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;
3183static std::pair<bool, bool>
3186 const bool EnablesBSValidation =
3188 const bool WasValidated =
3189 EnablesBSValidation &&
3191 return {EnablesBSValidation, WasValidated};
3194ASTReader::RelocationResult
3195ASTReader::getModuleForRelocationChecks(
ModuleFile &F,
bool DirectoryCheck) {
3197 const bool IgnoreError =
3198 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3201 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3202 return {std::nullopt, IgnoreError};
3206 if (!DirectoryCheck &&
3207 (!IsImplicitModule || ModuleMgr.begin()->Kind ==
MK_MainFile))
3208 return {std::nullopt, IgnoreError};
3210 const HeaderSearchOptions &HSOpts =
3211 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3216 auto [EnablesBSValidation, WasValidated] =
3219 return {std::nullopt, IgnoreError};
3220 if (EnablesBSValidation &&
3222 return {std::nullopt, IgnoreError};
3229 Module *M = PP.getHeaderSearchInfo().lookupModule(
3234 return {M, IgnoreError};
3239 SmallVectorImpl<ImportedModule> &Loaded,
3241 unsigned ClientLoadCapabilities) {
3242 BitstreamCursor &Stream = F.
Stream;
3245 Error(std::move(Err));
3255 bool HasReadUnhashedControlBlock =
false;
3256 auto readUnhashedControlBlockOnce = [&]() {
3257 if (!HasReadUnhashedControlBlock) {
3258 HasReadUnhashedControlBlock =
true;
3259 if (ASTReadResult
Result =
3260 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3266 bool DisableValidation = shouldDisableValidationForFile(F);
3270 unsigned NumInputs = 0;
3271 unsigned NumUserInputs = 0;
3272 StringRef BaseDirectoryAsWritten;
3274 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3276 Error(MaybeEntry.takeError());
3279 llvm::BitstreamEntry Entry = MaybeEntry.get();
3281 switch (Entry.Kind) {
3282 case llvm::BitstreamEntry::Error:
3283 Error(
"malformed block record in AST file");
3285 case llvm::BitstreamEntry::EndBlock: {
3288 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3292 const HeaderSearchOptions &HSOpts =
3293 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3300 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3306 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3312 N = ForceValidateUserInputs ? NumUserInputs : 0;
3314 ForceValidateUserInputs
3320 Diag(diag::remark_module_validation)
3323 for (
unsigned I = 0; I < N; ++I) {
3324 InputFile IF = getInputFile(F, I+1, Complain);
3338 for (
unsigned I = 0; I < N; ++I) {
3339 bool IsSystem = I >= NumUserInputs;
3341 auto FilenameAsRequested = ResolveImportedPath(
3344 *FilenameAsRequested, IsSystem, FI.
Overridden,
3352 case llvm::BitstreamEntry::SubBlock:
3356 if (llvm::Error Err = Stream.SkipBlock()) {
3357 Error(std::move(Err));
3361 Error(
"malformed block record in AST file");
3371 if (Listener && !ImportedBy) {
3377 bool AllowCompatibleConfigurationMismatch =
3381 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3382 AllowCompatibleConfigurationMismatch, *Listener,
3383 SuggestedPredefines);
3385 Error(
"malformed block record in AST file");
3389 if (DisableValidation ||
3390 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3398 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3399 Error(std::move(Err));
3405 if (llvm::Error Err = Stream.SkipBlock()) {
3406 Error(std::move(Err));
3412 case llvm::BitstreamEntry::Record:
3420 Expected<unsigned> MaybeRecordType =
3421 Stream.readRecord(Entry.ID,
Record, &Blob);
3422 if (!MaybeRecordType) {
3423 Error(MaybeRecordType.takeError());
3429 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3431 : diag::err_ast_file_version_too_new)
3436 bool hasErrors =
Record[7];
3437 if (hasErrors && !DisableValidation) {
3440 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3441 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3444 if (!AllowASTWithCompilerErrors) {
3445 Diag(diag::err_ast_file_with_compiler_errors)
3451 Diags.ErrorOccurred =
true;
3452 Diags.UncompilableErrorOccurred =
true;
3453 Diags.UnrecoverableErrorOccurred =
true;
3466 StringRef ASTBranch = Blob;
3467 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3468 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3469 Diag(diag::err_ast_file_different_branch)
3481 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3491 auto [ImportLoc, ImportModuleFileIndex] =
3492 ReadUntranslatedSourceLocation(
Record[Idx++]);
3494 assert(ImportModuleFileIndex == 0);
3496 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3498 bool IsImportingStdCXXModule =
Record[Idx++];
3500 off_t StoredSize = 0;
3501 time_t StoredModTime = 0;
3502 unsigned FileNameKind = 0;
3503 ASTFileSignature StoredSignature;
3504 ModuleFileName ImportedFile;
3505 std::string StoredFile;
3506 bool IgnoreImportedByNote =
false;
3515 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3516 ImportedName, !IsImportingStdCXXModule);
3518 if (IsImportingStdCXXModule && ImportedFile.
empty()) {
3519 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3523 if (!IsImportingStdCXXModule) {
3524 StoredSize = (off_t)
Record[Idx++];
3525 StoredModTime = (time_t)
Record[Idx++];
3526 FileNameKind = (unsigned)
Record[Idx++];
3530 SignatureBytes.end());
3533 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3534 if (ImportedFile.
empty()) {
3536 }
else if (!getDiags().isIgnored(
3537 diag::warn_module_file_mapping_mismatch,
3538 CurrentImportLoc)) {
3539 auto ImportedFileRef =
3540 PP.getFileManager().getOptionalFileRef(ImportedFile);
3541 auto StoredFileRef =
3542 PP.getFileManager().getOptionalFileRef(StoredFile);
3543 if ((ImportedFileRef && StoredFileRef) &&
3544 (*ImportedFileRef != *StoredFileRef)) {
3545 Diag(diag::warn_module_file_mapping_mismatch)
3546 << ImportedFile << StoredFile;
3547 Diag(diag::note_module_file_imported_by)
3549 IgnoreImportedByNote =
true;
3556 unsigned Capabilities = ClientLoadCapabilities;
3557 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3558 Capabilities &= ~ARR_Missing;
3561 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3562 Loaded, StoredSize, StoredModTime,
3563 StoredSignature, Capabilities);
3568 if (IsImportingStdCXXModule) {
3569 if (
const auto *Imported =
3570 getModuleManager().lookupByFileName(ImportedFile);
3571 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3572 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3578 bool recompilingFinalized =
Result == OutOfDate &&
3579 (Capabilities & ARR_OutOfDate) &&
3582 .getInMemoryModuleCache()
3584 if (!IgnoreImportedByNote &&
3586 Diag(diag::note_module_file_imported_by)
3593 case OutOfDate:
return OutOfDate;
3595 case ConfigurationMismatch:
return ConfigurationMismatch;
3596 case HadErrors:
return HadErrors;
3615 Diag(diag::remark_module_import)
3617 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3623 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3631 BaseDirectoryAsWritten = Blob;
3633 "MODULE_DIRECTORY found before MODULE_NAME");
3636 auto [MaybeM, IgnoreError] =
3637 getModuleForRelocationChecks(F,
true);
3638 if (!MaybeM.has_value())
3641 Module *M = MaybeM.value();
3653 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3654 if (BuildDir && (*BuildDir == M->
Directory)) {
3658 Diag(diag::remark_module_relocated)
3661 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3662 Diag(diag::err_imported_module_relocated)
3668 if (ASTReadResult
Result =
3669 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3675 NumUserInputs =
Record[1];
3677 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3686llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3687 unsigned ClientLoadCapabilities) {
3688 BitstreamCursor &Stream = F.
Stream;
3690 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3697 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3699 return MaybeEntry.takeError();
3700 llvm::BitstreamEntry Entry = MaybeEntry.get();
3702 switch (Entry.Kind) {
3703 case llvm::BitstreamEntry::Error:
3704 return llvm::createStringError(
3705 std::errc::illegal_byte_sequence,
3706 "error at end of module block in AST file");
3707 case llvm::BitstreamEntry::EndBlock:
3713 if (ASTContext *Ctx = ContextObj) {
3714 DeclContext *DC = Ctx->getTranslationUnitDecl();
3719 return llvm::Error::success();
3720 case llvm::BitstreamEntry::SubBlock:
3728 if (llvm::Error Err = Stream.SkipBlock())
3730 if (llvm::Error Err = ReadBlockAbbrevs(
3737 if (!PP.getExternalSource())
3738 PP.setExternalSource(
this);
3740 if (llvm::Error Err = Stream.SkipBlock())
3742 if (llvm::Error Err =
3751 if (llvm::Error Err = Stream.SkipBlock()) {
3760 if (!PP.getPreprocessingRecord())
3761 PP.createPreprocessingRecord();
3762 if (!PP.getPreprocessingRecord()->getExternalSource())
3763 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3767 if (llvm::Error Err = ReadSourceManagerBlock(F))
3773 if (llvm::Error Err = Stream.SkipBlock())
3775 if (llvm::Error Err =
3782 BitstreamCursor
C = Stream;
3784 if (llvm::Error Err = Stream.SkipBlock())
3788 CommentsCursors.push_back(std::make_pair(
C, &F));
3793 if (llvm::Error Err = Stream.SkipBlock())
3799 case llvm::BitstreamEntry::Record:
3807 Expected<unsigned> MaybeRecordType =
3808 Stream.readRecord(Entry.ID,
Record, &Blob);
3809 if (!MaybeRecordType)
3810 return MaybeRecordType.takeError();
3815 switch (RecordType) {
3837 switch (RecordType) {
3847 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3851 GlobalSubmoduleMap.insert(
3852 std::make_pair(getTotalNumSubmodules() + 1, &F));
3863 auto ReadSubmodule = [&](
unsigned LocalID) ->
Module * {
3864 return getSubmodule(getGlobalSubmoduleID(F, LocalID));
3867 if (PP.getHeaderSearchInfo().getModuleMap().findModule(F.
ModuleName)) {
3873 ReadSubmodule(LocalID);
3887 return llvm::createStringError(
3888 std::errc::illegal_byte_sequence,
3889 "duplicate TYPE_OFFSET record in AST file");
3902 return llvm::createStringError(
3903 std::errc::illegal_byte_sequence,
3904 "duplicate DECL_OFFSET record in AST file");
3916 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3917 LexicalContents Contents(
3919 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3920 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3927 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3928 auto *
Data = (
const unsigned char*)Blob.data();
3929 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3932 if (Decl *D = GetExistingDecl(ID))
3933 PendingUpdateRecords.push_back(
3934 PendingUpdateRecord(ID, D,
false));
3940 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3941 auto *
Data = (
const unsigned char *)Blob.data();
3942 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3945 if (Decl *D = GetExistingDecl(ID))
3946 PendingUpdateRecords.push_back(
3947 PendingUpdateRecord(ID, D,
false));
3955 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3956 auto *
Data = (
const unsigned char *)Blob.data();
3957 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3960 if (Decl *D = GetExistingDecl(ID))
3961 PendingUpdateRecords.push_back(
3962 PendingUpdateRecord(ID, D,
false));
3968 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3969 auto *
Data = (
const unsigned char *)Blob.data();
3970 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3973 if (Decl *D = GetExistingDecl(ID))
3974 PendingUpdateRecords.push_back(
3975 PendingUpdateRecord(ID, D,
false));
3981 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3982 auto *
Data = (
const unsigned char *)Blob.data();
3983 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3986 if (Decl *D = GetExistingDecl(ID))
3987 PendingUpdateRecords.push_back(
3988 PendingUpdateRecord(ID, D,
false));
3994 reinterpret_cast<const unsigned char *
>(Blob.data());
4000 ASTIdentifierLookupTrait(*
this, F));
4002 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
4008 return llvm::createStringError(
4009 std::errc::illegal_byte_sequence,
4010 "duplicate IDENTIFIER_OFFSET record in AST file");
4016 IdentifiersLoaded.resize(IdentifiersLoaded.size()
4028 for (
unsigned I = 0, N =
Record.size(); I != N; )
4029 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
4036 getContext().getLangOpts().BuildingPCHWithObjectFile)
4037 for (
unsigned I = 0, N =
Record.size(); I != N; )
4038 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
4042 if (SpecialTypes.empty()) {
4043 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
4044 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
4051 if (SpecialTypes.size() !=
Record.size())
4052 return llvm::createStringError(std::errc::illegal_byte_sequence,
4053 "invalid special-types record");
4055 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4057 if (!SpecialTypes[I])
4058 SpecialTypes[I] =
ID;
4065 TotalNumStatements +=
Record[0];
4066 TotalNumMacros +=
Record[1];
4067 TotalLexicalDeclContexts +=
Record[2];
4068 TotalVisibleDeclContexts +=
Record[3];
4069 TotalModuleLocalVisibleDeclContexts +=
Record[4];
4070 TotalTULocalVisibleDeclContexts +=
Record[5];
4074 for (
unsigned I = 0, N =
Record.size(); I != N; )
4075 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
4079 for (
unsigned I = 0, N =
Record.size(); I != N; )
4080 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
4084 if (
Record.size() % 3 != 0)
4085 return llvm::createStringError(std::errc::illegal_byte_sequence,
4086 "invalid weak identifiers record");
4090 WeakUndeclaredIdentifiers.clear();
4093 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4094 WeakUndeclaredIdentifiers.push_back(
4095 getGlobalIdentifierID(F,
Record[I++]));
4096 WeakUndeclaredIdentifiers.push_back(
4097 getGlobalIdentifierID(F,
Record[I++]));
4098 WeakUndeclaredIdentifiers.push_back(
4099 ReadSourceLocation(F,
Record, I).getRawEncoding());
4104 if (
Record.size() % 3 != 0)
4105 return llvm::createStringError(std::errc::illegal_byte_sequence,
4106 "invalid extname identifiers record");
4110 ExtnameUndeclaredIdentifiers.clear();
4114 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4115 ExtnameUndeclaredIdentifiers.push_back(
4116 getGlobalIdentifierID(F,
Record[I++]));
4117 ExtnameUndeclaredIdentifiers.push_back(
4118 getGlobalIdentifierID(F,
Record[I++]));
4119 ExtnameUndeclaredIdentifiers.push_back(
4120 ReadSourceLocation(F,
Record, I).getRawEncoding());
4127 unsigned LocalBaseSelectorID =
Record[1];
4133 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4138 std::make_pair(LocalBaseSelectorID,
4150 = ASTSelectorLookupTable::Create(
4153 ASTSelectorLookupTrait(*
this, F));
4154 TotalNumMethodPoolEntries +=
Record[1];
4159 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
4160 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4162 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
4171 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4172 ReadSourceLocation(F,
Record, Idx));
4178 SmallVector<SourceLocation, 64> SrcLocs;
4180 while (Idx <
Record.size())
4181 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
4182 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4189 unsigned Idx = 0, End =
Record.size() - 1;
4190 bool ReachedEOFWhileSkipping =
Record[Idx++];
4191 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4192 if (ReachedEOFWhileSkipping) {
4193 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4194 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4195 bool FoundNonSkipPortion =
Record[Idx++];
4196 bool FoundElse =
Record[Idx++];
4197 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4198 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4199 FoundElse, ElseLoc);
4201 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4203 auto Loc = ReadSourceLocation(F,
Record, Idx);
4204 bool WasSkipping =
Record[Idx++];
4205 bool FoundNonSkip =
Record[Idx++];
4206 bool FoundElse =
Record[Idx++];
4207 ConditionalStack.push_back(
4208 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4210 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4215 if (!
Record.empty() && Listener)
4233 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4234 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4235 return llvm::createStringError(std::errc::invalid_argument,
4236 "ran out of source locations");
4241 unsigned RangeStart =
4243 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4248 GlobalSLocOffsetMap.insert(
4250 - SLocSpaceSize,&F));
4261 ParseLineTable(F,
Record);
4265 for (
unsigned I = 0, N =
Record.size(); I != N; )
4266 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4270 if (
Record.size() % 3 != 0)
4271 return llvm::createStringError(std::errc::illegal_byte_sequence,
4272 "Invalid VTABLE_USES record");
4279 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4280 VTableUses.push_back(
4281 {ReadDeclID(F,
Record, Idx),
4282 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4289 if (
Record.size() % 2 != 0)
4290 return llvm::createStringError(
4291 std::errc::illegal_byte_sequence,
4292 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4297 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4298 PendingInstantiations.push_back(
4299 {ReadDeclID(F,
Record, I),
4300 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4307 return llvm::createStringError(std::errc::illegal_byte_sequence,
4308 "Invalid SEMA_DECL_REFS block");
4309 for (
unsigned I = 0, N =
Record.size(); I != N; )
4310 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4318 unsigned StartingID;
4319 if (!PP.getPreprocessingRecord())
4320 PP.createPreprocessingRecord();
4321 if (!PP.getPreprocessingRecord()->getExternalSource())
4322 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4324 = PP.getPreprocessingRecord()
4331 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4342 if (!PP.getPreprocessingRecord())
4343 PP.createPreprocessingRecord();
4344 if (!PP.getPreprocessingRecord()->getExternalSource())
4345 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4350 GlobalSkippedRangeMap.insert(
4356 if (
Record.size() % 2 != 0)
4357 return llvm::createStringError(
4358 std::errc::illegal_byte_sequence,
4359 "invalid DECL_UPDATE_OFFSETS block in AST file");
4360 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4361 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4362 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4366 if (Decl *D = GetExistingDecl(ID))
4367 PendingUpdateRecords.push_back(
4368 PendingUpdateRecord(ID, D,
false));
4373 if (
Record.size() % 5 != 0)
4374 return llvm::createStringError(
4375 std::errc::illegal_byte_sequence,
4376 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4378 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4379 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4382 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4385 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4388 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4391 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4394 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4396 DelayedNamespaceOffsetMap[
ID] = {
4397 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4399 assert(!GetExistingDecl(ID) &&
4400 "We shouldn't load the namespace in the front of delayed "
4401 "namespace lexical and visible block");
4407 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4408 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4409 auto &RelatedDecls = RelatedDeclsMap[
ID];
4410 unsigned NN =
Record[I++];
4411 RelatedDecls.reserve(NN);
4412 for (
unsigned II = 0; II < NN; II++)
4413 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4419 return llvm::createStringError(
4420 std::errc::illegal_byte_sequence,
4421 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4434 CUDASpecialDeclRefs.clear();
4435 for (
unsigned I = 0, N =
Record.size(); I != N; )
4436 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4446 HeaderFileInfoTrait(*
this, F));
4448 PP.getHeaderSearchInfo().SetExternalSource(
this);
4449 if (!PP.getHeaderSearchInfo().getExternalLookup())
4450 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4456 FPPragmaOptions.swap(
Record);
4460 for (
unsigned I = 0, N =
Record.size(); I != N; )
4461 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4465 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4466 auto Name = ReadString(
Record, I);
4467 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4468 OptInfo.Supported =
Record[I++] != 0;
4469 OptInfo.Enabled =
Record[I++] != 0;
4470 OptInfo.WithPragma =
Record[I++] != 0;
4471 OptInfo.Avail =
Record[I++];
4472 OptInfo.Core =
Record[I++];
4473 OptInfo.Opt =
Record[I++];
4478 for (
unsigned I = 0, N =
Record.size(); I != N; )
4479 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4483 for (
unsigned I = 0, N =
Record.size(); I != N; )
4484 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4488 if (
Record.size() % 2 != 0)
4489 return llvm::createStringError(std::errc::illegal_byte_sequence,
4490 "invalid undefined-but-used record");
4491 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4492 UndefinedButUsed.push_back(
4493 {ReadDeclID(F,
Record, I),
4494 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4499 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4500 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4502 DelayedDeleteExprs.push_back(Count);
4503 for (uint64_t
C = 0;
C < Count; ++
C) {
4504 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4505 bool IsArrayForm =
Record[I++] == 1;
4506 DelayedDeleteExprs.push_back(IsArrayForm);
4513 getContext().getLangOpts().BuildingPCHWithObjectFile)
4514 for (
unsigned I = 0, N =
Record.size(); I != N;)
4515 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4523 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4524 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4525 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4527 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4528 if (DeserializationListener)
4529 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4537 return llvm::createStringError(
4538 std::errc::illegal_byte_sequence,
4539 "duplicate MACRO_OFFSET record in AST file");
4551 LateParsedTemplates.emplace_back(
4552 std::piecewise_construct, std::forward_as_tuple(&F),
4558 return llvm::createStringError(std::errc::illegal_byte_sequence,
4559 "invalid pragma optimize record");
4560 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4565 return llvm::createStringError(std::errc::illegal_byte_sequence,
4566 "invalid pragma ms_struct record");
4567 PragmaMSStructState =
Record[0];
4572 return llvm::createStringError(
4573 std::errc::illegal_byte_sequence,
4574 "invalid pragma pointers to members record");
4575 PragmaMSPointersToMembersState =
Record[0];
4576 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4580 for (
unsigned I = 0, N =
Record.size(); I != N; )
4581 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4586 return llvm::createStringError(std::errc::illegal_byte_sequence,
4587 "invalid cuda pragma options record");
4588 ForceHostDeviceDepth =
Record[0];
4593 return llvm::createStringError(std::errc::illegal_byte_sequence,
4594 "invalid pragma pack record");
4595 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4596 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4597 unsigned NumStackEntries =
Record[2];
4600 PragmaAlignPackStack.clear();
4601 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4602 PragmaAlignPackStackEntry Entry;
4603 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4604 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4605 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4606 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4607 Entry.SlotLabel = PragmaAlignPackStrings.back();
4608 PragmaAlignPackStack.push_back(Entry);
4615 return llvm::createStringError(std::errc::illegal_byte_sequence,
4616 "invalid pragma float control record");
4618 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4619 unsigned NumStackEntries =
Record[2];
4622 FpPragmaStack.clear();
4623 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4624 FpPragmaStackEntry Entry;
4626 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4627 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4628 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4629 Entry.SlotLabel = FpPragmaStrings.back();
4630 FpPragmaStack.push_back(Entry);
4636 for (
unsigned I = 0, N =
Record.size(); I != N; )
4637 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4641 unsigned NumRecords =
Record.front();
4643 if (
Record.size() - 1 != NumRecords)
4644 return llvm::createStringError(std::errc::illegal_byte_sequence,
4645 "invalid rvv intrinsic pragma record");
4647 if (RISCVVecIntrinsicPragma.empty())
4648 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4651 for (
unsigned i = 0; i < NumRecords; ++i)
4652 RISCVVecIntrinsicPragma[i] |=
Record[i + 1];
4659void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4672 assert(ImportedModuleVector.empty());
4674 while (
Data < DataEnd) {
4678 using namespace llvm::support;
4680 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4681 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4682 StringRef Name = StringRef((
const char*)
Data, Len);
4687 ? ModuleMgr.lookupByModuleName(Name)
4692 std::string Msg =
"refers to unknown module, cannot find ";
4693 Msg.append(std::string(Name));
4698 ImportedModuleVector.push_back(OM);
4701 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4703 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4706 RemapBuilder &Remap) {
4707 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4709 Remap.insert(std::make_pair(Offset,
4710 static_cast<int>(BaseOffset - Offset)));
4721 unsigned ClientLoadCapabilities) {
4730 "MODULE_NAME should come before MODULE_MAP_FILE");
4731 auto [MaybeM, IgnoreError] =
4732 getModuleForRelocationChecks(F,
false);
4733 if (MaybeM.has_value()) {
4736 Module *M = MaybeM.value();
4737 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4739 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4740 if (!IgnoreError && !ModMap) {
4742 Diag(diag::remark_module_relocated)
4745 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4748 Diag(diag::err_module_file_conflict)
4753 Diag(diag::err_imported_module_not_found)
4760 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4761 Diag(diag::note_imported_by_pch_module_not_found)
4768 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4772 if (!StoredModMap || *StoredModMap != ModMap) {
4773 assert(ModMap &&
"found module is missing module map file");
4775 "top-level import should be verified");
4777 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4778 Diag(diag::err_imported_module_modmap_changed)
4785 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4787 std::string Filename = ReadPath(F,
Record, Idx);
4790 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4791 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4794 AdditionalStoredMaps.insert(*SF);
4799 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4800 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4803 if (!AdditionalStoredMaps.erase(ModMap)) {
4804 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4805 Diag(diag::err_module_different_modmap)
4814 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4815 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4816 Diag(diag::err_module_different_modmap)
4830 SemaObjC::GlobalMethodPool::iterator Known =
4836 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4837 : Known->second.second;
4841 if (List->getMethod() == Method) {
4849 if (List->getNext())
4850 List->setMethod(List->getNext()->getMethod());
4852 List->setMethod(Method);
4858 for (
Decl *D : Names) {
4862 if (wasHidden && SemaObj) {
4875 Stack.push_back(Mod);
4876 while (!Stack.empty()) {
4877 Mod = Stack.pop_back_val();
4879 if (NameVisibility <= Mod->NameVisibility) {
4895 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4896 if (Hidden != HiddenNamesMap.end()) {
4897 auto HiddenNames = std::move(*Hidden);
4898 HiddenNamesMap.erase(Hidden);
4900 assert(!HiddenNamesMap.contains(Mod) &&
4901 "making names visible added hidden names");
4908 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4910 if (Visited.insert(Exported).second)
4911 Stack.push_back(Exported);
4929 PendingMergedDefinitionsToDeduplicate.insert(Def);
4938 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4939 !PP.getLangOpts().Modules)
4943 TriedLoadingGlobalIndex =
true;
4944 StringRef SpecificModuleCachePath =
4946 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4948 if (llvm::Error Err = std::move(
Result.second)) {
4950 consumeError(std::move(Err));
4954 GlobalIndex.reset(
Result.first);
4955 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4960 return PP.getLangOpts().Modules && UseGlobalIndex &&
4972 consumeError(MaybeEntry.takeError());
4975 llvm::BitstreamEntry Entry = MaybeEntry.get();
4977 switch (Entry.Kind) {
4978 case llvm::BitstreamEntry::Error:
4979 case llvm::BitstreamEntry::EndBlock:
4982 case llvm::BitstreamEntry::Record:
4988 consumeError(Skipped.takeError());
4992 case llvm::BitstreamEntry::SubBlock:
4993 if (Entry.ID == BlockID) {
4994 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4996 consumeError(std::move(Err));
5003 if (llvm::Error Err = Cursor.SkipBlock()) {
5005 consumeError(std::move(Err));
5015 unsigned ClientLoadCapabilities,
5017 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
5021 CurrentDeserializingModuleKind,
Type);
5027 unsigned PreviousGeneration = 0;
5031 unsigned NumModules = ModuleMgr.size();
5036 ClientLoadCapabilities)) {
5037 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
5041 GlobalIndex.reset();
5042 ModuleMgr.setGlobalIndex(
nullptr);
5046 if (NewLoadedModuleFile && !Loaded.empty())
5047 *NewLoadedModuleFile = Loaded.back().Mod;
5060 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
5063 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
5064 Error(std::move(Err));
5070 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
5076 if (llvm::Error Err = ReadExtensionBlock(F)) {
5077 Error(std::move(Err));
5106 if (!PP.getLangOpts().CPlusPlus) {
5113 auto It = PP.getIdentifierTable().find(Key);
5114 if (It == PP.getIdentifierTable().end())
5123 II = &PP.getIdentifierTable().getOwn(Key);
5141 for (
auto &Id : PP.getIdentifierTable())
5142 Id.second->setOutOfDate(
true);
5145 for (
const auto &Sel : SelectorGeneration)
5146 SelectorOutOfDate[Sel.first] =
true;
5153 ModuleMgr.moduleFileAccepted(&F);
5175 if (DeserializationListener)
5176 DeserializationListener->ReaderInitialized(
this);
5178 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5193 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5194 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5195 ObjCClassesLoaded[I], PreviousGeneration);
5200 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5205 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5224 if (!Stream.canSkipToPos(4))
5225 return llvm::createStringError(
5226 std::errc::illegal_byte_sequence,
5227 "file too small to contain precompiled file magic");
5228 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5231 return llvm::createStringError(
5232 std::errc::illegal_byte_sequence,
5233 "file doesn't start with precompiled file magic");
5235 return Res.takeError();
5236 return llvm::Error::success();
5251 llvm_unreachable(
"unknown module kind");
5257 off_t ExpectedSize, time_t ExpectedModTime,
5259 auto Result = ModuleMgr.addModule(
5264 switch (
Result.getKind()) {
5266 Diag(diag::remark_module_import)
5268 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5283 Diag(diag::err_ast_file_not_found)
5285 if (!
Result.getBufferError().empty())
5286 Diag(diag::note_ast_file_buffer_failed) <<
Result.getBufferError();
5296 Diag(diag::err_ast_file_out_of_date)
5298 for (
const auto &
C :
Result.getChanges()) {
5299 Diag(diag::note_fe_ast_file_modified)
5300 <<
C.Kind << (
C.Old &&
C.New) << llvm::itostr(
C.Old.value_or(0))
5301 << llvm::itostr(
C.New.value_or(0));
5303 Diag(diag::note_ast_file_input_files_validation_status)
5304 <<
Result.getValidationStatus();
5305 if (!
Result.getSignatureError().empty())
5306 Diag(diag::note_ast_file_signature_failed) <<
Result.getSignatureError();
5310 llvm_unreachable(
"Unexpected value from adding module.");
5313 assert(M &&
"Missing module file");
5315 bool ShouldFinalizePCM =
false;
5316 llvm::scope_exit FinalizeOrDropPCM([&]() {
5318 if (ShouldFinalizePCM)
5324 BitstreamCursor &Stream = F.
Stream;
5325 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5326 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5330 Diag(diag::err_ast_file_invalid)
5336 bool HaveReadControlBlock =
false;
5340 Error(MaybeEntry.takeError());
5343 llvm::BitstreamEntry Entry = MaybeEntry.get();
5345 switch (Entry.Kind) {
5346 case llvm::BitstreamEntry::Error:
5347 case llvm::BitstreamEntry::Record:
5348 case llvm::BitstreamEntry::EndBlock:
5349 Error(
"invalid record at top-level of AST file");
5352 case llvm::BitstreamEntry::SubBlock:
5358 HaveReadControlBlock =
true;
5359 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5367 F.ModuleName.empty()) {
5386 if (!HaveReadControlBlock) {
5388 Diag(diag::err_ast_file_version_too_old)
5395 ShouldFinalizePCM =
true;
5399 if (llvm::Error Err = Stream.SkipBlock()) {
5400 Error(std::move(Err));
5407 llvm_unreachable(
"unexpected break; expected return");
5411ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5412 unsigned ClientLoadCapabilities) {
5414 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5415 bool AllowCompatibleConfigurationMismatch =
5417 bool DisableValidation = shouldDisableValidationForFile(F);
5419 ASTReadResult
Result = readUnhashedControlBlockImpl(
5421 AllowCompatibleConfigurationMismatch, Listener.get(),
5426 if (DisableValidation || WasImportedBy ||
5427 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5431 Error(
"malformed block record in AST file");
5454 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5456 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5465 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5466 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5467 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5469 BitstreamCursor Stream(StreamData);
5474 consumeError(std::move(Err));
5486 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5489 consumeError(MaybeEntry.takeError());
5492 llvm::BitstreamEntry Entry = MaybeEntry.get();
5494 switch (Entry.Kind) {
5495 case llvm::BitstreamEntry::Error:
5496 case llvm::BitstreamEntry::SubBlock:
5499 case llvm::BitstreamEntry::EndBlock:
5502 case llvm::BitstreamEntry::Record:
5510 Expected<unsigned> MaybeRecordType =
5511 Stream.readRecord(Entry.ID,
Record, &Blob);
5512 if (!MaybeRecordType) {
5521 "Dummy AST file signature not backpatched in ASTWriter.");
5528 "Dummy AST block hash not backpatched in ASTWriter.");
5532 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5533 if (Listener && ValidateDiagnosticOptions &&
5534 !AllowCompatibleConfigurationMismatch &&
5535 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5540 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5541 if (Listener && !AllowCompatibleConfigurationMismatch &&
5542 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5543 Result = ConfigurationMismatch;
5572 if (
Record.size() < 4)
return true;
5577 unsigned BlockNameLen =
Record[2];
5578 unsigned UserInfoLen =
Record[3];
5580 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5582 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5583 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5584 Blob.data() + BlockNameLen + UserInfoLen);
5588llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5589 BitstreamCursor &Stream = F.
Stream;
5593 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5595 return MaybeEntry.takeError();
5596 llvm::BitstreamEntry Entry = MaybeEntry.get();
5598 switch (Entry.Kind) {
5599 case llvm::BitstreamEntry::SubBlock:
5600 if (llvm::Error Err = Stream.SkipBlock())
5603 case llvm::BitstreamEntry::EndBlock:
5604 return llvm::Error::success();
5605 case llvm::BitstreamEntry::Error:
5606 return llvm::createStringError(std::errc::illegal_byte_sequence,
5607 "malformed block record in AST file");
5608 case llvm::BitstreamEntry::Record:
5614 Expected<unsigned> MaybeRecCode =
5615 Stream.readRecord(Entry.ID,
Record, &Blob);
5617 return MaybeRecCode.takeError();
5618 switch (MaybeRecCode.get()) {
5620 ModuleFileExtensionMetadata Metadata;
5622 return llvm::createStringError(
5623 std::errc::illegal_byte_sequence,
5624 "malformed EXTENSION_METADATA in AST file");
5627 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5628 if (Known == ModuleFileExtensions.end())
break;
5631 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5641 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5645 assert(ContextObj &&
"no context to initialize");
5649 if (DeserializationListener)
5650 DeserializationListener->DeclRead(
5652 Context.getTranslationUnitDecl());
5660 if (!Context.CFConstantStringTypeDecl)
5661 Context.setCFConstantStringType(
GetType(String));
5666 if (FileType.isNull()) {
5667 Error(
"FILE type is NULL");
5671 if (!Context.FILEDecl) {
5673 Context.setFILEDecl(
Typedef->getDecl());
5675 const TagType *Tag = FileType->getAs<TagType>();
5677 Error(
"Invalid FILE type in AST file");
5680 Context.setFILEDecl(Tag->getDecl());
5687 if (Jmp_bufType.
isNull()) {
5688 Error(
"jmp_buf type is NULL");
5692 if (!Context.jmp_bufDecl) {
5694 Context.setjmp_bufDecl(
Typedef->getDecl());
5696 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5698 Error(
"Invalid jmp_buf type in AST file");
5701 Context.setjmp_bufDecl(Tag->getDecl());
5708 if (Sigjmp_bufType.
isNull()) {
5709 Error(
"sigjmp_buf type is NULL");
5713 if (!Context.sigjmp_bufDecl) {
5715 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5717 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5718 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5719 Context.setsigjmp_bufDecl(Tag->getDecl());
5725 if (Context.ObjCIdRedefinitionType.isNull())
5726 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5729 if (
TypeID ObjCClassRedef =
5731 if (Context.ObjCClassRedefinitionType.isNull())
5732 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5735 if (
TypeID ObjCSelRedef =
5737 if (Context.ObjCSelRedefinitionType.isNull())
5738 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5743 if (Ucontext_tType.
isNull()) {
5744 Error(
"ucontext_t type is NULL");
5748 if (!Context.ucontext_tDecl) {
5750 Context.setucontext_tDecl(
Typedef->getDecl());
5752 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5753 assert(Tag &&
"Invalid ucontext_t type in AST file");
5754 Context.setucontext_tDecl(Tag->getDecl());
5763 if (!CUDASpecialDeclRefs.empty()) {
5764 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5765 Context.setcudaConfigureCallDecl(
5766 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5767 Context.setcudaGetParameterBufferDecl(
5768 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5769 Context.setcudaLaunchDeviceDecl(
5770 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5775 for (
auto &Import : PendingImportedModules) {
5779 if (Import.ImportLoc.isValid())
5780 PP.makeModuleVisible(Imported, Import.ImportLoc);
5787 PendingImportedModulesSema.append(PendingImportedModules);
5788 PendingImportedModules.clear();
5798 BitstreamCursor Stream(
PCH);
5801 consumeError(std::move(Err));
5813 Stream.advanceSkippingSubblocks();
5816 consumeError(MaybeEntry.takeError());
5819 llvm::BitstreamEntry Entry = MaybeEntry.get();
5821 if (Entry.Kind != llvm::BitstreamEntry::Record)
5829 consumeError(MaybeRecord.takeError());
5835 "Dummy AST file signature not backpatched in ASTWriter.");
5845 const std::string &ASTFileName,
FileManager &FileMgr,
5848 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5853 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5854 << ASTFileName << Buffer.getError().message();
5855 return std::string();
5859 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5863 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5864 return std::string();
5869 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5870 return std::string();
5877 Stream.advanceSkippingSubblocks();
5880 consumeError(MaybeEntry.takeError());
5881 return std::string();
5883 llvm::BitstreamEntry Entry = MaybeEntry.get();
5885 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5886 return std::string();
5888 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5889 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5890 return std::string();
5898 consumeError(MaybeRecord.takeError());
5899 return std::string();
5914 std::string ExistingSpecificModuleCachePath;
5916 bool StrictOptionMatches;
5919 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5924 StringRef ExistingSpecificModuleCachePath,
5926 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5927 ExistingTargetOpts(ExistingTargetOpts),
5928 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
5929 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
5932 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5933 StringRef ModuleFilename,
bool Complain,
5934 bool AllowCompatibleDifferences)
override {
5936 nullptr, AllowCompatibleDifferences);
5939 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5940 StringRef ModuleFilename,
bool Complain,
5941 bool AllowCompatibleDifferences)
override {
5943 nullptr, AllowCompatibleDifferences);
5946 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5947 StringRef ModuleFilename,
bool Complain,
5948 bool AllowCompatibleDifferences)
override {
5950 nullptr, AllowCompatibleDifferences);
5953 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5954 StringRef ASTFilename, StringRef ContextHash,
5955 bool Complain)
override {
5957 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
5958 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
5961 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5962 StringRef ModuleFilename,
bool ReadMacros,
5964 std::string &SuggestedPredefines)
override {
5966 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5967 FileMgr, SuggestedPredefines, ExistingLangOpts,
5979 unsigned ClientLoadCapabilities) {
5983 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5984 llvm::MemoryBuffer *Buffer =
5993 auto Entry = Filename ==
"-" ? FileMgr.getSTDIN()
5994 : FileMgr.getFileRef(Filename,
5999 llvm::consumeError(Entry.takeError());
6003 FileMgr.getBufferForFile(*Entry,
6010 OwnedBuffer = std::move(*BufferOrErr);
6011 Buffer = OwnedBuffer.get();
6015 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
6016 BitstreamCursor Stream(Bytes);
6020 consumeError(std::move(Err));
6028 bool NeedsInputFiles = Listener.needsInputFileVisitation();
6029 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
6030 bool NeedsImports = Listener.needsImportVisitation();
6031 BitstreamCursor InputFilesCursor;
6032 uint64_t InputFilesOffsetBase = 0;
6035 std::string ModuleDir;
6036 bool DoneWithControlBlock =
false;
6038 PathBuf.reserve(256);
6043 AdditionalPathBuf.reserve(256);
6044 while (!DoneWithControlBlock) {
6048 consumeError(MaybeEntry.takeError());
6051 llvm::BitstreamEntry Entry = MaybeEntry.get();
6053 switch (Entry.Kind) {
6054 case llvm::BitstreamEntry::SubBlock: {
6057 std::string IgnoredSuggestedPredefines;
6058 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6060 Listener, IgnoredSuggestedPredefines) !=
Success)
6066 InputFilesCursor = Stream;
6067 if (llvm::Error Err = Stream.SkipBlock()) {
6069 consumeError(std::move(Err));
6072 if (NeedsInputFiles &&
6075 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6079 if (llvm::Error Err = Stream.SkipBlock()) {
6081 consumeError(std::move(Err));
6090 case llvm::BitstreamEntry::EndBlock:
6091 DoneWithControlBlock =
true;
6094 case llvm::BitstreamEntry::Error:
6097 case llvm::BitstreamEntry::Record:
6101 if (DoneWithControlBlock)
break;
6106 Stream.readRecord(Entry.ID,
Record, &Blob);
6107 if (!MaybeRecCode) {
6115 if (Listener.ReadFullVersionInformation(Blob))
6119 Listener.ReadModuleName(Blob);
6122 ModuleDir = std::string(Blob);
6128 Listener.ReadModuleMapFile(*Path);
6132 if (!NeedsInputFiles)
6135 unsigned NumInputFiles =
Record[0];
6136 unsigned NumUserFiles =
Record[1];
6137 const llvm::support::unaligned_uint64_t *InputFileOffs =
6138 (
const llvm::support::unaligned_uint64_t *)Blob.data();
6139 for (
unsigned I = 0; I != NumInputFiles; ++I) {
6141 bool isSystemFile = I >= NumUserFiles;
6143 if (isSystemFile && !NeedsSystemInputFiles)
6146 BitstreamCursor &Cursor = InputFilesCursor;
6148 if (llvm::Error Err =
6149 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6151 consumeError(std::move(Err));
6157 consumeError(MaybeCode.takeError());
6159 unsigned Code = MaybeCode.get();
6163 bool shouldContinue =
false;
6165 Cursor.readRecord(Code,
Record, &Blob);
6166 if (!MaybeRecordType) {
6168 consumeError(MaybeRecordType.takeError());
6174 time_t StoredTime =
static_cast<time_t
>(
Record[2]);
6175 bool Overridden =
static_cast<bool>(
Record[3]);
6176 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6179 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6181 if (UnresolvedFilename.empty())
6182 Filename = *FilenameAsRequestedBuf;
6185 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6186 Filename = *FilenameBuf;
6188 shouldContinue = Listener.visitInputFileAsRequested(
6189 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6193 if (!shouldContinue)
6214 bool IsStandardCXXModule =
Record[Idx++];
6218 if (IsStandardCXXModule) {
6219 Listener.visitImport(ModuleName,
"");
6230 Listener.visitImport(ModuleName, *Filename);
6241 if (FindModuleFileExtensions) {
6242 BitstreamCursor SavedStream = Stream;
6244 bool DoneWithExtensionBlock =
false;
6245 while (!DoneWithExtensionBlock) {
6251 llvm::BitstreamEntry Entry = MaybeEntry.get();
6253 switch (Entry.Kind) {
6254 case llvm::BitstreamEntry::SubBlock:
6255 if (llvm::Error Err = Stream.SkipBlock()) {
6257 consumeError(std::move(Err));
6262 case llvm::BitstreamEntry::EndBlock:
6263 DoneWithExtensionBlock =
true;
6266 case llvm::BitstreamEntry::Error:
6269 case llvm::BitstreamEntry::Record:
6276 Stream.readRecord(Entry.ID,
Record, &Blob);
6277 if (!MaybeRecCode) {
6281 switch (MaybeRecCode.get()) {
6287 Listener.readModuleFileExtension(Metadata);
6293 Stream = std::move(SavedStream);
6297 if (readUnhashedControlBlockImpl(
6298 nullptr, Bytes, Filename, ClientLoadCapabilities,
6300 ValidateDiagnosticOptions) !=
Success)
6311 StringRef SpecificModuleCachePath,
bool RequireStrictOptionMatches) {
6312 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6313 SpecificModuleCachePath, FileMgr,
6314 RequireStrictOptionMatches);
6322 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
6327 if (GlobalIndex >= SubmodulesLoaded.size()) {
6328 Error(
"submodule ID out of range in AST file");
6332 if (SubmodulesLoaded[GlobalIndex])
6333 return SubmodulesLoaded[GlobalIndex];
6336 assert(It != GlobalSubmoduleMap.end());
6339 [[maybe_unused]]
unsigned LocalID =
6346 Error(std::move(Err));
6350 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6355 auto CreateModule = !KnowsTopLevelModule
6359 Module *CurrentModule =
nullptr;
6364 Error(MaybeEntry.takeError());
6367 llvm::BitstreamEntry Entry = MaybeEntry.get();
6369 switch (Entry.Kind) {
6370 case llvm::BitstreamEntry::SubBlock:
6371 case llvm::BitstreamEntry::Error:
6372 case llvm::BitstreamEntry::EndBlock: {
6373 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6374 "malformed block record in AST file"));
6377 case llvm::BitstreamEntry::Record:
6387 Error(MaybeKind.takeError());
6394 if (!CurrentModule) {
6395 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6396 "malformed module definition"));
6399 return CurrentModule;
6402 if (
Record.size() < 13) {
6403 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6404 "malformed module definition"));
6408 StringRef Name = Blob;
6410 [[maybe_unused]]
unsigned ReadLocalID =
Record[Idx++];
6411 assert(LocalID == ReadLocalID);
6417 bool IsFramework =
Record[Idx++];
6418 bool IsExplicit =
Record[Idx++];
6419 bool IsSystem =
Record[Idx++];
6420 bool IsExternC =
Record[Idx++];
6421 bool InferSubmodules =
Record[Idx++];
6422 bool InferExplicitSubmodules =
Record[Idx++];
6423 bool InferExportWildcard =
Record[Idx++];
6424 bool ConfigMacrosExhaustive =
Record[Idx++];
6425 bool ModuleMapIsPrivate =
Record[Idx++];
6426 bool NamedModuleHasInit =
Record[Idx++];
6428 Module *ParentModule =
nullptr;
6435 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6436 IsFramework, IsExplicit);
6438 if (!ParentModule) {
6442 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6444 assert(*CurFileKey != F.
FileKey &&
6445 "ModuleManager did not de-duplicate");
6447 Diag(diag::err_module_file_conflict)
6451 auto CurModMapFile =
6453 auto ModMapFile = FileMgr.getOptionalFileRef(F.
ModuleMapPath);
6454 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6455 Diag(diag::note_module_file_conflict)
6456 << CurModMapFile->getName() << ModMapFile->getName();
6467 CurrentModule->
Kind = Kind;
6477 if (InferredAllowedBy.
isValid())
6489 if (
auto Dir = FileMgr.getOptionalDirectoryRef(F.
BaseDirectory))
6491 }
else if (ParentModule && ParentModule->
Directory) {
6496 if (DeserializationListener)
6497 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6499 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6523 CurrentModule, Blob.str(), RelativePathName)) {
6559 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6569 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6576 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6584 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6586 bool IsWildcard =
Record[Idx + 1];
6589 if (ExportedMod || IsWildcard)
6590 CurrentModule->
Exports.push_back({ExportedMod, IsWildcard});
6600 PP.getTargetInfo());
6617 Conflict.
Message = Blob.str();
6618 CurrentModule->
Conflicts.push_back(Conflict);
6628 for (
unsigned I = 0; I <
Record.size(); )
6630 ContextObj->addLazyModuleInitializers(CurrentModule,
Inits);
6657bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6658 StringRef ModuleFilename,
bool Complain,
6660 bool AllowCompatibleDifferences) {
6663#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6664 LangOpts.Name = Record[Idx++];
6665#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6666 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6667#include "clang/Basic/LangOptions.def"
6668#define SANITIZER(NAME, ID) \
6669 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6670#include "clang/Basic/Sanitizers.def"
6672 for (
unsigned N =
Record[Idx++]; N; --N)
6676 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6682 for (
unsigned N =
Record[Idx++]; N; --N) {
6684 ReadString(
Record, Idx));
6689 for (
unsigned N =
Record[Idx++]; N; --N) {
6696 AllowCompatibleDifferences);
6699bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6700 StringRef ModuleFilename,
bool Complain,
6701 ASTReaderListener &Listener,
6702 bool AllowCompatibleDifferences) {
6704 CodeGenOptions CGOpts;
6706#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6707 if constexpr (CK::Compatibility != CK::Benign) \
6708 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6709#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6710 if constexpr (CK::Compatibility != CK::Benign) \
6711 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6712#define DEBUGOPT(Name, Bits, Default, Compatibility)
6713#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6714#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6715#include "clang/Basic/CodeGenOptions.def"
6718 AllowCompatibleDifferences);
6721bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6722 StringRef ModuleFilename,
bool Complain,
6723 ASTReaderListener &Listener,
6724 bool AllowCompatibleDifferences) {
6726 TargetOptions TargetOpts;
6728 TargetOpts.
CPU = ReadString(
Record, Idx);
6730 TargetOpts.
ABI = ReadString(
Record, Idx);
6731 for (
unsigned N =
Record[Idx++]; N; --N) {
6734 for (
unsigned N =
Record[Idx++]; N; --N) {
6739 AllowCompatibleDifferences);
6742bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6743 StringRef ModuleFilename,
bool Complain,
6744 ASTReaderListener &Listener) {
6745 DiagnosticOptions DiagOpts;
6747#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6748#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6749 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6750#include "clang/Basic/DiagnosticOptions.def"
6752 for (
unsigned N =
Record[Idx++]; N; --N)
6754 for (
unsigned N =
Record[Idx++]; N; --N)
6760bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6761 ASTReaderListener &Listener) {
6762 FileSystemOptions FSOpts;
6768bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6769 StringRef ModuleFilename,
6771 ASTReaderListener &Listener) {
6772 HeaderSearchOptions HSOpts;
6787 std::string ContextHash = ReadString(
Record, Idx);
6793bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6794 ASTReaderListener &Listener) {
6795 HeaderSearchOptions HSOpts;
6799 for (
unsigned N =
Record[Idx++]; N; --N) {
6800 std::string Path = ReadString(
Record, Idx);
6803 bool IsFramework =
Record[Idx++];
6804 bool IgnoreSysRoot =
Record[Idx++];
6805 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6810 for (
unsigned N =
Record[Idx++]; N; --N) {
6811 std::string Prefix = ReadString(
Record, Idx);
6812 bool IsSystemHeader =
Record[Idx++];
6817 for (
unsigned N =
Record[Idx++]; N; --N) {
6818 std::string VFSOverlayFile = ReadString(
Record, Idx);
6825bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6826 StringRef ModuleFilename,
6828 ASTReaderListener &Listener,
6829 std::string &SuggestedPredefines) {
6830 PreprocessorOptions PPOpts;
6834 bool ReadMacros =
Record[Idx++];
6836 for (
unsigned N =
Record[Idx++]; N; --N) {
6838 bool IsUndef =
Record[Idx++];
6839 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6844 for (
unsigned N =
Record[Idx++]; N; --N) {
6849 for (
unsigned N =
Record[Idx++]; N; --N) {
6858 SuggestedPredefines.clear();
6860 Complain, SuggestedPredefines);
6863std::pair<ModuleFile *, unsigned>
6864ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6865 GlobalPreprocessedEntityMapType::iterator
6866 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6867 assert(I != GlobalPreprocessedEntityMap.end() &&
6868 "Corrupted global preprocessed entity map");
6871 return std::make_pair(M, LocalIndex);
6874llvm::iterator_range<PreprocessingRecord::iterator>
6875ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6876 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6880 return llvm::make_range(PreprocessingRecord::iterator(),
6881 PreprocessingRecord::iterator());
6884bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6885 unsigned int ClientLoadCapabilities) {
6886 return ClientLoadCapabilities & ARR_OutOfDate &&
6889 .getInMemoryModuleCache()
6890 .isPCMFinal(ModuleFileName);
6893llvm::iterator_range<ASTReader::ModuleDeclIterator>
6895 return llvm::make_range(
6902 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6903 assert(I != GlobalSkippedRangeMap.end() &&
6904 "Corrupted global skipped range map");
6907 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6911 assert(Range.isValid());
6917 unsigned ModuleFileIndex = ID >> 32;
6918 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
6919 assert(getModuleManager().size() > ModuleFileIndex - 1);
6920 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6922 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6927 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6929 unsigned LocalIndex = PPInfo.second;
6934 if (!PP.getPreprocessingRecord()) {
6935 Error(
"no preprocessing record");
6942 Error(std::move(Err));
6949 Error(MaybeEntry.takeError());
6952 llvm::BitstreamEntry Entry = MaybeEntry.get();
6954 if (Entry.Kind != llvm::BitstreamEntry::Record)
6965 if (!MaybeRecType) {
6966 Error(MaybeRecType.takeError());
6971 bool isBuiltin =
Record[0];
6979 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
6999 if (DeserializationListener)
7000 DeserializationListener->MacroDefinitionRead(PPID, MD);
7006 const char *FullFileNameStart = Blob.data() +
Record[0];
7007 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
7009 if (!FullFileName.empty())
7010 File = PP.getFileManager().getOptionalFileRef(FullFileName);
7017 StringRef(Blob.data(),
Record[0]),
7025 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
7034unsigned ASTReader::findNextPreprocessedEntity(
7035 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
7037 for (GlobalSLocOffsetMapType::const_iterator
7038 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7044 return getTotalNumPreprocessedEntities();
7049struct PPEntityComp {
7050 const ASTReader &Reader;
7053 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7055 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
7056 SourceLocation LHS = getLoc(L);
7057 SourceLocation RHS = getLoc(R);
7061 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
7062 SourceLocation LHS = getLoc(L);
7066 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
7067 SourceLocation RHS = getLoc(R);
7071 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
7078unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7079 bool EndsAfter)
const {
7080 if (SourceMgr.isLocalSourceLocation(Loc))
7081 return getTotalNumPreprocessedEntities();
7083 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7084 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7085 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7086 "Corrupted global sloc offset map");
7088 if (SLocMapI->second->NumPreprocessedEntities == 0)
7089 return findNextPreprocessedEntity(SLocMapI);
7100 pp_iterator
First = pp_begin;
7104 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7105 PPEntityComp(*
this, M));
7114 std::advance(PPI,
Half);
7115 if (SourceMgr.isBeforeInTranslationUnit(
7116 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7119 Count = Count -
Half - 1;
7126 return findNextPreprocessedEntity(SLocMapI);
7133std::pair<unsigned, unsigned>
7135 if (Range.isInvalid())
7136 return std::make_pair(0,0);
7137 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7139 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
7140 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
7141 return std::make_pair(BeginID, EndID);
7151 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7153 unsigned LocalIndex = PPInfo.second;
7160 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7169 class HeaderFileInfoVisitor {
7171 std::optional<HeaderFileInfo> HFI;
7174 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7183 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7184 if (Pos == Table->end())
7191 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7197 HeaderFileInfoVisitor Visitor(FE);
7198 ModuleMgr.visit(Visitor);
7199 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7206 using DiagState = DiagnosticsEngine::DiagState;
7217 auto ReadDiagState = [&](
const DiagState &BasedOn,
7218 bool IncludeNonPragmaStates) {
7219 unsigned BackrefID =
Record[Idx++];
7221 return DiagStates[BackrefID - 1];
7224 Diag.DiagStates.push_back(BasedOn);
7225 DiagState *NewState = &
Diag.DiagStates.back();
7226 DiagStates.push_back(NewState);
7227 unsigned Size =
Record[Idx++];
7228 assert(Idx + Size * 2 <=
Record.size() &&
7229 "Invalid data, not enough diag/map pairs");
7231 unsigned DiagID =
Record[Idx++];
7234 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7247 Mapping = NewMapping;
7253 DiagState *FirstState;
7258 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7259 DiagStates.push_back(FirstState);
7263 "Invalid data, unexpected backref in initial state");
7265 assert(Idx <
Record.size() &&
7266 "Invalid data, not enough state change pairs in initial state");
7271 unsigned Flags =
Record[Idx++];
7272 DiagState Initial(*
Diag.getDiagnosticIDs());
7273 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7274 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7275 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7276 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7277 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7279 FirstState = ReadDiagState(Initial,
true);
7287 .StateTransitions.push_back({FirstState, 0});
7292 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7296 unsigned NumLocations =
Record[Idx++];
7297 while (NumLocations--) {
7298 assert(Idx <
Record.size() &&
7299 "Invalid data, missing pragma diagnostic states");
7301 assert(FID.
isValid() &&
"invalid FileID for transition");
7302 unsigned Transitions =
Record[Idx++];
7308 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7309 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7310 for (
unsigned I = 0; I != Transitions; ++I) {
7311 unsigned Offset =
Record[Idx++];
7312 auto *State = ReadDiagState(*FirstState,
false);
7313 F.StateTransitions.push_back({State, Offset});
7318 assert(Idx <
Record.size() &&
7319 "Invalid data, missing final pragma diagnostic state");
7321 auto *CurState = ReadDiagState(*FirstState,
false);
7324 Diag.DiagStatesByLoc.CurDiagState = CurState;
7325 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7330 auto &T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7332 T.push_back({CurState, 0});
7334 T[0].State = CurState;
7340 assert(Idx <
Record.size() &&
7341 "Invalid data, missing diagnostic push stack");
7342 unsigned NumPushes =
Record[Idx++];
7343 for (
unsigned I = 0; I != NumPushes; ++I) {
7344 auto *State = ReadDiagState(*FirstState,
false);
7346 Diag.DiagStateOnPushStack.push_back(State);
7355ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7356 auto [M, Index] = translateTypeIDToIndex(ID);
7363#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7364 case TYPE_##CODE_ID: return Type::CLASS_ID;
7365#include "clang/Serialization/TypeBitCodes.def"
7367 return std::nullopt;
7377QualType ASTReader::readTypeRecord(
TypeID ID) {
7378 assert(ContextObj &&
"reading type with no AST context");
7379 ASTContext &Context = *ContextObj;
7380 RecordLocation Loc = TypeCursorForIndex(ID);
7381 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7385 SavedStreamPosition SavedPosition(DeclsCursor);
7387 ReadingKindTracker ReadingKind(Read_Type, *
this);
7390 Deserializing AType(
this);
7392 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7393 Error(std::move(Err));
7396 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7398 Error(RawCode.takeError());
7402 ASTRecordReader
Record(*
this, *Loc.F);
7403 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7405 Error(Code.takeError());
7409 QualType baseType =
Record.readQualType();
7410 Qualifiers quals =
Record.readQualifiers();
7416 Error(
"Unexpected code for type");
7420 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7421 return TypeReader.read(*maybeClass);
7429 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7430 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7433 return Reader.readTypeSourceInfo();
7437 return Reader.readNestedNameSpecifierLoc();
7441 return Reader.readAttr();
7450#define ABSTRACT_TYPELOC(CLASS, PARENT)
7451#define TYPELOC(CLASS, PARENT) \
7452 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7453#include "clang/AST/TypeLocNodes.def"
7462void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7466void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7476void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7480void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7484void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7488void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7492void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7496void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7500void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7504void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7508void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7512void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7520 if (Reader.readBool())
7527 VisitArrayTypeLoc(TL);
7531 VisitArrayTypeLoc(TL);
7534void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7535 VisitArrayTypeLoc(TL);
7538void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7539 DependentSizedArrayTypeLoc TL) {
7540 VisitArrayTypeLoc(TL);
7543void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7544 DependentAddressSpaceTypeLoc TL) {
7551void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7552 DependentSizedExtVectorTypeLoc TL) {
7556void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7560void TypeLocReader::VisitDependentVectorTypeLoc(
7561 DependentVectorTypeLoc TL) {
7565void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7569void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7576void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7577 DependentSizedMatrixTypeLoc TL) {
7590 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7596 VisitFunctionTypeLoc(TL);
7600 VisitFunctionTypeLoc(TL);
7603void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7604 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7605 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7606 SourceLocation NameLoc = readSourceLocation();
7607 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7610void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7611 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7612 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7613 SourceLocation NameLoc = readSourceLocation();
7614 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7617void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7618 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7619 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7620 SourceLocation NameLoc = readSourceLocation();
7621 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7624void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7630void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7637void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7642void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7646void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7660 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7665void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7667 if (Reader.readBool())
7669 if (Reader.readBool())
7673void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7687 VisitTagTypeLoc(TL);
7691 VisitTagTypeLoc(TL);
7694void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7696void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7700void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7704void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7708void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7712void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7713 HLSLAttributedResourceTypeLoc TL) {
7717void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7721void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7725void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7726 SubstTemplateTypeParmTypeLoc TL) {
7730void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7731 SubstTemplateTypeParmPackTypeLoc TL) {
7735void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7736 SubstBuiltinTemplatePackTypeLoc TL) {
7740void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7741 TemplateSpecializationTypeLoc TL) {
7742 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7743 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7744 SourceLocation TemplateKeywordLoc = readSourceLocation();
7745 SourceLocation NameLoc = readSourceLocation();
7746 SourceLocation LAngleLoc = readSourceLocation();
7747 SourceLocation RAngleLoc = readSourceLocation();
7748 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7749 LAngleLoc, RAngleLoc);
7750 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7751 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7752 Args[I] = Reader.readTemplateArgumentLocInfo(
7753 TL.
getTypePtr()->template_arguments()[I].getKind());
7756void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7761void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7767void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7771void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7776void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7785void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7797void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7801void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7807void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7811void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7815void TypeLocReader::VisitDependentBitIntTypeLoc(
7816 clang::DependentBitIntTypeLoc TL) {
7820void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7854std::pair<ModuleFile *, unsigned>
7857 "Predefined type shouldn't be in TypesLoaded");
7859 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7861 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7862 assert(OwningModuleFile &&
7863 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7865 return {OwningModuleFile,
7870 assert(ContextObj &&
"reading type with no AST context");
7881 llvm_unreachable(
"Invalid predefined type");
7897 T = Context.UnsignedCharTy;
7900 T = Context.UnsignedShortTy;
7903 T = Context.UnsignedIntTy;
7906 T = Context.UnsignedLongTy;
7909 T = Context.UnsignedLongLongTy;
7912 T = Context.UnsignedInt128Ty;
7915 T = Context.SignedCharTy;
7918 T = Context.WCharTy;
7921 T = Context.ShortTy;
7930 T = Context.LongLongTy;
7933 T = Context.Int128Ty;
7936 T = Context.BFloat16Ty;
7942 T = Context.FloatTy;
7945 T = Context.DoubleTy;
7948 T = Context.LongDoubleTy;
7951 T = Context.ShortAccumTy;
7954 T = Context.AccumTy;
7957 T = Context.LongAccumTy;
7960 T = Context.UnsignedShortAccumTy;
7963 T = Context.UnsignedAccumTy;
7966 T = Context.UnsignedLongAccumTy;
7969 T = Context.ShortFractTy;
7972 T = Context.FractTy;
7975 T = Context.LongFractTy;
7978 T = Context.UnsignedShortFractTy;
7981 T = Context.UnsignedFractTy;
7984 T = Context.UnsignedLongFractTy;
7987 T = Context.SatShortAccumTy;
7990 T = Context.SatAccumTy;
7993 T = Context.SatLongAccumTy;
7996 T = Context.SatUnsignedShortAccumTy;
7999 T = Context.SatUnsignedAccumTy;
8002 T = Context.SatUnsignedLongAccumTy;
8005 T = Context.SatShortFractTy;
8008 T = Context.SatFractTy;
8011 T = Context.SatLongFractTy;
8014 T = Context.SatUnsignedShortFractTy;
8017 T = Context.SatUnsignedFractTy;
8020 T = Context.SatUnsignedLongFractTy;
8023 T = Context.Float16Ty;
8026 T = Context.Float128Ty;
8029 T = Context.Ibm128Ty;
8032 T = Context.OverloadTy;
8035 T = Context.UnresolvedTemplateTy;
8038 T = Context.BoundMemberTy;
8041 T = Context.PseudoObjectTy;
8044 T = Context.DependentTy;
8047 T = Context.UnknownAnyTy;
8050 T = Context.NullPtrTy;
8053 T = Context.Char8Ty;
8056 T = Context.Char16Ty;
8059 T = Context.Char32Ty;
8062 T = Context.ObjCBuiltinIdTy;
8065 T = Context.ObjCBuiltinClassTy;
8068 T = Context.ObjCBuiltinSelTy;
8070#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8071 case PREDEF_TYPE_##Id##_ID: \
8072 T = Context.SingletonId; \
8074#include "clang/Basic/OpenCLImageTypes.def"
8075#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8076 case PREDEF_TYPE_##Id##_ID: \
8077 T = Context.Id##Ty; \
8079#include "clang/Basic/OpenCLExtensionTypes.def"
8081 T = Context.OCLSamplerTy;
8084 T = Context.OCLEventTy;
8087 T = Context.OCLClkEventTy;
8090 T = Context.OCLQueueTy;
8093 T = Context.OCLReserveIDTy;
8096 T = Context.getAutoDeductType();
8099 T = Context.getAutoRRefDeductType();
8102 T = Context.ARCUnbridgedCastTy;
8105 T = Context.BuiltinFnTy;
8108 T = Context.IncompleteMatrixIdxTy;
8111 T = Context.ArraySectionTy;
8114 T = Context.OMPArrayShapingTy;
8117 T = Context.OMPIteratorTy;
8119#define SVE_TYPE(Name, Id, SingletonId) \
8120 case PREDEF_TYPE_##Id##_ID: \
8121 T = Context.SingletonId; \
8123#include "clang/Basic/AArch64ACLETypes.def"
8124#define PPC_VECTOR_TYPE(Name, Id, Size) \
8125 case PREDEF_TYPE_##Id##_ID: \
8126 T = Context.Id##Ty; \
8128#include "clang/Basic/PPCTypes.def"
8129#define RVV_TYPE(Name, Id, SingletonId) \
8130 case PREDEF_TYPE_##Id##_ID: \
8131 T = Context.SingletonId; \
8133#include "clang/Basic/RISCVVTypes.def"
8134#define WASM_TYPE(Name, Id, SingletonId) \
8135 case PREDEF_TYPE_##Id##_ID: \
8136 T = Context.SingletonId; \
8138#include "clang/Basic/WebAssemblyReferenceTypes.def"
8139#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8140 case PREDEF_TYPE_##Id##_ID: \
8141 T = Context.SingletonId; \
8143#include "clang/Basic/AMDGPUTypes.def"
8144#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8145 case PREDEF_TYPE_##Id##_ID: \
8146 T = Context.SingletonId; \
8148#include "clang/Basic/HLSLIntangibleTypes.def"
8151 assert(!T.isNull() &&
"Unknown predefined type");
8152 return T.withFastQualifiers(FastQuals);
8155 unsigned Index = translateTypeIDToIndex(ID).second;
8157 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
8158 if (TypesLoaded[Index].isNull()) {
8159 TypesLoaded[Index] = readTypeRecord(ID);
8160 if (TypesLoaded[Index].isNull())
8163 TypesLoaded[Index]->setFromAST();
8164 if (DeserializationListener)
8166 TypesLoaded[Index]);
8169 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8182 ReadModuleOffsetMap(F);
8185 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8187 if (ModuleFileIndex == 0)
8192 ModuleFileIndex = MF.
Index + 1;
8193 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8212 TemplateNameLoc, EllipsisLoc);
8223 llvm_unreachable(
"unexpected template argument loc");
8240 unsigned NumArgsAsWritten =
readInt();
8241 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8255 if (NumCurrentElementsDeserializing) {
8260 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8283 auto *II = Name.getAsIdentifierInfo();
8284 assert(II &&
"non-identifier name in C?");
8285 if (II->isOutOfDate())
8302 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8303 Template = CTSD->getSpecializedTemplate();
8304 Args = CTSD->getTemplateArgs().asArray();
8305 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8306 Template = VTSD->getSpecializedTemplate();
8307 Args = VTSD->getTemplateArgs().asArray();
8308 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8309 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8311 Args = FD->getTemplateSpecializationArgs()->asArray();
8316 Template->loadLazySpecializationsImpl(Args);
8321 RecordLocation Loc = getLocalBitOffset(Offset);
8324 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8325 Error(std::move(Err));
8328 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8333 Error(MaybeCode.takeError());
8336 unsigned Code = MaybeCode.get();
8340 if (!MaybeRecCode) {
8341 Error(MaybeRecCode.takeError());
8345 Error(
"malformed AST file: missing C++ ctor initializers");
8349 return Record.readCXXCtorInitializers();
8353 assert(ContextObj &&
"reading base specifiers with no AST context");
8356 RecordLocation Loc = getLocalBitOffset(Offset);
8359 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8360 Error(std::move(Err));
8363 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8368 Error(MaybeCode.takeError());
8371 unsigned Code = MaybeCode.get();
8375 if (!MaybeRecCode) {
8376 Error(MaybeCode.takeError());
8379 unsigned RecCode = MaybeRecCode.get();
8382 Error(
"malformed AST file: missing C++ base specifiers");
8386 unsigned NumBases =
Record.readInt();
8389 for (
unsigned I = 0; I != NumBases; ++I)
8390 Bases[I] =
Record.readCXXBaseSpecifier();
8403 ReadModuleOffsetMap(F);
8406 OwningModuleFileIndex == 0
8410 if (OwningModuleFileIndex == 0)
8413 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8422 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8423 return M.
Index == ModuleFileIndex - 1;
8431 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8432 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8452 DeclCursorForID(ID, Loc);
8457 assert(ContextObj &&
"reading predefined decl without AST context");
8459 Decl *NewLoaded =
nullptr;
8465 return Context.getTranslationUnitDecl();
8468 if (Context.ObjCIdDecl)
8469 return Context.ObjCIdDecl;
8470 NewLoaded = Context.getObjCIdDecl();
8474 if (Context.ObjCSelDecl)
8475 return Context.ObjCSelDecl;
8476 NewLoaded = Context.getObjCSelDecl();
8480 if (Context.ObjCClassDecl)
8481 return Context.ObjCClassDecl;
8482 NewLoaded = Context.getObjCClassDecl();
8486 if (Context.ObjCProtocolClassDecl)
8487 return Context.ObjCProtocolClassDecl;
8488 NewLoaded = Context.getObjCProtocolDecl();
8492 if (Context.Int128Decl)
8493 return Context.Int128Decl;
8494 NewLoaded = Context.getInt128Decl();
8498 if (Context.UInt128Decl)
8499 return Context.UInt128Decl;
8500 NewLoaded = Context.getUInt128Decl();
8504 if (Context.ObjCInstanceTypeDecl)
8505 return Context.ObjCInstanceTypeDecl;
8506 NewLoaded = Context.getObjCInstanceTypeDecl();
8510 if (Context.BuiltinVaListDecl)
8511 return Context.BuiltinVaListDecl;
8512 NewLoaded = Context.getBuiltinVaListDecl();
8516 if (Context.VaListTagDecl)
8517 return Context.VaListTagDecl;
8518 NewLoaded = Context.getVaListTagDecl();
8522 if (Context.BuiltinMSVaListDecl)
8523 return Context.BuiltinMSVaListDecl;
8524 NewLoaded = Context.getBuiltinMSVaListDecl();
8529 return Context.getMSGuidTagDecl();
8532 if (Context.ExternCContext)
8533 return Context.ExternCContext;
8534 NewLoaded = Context.getExternCContextDecl();
8538 if (Context.CFConstantStringTypeDecl)
8539 return Context.CFConstantStringTypeDecl;
8540 NewLoaded = Context.getCFConstantStringDecl();
8544 if (Context.CFConstantStringTagDecl)
8545 return Context.CFConstantStringTagDecl;
8546 NewLoaded = Context.getCFConstantStringTagDecl();
8550 return Context.getMSTypeInfoTagDecl();
8552#define BuiltinTemplate(BTName) \
8553 case PREDEF_DECL##BTName##_ID: \
8554 if (Context.Decl##BTName) \
8555 return Context.Decl##BTName; \
8556 NewLoaded = Context.get##BTName##Decl(); \
8558#include "clang/Basic/BuiltinTemplates.inc"
8561 llvm_unreachable(
"Invalid decl ID");
8565 assert(NewLoaded &&
"Failed to load predefined decl?");
8567 if (DeserializationListener)
8568 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8573unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8574 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8575 if (!OwningModuleFile) {
8584 assert(ContextObj &&
"reading decl with no AST context");
8593 Merged.push_back(ID);
8598 unsigned Index = translateGlobalDeclIDToIndex(ID);
8600 if (Index >= DeclsLoaded.size()) {
8601 assert(0 &&
"declaration ID out-of-range for AST file");
8602 Error(
"declaration ID out-of-range for AST file");
8606 return DeclsLoaded[Index];
8613 unsigned Index = translateGlobalDeclIDToIndex(ID);
8615 if (Index >= DeclsLoaded.size()) {
8616 assert(0 &&
"declaration ID out-of-range for AST file");
8617 Error(
"declaration ID out-of-range for AST file");
8621 if (!DeclsLoaded[Index]) {
8623 if (DeserializationListener)
8624 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8627 return DeclsLoaded[Index];
8636 ReadModuleOffsetMap(M);
8646 uint64_t OrignalModuleFileIndex = 0;
8649 OrignalModuleFileIndex = I + 1;
8653 if (!OrignalModuleFileIndex)
8661 if (Idx >=
Record.size()) {
8662 Error(
"Corrupted AST file");
8679 RecordLocation Loc = getLocalBitOffset(Offset);
8680 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8681 Error(std::move(Err));
8684 assert(NumCurrentElementsDeserializing == 0 &&
8685 "should not be called while already deserializing");
8687 return ReadStmtFromStream(*Loc.F);
8690bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8694 auto It = SpecLookups.find(D);
8695 if (It == SpecLookups.end())
8701 It->second.Table.findAll();
8705 SpecLookups.erase(It);
8707 bool NewSpecsFound =
false;
8708 Deserializing LookupResults(
this);
8709 for (
auto &Info : Infos) {
8710 if (GetExistingDecl(Info))
8712 NewSpecsFound =
true;
8716 return NewSpecsFound;
8723 bool NewSpecsFound =
8724 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8726 return NewSpecsFound;
8728 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8729 return NewSpecsFound;
8732bool ASTReader::LoadExternalSpecializationsImpl(
8733 SpecLookupTableTy &SpecLookups,
const Decl *D,
8738 if (
auto It = SpecLookups.find(D); It != SpecLookups.end())
8739 LookupTable = &It->getSecond();
8745 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8747 llvm::raw_string_ostream OS(Name);
8754 Deserializing LookupResults(
this);
8759 LookupTable->
Table.find(HashValue);
8761 bool NewSpecsFound =
false;
8762 for (
auto &Info : Infos) {
8763 if (GetExistingDecl(Info))
8765 NewSpecsFound =
true;
8769 return NewSpecsFound;
8776 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8777 PartialSpecializationsLookups, D, TemplateArgs);
8779 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8781 return NewDeclsFound;
8789 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8790 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8791 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8793 if (!IsKindWeWant(K))
8796 auto ID = (
DeclID) + LexicalDecls[I + 1];
8801 if (PredefsVisited[ID])
8804 PredefsVisited[ID] =
true;
8808 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8816 for (
const auto &Lexical : TULexicalDecls)
8817 Visit(Lexical.first, Lexical.second);
8819 auto I = LexicalDecls.find(DC);
8820 if (I != LexicalDecls.end())
8821 Visit(I->second.first, I->second.second);
8824 ++NumLexicalDeclContextsRead;
8829class UnalignedDeclIDComp {
8835 : Reader(Reader), Mod(M) {}
8844 SourceLocation RHS = getLocation(R);
8849 SourceLocation LHS = getLocation(L);
8863 unsigned Offset,
unsigned Length,
8867 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8868 if (I == FileDeclIDs.end())
8871 FileDeclsInfo &DInfo = I->second;
8872 if (DInfo.Decls.empty())
8876 BeginLoc =
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
8879 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8881 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8882 if (BeginIt != DInfo.Decls.begin())
8888 while (BeginIt != DInfo.Decls.begin() &&
8891 ->isTopLevelDeclInObjCContainer())
8895 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8896 if (EndIt != DInfo.Decls.end())
8909 "DeclContext has no visible decls in storage");
8916 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8938 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8939 ++NumVisibleDeclContextsRead;
8940 Find(It->second.Table, Name);
8943 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8944 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8945 ++NumModuleLocalVisibleDeclContexts;
8946 Find(It->second.Table, std::make_pair(Name, NamedModule));
8949 if (
auto *NamedModule =
8950 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8952 FindModuleLocalLookup(NamedModule);
8957 if (ContextObj && ContextObj->getCurrentNamedModule())
8958 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8960 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8961 ++NumTULocalVisibleDeclContexts;
8962 Find(It->second.Table, Name);
8975 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
8976 auto It = LookupTables.find(DC);
8977 if (It == LookupTables.end())
8999 findAll(Lookups, NumVisibleDeclContextsRead);
9000 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
9001 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
9003 for (
auto &[Name, DS] : Decls)
9006 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
9011 auto I = Lookups.find(Primary);
9012 return I == Lookups.end() ?
nullptr : &I->second;
9017 auto I = ModuleLocalLookups.find(Primary);
9018 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
9023 auto I = TULocalLookups.find(Primary);
9024 return I == TULocalLookups.end() ?
nullptr : &I->second;
9031 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
9032 auto I = LookupTable.find(D);
9033 return I == LookupTable.end() ?
nullptr : &I->second;
9038 return PartialSpecializationsLookups.contains(D) ||
9039 SpecializationsLookups.contains(D);
9048 assert(ImplD && Consumer);
9050 for (
auto *I : ImplD->
methods())
9056void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9057 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9060 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9063void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9064 Consumer->HandleVTable(RD);
9068 this->Consumer = Consumer;
9071 PassInterestingDeclsToConsumer();
9073 if (DeserializationListener)
9074 DeserializationListener->ReaderInitialized(
this);
9078 std::fprintf(
stderr,
"*** AST File Statistics:\n");
9080 unsigned NumTypesLoaded =
9081 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
9082 unsigned NumDeclsLoaded =
9083 DeclsLoaded.size() -
9084 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
9085 unsigned NumIdentifiersLoaded =
9086 IdentifiersLoaded.size() -
9088 unsigned NumMacrosLoaded =
9089 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
9090 unsigned NumSelectorsLoaded =
9091 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
9094 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
9095 NumSLocEntriesRead, TotalNumSLocEntries,
9096 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9097 if (!TypesLoaded.empty())
9098 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
9099 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
9100 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
9101 if (!DeclsLoaded.empty())
9102 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
9103 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
9104 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9105 if (!IdentifiersLoaded.empty())
9106 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
9107 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
9108 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9109 if (!MacrosLoaded.empty())
9110 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9111 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
9112 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9113 if (!SelectorsLoaded.empty())
9114 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
9115 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
9116 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9117 if (TotalNumStatements)
9118 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
9119 NumStatementsRead, TotalNumStatements,
9120 ((
float)NumStatementsRead/TotalNumStatements * 100));
9122 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9123 NumMacrosRead, TotalNumMacros,
9124 ((
float)NumMacrosRead/TotalNumMacros * 100));
9125 if (TotalLexicalDeclContexts)
9126 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
9127 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9128 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9130 if (TotalVisibleDeclContexts)
9131 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
9132 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9133 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9135 if (TotalModuleLocalVisibleDeclContexts)
9137 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
9138 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9139 ((
float)NumModuleLocalVisibleDeclContexts /
9140 TotalModuleLocalVisibleDeclContexts * 100));
9141 if (TotalTULocalVisibleDeclContexts)
9142 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
9143 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9144 ((
float)NumTULocalVisibleDeclContexts /
9145 TotalTULocalVisibleDeclContexts * 100));
9146 if (TotalNumMethodPoolEntries)
9147 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
9148 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9149 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9151 if (NumMethodPoolLookups)
9152 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
9153 NumMethodPoolHits, NumMethodPoolLookups,
9154 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9155 if (NumMethodPoolTableLookups)
9156 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
9157 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9158 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9160 if (NumIdentifierLookupHits)
9162 " %u / %u identifier table lookups succeeded (%f%%)\n",
9163 NumIdentifierLookupHits, NumIdentifierLookups,
9164 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9167 std::fprintf(
stderr,
"\n");
9168 GlobalIndex->printStats();
9171 std::fprintf(
stderr,
"\n");
9173 std::fprintf(
stderr,
"\n");
9176template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9177LLVM_DUMP_METHOD
static void
9180 InitialCapacity> &Map) {
9181 if (Map.begin() == Map.end())
9186 llvm::errs() << Name <<
":\n";
9187 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9189 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9194 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9196 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9200 GlobalPreprocessedEntityMap);
9202 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9211 if (llvm::MemoryBuffer *buf = I.Buffer) {
9212 size_t bytes = buf->getBufferSize();
9213 switch (buf->getBufferKind()) {
9214 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9217 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9238 if (!FPPragmaOptions.empty()) {
9239 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9242 SemaObj->CurFPFeatures =
9248 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9249 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9250 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9251 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9253 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9255 DeclsWithEffectsToVerify.clear();
9257 SemaObj->OpenCLFeatures = OpenCLExtensions;
9263 assert(SemaObj &&
"no Sema to update");
9267 if (!SemaDeclRefs.empty()) {
9268 assert(SemaDeclRefs.size() % 3 == 0);
9269 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9270 if (!SemaObj->StdNamespace)
9271 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9272 if (!SemaObj->StdBadAlloc)
9273 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9274 if (!SemaObj->StdAlignValT)
9275 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9277 SemaDeclRefs.clear();
9282 if(OptimizeOffPragmaLocation.isValid())
9283 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9284 if (PragmaMSStructState != -1)
9286 if (PointersToMembersPragmaLocation.isValid()) {
9287 SemaObj->ActOnPragmaMSPointersToMembers(
9289 PragmaMSPointersToMembersState,
9290 PointersToMembersPragmaLocation);
9292 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9293 if (!RISCVVecIntrinsicPragma.empty()) {
9294 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9295 "Wrong number of RISCVVecIntrinsicPragma");
9296 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9297 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9298 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9301 if (PragmaAlignPackCurrentValue) {
9305 bool DropFirst =
false;
9306 if (!PragmaAlignPackStack.empty() &&
9307 PragmaAlignPackStack.front().Location.isInvalid()) {
9308 assert(PragmaAlignPackStack.front().Value ==
9309 SemaObj->AlignPackStack.DefaultValue &&
9310 "Expected a default alignment value");
9311 SemaObj->AlignPackStack.Stack.emplace_back(
9312 PragmaAlignPackStack.front().SlotLabel,
9313 SemaObj->AlignPackStack.CurrentValue,
9314 SemaObj->AlignPackStack.CurrentPragmaLocation,
9315 PragmaAlignPackStack.front().PushLocation);
9318 for (
const auto &Entry :
9319 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9320 SemaObj->AlignPackStack.Stack.emplace_back(
9321 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9323 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9324 assert(*PragmaAlignPackCurrentValue ==
9325 SemaObj->AlignPackStack.DefaultValue &&
9326 "Expected a default align and pack value");
9329 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9330 SemaObj->AlignPackStack.CurrentPragmaLocation =
9331 PragmaAlignPackCurrentLocation;
9334 if (FpPragmaCurrentValue) {
9338 bool DropFirst =
false;
9339 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9340 assert(FpPragmaStack.front().Value ==
9341 SemaObj->FpPragmaStack.DefaultValue &&
9342 "Expected a default pragma float_control value");
9343 SemaObj->FpPragmaStack.Stack.emplace_back(
9344 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9345 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9346 FpPragmaStack.front().PushLocation);
9349 for (
const auto &Entry :
9351 SemaObj->FpPragmaStack.Stack.emplace_back(
9352 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9353 if (FpPragmaCurrentLocation.isInvalid()) {
9354 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9355 "Expected a default pragma float_control value");
9358 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9359 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9364 for (
auto &Import : PendingImportedModulesSema) {
9365 if (Import.ImportLoc.isInvalid())
9368 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9371 PendingImportedModulesSema.clear();
9378 IdentifierLookupVisitor Visitor(Name, 0,
9379 NumIdentifierLookups,
9380 NumIdentifierLookupHits);
9386 if (PP.getLangOpts().CPlusPlus) {
9387 for (
auto *F : ModuleMgr.pch_modules())
9396 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9401 ModuleMgr.visit(Visitor, HitsPtr);
9423 ASTIdentifierLookupTable::key_iterator Current;
9427 ASTIdentifierLookupTable::key_iterator End;
9434 bool SkipModules =
false);
9436 StringRef
Next()
override;
9443 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9447 while (Current == End) {
9459 Current = IdTable->key_begin();
9460 End = IdTable->key_end();
9465 StringRef
Result = *Current;
9474 std::unique_ptr<IdentifierIterator> Current;
9475 std::unique_ptr<IdentifierIterator> Queued;
9478 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9479 std::unique_ptr<IdentifierIterator> Second)
9480 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9482 StringRef
Next()
override {
9486 StringRef result = Current->Next();
9487 if (!result.empty())
9492 std::swap(Current, Queued);
9501 std::unique_ptr<IdentifierIterator> ReaderIter(
9503 std::unique_ptr<IdentifierIterator> ModulesIter(
9504 GlobalIndex->createIdentifierIterator());
9505 return new ChainedIdentifierIterator(std::move(ReaderIter),
9506 std::move(ModulesIter));
9518 unsigned PriorGeneration;
9519 unsigned InstanceBits = 0;
9520 unsigned FactoryBits = 0;
9521 bool InstanceHasMoreThanOneDecl =
false;
9522 bool FactoryHasMoreThanOneDecl =
false;
9528 unsigned PriorGeneration)
9529 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9539 ++Reader.NumMethodPoolTableLookups;
9542 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9543 if (Pos == PoolTable->end())
9546 ++Reader.NumMethodPoolTableHits;
9547 ++Reader.NumSelectorsRead;
9551 ++Reader.NumMethodPoolEntriesRead;
9553 if (Reader.DeserializationListener)
9554 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9559 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9560 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9561 InstanceBits =
Data.InstanceBits;
9562 FactoryBits =
Data.FactoryBits;
9563 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9564 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9570 return InstanceMethods;
9575 return FactoryMethods;
9582 return InstanceHasMoreThanOneDecl;
9600 unsigned &Generation = SelectorGeneration[Sel];
9601 unsigned PriorGeneration = Generation;
9603 SelectorOutOfDate[Sel] =
false;
9606 ++NumMethodPoolLookups;
9608 ModuleMgr.visit(Visitor);
9614 ++NumMethodPoolHits;
9635 if (SelectorOutOfDate[Sel])
9643 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9645 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9646 Namespaces.push_back(Namespace);
9651 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9652 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9653 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9656 Undefined.insert(std::make_pair(D, Loc));
9658 UndefinedButUsed.clear();
9664 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9667 uint64_t Count = DelayedDeleteExprs[Idx++];
9668 for (uint64_t
C = 0;
C < Count; ++
C) {
9671 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9672 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9679 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9680 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9682 TentativeDefs.push_back(Var);
9684 TentativeDefinitions.clear();
9689 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9691 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9695 UnusedFileScopedDecls.clear();
9700 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9702 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9706 DelegatingCtorDecls.clear();
9710 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9712 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9716 ExtVectorDecls.clear();
9721 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9724 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9728 UnusedLocalTypedefNameCandidates.clear();
9733 for (
auto I : DeclsToCheckForDeferredDiags) {
9734 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9738 DeclsToCheckForDeferredDiags.clear();
9743 if (ReferencedSelectorsData.empty())
9748 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9750 while (I < DataSize) {
9754 Sels.push_back(std::make_pair(Sel, SelLoc));
9756 ReferencedSelectorsData.clear();
9761 if (WeakUndeclaredIdentifiers.empty())
9764 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9772 WeakIDs.push_back(std::make_pair(WeakId, WI));
9774 WeakUndeclaredIdentifiers.clear();
9778 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9779 if (ExtnameUndeclaredIdentifiers.empty())
9782 for (
unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9789 AsmLabelAttr *
Attr = AsmLabelAttr::CreateImplicit(
9793 ExtnameIDs.push_back(std::make_pair(NameId,
Attr));
9795 ExtnameUndeclaredIdentifiers.clear();
9799 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9801 VTableUse &TableInfo = VTableUses[Idx++];
9802 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9805 VTables.push_back(VT);
9813 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9814 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9818 Pending.push_back(std::make_pair(D, Loc));
9820 PendingInstantiations.clear();
9824 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9826 for (
auto &LPT : LateParsedTemplates) {
9829 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9833 auto LT = std::make_unique<LateParsedTemplate>();
9834 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9838 assert(F &&
"No module");
9840 unsigned TokN = LateParsed[Idx++];
9841 LT->Toks.reserve(TokN);
9842 for (
unsigned T = 0; T < TokN; ++T)
9843 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9845 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9849 LateParsedTemplates.clear();
9861 if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9862 Iter != LambdaDeclarationsForMerging.end() &&
9863 Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
9872 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9881 assert(ID &&
"Non-zero identifier ID required");
9882 unsigned Index = translateIdentifierIDToIndex(ID).second;
9883 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9884 IdentifiersLoaded[Index] = II;
9885 if (DeserializationListener)
9886 DeserializationListener->IdentifierRead(ID, II);
9908 if (NumCurrentElementsDeserializing && !Decls) {
9909 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9913 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9926 Decls->push_back(D);
9933 pushExternalDeclIntoScope(D, II);
9937std::pair<ModuleFile *, unsigned>
9938ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9940 return {
nullptr, 0};
9942 unsigned ModuleFileIndex = ID >> 32;
9943 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9945 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9957 if (IdentifiersLoaded.empty()) {
9958 Error(
"no identifier table in AST file");
9962 auto [M, Index] = translateIdentifierIDToIndex(ID);
9963 if (!IdentifiersLoaded[Index]) {
9964 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9967 const unsigned char *
Data =
9973 auto &II = PP.getIdentifierTable().get(Key);
9974 IdentifiersLoaded[Index] = &II;
9977 if (DeserializationListener)
9978 DeserializationListener->IdentifierRead(ID, &II);
9981 return IdentifiersLoaded[Index];
9993 ReadModuleOffsetMap(M);
9995 unsigned ModuleFileIndex = LocalID >> 32;
9996 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9999 assert(MF &&
"malformed identifier ID encoding?");
10001 if (!ModuleFileIndex)
10007std::pair<ModuleFile *, unsigned>
10008ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
10010 return {
nullptr, 0};
10012 unsigned ModuleFileIndex = ID >> 32;
10013 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
10017 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
10026 if (MacrosLoaded.empty()) {
10027 Error(
"no macro table in AST file");
10031 auto [M, Index] = translateMacroIDToIndex(ID);
10032 if (!MacrosLoaded[Index]) {
10033 assert(M !=
nullptr &&
"Untranslated Macro ID?");
10039 if (DeserializationListener)
10040 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10043 return MacrosLoaded[Index];
10051 ReadModuleOffsetMap(M);
10053 unsigned ModuleFileIndex = LocalID >> 32;
10054 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10057 assert(MF &&
"malformed identifier ID encoding?");
10059 if (!ModuleFileIndex) {
10064 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
10073 ReadModuleOffsetMap(M);
10078 &&
"Invalid index into submodule index remap");
10080 return LocalID + I->second;
10091 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
10094 int IndexFromEnd =
static_cast<int>(ID >> 1);
10095 assert(IndexFromEnd &&
"got reference to unknown module file");
10112 auto I = llvm::find(PCHModules, M);
10113 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
10114 return std::distance(I, PCHModules.end()) << 1;
10123 const auto &PCHChain = ModuleMgr.pch_modules();
10124 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10125 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10129 llvm::sys::path::parent_path(MF.
FileName),
10132 return std::nullopt;
10136 auto I = DefinitionSource.find(FD);
10137 if (I == DefinitionSource.end())
10143 return ThisDeclarationWasADefinitionSet.contains(FD);
10154 if (ID > SelectorsLoaded.size()) {
10155 Error(
"selector ID out of range in AST file");
10159 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
10162 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
10166 SelectorsLoaded[ID - 1] =
10168 if (DeserializationListener)
10169 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10172 return SelectorsLoaded[ID - 1];
10190 ReadModuleOffsetMap(M);
10195 &&
"Invalid index into selector index remap");
10197 return LocalID + I->second;
10228 NameInfo.
setName(readDeclarationName());
10242 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10243 assert(Op.isValid());
10249 unsigned NumTPLists =
readInt();
10254 for (
unsigned i = 0; i != NumTPLists; ++i)
10265 unsigned NumParams =
readInt();
10267 Params.reserve(NumParams);
10268 while (NumParams--)
10271 bool HasRequiresClause =
readBool();
10272 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10275 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10276 return TemplateParams;
10281 bool Canonicalize) {
10282 unsigned NumTemplateArgs =
readInt();
10283 TemplArgs.reserve(NumTemplateArgs);
10284 while (NumTemplateArgs--)
10290 unsigned NumDecls =
readInt();
10292 while (NumDecls--) {
10304 bool inheritConstructors =
readBool();
10310 Result.setInheritConstructors(inheritConstructors);
10317 unsigned NumInitializers =
readInt();
10318 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10320 for (
unsigned i = 0; i != NumInitializers; ++i) {
10322 bool IsBaseVirtual =
false;
10353 BOMInit =
new (Context)
10355 RParenLoc, MemberOrEllipsisLoc);
10357 BOMInit =
new (Context)
10360 BOMInit =
new (Context)
10364 BOMInit =
new (Context)
10366 LParenLoc,
Init, RParenLoc);
10369 unsigned SourceOrder =
readInt();
10373 CtorInitializers[i] = BOMInit;
10376 return CtorInitializers;
10384 for (
unsigned I = 0; I != N; ++I) {
10385 auto Kind = readNestedNameSpecifierKind();
10390 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10399 Builder.Make(Context, T->getTypeLoc(), ColonColonLoc);
10405 Builder.MakeGlobal(Context, ColonColonLoc);
10412 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10417 llvm_unreachable(
"unexpected null nested name specifier");
10432 const StringRef Blob) {
10433 unsigned Count =
Record[0];
10434 const char *Byte = Blob.data();
10435 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10436 for (
unsigned I = 0; I < Count; ++Byte)
10437 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10438 if (*Byte & (1 << Bit))
10445 return llvm::APFloat(Sem,
readAPInt());
10450 unsigned Len =
Record[Idx++];
10458 unsigned Len =
Record[Idx++];
10459 StringRef
Result = Blob.substr(0, Len);
10460 Blob = Blob.substr(Len);
10484 unsigned Major =
Record[Idx++];
10485 unsigned Minor =
Record[Idx++];
10486 unsigned Subminor =
Record[Idx++];
10488 return VersionTuple(Major);
10490 return VersionTuple(Major, Minor - 1);
10491 return VersionTuple(Major, Minor - 1, Subminor - 1);
10502 return Diag(CurrentImportLoc, DiagID);
10506 return Diags.Report(Loc, DiagID);
10510 llvm::function_ref<
void()> Fn) {
10513 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10517 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10523 return PP.getIdentifierTable();
10529 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10530 "Already have a SwitchCase with this ID");
10531 (*CurrSwitchCaseStmts)[ID] = SC;
10536 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10537 return (*CurrSwitchCaseStmts)[ID];
10541 CurrSwitchCaseStmts->clear();
10546 std::vector<RawComment *> Comments;
10553 BitstreamCursor &Cursor = I->first;
10560 Cursor.advanceSkippingSubblocks(
10561 BitstreamCursor::AF_DontPopBlockAtEnd);
10563 Error(MaybeEntry.takeError());
10566 llvm::BitstreamEntry Entry = MaybeEntry.get();
10568 switch (Entry.Kind) {
10569 case llvm::BitstreamEntry::SubBlock:
10570 case llvm::BitstreamEntry::Error:
10571 Error(
"malformed block record in AST file");
10573 case llvm::BitstreamEntry::EndBlock:
10575 case llvm::BitstreamEntry::Record:
10583 if (!MaybeComment) {
10584 Error(MaybeComment.takeError());
10593 bool IsTrailingComment =
Record[Idx++];
10594 bool IsAlmostTrailingComment =
Record[Idx++];
10595 Comments.push_back(
new (Context)
RawComment(
10596 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10606 if (Loc.first.isValid())
10607 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10620 assert(NumUserInputs <= NumInputs);
10621 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10622 for (
unsigned I = 0; I < N; ++I) {
10623 bool IsSystem = I >= NumUserInputs;
10625 Visitor(IFI, IsSystem);
10630 bool IncludeSystem,
bool Complain,
10632 bool isSystem)> Visitor) {
10635 assert(NumUserInputs <= NumInputs);
10636 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10637 for (
unsigned I = 0; I < N; ++I) {
10638 bool IsSystem = I >= NumUserInputs;
10639 InputFile IF = getInputFile(MF, I+1, Complain);
10640 Visitor(IF, IsSystem);
10648 for (
unsigned I = 0; I < NumInputs; ++I) {
10651 if (
auto FE = getInputFile(MF, I + 1).getFile())
10656void ASTReader::finishPendingActions() {
10657 while (!PendingIdentifierInfos.empty() ||
10658 !PendingDeducedFunctionTypes.empty() ||
10659 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10660 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10661 !PendingUpdateRecords.empty() ||
10662 !PendingObjCExtensionIvarRedeclarations.empty()) {
10665 using TopLevelDeclsMap =
10666 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10667 TopLevelDeclsMap TopLevelDecls;
10669 while (!PendingIdentifierInfos.empty()) {
10672 std::move(PendingIdentifierInfos.back().second);
10673 PendingIdentifierInfos.pop_back();
10680 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10681 auto *FD = PendingDeducedFunctionTypes[I].first;
10682 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10684 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10687 if (DT->isDeduced()) {
10688 PendingDeducedTypeUpdates.insert(
10689 {FD->getCanonicalDecl(), FD->getReturnType()});
10696 PendingUndeducedFunctionDecls.push_back(FD);
10700 PendingDeducedFunctionTypes.clear();
10704 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10705 auto *VD = PendingDeducedVarTypes[I].first;
10706 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10708 PendingDeducedVarTypes.clear();
10711 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10712 loadPendingDeclChain(PendingDeclChains[I].first,
10713 PendingDeclChains[I].second);
10714 PendingDeclChains.clear();
10717 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10718 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10719 IdentifierInfo *II = TLD->first;
10720 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10726 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10727 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10728 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10729 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10731 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10733 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10734 if (!Info.M->isModule())
10738 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10740 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10741 if (Info.M->isModule())
10745 PendingMacroIDs.clear();
10749 while (!PendingDeclContextInfos.empty()) {
10750 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10751 PendingDeclContextInfos.pop_front();
10754 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10758 while (!PendingUpdateRecords.empty()) {
10759 auto Update = PendingUpdateRecords.pop_back_val();
10760 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10761 loadDeclUpdateRecords(
Update);
10764 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10765 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10766 auto DuplicateIvars =
10767 PendingObjCExtensionIvarRedeclarations.back().second;
10769 StructuralEquivalenceContext Ctx(
10770 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10771 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10775 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10777 for (
auto IvarPair : DuplicateIvars) {
10778 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10780 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10786 ExtensionsPair.first->setInvalidDecl();
10787 ExtensionsPair.second->getClassInterface()
10789 ->setIvarList(
nullptr);
10791 for (
auto IvarPair : DuplicateIvars) {
10792 Diag(IvarPair.first->getLocation(),
10793 diag::err_duplicate_ivar_declaration)
10794 << IvarPair.first->getIdentifier();
10795 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10798 PendingObjCExtensionIvarRedeclarations.pop_back();
10804 assert(PendingFakeDefinitionData.empty() &&
10805 "faked up a class definition but never saw the real one");
10811 for (Decl *D : PendingDefinitions) {
10812 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10813 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10814 for (
auto *R = getMostRecentExistingDecl(RD);
R;
10815 R =
R->getPreviousDecl()) {
10818 "declaration thinks it's the definition but it isn't");
10826 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10831 for (
auto *R = getMostRecentExistingDecl(ID);
R;
R =
R->getPreviousDecl())
10837 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10838 for (
auto *R = getMostRecentExistingDecl(PD);
R;
R =
R->getPreviousDecl())
10845 for (
auto *R = getMostRecentExistingDecl(RTD);
R;
R =
R->getPreviousDecl())
10848 PendingDefinitions.clear();
10850 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10851 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10852 if (
auto *VD = dyn_cast<VarDecl>(D))
10853 return VD->isThisDeclarationADefinition() ||
10854 VD->isThisDeclarationADemotedDefinition();
10856 if (
auto *TD = dyn_cast<TagDecl>(D))
10857 return TD->isThisDeclarationADefinition() ||
10858 TD->isThisDeclarationADemotedDefinition();
10860 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10861 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10863 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10864 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10871 return hasDefinitionImpl(D, hasDefinitionImpl);
10887 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10893 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10894 PBEnd = PendingBodies.end();
10895 PB != PBEnd; ++PB) {
10896 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10898 const FunctionDecl *Defn =
nullptr;
10899 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10900 FD->setLazyBody(PB->second);
10902 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10905 if (!FD->isLateTemplateParsed() &&
10906 !NonConstDefn->isLateTemplateParsed() &&
10911 FD->getODRHash() != NonConstDefn->getODRHash()) {
10913 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10914 }
else if (FD->getLexicalParent()->isFileContext() &&
10915 NonConstDefn->getLexicalParent()->isFileContext()) {
10919 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10930 PendingBodies.clear();
10933 for (
auto [RD, MD] : PendingAddedClassMembers) {
10934 RD->addedMember(MD);
10936 PendingAddedClassMembers.clear();
10939 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10941 PendingMergedDefinitionsToDeduplicate.clear();
10945 for (Decl *D : PendingIncompleteDeclChains)
10946 markIncompleteDeclChain(D);
10947 PendingIncompleteDeclChains.clear();
10949 assert(PendingIdentifierInfos.empty() &&
10950 "Should be empty at the end of finishPendingActions");
10951 assert(PendingDeducedFunctionTypes.empty() &&
10952 "Should be empty at the end of finishPendingActions");
10953 assert(PendingDeducedVarTypes.empty() &&
10954 "Should be empty at the end of finishPendingActions");
10955 assert(PendingDeclChains.empty() &&
10956 "Should be empty at the end of finishPendingActions");
10957 assert(PendingMacroIDs.empty() &&
10958 "Should be empty at the end of finishPendingActions");
10959 assert(PendingDeclContextInfos.empty() &&
10960 "Should be empty at the end of finishPendingActions");
10961 assert(PendingUpdateRecords.empty() &&
10962 "Should be empty at the end of finishPendingActions");
10963 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10964 "Should be empty at the end of finishPendingActions");
10965 assert(PendingFakeDefinitionData.empty() &&
10966 "Should be empty at the end of finishPendingActions");
10967 assert(PendingDefinitions.empty() &&
10968 "Should be empty at the end of finishPendingActions");
10969 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10970 "Should be empty at the end of finishPendingActions");
10971 assert(PendingBodies.empty() &&
10972 "Should be empty at the end of finishPendingActions");
10973 assert(PendingAddedClassMembers.empty() &&
10974 "Should be empty at the end of finishPendingActions");
10975 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10976 "Should be empty at the end of finishPendingActions");
10977 assert(PendingIncompleteDeclChains.empty() &&
10978 "Should be empty at the end of finishPendingActions");
10981void ASTReader::diagnoseOdrViolations() {
10982 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10983 PendingRecordOdrMergeFailures.empty() &&
10984 PendingFunctionOdrMergeFailures.empty() &&
10985 PendingEnumOdrMergeFailures.empty() &&
10986 PendingObjCInterfaceOdrMergeFailures.empty() &&
10987 PendingObjCProtocolOdrMergeFailures.empty())
10994 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10995 PendingOdrMergeFailures.clear();
10996 for (
auto &Merge : OdrMergeFailures) {
10997 Merge.first->buildLookup();
10998 Merge.first->decls_begin();
10999 Merge.first->bases_begin();
11000 Merge.first->vbases_begin();
11001 for (
auto &RecordPair : Merge.second) {
11002 auto *RD = RecordPair.first;
11010 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
11011 PendingRecordOdrMergeFailures.clear();
11012 for (
auto &Merge : RecordOdrMergeFailures) {
11013 Merge.first->decls_begin();
11014 for (
auto &D : Merge.second)
11019 auto ObjCInterfaceOdrMergeFailures =
11020 std::move(PendingObjCInterfaceOdrMergeFailures);
11021 PendingObjCInterfaceOdrMergeFailures.clear();
11022 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11023 Merge.first->decls_begin();
11024 for (
auto &InterfacePair : Merge.second)
11025 InterfacePair.first->decls_begin();
11029 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11030 PendingFunctionOdrMergeFailures.clear();
11031 for (
auto &Merge : FunctionOdrMergeFailures) {
11032 Merge.first->buildLookup();
11033 Merge.first->decls_begin();
11034 Merge.first->getBody();
11035 for (
auto &FD : Merge.second) {
11043 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11044 PendingEnumOdrMergeFailures.clear();
11045 for (
auto &Merge : EnumOdrMergeFailures) {
11046 Merge.first->decls_begin();
11047 for (
auto &
Enum : Merge.second) {
11048 Enum->decls_begin();
11053 auto ObjCProtocolOdrMergeFailures =
11054 std::move(PendingObjCProtocolOdrMergeFailures);
11055 PendingObjCProtocolOdrMergeFailures.clear();
11056 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11057 Merge.first->decls_begin();
11058 for (
auto &ProtocolPair : Merge.second)
11059 ProtocolPair.first->decls_begin();
11068 while (!PendingOdrMergeChecks.empty()) {
11069 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11080 bool Found =
false;
11083 for (
auto *RI : D->
redecls()) {
11084 if (RI->getLexicalDeclContext() == CanonDef) {
11098 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11099 for (
auto *CanonMember : CanonDef->
decls()) {
11100 if (CanonMember->getCanonicalDecl() == DCanon) {
11109 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
11111 Candidates.push_back(ND);
11124 std::string CanonDefModule =
11129 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11131 if (Candidates.empty())
11133 diag::note_module_odr_violation_no_possible_decls) << D;
11135 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
11136 Diag(Candidates[I]->getLocation(),
11137 diag::note_module_odr_violation_possible_decl)
11141 DiagnosedOdrMergeFailures.insert(CanonDef);
11145 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11146 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11147 ObjCInterfaceOdrMergeFailures.empty() &&
11148 ObjCProtocolOdrMergeFailures.empty())
11151 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
11155 for (
auto &Merge : OdrMergeFailures) {
11158 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11161 bool Diagnosed =
false;
11162 CXXRecordDecl *FirstRecord = Merge.first;
11163 for (
auto &RecordPair : Merge.second) {
11164 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11165 RecordPair.second)) {
11178 Diag(Merge.first->getLocation(),
11179 diag::err_module_odr_violation_different_instantiations)
11186 for (
auto &Merge : RecordOdrMergeFailures) {
11189 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11192 RecordDecl *FirstRecord = Merge.first;
11193 bool Diagnosed =
false;
11194 for (
auto *SecondRecord : Merge.second) {
11195 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11201 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11205 for (
auto &Merge : FunctionOdrMergeFailures) {
11206 FunctionDecl *FirstFunction = Merge.first;
11207 bool Diagnosed =
false;
11208 for (
auto &SecondFunction : Merge.second) {
11209 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11215 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11219 for (
auto &Merge : EnumOdrMergeFailures) {
11222 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11225 EnumDecl *FirstEnum = Merge.first;
11226 bool Diagnosed =
false;
11227 for (
auto &SecondEnum : Merge.second) {
11228 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11234 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11237 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11240 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11243 bool Diagnosed =
false;
11244 ObjCInterfaceDecl *FirstID = Merge.first;
11245 for (
auto &InterfacePair : Merge.second) {
11246 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11247 InterfacePair.second)) {
11253 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11256 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11259 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11262 ObjCProtocolDecl *FirstProtocol = Merge.first;
11263 bool Diagnosed =
false;
11264 for (
auto &ProtocolPair : Merge.second) {
11265 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11266 ProtocolPair.second)) {
11272 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11277 if (llvm::Timer *T = ReadTimer.get();
11278 ++NumCurrentElementsDeserializing == 1 && T)
11279 ReadTimeRegion.emplace(T);
11283 assert(NumCurrentElementsDeserializing &&
11284 "FinishedDeserializing not paired with StartedDeserializing");
11285 if (NumCurrentElementsDeserializing == 1) {
11288 finishPendingActions();
11290 --NumCurrentElementsDeserializing;
11292 if (NumCurrentElementsDeserializing == 0) {
11296 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11304 while (!PendingExceptionSpecUpdates.empty() ||
11305 !PendingDeducedTypeUpdates.empty() ||
11306 !PendingUndeducedFunctionDecls.empty()) {
11307 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11308 PendingExceptionSpecUpdates.clear();
11309 for (
auto Update : ESUpdates) {
11310 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11313 if (
auto *Listener =
getContext().getASTMutationListener())
11315 for (
auto *Redecl :
Update.second->redecls())
11319 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11320 PendingDeducedTypeUpdates.clear();
11321 for (
auto Update : DTUpdates) {
11322 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11329 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11330 PendingUndeducedFunctionDecls.clear();
11334 (void)UndeducedFD->getMostRecentDecl();
11337 ReadTimeRegion.reset();
11339 diagnoseOdrViolations();
11345 PassInterestingDeclsToConsumer();
11352 auto It = PendingFakeLookupResults.find(II);
11353 if (It != PendingFakeLookupResults.end()) {
11354 for (
auto *ND : It->second)
11359 It->second.clear();
11363 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11364 SemaObj->TUScope->AddDecl(D);
11365 }
else if (SemaObj->TUScope) {
11369 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11370 SemaObj->TUScope->AddDecl(D);
11378 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11379 StringRef isysroot,
11381 bool AllowASTWithCompilerErrors,
11382 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11383 bool ForceValidateUserInputs,
11384 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11385 std::unique_ptr<llvm::Timer> ReadTimer)
11390 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11391 StackHandler(Diags), PP(PP), ContextObj(Context),
11392 CodeGenOpts(CodeGenOpts),
11394 PP.getHeaderSearchInfo()),
11395 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11396 DisableValidationKind(DisableValidationKind),
11397 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11398 AllowConfigurationMismatch(AllowConfigurationMismatch),
11399 ValidateSystemInputs(ValidateSystemInputs),
11400 ForceValidateUserInputs(ForceValidateUserInputs),
11401 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11402 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11403 SourceMgr.setExternalSLocEntrySource(
this);
11405 PathBuf.reserve(256);
11407 for (
const auto &Ext : Extensions) {
11408 auto BlockName = Ext->getExtensionMetadata().BlockName;
11409 auto Known = ModuleFileExtensions.find(BlockName);
11410 if (Known != ModuleFileExtensions.end()) {
11411 Diags.Report(diag::warn_duplicate_module_file_extension)
11416 ModuleFileExtensions.insert({BlockName, Ext});
11421 if (OwnsDeserializationListener)
11422 delete DeserializationListener;
11426 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11430 unsigned AbbrevID) {
11433 return Cursor.readRecord(AbbrevID, Record);
11449 : Record(Record), Context(Record.getContext()) {}
11450#define GEN_CLANG_CLAUSE_CLASS
11451#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11452#include "llvm/Frontend/OpenMP/OMP.inc"
11466 switch (llvm::omp::Clause(Record.readInt())) {
11467 case llvm::omp::OMPC_if:
11470 case llvm::omp::OMPC_final:
11473 case llvm::omp::OMPC_num_threads:
11476 case llvm::omp::OMPC_safelen:
11479 case llvm::omp::OMPC_simdlen:
11482 case llvm::omp::OMPC_sizes: {
11483 unsigned NumSizes = Record.readInt();
11487 case llvm::omp::OMPC_counts: {
11488 unsigned NumCounts = Record.readInt();
11492 case llvm::omp::OMPC_permutation: {
11493 unsigned NumLoops = Record.readInt();
11497 case llvm::omp::OMPC_full:
11500 case llvm::omp::OMPC_partial:
11503 case llvm::omp::OMPC_looprange:
11506 case llvm::omp::OMPC_allocator:
11509 case llvm::omp::OMPC_collapse:
11512 case llvm::omp::OMPC_default:
11515 case llvm::omp::OMPC_proc_bind:
11516 C =
new (Context) OMPProcBindClause();
11518 case llvm::omp::OMPC_schedule:
11519 C =
new (Context) OMPScheduleClause();
11521 case llvm::omp::OMPC_ordered:
11522 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11524 case llvm::omp::OMPC_nowait:
11525 C =
new (Context) OMPNowaitClause();
11527 case llvm::omp::OMPC_untied:
11528 C =
new (Context) OMPUntiedClause();
11530 case llvm::omp::OMPC_mergeable:
11531 C =
new (Context) OMPMergeableClause();
11533 case llvm::omp::OMPC_threadset:
11536 case llvm::omp::OMPC_transparent:
11537 C =
new (Context) OMPTransparentClause();
11539 case llvm::omp::OMPC_read:
11540 C =
new (Context) OMPReadClause();
11542 case llvm::omp::OMPC_write:
11543 C =
new (Context) OMPWriteClause();
11545 case llvm::omp::OMPC_update:
11546 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11548 case llvm::omp::OMPC_capture:
11549 C =
new (Context) OMPCaptureClause();
11551 case llvm::omp::OMPC_compare:
11552 C =
new (Context) OMPCompareClause();
11554 case llvm::omp::OMPC_fail:
11555 C =
new (Context) OMPFailClause();
11557 case llvm::omp::OMPC_seq_cst:
11558 C =
new (Context) OMPSeqCstClause();
11560 case llvm::omp::OMPC_acq_rel:
11561 C =
new (Context) OMPAcqRelClause();
11563 case llvm::omp::OMPC_absent: {
11564 unsigned NumKinds = Record.readInt();
11565 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11568 case llvm::omp::OMPC_holds:
11569 C =
new (Context) OMPHoldsClause();
11571 case llvm::omp::OMPC_contains: {
11572 unsigned NumKinds = Record.readInt();
11573 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11576 case llvm::omp::OMPC_no_openmp:
11577 C =
new (Context) OMPNoOpenMPClause();
11579 case llvm::omp::OMPC_no_openmp_routines:
11580 C =
new (Context) OMPNoOpenMPRoutinesClause();
11582 case llvm::omp::OMPC_no_openmp_constructs:
11583 C =
new (Context) OMPNoOpenMPConstructsClause();
11585 case llvm::omp::OMPC_no_parallelism:
11586 C =
new (Context) OMPNoParallelismClause();
11588 case llvm::omp::OMPC_acquire:
11589 C =
new (Context) OMPAcquireClause();
11591 case llvm::omp::OMPC_release:
11592 C =
new (Context) OMPReleaseClause();
11594 case llvm::omp::OMPC_relaxed:
11595 C =
new (Context) OMPRelaxedClause();
11597 case llvm::omp::OMPC_weak:
11598 C =
new (Context) OMPWeakClause();
11600 case llvm::omp::OMPC_threads:
11603 case llvm::omp::OMPC_simd:
11606 case llvm::omp::OMPC_nogroup:
11609 case llvm::omp::OMPC_unified_address:
11610 C =
new (Context) OMPUnifiedAddressClause();
11612 case llvm::omp::OMPC_unified_shared_memory:
11613 C =
new (Context) OMPUnifiedSharedMemoryClause();
11615 case llvm::omp::OMPC_reverse_offload:
11616 C =
new (Context) OMPReverseOffloadClause();
11618 case llvm::omp::OMPC_dynamic_allocators:
11619 C =
new (Context) OMPDynamicAllocatorsClause();
11621 case llvm::omp::OMPC_atomic_default_mem_order:
11622 C =
new (Context) OMPAtomicDefaultMemOrderClause();
11624 case llvm::omp::OMPC_self_maps:
11625 C =
new (Context) OMPSelfMapsClause();
11627 case llvm::omp::OMPC_at:
11628 C =
new (Context) OMPAtClause();
11630 case llvm::omp::OMPC_severity:
11631 C =
new (Context) OMPSeverityClause();
11633 case llvm::omp::OMPC_message:
11634 C =
new (Context) OMPMessageClause();
11636 case llvm::omp::OMPC_private:
11637 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11639 case llvm::omp::OMPC_firstprivate:
11640 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11642 case llvm::omp::OMPC_lastprivate:
11643 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11645 case llvm::omp::OMPC_shared:
11646 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11648 case llvm::omp::OMPC_reduction: {
11649 unsigned N = Record.readInt();
11651 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11654 case llvm::omp::OMPC_task_reduction:
11655 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11657 case llvm::omp::OMPC_in_reduction:
11658 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11660 case llvm::omp::OMPC_linear:
11661 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11663 case llvm::omp::OMPC_aligned:
11666 case llvm::omp::OMPC_copyin:
11669 case llvm::omp::OMPC_copyprivate:
11672 case llvm::omp::OMPC_flush:
11675 case llvm::omp::OMPC_depobj:
11678 case llvm::omp::OMPC_depend: {
11679 unsigned NumVars = Record.readInt();
11680 unsigned NumLoops = Record.readInt();
11684 case llvm::omp::OMPC_device:
11687 case llvm::omp::OMPC_map: {
11689 Sizes.
NumVars = Record.readInt();
11696 case llvm::omp::OMPC_num_teams:
11699 case llvm::omp::OMPC_thread_limit:
11702 case llvm::omp::OMPC_priority:
11705 case llvm::omp::OMPC_grainsize:
11708 case llvm::omp::OMPC_num_tasks:
11711 case llvm::omp::OMPC_hint:
11714 case llvm::omp::OMPC_dist_schedule:
11717 case llvm::omp::OMPC_defaultmap:
11720 case llvm::omp::OMPC_to: {
11722 Sizes.
NumVars = Record.readInt();
11729 case llvm::omp::OMPC_from: {
11731 Sizes.
NumVars = Record.readInt();
11738 case llvm::omp::OMPC_use_device_ptr: {
11740 Sizes.
NumVars = Record.readInt();
11747 case llvm::omp::OMPC_use_device_addr: {
11749 Sizes.
NumVars = Record.readInt();
11756 case llvm::omp::OMPC_is_device_ptr: {
11758 Sizes.
NumVars = Record.readInt();
11765 case llvm::omp::OMPC_has_device_addr: {
11767 Sizes.
NumVars = Record.readInt();
11774 case llvm::omp::OMPC_allocate:
11777 case llvm::omp::OMPC_nontemporal:
11780 case llvm::omp::OMPC_inclusive:
11783 case llvm::omp::OMPC_exclusive:
11786 case llvm::omp::OMPC_order:
11789 case llvm::omp::OMPC_init:
11792 case llvm::omp::OMPC_use:
11795 case llvm::omp::OMPC_destroy:
11798 case llvm::omp::OMPC_novariants:
11801 case llvm::omp::OMPC_nocontext:
11804 case llvm::omp::OMPC_detach:
11807 case llvm::omp::OMPC_uses_allocators:
11810 case llvm::omp::OMPC_affinity:
11813 case llvm::omp::OMPC_filter:
11816 case llvm::omp::OMPC_bind:
11819 case llvm::omp::OMPC_align:
11822 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11825 case llvm::omp::OMPC_dyn_groupprivate:
11828 case llvm::omp::OMPC_doacross: {
11829 unsigned NumVars = Record.readInt();
11830 unsigned NumLoops = Record.readInt();
11834 case llvm::omp::OMPC_ompx_attribute:
11837 case llvm::omp::OMPC_ompx_bare:
11840#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11841 case llvm::omp::Enum: \
11843#include "llvm/Frontend/OpenMP/OMPKinds.def"
11847 assert(
C &&
"Unknown OMPClause type");
11850 C->setLocStart(Record.readSourceLocation());
11851 C->setLocEnd(Record.readSourceLocation());
11857 C->setPreInitStmt(Record.readSubStmt(),
11863 C->setPostUpdateExpr(Record.readSubExpr());
11866void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11869 C->setNameModifierLoc(
Record.readSourceLocation());
11870 C->setColonLoc(
Record.readSourceLocation());
11871 C->setCondition(
Record.readSubExpr());
11872 C->setLParenLoc(
Record.readSourceLocation());
11877 C->setCondition(
Record.readSubExpr());
11878 C->setLParenLoc(
Record.readSourceLocation());
11884 C->setNumThreads(Record.readSubExpr());
11885 C->setModifierLoc(Record.readSourceLocation());
11886 C->setLParenLoc(Record.readSourceLocation());
11890 C->setSafelen(Record.readSubExpr());
11891 C->setLParenLoc(Record.readSourceLocation());
11895 C->setSimdlen(Record.readSubExpr());
11896 C->setLParenLoc(Record.readSourceLocation());
11900 for (Expr *&E :
C->getSizesRefs())
11901 E = Record.readSubExpr();
11902 C->setLParenLoc(Record.readSourceLocation());
11906 bool HasFill = Record.readBool();
11908 C->setOmpFillIndex(Record.readInt());
11909 C->setOmpFillLoc(Record.readSourceLocation());
11910 for (Expr *&E :
C->getCountsRefs())
11911 E = Record.readSubExpr();
11912 C->setLParenLoc(Record.readSourceLocation());
11916 for (Expr *&E :
C->getArgsRefs())
11917 E = Record.readSubExpr();
11918 C->setLParenLoc(Record.readSourceLocation());
11924 C->setFactor(Record.readSubExpr());
11925 C->setLParenLoc(Record.readSourceLocation());
11929 C->setFirst(Record.readSubExpr());
11930 C->setCount(Record.readSubExpr());
11931 C->setLParenLoc(Record.readSourceLocation());
11932 C->setFirstLoc(Record.readSourceLocation());
11933 C->setCountLoc(Record.readSourceLocation());
11937 C->setAllocator(Record.readExpr());
11938 C->setLParenLoc(Record.readSourceLocation());
11942 C->setNumForLoops(Record.readSubExpr());
11943 C->setLParenLoc(Record.readSourceLocation());
11947 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11948 C->setLParenLoc(Record.readSourceLocation());
11949 C->setDefaultKindKwLoc(Record.readSourceLocation());
11950 C->setDefaultVariableCategory(
11952 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11958 C->setLParenLoc(Record.readSourceLocation());
11959 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11960 C->setThreadsetKindLoc(ThreadsetKindLoc);
11963 C->setThreadsetKind(TKind);
11966void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *
C) {
11967 C->setLParenLoc(Record.readSourceLocation());
11968 C->setImpexTypeKind(Record.readSubExpr());
11971void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *
C) {
11972 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11973 C->setLParenLoc(Record.readSourceLocation());
11974 C->setProcBindKindKwLoc(Record.readSourceLocation());
11977void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *
C) {
11979 C->setScheduleKind(
11981 C->setFirstScheduleModifier(
11983 C->setSecondScheduleModifier(
11985 C->setChunkSize(Record.readSubExpr());
11986 C->setLParenLoc(Record.readSourceLocation());
11987 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11988 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11989 C->setScheduleKindLoc(Record.readSourceLocation());
11990 C->setCommaLoc(Record.readSourceLocation());
11993void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *
C) {
11994 C->setNumForLoops(Record.readSubExpr());
11995 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11996 C->setLoopNumIterations(I, Record.readSubExpr());
11997 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11998 C->setLoopCounter(I, Record.readSubExpr());
11999 C->setLParenLoc(Record.readSourceLocation());
12002void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *
C) {
12003 C->setEventHandler(Record.readSubExpr());
12004 C->setLParenLoc(Record.readSourceLocation());
12007void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *
C) {
12008 C->setCondition(Record.readSubExpr());
12009 C->setLParenLoc(Record.readSourceLocation());
12012void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12014void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12016void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12018void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12020void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *
C) {
12021 if (
C->isExtended()) {
12022 C->setLParenLoc(Record.readSourceLocation());
12023 C->setArgumentLoc(Record.readSourceLocation());
12028void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12030void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12034void OMPClauseReader::VisitOMPFailClause(OMPFailClause *
C) {
12035 C->setLParenLoc(Record.readSourceLocation());
12036 SourceLocation FailParameterLoc = Record.readSourceLocation();
12037 C->setFailParameterLoc(FailParameterLoc);
12039 C->setFailParameter(CKind);
12042void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *
C) {
12043 unsigned Count =
C->getDirectiveKinds().size();
12044 C->setLParenLoc(Record.readSourceLocation());
12045 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12046 DKVec.reserve(Count);
12047 for (
unsigned I = 0; I < Count; I++) {
12050 C->setDirectiveKinds(DKVec);
12053void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *
C) {
12054 C->setExpr(Record.readExpr());
12055 C->setLParenLoc(Record.readSourceLocation());
12058void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *
C) {
12059 unsigned Count =
C->getDirectiveKinds().size();
12060 C->setLParenLoc(Record.readSourceLocation());
12061 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12062 DKVec.reserve(Count);
12063 for (
unsigned I = 0; I < Count; I++) {
12066 C->setDirectiveKinds(DKVec);
12069void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12071void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12072 OMPNoOpenMPRoutinesClause *) {}
12074void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12075 OMPNoOpenMPConstructsClause *) {}
12077void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12079void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12081void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12083void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12085void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12087void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12089void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12091void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12093void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12095void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12097void OMPClauseReader::VisitOMPInitClause(OMPInitClause *
C) {
12098 unsigned NumVars =
C->varlist_size();
12099 SmallVector<Expr *, 16> Vars;
12100 Vars.reserve(NumVars);
12101 for (
unsigned I = 0; I != NumVars; ++I)
12102 Vars.push_back(Record.readSubExpr());
12103 C->setVarRefs(Vars);
12104 C->setIsTarget(Record.readBool());
12105 C->setIsTargetSync(Record.readBool());
12106 C->setLParenLoc(Record.readSourceLocation());
12107 C->setVarLoc(Record.readSourceLocation());
12110void OMPClauseReader::VisitOMPUseClause(OMPUseClause *
C) {
12111 C->setInteropVar(Record.readSubExpr());
12112 C->setLParenLoc(Record.readSourceLocation());
12113 C->setVarLoc(Record.readSourceLocation());
12116void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *
C) {
12117 C->setInteropVar(Record.readSubExpr());
12118 C->setLParenLoc(Record.readSourceLocation());
12119 C->setVarLoc(Record.readSourceLocation());
12122void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
12124 C->setCondition(Record.readSubExpr());
12125 C->setLParenLoc(Record.readSourceLocation());
12128void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *
C) {
12130 C->setCondition(Record.readSubExpr());
12131 C->setLParenLoc(Record.readSourceLocation());
12134void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12136void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12137 OMPUnifiedSharedMemoryClause *) {}
12139void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12142OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12145void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12146 OMPAtomicDefaultMemOrderClause *
C) {
12147 C->setAtomicDefaultMemOrderKind(
12149 C->setLParenLoc(Record.readSourceLocation());
12150 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12153void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12155void OMPClauseReader::VisitOMPAtClause(OMPAtClause *
C) {
12157 C->setLParenLoc(Record.readSourceLocation());
12158 C->setAtKindKwLoc(Record.readSourceLocation());
12161void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *
C) {
12163 C->setLParenLoc(Record.readSourceLocation());
12164 C->setSeverityKindKwLoc(Record.readSourceLocation());
12167void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *
C) {
12169 C->setMessageString(Record.readSubExpr());
12170 C->setLParenLoc(Record.readSourceLocation());
12173void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *
C) {
12174 C->setLParenLoc(Record.readSourceLocation());
12175 unsigned NumVars =
C->varlist_size();
12176 SmallVector<Expr *, 16> Vars;
12177 Vars.reserve(NumVars);
12178 for (
unsigned i = 0; i != NumVars; ++i)
12179 Vars.push_back(Record.readSubExpr());
12180 C->setVarRefs(Vars);
12182 for (
unsigned i = 0; i != NumVars; ++i)
12183 Vars.push_back(Record.readSubExpr());
12184 C->setPrivateCopies(Vars);
12187void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
12189 C->setLParenLoc(Record.readSourceLocation());
12190 unsigned NumVars =
C->varlist_size();
12191 SmallVector<Expr *, 16> Vars;
12192 Vars.reserve(NumVars);
12193 for (
unsigned i = 0; i != NumVars; ++i)
12194 Vars.push_back(Record.readSubExpr());
12195 C->setVarRefs(Vars);
12197 for (
unsigned i = 0; i != NumVars; ++i)
12198 Vars.push_back(Record.readSubExpr());
12199 C->setPrivateCopies(Vars);
12201 for (
unsigned i = 0; i != NumVars; ++i)
12202 Vars.push_back(Record.readSubExpr());
12206void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
12208 C->setLParenLoc(Record.readSourceLocation());
12210 C->setKindLoc(Record.readSourceLocation());
12211 C->setColonLoc(Record.readSourceLocation());
12212 unsigned NumVars =
C->varlist_size();
12213 SmallVector<Expr *, 16> Vars;
12214 Vars.reserve(NumVars);
12215 for (
unsigned i = 0; i != NumVars; ++i)
12216 Vars.push_back(Record.readSubExpr());
12217 C->setVarRefs(Vars);
12219 for (
unsigned i = 0; i != NumVars; ++i)
12220 Vars.push_back(Record.readSubExpr());
12221 C->setPrivateCopies(Vars);
12223 for (
unsigned i = 0; i != NumVars; ++i)
12224 Vars.push_back(Record.readSubExpr());
12225 C->setSourceExprs(Vars);
12227 for (
unsigned i = 0; i != NumVars; ++i)
12228 Vars.push_back(Record.readSubExpr());
12229 C->setDestinationExprs(Vars);
12231 for (
unsigned i = 0; i != NumVars; ++i)
12232 Vars.push_back(Record.readSubExpr());
12233 C->setAssignmentOps(Vars);
12236void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *
C) {
12237 C->setLParenLoc(Record.readSourceLocation());
12238 unsigned NumVars =
C->varlist_size();
12239 SmallVector<Expr *, 16> Vars;
12240 Vars.reserve(NumVars);
12241 for (
unsigned i = 0; i != NumVars; ++i)
12242 Vars.push_back(Record.readSubExpr());
12243 C->setVarRefs(Vars);
12246void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *
C) {
12248 C->setLParenLoc(Record.readSourceLocation());
12249 C->setModifierLoc(Record.readSourceLocation());
12250 C->setColonLoc(Record.readSourceLocation());
12251 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12252 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12253 C->setQualifierLoc(NNSL);
12254 C->setNameInfo(DNI);
12256 unsigned NumVars =
C->varlist_size();
12257 SmallVector<Expr *, 16> Vars;
12258 Vars.reserve(NumVars);
12259 for (
unsigned i = 0; i != NumVars; ++i)
12260 Vars.push_back(Record.readSubExpr());
12261 C->setVarRefs(Vars);
12263 for (
unsigned i = 0; i != NumVars; ++i)
12264 Vars.push_back(Record.readSubExpr());
12265 C->setPrivates(Vars);
12267 for (
unsigned i = 0; i != NumVars; ++i)
12268 Vars.push_back(Record.readSubExpr());
12269 C->setLHSExprs(Vars);
12271 for (
unsigned i = 0; i != NumVars; ++i)
12272 Vars.push_back(Record.readSubExpr());
12273 C->setRHSExprs(Vars);
12275 for (
unsigned i = 0; i != NumVars; ++i)
12276 Vars.push_back(Record.readSubExpr());
12277 C->setReductionOps(Vars);
12278 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12280 for (
unsigned i = 0; i != NumVars; ++i)
12281 Vars.push_back(Record.readSubExpr());
12282 C->setInscanCopyOps(Vars);
12284 for (
unsigned i = 0; i != NumVars; ++i)
12285 Vars.push_back(Record.readSubExpr());
12286 C->setInscanCopyArrayTemps(Vars);
12288 for (
unsigned i = 0; i != NumVars; ++i)
12289 Vars.push_back(Record.readSubExpr());
12290 C->setInscanCopyArrayElems(Vars);
12292 unsigned NumFlags = Record.readInt();
12293 SmallVector<bool, 16> Flags;
12294 Flags.reserve(NumFlags);
12295 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12296 Flags.push_back(Record.readInt());
12297 C->setPrivateVariableReductionFlags(Flags);
12300void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
12302 C->setLParenLoc(Record.readSourceLocation());
12303 C->setColonLoc(Record.readSourceLocation());
12304 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12305 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12306 C->setQualifierLoc(NNSL);
12307 C->setNameInfo(DNI);
12309 unsigned NumVars =
C->varlist_size();
12310 SmallVector<Expr *, 16> Vars;
12311 Vars.reserve(NumVars);
12312 for (
unsigned I = 0; I != NumVars; ++I)
12313 Vars.push_back(Record.readSubExpr());
12314 C->setVarRefs(Vars);
12316 for (
unsigned I = 0; I != NumVars; ++I)
12317 Vars.push_back(Record.readSubExpr());
12318 C->setPrivates(Vars);
12320 for (
unsigned I = 0; I != NumVars; ++I)
12321 Vars.push_back(Record.readSubExpr());
12322 C->setLHSExprs(Vars);
12324 for (
unsigned I = 0; I != NumVars; ++I)
12325 Vars.push_back(Record.readSubExpr());
12326 C->setRHSExprs(Vars);
12328 for (
unsigned I = 0; I != NumVars; ++I)
12329 Vars.push_back(Record.readSubExpr());
12330 C->setReductionOps(Vars);
12333void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *
C) {
12335 C->setLParenLoc(Record.readSourceLocation());
12336 C->setColonLoc(Record.readSourceLocation());
12337 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12338 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12339 C->setQualifierLoc(NNSL);
12340 C->setNameInfo(DNI);
12342 unsigned NumVars =
C->varlist_size();
12343 SmallVector<Expr *, 16> Vars;
12344 Vars.reserve(NumVars);
12345 for (
unsigned I = 0; I != NumVars; ++I)
12346 Vars.push_back(Record.readSubExpr());
12347 C->setVarRefs(Vars);
12349 for (
unsigned I = 0; I != NumVars; ++I)
12350 Vars.push_back(Record.readSubExpr());
12351 C->setPrivates(Vars);
12353 for (
unsigned I = 0; I != NumVars; ++I)
12354 Vars.push_back(Record.readSubExpr());
12355 C->setLHSExprs(Vars);
12357 for (
unsigned I = 0; I != NumVars; ++I)
12358 Vars.push_back(Record.readSubExpr());
12359 C->setRHSExprs(Vars);
12361 for (
unsigned I = 0; I != NumVars; ++I)
12362 Vars.push_back(Record.readSubExpr());
12363 C->setReductionOps(Vars);
12365 for (
unsigned I = 0; I != NumVars; ++I)
12366 Vars.push_back(Record.readSubExpr());
12367 C->setTaskgroupDescriptors(Vars);
12370void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *
C) {
12372 C->setLParenLoc(Record.readSourceLocation());
12373 C->setColonLoc(Record.readSourceLocation());
12375 C->setModifierLoc(Record.readSourceLocation());
12376 unsigned NumVars =
C->varlist_size();
12377 SmallVector<Expr *, 16> Vars;
12378 Vars.reserve(NumVars);
12379 for (
unsigned i = 0; i != NumVars; ++i)
12380 Vars.push_back(Record.readSubExpr());
12381 C->setVarRefs(Vars);
12383 for (
unsigned i = 0; i != NumVars; ++i)
12384 Vars.push_back(Record.readSubExpr());
12385 C->setPrivates(Vars);
12387 for (
unsigned i = 0; i != NumVars; ++i)
12388 Vars.push_back(Record.readSubExpr());
12391 for (
unsigned i = 0; i != NumVars; ++i)
12392 Vars.push_back(Record.readSubExpr());
12393 C->setUpdates(Vars);
12395 for (
unsigned i = 0; i != NumVars; ++i)
12396 Vars.push_back(Record.readSubExpr());
12397 C->setFinals(Vars);
12398 C->setStep(Record.readSubExpr());
12399 C->setCalcStep(Record.readSubExpr());
12401 for (
unsigned I = 0; I != NumVars + 1; ++I)
12402 Vars.push_back(Record.readSubExpr());
12403 C->setUsedExprs(Vars);
12406void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *
C) {
12407 C->setLParenLoc(Record.readSourceLocation());
12408 C->setColonLoc(Record.readSourceLocation());
12409 unsigned NumVars =
C->varlist_size();
12410 SmallVector<Expr *, 16> Vars;
12411 Vars.reserve(NumVars);
12412 for (
unsigned i = 0; i != NumVars; ++i)
12413 Vars.push_back(Record.readSubExpr());
12414 C->setVarRefs(Vars);
12415 C->setAlignment(Record.readSubExpr());
12418void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *
C) {
12419 C->setLParenLoc(Record.readSourceLocation());
12420 unsigned NumVars =
C->varlist_size();
12421 SmallVector<Expr *, 16> Exprs;
12422 Exprs.reserve(NumVars);
12423 for (
unsigned i = 0; i != NumVars; ++i)
12424 Exprs.push_back(Record.readSubExpr());
12425 C->setVarRefs(Exprs);
12427 for (
unsigned i = 0; i != NumVars; ++i)
12428 Exprs.push_back(Record.readSubExpr());
12429 C->setSourceExprs(Exprs);
12431 for (
unsigned i = 0; i != NumVars; ++i)
12432 Exprs.push_back(Record.readSubExpr());
12433 C->setDestinationExprs(Exprs);
12435 for (
unsigned i = 0; i != NumVars; ++i)
12436 Exprs.push_back(Record.readSubExpr());
12437 C->setAssignmentOps(Exprs);
12440void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
12441 C->setLParenLoc(Record.readSourceLocation());
12442 unsigned NumVars =
C->varlist_size();
12443 SmallVector<Expr *, 16> Exprs;
12444 Exprs.reserve(NumVars);
12445 for (
unsigned i = 0; i != NumVars; ++i)
12446 Exprs.push_back(Record.readSubExpr());
12447 C->setVarRefs(Exprs);
12449 for (
unsigned i = 0; i != NumVars; ++i)
12450 Exprs.push_back(Record.readSubExpr());
12451 C->setSourceExprs(Exprs);
12453 for (
unsigned i = 0; i != NumVars; ++i)
12454 Exprs.push_back(Record.readSubExpr());
12455 C->setDestinationExprs(Exprs);
12457 for (
unsigned i = 0; i != NumVars; ++i)
12458 Exprs.push_back(Record.readSubExpr());
12459 C->setAssignmentOps(Exprs);
12462void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *
C) {
12463 C->setLParenLoc(Record.readSourceLocation());
12464 unsigned NumVars =
C->varlist_size();
12465 SmallVector<Expr *, 16> Vars;
12466 Vars.reserve(NumVars);
12467 for (
unsigned i = 0; i != NumVars; ++i)
12468 Vars.push_back(Record.readSubExpr());
12469 C->setVarRefs(Vars);
12472void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *
C) {
12473 C->setDepobj(Record.readSubExpr());
12474 C->setLParenLoc(Record.readSourceLocation());
12477void OMPClauseReader::VisitOMPDependClause(OMPDependClause *
C) {
12478 C->setLParenLoc(Record.readSourceLocation());
12479 C->setModifier(Record.readSubExpr());
12480 C->setDependencyKind(
12482 C->setDependencyLoc(Record.readSourceLocation());
12483 C->setColonLoc(Record.readSourceLocation());
12484 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12485 unsigned NumVars =
C->varlist_size();
12486 SmallVector<Expr *, 16> Vars;
12487 Vars.reserve(NumVars);
12488 for (
unsigned I = 0; I != NumVars; ++I)
12489 Vars.push_back(Record.readSubExpr());
12490 C->setVarRefs(Vars);
12491 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12492 C->setLoopData(I, Record.readSubExpr());
12495void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *
C) {
12498 C->setDevice(Record.readSubExpr());
12499 C->setModifierLoc(Record.readSourceLocation());
12500 C->setLParenLoc(Record.readSourceLocation());
12503void OMPClauseReader::VisitOMPMapClause(OMPMapClause *
C) {
12504 C->setLParenLoc(Record.readSourceLocation());
12505 bool HasIteratorModifier =
false;
12507 C->setMapTypeModifier(
12509 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12510 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12511 HasIteratorModifier =
true;
12513 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12514 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12517 C->setMapLoc(Record.readSourceLocation());
12518 C->setColonLoc(Record.readSourceLocation());
12519 auto NumVars =
C->varlist_size();
12520 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12521 auto TotalLists =
C->getTotalComponentListNum();
12522 auto TotalComponents =
C->getTotalComponentsNum();
12524 SmallVector<Expr *, 16> Vars;
12525 Vars.reserve(NumVars);
12526 for (
unsigned i = 0; i != NumVars; ++i)
12527 Vars.push_back(Record.readExpr());
12528 C->setVarRefs(Vars);
12530 SmallVector<Expr *, 16> UDMappers;
12531 UDMappers.reserve(NumVars);
12532 for (
unsigned I = 0; I < NumVars; ++I)
12533 UDMappers.push_back(Record.readExpr());
12534 C->setUDMapperRefs(UDMappers);
12536 if (HasIteratorModifier)
12537 C->setIteratorModifier(Record.readExpr());
12539 SmallVector<ValueDecl *, 16> Decls;
12540 Decls.reserve(UniqueDecls);
12541 for (
unsigned i = 0; i < UniqueDecls; ++i)
12542 Decls.push_back(Record.readDeclAs<ValueDecl>());
12543 C->setUniqueDecls(Decls);
12545 SmallVector<unsigned, 16> ListsPerDecl;
12546 ListsPerDecl.reserve(UniqueDecls);
12547 for (
unsigned i = 0; i < UniqueDecls; ++i)
12548 ListsPerDecl.push_back(Record.readInt());
12549 C->setDeclNumLists(ListsPerDecl);
12551 SmallVector<unsigned, 32> ListSizes;
12552 ListSizes.reserve(TotalLists);
12553 for (
unsigned i = 0; i < TotalLists; ++i)
12554 ListSizes.push_back(Record.readInt());
12555 C->setComponentListSizes(ListSizes);
12557 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12558 Components.reserve(TotalComponents);
12559 for (
unsigned i = 0; i < TotalComponents; ++i) {
12560 Expr *AssociatedExprPr = Record.readExpr();
12561 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12562 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12565 C->setComponents(Components, ListSizes);
12571 C->setLParenLoc(Record.readSourceLocation());
12572 C->setColonLoc(Record.readSourceLocation());
12573 C->setAllocator(Record.readSubExpr());
12574 C->setAlignment(Record.readSubExpr());
12575 unsigned NumVars =
C->varlist_size();
12576 SmallVector<Expr *, 16> Vars;
12577 Vars.reserve(NumVars);
12578 for (
unsigned i = 0; i != NumVars; ++i)
12579 Vars.push_back(Record.readSubExpr());
12580 C->setVarRefs(Vars);
12583void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
12585 C->setLParenLoc(Record.readSourceLocation());
12586 unsigned NumVars =
C->varlist_size();
12587 SmallVector<Expr *, 16> Vars;
12588 Vars.reserve(NumVars);
12589 for (
unsigned I = 0; I != NumVars; ++I)
12590 Vars.push_back(Record.readSubExpr());
12591 C->setVarRefs(Vars);
12594void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
12596 C->setLParenLoc(Record.readSourceLocation());
12597 unsigned NumVars =
C->varlist_size();
12598 SmallVector<Expr *, 16> Vars;
12599 Vars.reserve(NumVars);
12600 for (
unsigned I = 0; I != NumVars; ++I)
12601 Vars.push_back(Record.readSubExpr());
12602 C->setVarRefs(Vars);
12605void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *
C) {
12607 C->setPriority(Record.readSubExpr());
12608 C->setLParenLoc(Record.readSourceLocation());
12611void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
12614 C->setGrainsize(Record.readSubExpr());
12615 C->setModifierLoc(Record.readSourceLocation());
12616 C->setLParenLoc(Record.readSourceLocation());
12619void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
12622 C->setNumTasks(Record.readSubExpr());
12623 C->setModifierLoc(Record.readSourceLocation());
12624 C->setLParenLoc(Record.readSourceLocation());
12627void OMPClauseReader::VisitOMPHintClause(OMPHintClause *
C) {
12628 C->setHint(Record.readSubExpr());
12629 C->setLParenLoc(Record.readSourceLocation());
12632void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
12634 C->setDistScheduleKind(
12636 C->setChunkSize(Record.readSubExpr());
12637 C->setLParenLoc(Record.readSourceLocation());
12638 C->setDistScheduleKindLoc(Record.readSourceLocation());
12639 C->setCommaLoc(Record.readSourceLocation());
12642void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
12643 C->setDefaultmapKind(
12645 C->setDefaultmapModifier(
12647 C->setLParenLoc(Record.readSourceLocation());
12648 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12649 C->setDefaultmapKindLoc(Record.readSourceLocation());
12652void OMPClauseReader::VisitOMPToClause(OMPToClause *
C) {
12653 C->setLParenLoc(Record.readSourceLocation());
12655 C->setMotionModifier(
12657 C->setMotionModifierLoc(I, Record.readSourceLocation());
12658 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12659 C->setIteratorModifier(Record.readExpr());
12661 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12662 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12663 C->setColonLoc(Record.readSourceLocation());
12664 auto NumVars =
C->varlist_size();
12665 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12666 auto TotalLists =
C->getTotalComponentListNum();
12667 auto TotalComponents =
C->getTotalComponentsNum();
12669 SmallVector<Expr *, 16> Vars;
12670 Vars.reserve(NumVars);
12671 for (
unsigned i = 0; i != NumVars; ++i)
12672 Vars.push_back(Record.readSubExpr());
12673 C->setVarRefs(Vars);
12675 SmallVector<Expr *, 16> UDMappers;
12676 UDMappers.reserve(NumVars);
12677 for (
unsigned I = 0; I < NumVars; ++I)
12678 UDMappers.push_back(Record.readSubExpr());
12679 C->setUDMapperRefs(UDMappers);
12681 SmallVector<ValueDecl *, 16> Decls;
12682 Decls.reserve(UniqueDecls);
12683 for (
unsigned i = 0; i < UniqueDecls; ++i)
12684 Decls.push_back(Record.readDeclAs<ValueDecl>());
12685 C->setUniqueDecls(Decls);
12687 SmallVector<unsigned, 16> ListsPerDecl;
12688 ListsPerDecl.reserve(UniqueDecls);
12689 for (
unsigned i = 0; i < UniqueDecls; ++i)
12690 ListsPerDecl.push_back(Record.readInt());
12691 C->setDeclNumLists(ListsPerDecl);
12693 SmallVector<unsigned, 32> ListSizes;
12694 ListSizes.reserve(TotalLists);
12695 for (
unsigned i = 0; i < TotalLists; ++i)
12696 ListSizes.push_back(Record.readInt());
12697 C->setComponentListSizes(ListSizes);
12699 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12700 Components.reserve(TotalComponents);
12701 for (
unsigned i = 0; i < TotalComponents; ++i) {
12702 Expr *AssociatedExprPr = Record.readSubExpr();
12703 bool IsNonContiguous = Record.readBool();
12704 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12705 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12707 C->setComponents(Components, ListSizes);
12710void OMPClauseReader::VisitOMPFromClause(OMPFromClause *
C) {
12711 C->setLParenLoc(Record.readSourceLocation());
12713 C->setMotionModifier(
12715 C->setMotionModifierLoc(I, Record.readSourceLocation());
12716 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12717 C->setIteratorModifier(Record.readExpr());
12719 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12720 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12721 C->setColonLoc(Record.readSourceLocation());
12722 auto NumVars =
C->varlist_size();
12723 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12724 auto TotalLists =
C->getTotalComponentListNum();
12725 auto TotalComponents =
C->getTotalComponentsNum();
12727 SmallVector<Expr *, 16> Vars;
12728 Vars.reserve(NumVars);
12729 for (
unsigned i = 0; i != NumVars; ++i)
12730 Vars.push_back(Record.readSubExpr());
12731 C->setVarRefs(Vars);
12733 SmallVector<Expr *, 16> UDMappers;
12734 UDMappers.reserve(NumVars);
12735 for (
unsigned I = 0; I < NumVars; ++I)
12736 UDMappers.push_back(Record.readSubExpr());
12737 C->setUDMapperRefs(UDMappers);
12739 SmallVector<ValueDecl *, 16> Decls;
12740 Decls.reserve(UniqueDecls);
12741 for (
unsigned i = 0; i < UniqueDecls; ++i)
12742 Decls.push_back(Record.readDeclAs<ValueDecl>());
12743 C->setUniqueDecls(Decls);
12745 SmallVector<unsigned, 16> ListsPerDecl;
12746 ListsPerDecl.reserve(UniqueDecls);
12747 for (
unsigned i = 0; i < UniqueDecls; ++i)
12748 ListsPerDecl.push_back(Record.readInt());
12749 C->setDeclNumLists(ListsPerDecl);
12751 SmallVector<unsigned, 32> ListSizes;
12752 ListSizes.reserve(TotalLists);
12753 for (
unsigned i = 0; i < TotalLists; ++i)
12754 ListSizes.push_back(Record.readInt());
12755 C->setComponentListSizes(ListSizes);
12757 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12758 Components.reserve(TotalComponents);
12759 for (
unsigned i = 0; i < TotalComponents; ++i) {
12760 Expr *AssociatedExprPr = Record.readSubExpr();
12761 bool IsNonContiguous = Record.readBool();
12762 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12763 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12765 C->setComponents(Components, ListSizes);
12768void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
12769 C->setLParenLoc(Record.readSourceLocation());
12771 C->setFallbackModifierLoc(Record.readSourceLocation());
12772 auto NumVars =
C->varlist_size();
12773 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12774 auto TotalLists =
C->getTotalComponentListNum();
12775 auto TotalComponents =
C->getTotalComponentsNum();
12777 SmallVector<Expr *, 16> Vars;
12778 Vars.reserve(NumVars);
12779 for (
unsigned i = 0; i != NumVars; ++i)
12780 Vars.push_back(Record.readSubExpr());
12781 C->setVarRefs(Vars);
12783 for (
unsigned i = 0; i != NumVars; ++i)
12784 Vars.push_back(Record.readSubExpr());
12785 C->setPrivateCopies(Vars);
12787 for (
unsigned i = 0; i != NumVars; ++i)
12788 Vars.push_back(Record.readSubExpr());
12791 SmallVector<ValueDecl *, 16> Decls;
12792 Decls.reserve(UniqueDecls);
12793 for (
unsigned i = 0; i < UniqueDecls; ++i)
12794 Decls.push_back(Record.readDeclAs<ValueDecl>());
12795 C->setUniqueDecls(Decls);
12797 SmallVector<unsigned, 16> ListsPerDecl;
12798 ListsPerDecl.reserve(UniqueDecls);
12799 for (
unsigned i = 0; i < UniqueDecls; ++i)
12800 ListsPerDecl.push_back(Record.readInt());
12801 C->setDeclNumLists(ListsPerDecl);
12803 SmallVector<unsigned, 32> ListSizes;
12804 ListSizes.reserve(TotalLists);
12805 for (
unsigned i = 0; i < TotalLists; ++i)
12806 ListSizes.push_back(Record.readInt());
12807 C->setComponentListSizes(ListSizes);
12809 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12810 Components.reserve(TotalComponents);
12811 for (
unsigned i = 0; i < TotalComponents; ++i) {
12812 auto *AssociatedExprPr = Record.readSubExpr();
12813 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12814 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12817 C->setComponents(Components, ListSizes);
12820void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
12821 C->setLParenLoc(Record.readSourceLocation());
12822 auto NumVars =
C->varlist_size();
12823 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12824 auto TotalLists =
C->getTotalComponentListNum();
12825 auto TotalComponents =
C->getTotalComponentsNum();
12827 SmallVector<Expr *, 16> Vars;
12828 Vars.reserve(NumVars);
12829 for (
unsigned i = 0; i != NumVars; ++i)
12830 Vars.push_back(Record.readSubExpr());
12831 C->setVarRefs(Vars);
12833 SmallVector<ValueDecl *, 16> Decls;
12834 Decls.reserve(UniqueDecls);
12835 for (
unsigned i = 0; i < UniqueDecls; ++i)
12836 Decls.push_back(Record.readDeclAs<ValueDecl>());
12837 C->setUniqueDecls(Decls);
12839 SmallVector<unsigned, 16> ListsPerDecl;
12840 ListsPerDecl.reserve(UniqueDecls);
12841 for (
unsigned i = 0; i < UniqueDecls; ++i)
12842 ListsPerDecl.push_back(Record.readInt());
12843 C->setDeclNumLists(ListsPerDecl);
12845 SmallVector<unsigned, 32> ListSizes;
12846 ListSizes.reserve(TotalLists);
12847 for (
unsigned i = 0; i < TotalLists; ++i)
12848 ListSizes.push_back(Record.readInt());
12849 C->setComponentListSizes(ListSizes);
12851 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12852 Components.reserve(TotalComponents);
12853 for (
unsigned i = 0; i < TotalComponents; ++i) {
12854 Expr *AssociatedExpr = Record.readSubExpr();
12855 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12856 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12859 C->setComponents(Components, ListSizes);
12862void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
12863 C->setLParenLoc(Record.readSourceLocation());
12864 auto NumVars =
C->varlist_size();
12865 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12866 auto TotalLists =
C->getTotalComponentListNum();
12867 auto TotalComponents =
C->getTotalComponentsNum();
12869 SmallVector<Expr *, 16> Vars;
12870 Vars.reserve(NumVars);
12871 for (
unsigned i = 0; i != NumVars; ++i)
12872 Vars.push_back(Record.readSubExpr());
12873 C->setVarRefs(Vars);
12876 SmallVector<ValueDecl *, 16> Decls;
12877 Decls.reserve(UniqueDecls);
12878 for (
unsigned i = 0; i < UniqueDecls; ++i)
12879 Decls.push_back(Record.readDeclAs<ValueDecl>());
12880 C->setUniqueDecls(Decls);
12882 SmallVector<unsigned, 16> ListsPerDecl;
12883 ListsPerDecl.reserve(UniqueDecls);
12884 for (
unsigned i = 0; i < UniqueDecls; ++i)
12885 ListsPerDecl.push_back(Record.readInt());
12886 C->setDeclNumLists(ListsPerDecl);
12888 SmallVector<unsigned, 32> ListSizes;
12889 ListSizes.reserve(TotalLists);
12890 for (
unsigned i = 0; i < TotalLists; ++i)
12891 ListSizes.push_back(Record.readInt());
12892 C->setComponentListSizes(ListSizes);
12894 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12895 Components.reserve(TotalComponents);
12896 for (
unsigned i = 0; i < TotalComponents; ++i) {
12897 Expr *AssociatedExpr = Record.readSubExpr();
12898 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12899 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12902 C->setComponents(Components, ListSizes);
12905void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
12906 C->setLParenLoc(Record.readSourceLocation());
12907 auto NumVars =
C->varlist_size();
12908 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12909 auto TotalLists =
C->getTotalComponentListNum();
12910 auto TotalComponents =
C->getTotalComponentsNum();
12912 SmallVector<Expr *, 16> Vars;
12913 Vars.reserve(NumVars);
12914 for (
unsigned I = 0; I != NumVars; ++I)
12915 Vars.push_back(Record.readSubExpr());
12916 C->setVarRefs(Vars);
12919 SmallVector<ValueDecl *, 16> Decls;
12920 Decls.reserve(UniqueDecls);
12921 for (
unsigned I = 0; I < UniqueDecls; ++I)
12922 Decls.push_back(Record.readDeclAs<ValueDecl>());
12923 C->setUniqueDecls(Decls);
12925 SmallVector<unsigned, 16> ListsPerDecl;
12926 ListsPerDecl.reserve(UniqueDecls);
12927 for (
unsigned I = 0; I < UniqueDecls; ++I)
12928 ListsPerDecl.push_back(Record.readInt());
12929 C->setDeclNumLists(ListsPerDecl);
12931 SmallVector<unsigned, 32> ListSizes;
12932 ListSizes.reserve(TotalLists);
12933 for (
unsigned i = 0; i < TotalLists; ++i)
12934 ListSizes.push_back(Record.readInt());
12935 C->setComponentListSizes(ListSizes);
12937 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12938 Components.reserve(TotalComponents);
12939 for (
unsigned I = 0; I < TotalComponents; ++I) {
12940 Expr *AssociatedExpr = Record.readSubExpr();
12941 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12942 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12945 C->setComponents(Components, ListSizes);
12948void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
12949 C->setLParenLoc(Record.readSourceLocation());
12950 unsigned NumVars =
C->varlist_size();
12951 SmallVector<Expr *, 16> Vars;
12952 Vars.reserve(NumVars);
12953 for (
unsigned i = 0; i != NumVars; ++i)
12954 Vars.push_back(Record.readSubExpr());
12955 C->setVarRefs(Vars);
12957 Vars.reserve(NumVars);
12958 for (
unsigned i = 0; i != NumVars; ++i)
12959 Vars.push_back(Record.readSubExpr());
12960 C->setPrivateRefs(Vars);
12963void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
12964 C->setLParenLoc(Record.readSourceLocation());
12965 unsigned NumVars =
C->varlist_size();
12966 SmallVector<Expr *, 16> Vars;
12967 Vars.reserve(NumVars);
12968 for (
unsigned i = 0; i != NumVars; ++i)
12969 Vars.push_back(Record.readSubExpr());
12970 C->setVarRefs(Vars);
12973void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
12974 C->setLParenLoc(Record.readSourceLocation());
12975 unsigned NumVars =
C->varlist_size();
12976 SmallVector<Expr *, 16> Vars;
12977 Vars.reserve(NumVars);
12978 for (
unsigned i = 0; i != NumVars; ++i)
12979 Vars.push_back(Record.readSubExpr());
12980 C->setVarRefs(Vars);
12983void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
12984 C->setLParenLoc(Record.readSourceLocation());
12985 unsigned NumOfAllocators =
C->getNumberOfAllocators();
12986 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
12987 Data.reserve(NumOfAllocators);
12988 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
12989 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
12992 D.
LParenLoc = Record.readSourceLocation();
12993 D.
RParenLoc = Record.readSourceLocation();
12995 C->setAllocatorsData(
Data);
12998void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *
C) {
12999 C->setLParenLoc(Record.readSourceLocation());
13000 C->setModifier(Record.readSubExpr());
13001 C->setColonLoc(Record.readSourceLocation());
13002 unsigned NumOfLocators =
C->varlist_size();
13003 SmallVector<Expr *, 4> Locators;
13004 Locators.reserve(NumOfLocators);
13005 for (
unsigned I = 0; I != NumOfLocators; ++I)
13006 Locators.push_back(Record.readSubExpr());
13007 C->setVarRefs(Locators);
13010void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *
C) {
13013 C->setLParenLoc(Record.readSourceLocation());
13014 C->setKindKwLoc(Record.readSourceLocation());
13015 C->setModifierKwLoc(Record.readSourceLocation());
13018void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *
C) {
13020 C->setThreadID(Record.readSubExpr());
13021 C->setLParenLoc(Record.readSourceLocation());
13024void OMPClauseReader::VisitOMPBindClause(OMPBindClause *
C) {
13026 C->setLParenLoc(Record.readSourceLocation());
13027 C->setBindKindLoc(Record.readSourceLocation());
13031 C->setAlignment(Record.readExpr());
13032 C->setLParenLoc(Record.readSourceLocation());
13035void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
13037 C->setSize(Record.readSubExpr());
13038 C->setLParenLoc(Record.readSourceLocation());
13041void OMPClauseReader::VisitOMPDynGroupprivateClause(
13042 OMPDynGroupprivateClause *
C) {
13044 C->setDynGroupprivateModifier(
13046 C->setDynGroupprivateFallbackModifier(
13048 C->setSize(Record.readSubExpr());
13049 C->setLParenLoc(Record.readSourceLocation());
13050 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13051 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13054void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
13055 C->setLParenLoc(Record.readSourceLocation());
13056 C->setDependenceType(
13058 C->setDependenceLoc(Record.readSourceLocation());
13059 C->setColonLoc(Record.readSourceLocation());
13060 unsigned NumVars =
C->varlist_size();
13061 SmallVector<Expr *, 16> Vars;
13062 Vars.reserve(NumVars);
13063 for (
unsigned I = 0; I != NumVars; ++I)
13064 Vars.push_back(Record.readSubExpr());
13065 C->setVarRefs(Vars);
13066 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
13067 C->setLoopData(I, Record.readSubExpr());
13070void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
13072 Record.readAttributes(Attrs);
13073 C->setAttrs(Attrs);
13074 C->setLocStart(Record.readSourceLocation());
13075 C->setLParenLoc(Record.readSourceLocation());
13076 C->setLocEnd(Record.readSourceLocation());
13079void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *
C) {}
13089 Selector.ScoreOrCondition =
nullptr;
13091 Selector.ScoreOrCondition = readExprRef();
13103 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13108 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
13110 Data->setClauses(Clauses);
13111 if (
Data->hasAssociatedStmt())
13113 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
13118 unsigned NumVars =
readInt();
13120 for (
unsigned I = 0; I < NumVars; ++I)
13126 unsigned NumExprs =
readInt();
13128 for (
unsigned I = 0; I < NumExprs; ++I)
13138 switch (ClauseKind) {
13153 bool isConditionExprClause =
readBool();
13154 if (isConditionExprClause) {
13159 unsigned NumVars =
readInt();
13161 for (
unsigned I = 0; I < NumVars; ++I)
13168 unsigned NumClauses =
readInt();
13170 for (
unsigned I = 0; I < NumClauses; ++I)
13204 for (
unsigned I = 0; I < VarList.size(); ++I) {
13207 RecipeList.push_back({Alloca});
13211 VarList, RecipeList, EndLoc);
13229 for (
unsigned I = 0; I < VarList.size(); ++I) {
13233 RecipeList.push_back({Recipe, RecipeTemp});
13237 VarList, RecipeList, EndLoc);
13288 LParenLoc, ModList, VarList, EndLoc);
13297 LParenLoc, ModList, VarList, EndLoc);
13306 LParenLoc, ModList, VarList, EndLoc);
13315 LParenLoc, ModList, VarList, EndLoc);
13321 AsyncExpr, EndLoc);
13329 DevNumExpr, QueuesLoc, QueueIdExprs,
13336 unsigned NumArchs =
readInt();
13338 for (
unsigned I = 0; I < NumArchs; ++I) {
13341 Archs.emplace_back(Loc, Ident);
13345 LParenLoc, Archs, EndLoc);
13353 for (
unsigned I = 0; I < VarList.size(); ++I) {
13357 3 *
sizeof(
int *));
13360 unsigned NumCombiners =
readInt();
13361 for (
unsigned I = 0; I < NumCombiners; ++I) {
13366 Combiners.push_back({LHS, RHS, Op});
13369 RecipeList.push_back({Recipe, Combiners});
13373 VarList, RecipeList, EndLoc);
13392 HasForce, LoopCount, EndLoc);
13396 unsigned NumClauses =
readInt();
13398 for (
unsigned I = 0; I < NumClauses; ++I)
13401 SizeExprs, EndLoc);
13405 unsigned NumExprs =
readInt();
13408 for (
unsigned I = 0; I < NumExprs; ++I) {
13414 GangKinds, Exprs, EndLoc);
13420 WorkerExpr, EndLoc);
13426 VectorExpr, EndLoc);
13438 LParenLoc, VarList, EndLoc);
13452 llvm_unreachable(
"Clause serialization not yet implemented");
13454 llvm_unreachable(
"Invalid Clause Kind");
13459 for (
unsigned I = 0; I < Clauses.size(); ++I)
13464 unsigned NumVars =
readInt();
13465 A->Clauses.resize(NumVars);
13472 llvm::FoldingSetNodeID ID;
13473 ID.AddString(PrimaryModuleName);
13474 return ID.computeStableHash();
13479 return std::nullopt;
13482 return std::nullopt;
13485 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 std::pair< bool, bool > wasValidatedInBuildSession(const ModuleFile &MF, const HeaderSearchOptions &HSOpts)
Returns {build-session validation applies, MF was validated this session}.
static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID)
static void collectMacroDefinitions(const PreprocessorOptions &PPOpts, MacroDefinitionsMap &Macros, SmallVectorImpl< StringRef > *MacroNames=nullptr)
Collect the macro definitions provided by the given preprocessor options.
static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II, bool IsModule)
static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method)
Move the given method to the back of the global list of methods.
static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps)
static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)
Whether the given identifier is "interesting".
static bool parseModuleFileExtensionMetadata(const SmallVectorImpl< uint64_t > &Record, StringRef Blob, ModuleFileExtensionMetadata &Metadata)
Parse a record and blob containing module file extension metadata.
static Module * getTopImportImplicitModule(ModuleManager &ModuleMgr, Preprocessor &PP)
Return the top import module if it is implicit, nullptr otherwise.
static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename, bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr, std::string &SuggestedPredefines, const LangOptions &LangOpts, OptionValidation Validation=OptionValidateContradictions)
Check the preprocessor options deserialized from the control block against the preprocessor options i...
static 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 makeExplicit(std::string Name)
Creates a file name for an explicit module.
static ModuleFileName makeInMemory(StringRef Name)
Creates a file name for an in-memory module.
StringRef str() const
Returns the plain module file name.
static ModuleFileName makeFromRaw(StringRef Name, unsigned RawKind)
Creates a file name from the raw kind value.
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella header of the given module to the given header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false, SourceLocation Loc=SourceLocation())
Adds this header to the given module.
OptionalFileEntryRef findUmbrellaHeaderForModule(Module *M, std::string NameAsWritten, SmallVectorImpl< char > &RelativePathName)
Find the FileEntry for an umbrella header in a module as if it was written in the module map as a hea...
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella directory of the given module to the given directory.
llvm::DenseSet< FileEntryRef > AdditionalModMapsSet
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
ModuleHeaderRole
Flags describing the role of a module header.
Reference to a module that consists of either an existing/materialized Module object,...
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
void addRequirement(StringRef Feature, bool RequiredState, const LangOptions &LangOpts, const TargetInfo &Target)
Add the given feature requirement to the list of features required by this module.
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
NameVisibilityKind
Describes the visibility of the various names within a particular module.
@ Hidden
All of the names in this module are hidden.
@ AllVisible
All of the names in this module are visible.
const ModuleFileKey * getASTFileKey() const
The serialized AST file key for this module, if one was created.
SourceLocation DefinitionLoc
The location of the module definition.
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
ModuleKind Kind
The kind of this module.
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
bool isUnimportable() const
Determine whether this module has been declared unimportable.
void setASTFileNameAndKey(ModuleFileName NewName, ModuleFileKey NewKey)
Set the serialized module file for the top-level module of this module.
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
std::string Name
The name of this module.
const ModuleFileName * getASTFileName() const
The serialized AST file name for this module, if one was created.
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
OptionalDirectoryEntryRef Directory
The build directory of this module.
llvm::SmallVector< ModuleRef, 2 > AffectingClangModules
The set of top-level modules that affected the compilation of this module, but were not imported.
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
ASTFileSignature Signature
The module signature.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
unsigned IsAvailable
Whether this module is available in the current translation unit.
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
void addSubmodule(StringRef Name, Module *Submodule)
Add a child submodule.
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
std::vector< Conflict > Conflicts
The list of conflicts.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Represent a C++ namespace.
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
static std::string getOwningModuleNameForDiagnostic(const Decl *D)
Get the best name we know for the module that owns the given declaration, or an empty string if the d...
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'allocate' in the 'pragma omp ...' directives.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'allocator' clause in the 'pragma omp ...' directive.
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C)
OMPClauseReader(ASTRecordReader &Record)
void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C)
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This is a basic class for representing single OpenMP clause.
This represents 'collapse' clause in the 'pragma omp ...' directive.
This represents the 'counts' clause in the 'pragma omp split' directive.
static OMPCountsClause * CreateEmpty(const ASTContext &C, unsigned NumCounts)
Build an empty 'counts' AST node for deserialization.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents 'final' clause in the 'pragma omp ...' directive.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
static OMPFullClause * CreateEmpty(const ASTContext &C)
Build an empty 'full' AST node for deserialization.
This represents 'if' clause in the 'pragma omp ...' directive.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
static OMPLoopRangeClause * CreateEmpty(const ASTContext &C)
Build an empty 'looprange' clause node.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
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)