96#include "llvm/ADT/APFloat.h"
97#include "llvm/ADT/APInt.h"
98#include "llvm/ADT/ArrayRef.h"
99#include "llvm/ADT/DenseMap.h"
100#include "llvm/ADT/FoldingSet.h"
101#include "llvm/ADT/IntrusiveRefCntPtr.h"
102#include "llvm/ADT/STLExtras.h"
103#include "llvm/ADT/ScopeExit.h"
104#include "llvm/ADT/Sequence.h"
105#include "llvm/ADT/SmallPtrSet.h"
106#include "llvm/ADT/SmallVector.h"
107#include "llvm/ADT/StringExtras.h"
108#include "llvm/ADT/StringMap.h"
109#include "llvm/ADT/StringRef.h"
110#include "llvm/ADT/iterator_range.h"
111#include "llvm/Bitstream/BitstreamReader.h"
112#include "llvm/Support/Compiler.h"
113#include "llvm/Support/Compression.h"
114#include "llvm/Support/DJB.h"
115#include "llvm/Support/Endian.h"
116#include "llvm/Support/Error.h"
117#include "llvm/Support/ErrorHandling.h"
118#include "llvm/Support/LEB128.h"
119#include "llvm/Support/MemoryBuffer.h"
120#include "llvm/Support/Path.h"
121#include "llvm/Support/SaveAndRestore.h"
122#include "llvm/Support/TimeProfiler.h"
123#include "llvm/Support/Timer.h"
124#include "llvm/Support/VersionTuple.h"
125#include "llvm/Support/raw_ostream.h"
126#include "llvm/TargetParser/Triple.h"
139#include <system_error>
144using namespace clang;
147using llvm::BitstreamCursor;
155 return First->ReadFullVersionInformation(FullVersion) ||
156 Second->ReadFullVersionInformation(FullVersion);
160 First->ReadModuleName(ModuleName);
161 Second->ReadModuleName(ModuleName);
165 First->ReadModuleMapFile(ModuleMapPath);
166 Second->ReadModuleMapFile(ModuleMapPath);
170 const LangOptions &LangOpts, StringRef ModuleFilename,
bool Complain,
171 bool AllowCompatibleDifferences) {
172 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
173 AllowCompatibleDifferences) ||
174 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
175 AllowCompatibleDifferences);
179 const CodeGenOptions &CGOpts, StringRef ModuleFilename,
bool Complain,
180 bool AllowCompatibleDifferences) {
181 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
182 AllowCompatibleDifferences) ||
183 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
184 AllowCompatibleDifferences);
188 const TargetOptions &TargetOpts, StringRef ModuleFilename,
bool Complain,
189 bool AllowCompatibleDifferences) {
190 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
191 AllowCompatibleDifferences) ||
192 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
193 AllowCompatibleDifferences);
198 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
199 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
205 return First->ReadFileSystemOptions(FSOpts, Complain) ||
206 Second->ReadFileSystemOptions(FSOpts, Complain);
211 StringRef ContextHash,
bool Complain) {
212 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
214 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
220 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
221 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
222 Complain, SuggestedPredefines) ||
223 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
224 Complain, SuggestedPredefines);
229 First->ReadCounter(M,
Value);
230 Second->ReadCounter(M,
Value);
234 return First->needsInputFileVisitation() ||
235 Second->needsInputFileVisitation();
239 return First->needsSystemInputFileVisitation() ||
240 Second->needsSystemInputFileVisitation();
245 First->visitModuleFile(Filename, Kind);
246 Second->visitModuleFile(Filename, Kind);
252 bool isExplicitModule) {
253 bool Continue =
false;
254 if (First->needsInputFileVisitation() &&
255 (!isSystem || First->needsSystemInputFileVisitation()))
256 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
258 if (Second->needsInputFileVisitation() &&
259 (!isSystem || Second->needsSystemInputFileVisitation()))
260 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
267 First->readModuleFileExtension(Metadata);
268 Second->readModuleFileExtension(Metadata);
287 StringRef ModuleFilename,
289 bool AllowCompatibleDifferences =
true) {
293#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
294 if constexpr (CK::Compatibility != CK::Benign) { \
295 if ((CK::Compatibility == CK::NotCompatible) || \
296 (CK::Compatibility == CK::Compatible && \
297 !AllowCompatibleDifferences)) { \
298 if (ExistingLangOpts.Name != LangOpts.Name) { \
301 Diags->Report(diag::err_ast_file_langopt_mismatch) \
302 << Description << LangOpts.Name << ExistingLangOpts.Name \
305 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
306 << Description << ModuleFilename; \
313#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
314 if constexpr (CK::Compatibility != CK::Benign) { \
315 if ((CK::Compatibility == CK::NotCompatible) || \
316 (CK::Compatibility == CK::Compatible && \
317 !AllowCompatibleDifferences)) { \
318 if (ExistingLangOpts.Name != LangOpts.Name) { \
320 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
321 << Description << ModuleFilename; \
327#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
328 if constexpr (CK::Compatibility != CK::Benign) { \
329 if ((CK::Compatibility == CK::NotCompatible) || \
330 (CK::Compatibility == CK::Compatible && \
331 !AllowCompatibleDifferences)) { \
332 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
334 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
335 << Description << ModuleFilename; \
341#include "clang/Basic/LangOptions.def"
345 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
346 <<
"module features" << ModuleFilename;
352 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
353 <<
"target Objective-C runtime" << ModuleFilename;
360 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
361 <<
"block command names" << ModuleFilename;
369 if (!AllowCompatibleDifferences) {
373 ExistingSanitizers.
clear(ModularSanitizers);
374 ImportedSanitizers.
clear(ModularSanitizers);
375 if (ExistingSanitizers.
Mask != ImportedSanitizers.
Mask) {
376 const std::string Flag =
"-fsanitize=";
378#define SANITIZER(NAME, ID) \
380 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
381 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
382 if (InExistingModule != InImportedModule) \
383 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
384 << InExistingModule << ModuleFilename << (Flag + NAME); \
386#include "clang/Basic/Sanitizers.def"
397 StringRef ModuleFilename,
399 bool AllowCompatibleDifferences =
true) {
403#define CODEGENOPT(Name, Bits, Default, Compatibility) \
404 if constexpr (CK::Compatibility != CK::Benign) { \
405 if ((CK::Compatibility == CK::NotCompatible) || \
406 (CK::Compatibility == CK::Compatible && \
407 !AllowCompatibleDifferences)) { \
408 if (ExistingCGOpts.Name != CGOpts.Name) { \
411 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
412 << #Name << CGOpts.Name << ExistingCGOpts.Name \
415 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
416 << #Name << ModuleFilename; \
423#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
424 if constexpr (CK::Compatibility != CK::Benign) { \
425 if ((CK::Compatibility == CK::NotCompatible) || \
426 (CK::Compatibility == CK::Compatible && \
427 !AllowCompatibleDifferences)) { \
428 if (ExistingCGOpts.Name != CGOpts.Name) { \
430 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
431 << #Name << ModuleFilename; \
436#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
437 if constexpr (CK::Compatibility != CK::Benign) { \
438 if ((CK::Compatibility == CK::NotCompatible) || \
439 (CK::Compatibility == CK::Compatible && \
440 !AllowCompatibleDifferences)) { \
441 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
443 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
444 << #Name << ModuleFilename; \
449#define DEBUGOPT(Name, Bits, Default, Compatibility)
450#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
451#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
452#include "clang/Basic/CodeGenOptions.def"
465 StringRef ModuleFilename,
467 bool AllowCompatibleDifferences =
true) {
468#define CHECK_TARGET_OPT(Field, Name) \
469 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
471 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
472 << ModuleFilename << Name << TargetOpts.Field \
473 << ExistingTargetOpts.Field; \
484 if (!AllowCompatibleDifferences) {
489#undef CHECK_TARGET_OPT
497 llvm::sort(ExistingFeatures);
498 llvm::sort(ReadFeatures);
504 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
505 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
506 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
507 ExistingFeatures.begin(), ExistingFeatures.end(),
508 std::back_inserter(UnmatchedReadFeatures));
512 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
516 for (StringRef
Feature : UnmatchedReadFeatures)
517 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
518 <<
false << ModuleFilename <<
Feature;
519 for (StringRef
Feature : UnmatchedExistingFeatures)
520 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
521 <<
true << ModuleFilename <<
Feature;
524 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
528 StringRef ModuleFilename,
bool Complain,
529 bool AllowCompatibleDifferences) {
530 const LangOptions &ExistingLangOpts = PP.getLangOpts();
532 Complain ? &Reader.Diags :
nullptr,
533 AllowCompatibleDifferences);
537 StringRef ModuleFilename,
bool Complain,
538 bool AllowCompatibleDifferences) {
541 Complain ? &Reader.Diags :
nullptr,
542 AllowCompatibleDifferences);
546 StringRef ModuleFilename,
bool Complain,
547 bool AllowCompatibleDifferences) {
548 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
550 Complain ? &Reader.Diags :
nullptr,
551 AllowCompatibleDifferences);
556using MacroDefinitionsMap =
557 llvm::StringMap<std::pair<StringRef,
bool >>;
566 bool empty()
const {
return Decls.empty(); }
568 bool insert(NamedDecl *ND) {
569 auto [_, Inserted] =
Found.insert(ND);
576using DeclsMap = llvm::DenseMap<DeclarationName, DeclsSet>;
582 StringRef ModuleFilename,
592 for (
auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
601 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
603 ->getWarningOptionForDiag(DiagID)
623 StringRef ModuleFilename,
bool IsSystem,
624 bool SystemHeaderWarningsInModule,
633 !SystemHeaderWarningsInModule) {
635 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
636 <<
"-Wsystem-headers" << ModuleFilename;
643 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
644 <<
"-Werror" << ModuleFilename;
651 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
652 <<
"-Weverything -Werror" << ModuleFilename;
659 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
660 <<
"-pedantic-errors" << ModuleFilename;
685 assert(!ModuleName.empty() &&
"diagnostic options read before module name");
689 assert(M &&
"missing module");
694 StringRef ModuleFilename,
698 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
702 PP.getFileManager().getVirtualFileSystem(),
706 assert(ModuleMgr.
size() >= 1 &&
"what ASTFile is this then");
712 Module *Importer = PP.getCurrentModule();
715 bool SystemHeaderWarningsInModule =
722 TopM->
IsSystem, SystemHeaderWarningsInModule,
730 MacroDefinitionsMap &
Macros,
732 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
734 bool IsUndef = PPOpts.
Macros[I].second;
736 std::pair<StringRef, StringRef> MacroPair =
Macro.split(
'=');
737 StringRef MacroName = MacroPair.first;
738 StringRef MacroBody = MacroPair.second;
742 auto [It, Inserted] =
Macros.try_emplace(MacroName);
743 if (MacroNames && Inserted)
744 MacroNames->push_back(MacroName);
746 It->second = std::make_pair(
"",
true);
751 if (MacroName.size() ==
Macro.size())
755 StringRef::size_type End = MacroBody.find_first_of(
"\n\r");
756 MacroBody = MacroBody.substr(0, End);
759 auto [It, Inserted] =
Macros.try_emplace(MacroName);
760 if (MacroNames && Inserted)
761 MacroNames->push_back(MacroName);
762 It->second = std::make_pair(MacroBody,
false);
786 std::string &SuggestedPredefines,
const LangOptions &LangOpts,
790 MacroDefinitionsMap ASTFileMacros;
792 MacroDefinitionsMap ExistingMacros;
795 &ExistingMacroNames);
799 SuggestedPredefines +=
"# 1 \"<command line>\" 1\n";
801 for (
unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
803 StringRef MacroName = ExistingMacroNames[I];
804 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
807 llvm::StringMap<std::pair<StringRef,
bool >>
::iterator Known =
808 ASTFileMacros.find(MacroName);
814 Diags->
Report(diag::err_ast_file_macro_def_undef)
815 << MacroName <<
true << ModuleFilename;
823 if (Existing.second) {
824 SuggestedPredefines +=
"#undef ";
825 SuggestedPredefines += MacroName.str();
826 SuggestedPredefines +=
'\n';
828 SuggestedPredefines +=
"#define ";
829 SuggestedPredefines += MacroName.str();
830 SuggestedPredefines +=
' ';
831 SuggestedPredefines += Existing.first.str();
832 SuggestedPredefines +=
'\n';
839 if (Existing.second != Known->second.second) {
841 Diags->
Report(diag::err_ast_file_macro_def_undef)
842 << MacroName << Known->second.second << ModuleFilename;
849 if (Existing.second || Existing.first == Known->second.first) {
850 ASTFileMacros.erase(Known);
856 Diags->
Report(diag::err_ast_file_macro_def_conflict)
857 << MacroName << Known->second.first << Existing.first
864 SuggestedPredefines +=
"# 1 \"<built-in>\" 2\n";
869 for (
const auto &MacroName : ASTFileMacros.keys()) {
871 Diags->
Report(diag::err_ast_file_macro_def_undef)
872 << MacroName <<
false << ModuleFilename;
883 Diags->
Report(diag::err_ast_file_undef)
890 if (LangOpts.Modules &&
894 Diags->
Report(diag::err_ast_file_pp_detailed_record)
901 for (
unsigned I = 0, N = ExistingPPOpts.
Includes.size(); I != N; ++I) {
908 SuggestedPredefines +=
"#include \"";
909 SuggestedPredefines +=
File;
910 SuggestedPredefines +=
"\"\n";
920 SuggestedPredefines +=
"#include \"";
921 SuggestedPredefines +=
File;
922 SuggestedPredefines +=
"\"\n";
925 for (
unsigned I = 0, N = ExistingPPOpts.
MacroIncludes.size(); I != N; ++I) {
930 SuggestedPredefines +=
"#__include_macros \"";
931 SuggestedPredefines +=
File;
932 SuggestedPredefines +=
"\"\n##\n";
939 StringRef ModuleFilename,
940 bool ReadMacros,
bool Complain,
941 std::string &SuggestedPredefines) {
945 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
946 Complain ? &Reader.Diags :
nullptr, PP.getFileManager(),
947 SuggestedPredefines, PP.getLangOpts());
952 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
954 ModuleFilename, ReadMacros,
nullptr,
955 PP.getFileManager(), SuggestedPredefines,
964 StringRef ExistingSpecificModuleCachePath,
965 StringRef ASTFilename,
973 std::string(ContextHash));
976 SpecificModuleCachePath == ExistingSpecificModuleCachePath)
978 auto EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
979 SpecificModuleCachePath, ExistingSpecificModuleCachePath);
980 if (EqualOrErr && *EqualOrErr)
986 EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
988 if (EqualOrErr && *EqualOrErr)
989 Diags->
Report(clang::diag::warn_ast_file_config_mismatch) << ASTFilename;
991 Diags->
Report(diag::err_ast_file_modulecache_mismatch)
992 << SpecificModuleCachePath << ExistingSpecificModuleCachePath
999 StringRef ASTFilename,
1000 StringRef ContextHash,
1002 const HeaderSearch &HeaderSearchInfo = PP.getHeaderSearchInfo();
1005 ASTFilename, Complain ? &Reader.Diags :
nullptr,
1006 PP.getLangOpts(), PP.getPreprocessorOpts(),
1011 PP.setCounterValue(
Value);
1019 unsigned Length = 0;
1020 const char *
Error =
nullptr;
1022 uint64_t Val = llvm::decodeULEB128(P, &Length,
nullptr, &
Error);
1024 llvm::report_fatal_error(
Error);
1030static std::pair<unsigned, unsigned>
1033 if ((
unsigned)KeyLen != KeyLen)
1034 llvm::report_fatal_error(
"key too large");
1037 if ((
unsigned)DataLen != DataLen)
1038 llvm::report_fatal_error(
"data too large");
1040 return std::make_pair(KeyLen, DataLen);
1044 bool TakeOwnership) {
1045 DeserializationListener = Listener;
1046 OwnsDeserializationListener = TakeOwnership;
1057 Reader.ReadModuleOffsetMap(MF);
1059 unsigned ModuleFileIndex =
ID.getModuleFileIndex();
1060 unsigned LocalDeclID =
ID.getLocalDeclIndex();
1066 assert(OwningModuleFile);
1070 if (!ModuleFileIndex)
1073 assert(LocalDeclID < LocalNumDecls);
1081 unsigned ModuleFileIndex,
unsigned LocalDeclID) {
1086std::pair<unsigned, unsigned>
1093 using namespace llvm::support;
1096 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1098 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1105 Args.push_back(FirstII);
1106 for (
unsigned I = 1; I != N; ++I)
1107 Args.push_back(Reader.getLocalIdentifier(
1108 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1116 using namespace llvm::support;
1120 Result.ID = Reader.getGlobalSelectorID(
1121 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1122 unsigned FullInstanceBits =
1123 endian::readNext<uint16_t, llvm::endianness::little>(d);
1124 unsigned FullFactoryBits =
1125 endian::readNext<uint16_t, llvm::endianness::little>(d);
1126 Result.InstanceBits = FullInstanceBits & 0x3;
1127 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1128 Result.FactoryBits = FullFactoryBits & 0x3;
1129 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1130 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1131 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1134 for (
unsigned I = 0; I != NumInstanceMethods; ++I) {
1138 endian::readNext<DeclID, llvm::endianness::little>(d))))
1143 for (
unsigned I = 0; I != NumFactoryMethods; ++I) {
1147 endian::readNext<DeclID, llvm::endianness::little>(d))))
1155 return llvm::djbHash(a);
1158std::pair<unsigned, unsigned>
1165 assert(n >= 2 && d[n-1] ==
'\0');
1166 return StringRef((
const char*) d, n-1);
1172 bool IsInteresting =
1183 bool Value = Bits & 0x1;
1189 using namespace llvm::support;
1192 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1193 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1206 const unsigned char* d,
1208 using namespace llvm::support;
1211 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1212 bool IsInteresting = RawID & 0x01;
1222 II = &Reader.getIdentifierTable().getOwn(k);
1225 bool IsModule = Reader.getPreprocessor().getCurrentModule() !=
nullptr;
1227 Reader.markIdentifierUpToDate(II);
1229 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1230 if (!IsInteresting) {
1233 Reader.SetIdentifierInfo(ID, II);
1237 unsigned ObjCOrBuiltinID =
1238 endian::readNext<uint16_t, llvm::endianness::little>(d);
1239 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1240 bool CPlusPlusOperatorKeyword =
readBit(Bits);
1241 bool HasRevertedTokenIDToIdentifier =
readBit(Bits);
1242 bool Poisoned =
readBit(Bits);
1243 bool ExtensionToken =
readBit(Bits);
1244 bool HasMacroDefinition =
readBit(Bits);
1246 assert(Bits == 0 &&
"Extra bits in the identifier?");
1247 DataLen -=
sizeof(uint16_t) * 2;
1251 if (HasRevertedTokenIDToIdentifier && II->
getTokenID() != tok::identifier)
1256 "Incorrect extension token flag");
1257 (void)ExtensionToken;
1261 "Incorrect C++ operator keyword flag");
1262 (void)CPlusPlusOperatorKeyword;
1266 if (HasMacroDefinition) {
1267 uint32_t MacroDirectivesOffset =
1268 endian::readNext<uint32_t, llvm::endianness::little>(d);
1271 if (MacroDirectivesOffset)
1272 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1274 hasMacroDefinitionInDependencies =
true;
1277 Reader.SetIdentifierInfo(ID, II);
1283 for (; DataLen > 0; DataLen -=
sizeof(
DeclID))
1284 DeclIDs.push_back(Reader.getGlobalDeclID(
1287 endian::readNext<DeclID, llvm::endianness::little>(d))));
1288 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1295 : Kind(Name.getNameKind()) {
1325 llvm::FoldingSetNodeID ID;
1326 ID.AddInteger(Kind);
1349 return ID.computeStableHash();
1354 using namespace llvm::support;
1356 uint32_t ModuleFileID =
1357 endian::readNext<uint32_t, llvm::endianness::little>(d);
1358 return Reader.getLocalModuleFile(
F, ModuleFileID);
1361std::pair<unsigned, unsigned>
1368 using namespace llvm::support;
1377 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1384 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1408 using namespace llvm::support;
1410 for (
unsigned NumDecls = DataLen /
sizeof(
DeclID); NumDecls; --NumDecls) {
1412 Reader,
F, endian::readNext<DeclID, llvm::endianness::little>(d));
1418 const unsigned char *d,
1426 llvm::FoldingSetNodeID ID;
1427 ID.AddInteger(Key.first.getHash());
1428 ID.AddInteger(Key.second);
1429 return ID.computeStableHash();
1440 return {Name, *ModuleHash};
1446 unsigned PrimaryModuleHash =
1447 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1448 return {Name, PrimaryModuleHash};
1452 const unsigned char *d,
1460 using namespace llvm::support;
1462 uint32_t ModuleFileID =
1463 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1464 return Reader.getLocalModuleFile(F, ModuleFileID);
1469 using namespace llvm::support;
1470 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1473std::pair<unsigned, unsigned>
1479 const unsigned char *d,
1482 using namespace llvm::support;
1484 for (
unsigned NumDecls =
1486 NumDecls; --NumDecls) {
1489 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1490 Val.
insert(Reader.getGlobalDeclID(F, LocalID));
1494bool ASTReader::ReadLexicalDeclContextStorage(
ModuleFile &M,
1495 BitstreamCursor &Cursor,
1498 assert(Offset != 0);
1501 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1502 Error(std::move(Err));
1510 Error(MaybeCode.takeError());
1513 unsigned Code = MaybeCode.get();
1516 if (!MaybeRecCode) {
1517 Error(MaybeRecCode.takeError());
1520 unsigned RecCode = MaybeRecCode.get();
1522 Error(
"Expected lexical block");
1527 "expected a TU_UPDATE_LEXICAL record for TU");
1532 auto &Lex = LexicalDecls[DC];
1534 Lex = std::make_pair(
1537 Blob.size() /
sizeof(
DeclID)));
1543bool ASTReader::ReadVisibleDeclContextStorage(
1544 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1545 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1546 assert(Offset != 0);
1548 SavedStreamPosition SavedPosition(Cursor);
1549 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1550 Error(std::move(Err));
1556 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1558 Error(MaybeCode.takeError());
1561 unsigned Code = MaybeCode.get();
1563 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1564 if (!MaybeRecCode) {
1565 Error(MaybeRecCode.takeError());
1568 unsigned RecCode = MaybeRecCode.get();
1569 switch (VisibleKind) {
1570 case VisibleDeclContextStorageKind::GenerallyVisible:
1572 Error(
"Expected visible lookup table block");
1576 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1578 Error(
"Expected module local visible lookup table block");
1582 case VisibleDeclContextStorageKind::TULocalVisible:
1584 Error(
"Expected TU local lookup table block");
1592 auto *
Data = (
const unsigned char*)Blob.data();
1593 switch (VisibleKind) {
1594 case VisibleDeclContextStorageKind::GenerallyVisible:
1595 PendingVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1597 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1598 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1600 case VisibleDeclContextStorageKind::TULocalVisible:
1602 TULocalUpdates[
ID].push_back(UpdateData{&M,
Data});
1608void ASTReader::AddSpecializations(
const Decl *D,
const unsigned char *
Data,
1612 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1613 SpecLookups[D].Table.add(&M,
Data,
1617bool ASTReader::ReadSpecializations(
ModuleFile &M, BitstreamCursor &Cursor,
1618 uint64_t Offset, Decl *D,
bool IsPartial) {
1619 assert(Offset != 0);
1621 SavedStreamPosition SavedPosition(Cursor);
1622 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1623 Error(std::move(Err));
1629 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1631 Error(MaybeCode.takeError());
1634 unsigned Code = MaybeCode.get();
1636 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1637 if (!MaybeRecCode) {
1638 Error(MaybeRecCode.takeError());
1641 unsigned RecCode = MaybeRecCode.get();
1644 Error(
"Expected decl specs block");
1648 auto *
Data = (
const unsigned char *)Blob.data();
1649 AddSpecializations(D,
Data, M, IsPartial);
1653void ASTReader::Error(StringRef Msg)
const {
1654 Error(diag::err_fe_ast_file_malformed, Msg);
1655 if (PP.getLangOpts().Modules &&
1656 !PP.getHeaderSearchInfo().getSpecificModuleCachePath().empty()) {
1657 Diag(diag::note_module_cache_path)
1658 << PP.getHeaderSearchInfo().getSpecificModuleCachePath();
1662void ASTReader::Error(
unsigned DiagID, StringRef Arg1, StringRef Arg2,
1663 StringRef Arg3)
const {
1664 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1668struct AlreadyReportedDiagnosticError
1669 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1672 void log(raw_ostream &OS)
const override {
1673 llvm_unreachable(
"reporting an already-reported diagnostic error");
1676 std::error_code convertToErrorCode()
const override {
1677 return llvm::inconvertibleErrorCode();
1681char AlreadyReportedDiagnosticError::ID = 0;
1684void ASTReader::Error(llvm::Error &&Err)
const {
1686 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1687 [&](llvm::ErrorInfoBase &E) {
return Error(E.message()); });
1697 LineTableInfo &LineTable = SourceMgr.getLineTable();
1700 std::map<int, int> FileIDs;
1702 for (
unsigned I = 0;
Record[Idx]; ++I) {
1704 auto Filename = ReadPath(F,
Record, Idx);
1710 std::vector<LineEntry> Entries;
1711 while (Idx <
Record.size()) {
1712 FileID FID = ReadFileID(F,
Record, Idx);
1715 unsigned NumEntries =
Record[Idx++];
1716 assert(NumEntries &&
"no line entries for file ID");
1718 Entries.reserve(NumEntries);
1719 for (
unsigned I = 0; I != NumEntries; ++I) {
1720 unsigned FileOffset =
Record[Idx++];
1721 unsigned LineNo =
Record[Idx++];
1722 int FilenameID = FileIDs[
Record[Idx++]];
1725 unsigned IncludeOffset =
Record[Idx++];
1727 FileKind, IncludeOffset));
1734llvm::Error ASTReader::ReadSourceManagerBlock(
ModuleFile &F) {
1735 using namespace SrcMgr;
1743 SLocEntryCursor = F.
Stream;
1746 if (llvm::Error Err = F.
Stream.SkipBlock())
1756 Expected<llvm::BitstreamEntry> MaybeE =
1757 SLocEntryCursor.advanceSkippingSubblocks();
1759 return MaybeE.takeError();
1760 llvm::BitstreamEntry E = MaybeE.get();
1763 case llvm::BitstreamEntry::SubBlock:
1764 case llvm::BitstreamEntry::Error:
1765 return llvm::createStringError(std::errc::illegal_byte_sequence,
1766 "malformed block record in AST file");
1767 case llvm::BitstreamEntry::EndBlock:
1768 return llvm::Error::success();
1769 case llvm::BitstreamEntry::Record:
1777 Expected<unsigned> MaybeRecord =
1778 SLocEntryCursor.readRecord(E.ID,
Record, &Blob);
1780 return MaybeRecord.takeError();
1781 switch (MaybeRecord.get()) {
1789 return llvm::Error::success();
1794llvm::Expected<SourceLocation::UIntTy>
1800 return std::move(Err);
1804 return MaybeEntry.takeError();
1806 llvm::BitstreamEntry Entry = MaybeEntry.get();
1807 if (Entry.Kind != llvm::BitstreamEntry::Record)
1808 return llvm::createStringError(
1809 std::errc::illegal_byte_sequence,
1810 "incorrectly-formatted source location entry in AST file");
1816 return MaybeSLOC.takeError();
1818 switch (MaybeSLOC.get()) {
1820 return llvm::createStringError(
1821 std::errc::illegal_byte_sequence,
1822 "incorrectly-formatted source location entry in AST file");
1832 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1833 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1834 "Corrupted global sloc offset map");
1839 auto It = llvm::upper_bound(
1842 int ID = F->SLocEntryBaseID + LocalIndex;
1843 std::size_t Index = -ID - 2;
1844 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1845 assert(!SourceMgr.SLocEntryLoaded[Index]);
1846 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1847 if (!MaybeEntryOffset) {
1848 Error(MaybeEntryOffset.takeError());
1852 SourceMgr.LoadedSLocEntryTable[Index] =
1853 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1854 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1856 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1872 Error(
"source location entry ID out-of-range for AST file");
1878 auto ReadBuffer = [
this](
1879 BitstreamCursor &SLocEntryCursor,
1880 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1885 Error(MaybeCode.takeError());
1888 unsigned Code = MaybeCode.get();
1891 SLocEntryCursor.readRecord(Code,
Record, &Blob);
1892 if (!MaybeRecCode) {
1893 Error(MaybeRecCode.takeError());
1896 unsigned RecCode = MaybeRecCode.get();
1901 const llvm::compression::Format F =
1902 Blob.size() > 0 && Blob.data()[0] == 0x78
1903 ? llvm::compression::Format::Zlib
1904 : llvm::compression::Format::Zstd;
1905 if (
const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1910 if (llvm::Error E = llvm::compression::decompress(
1911 F, llvm::arrayRefFromStringRef(Blob), Decompressed,
Record[0])) {
1912 Error(
"could not decompress embedded file contents: " +
1913 llvm::toString(std::move(E)));
1916 return llvm::MemoryBuffer::getMemBufferCopy(
1917 llvm::toStringRef(Decompressed), Name);
1919 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name,
true);
1921 Error(
"AST record has invalid code");
1926 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1930 Error(std::move(Err));
1937 ++NumSLocEntriesRead;
1940 Error(MaybeEntry.takeError());
1943 llvm::BitstreamEntry Entry = MaybeEntry.get();
1945 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1946 Error(
"incorrectly-formatted source location entry in AST file");
1953 SLocEntryCursor.readRecord(Entry.ID,
Record, &Blob);
1955 Error(MaybeSLOC.takeError());
1958 switch (MaybeSLOC.get()) {
1960 Error(
"incorrectly-formatted source location entry in AST file");
1966 unsigned InputID =
Record[4];
1967 InputFile IF = getInputFile(*F, InputID);
1980 IncludeLoc = getImportLocation(F);
1984 FileID FID = SourceMgr.createFileID(*
File, IncludeLoc, FileCharacter, ID,
1987 FileInfo.NumCreatedFIDs =
Record[5];
1991 unsigned NumFileDecls =
Record[7];
1992 if (NumFileDecls && ContextObj) {
1994 assert(F->
FileSortedDecls &&
"FILE_SORTED_DECLS not encountered yet ?");
2000 SourceMgr.getOrCreateContentCache(*
File, isSystem(FileCharacter));
2004 auto Buffer = ReadBuffer(SLocEntryCursor,
File->getName());
2007 SourceMgr.overrideFileContents(*
File, std::move(Buffer));
2014 const char *Name = Blob.data();
2015 unsigned Offset =
Record[0];
2020 IncludeLoc = getImportLocation(F);
2023 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2026 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2027 BaseOffset + Offset, IncludeLoc);
2029 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2030 FileInfo.setHasLineDirectives();
2039 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2054 Error(
"source location entry ID out-of-range for AST file");
2059 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2077 assert(SourceMgr.getMainFileID().isValid() &&
"missing main file");
2078 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2088 uint64_t *StartOfBlockOffset) {
2089 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2092 if (StartOfBlockOffset)
2093 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2096 uint64_t Offset = Cursor.GetCurrentBitNo();
2099 return MaybeCode.takeError();
2100 unsigned Code = MaybeCode.get();
2103 if (Code != llvm::bitc::DEFINE_ABBREV) {
2104 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2106 return llvm::Error::success();
2108 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2121 if (
Tok.isAnnotation()) {
2123 switch (
Tok.getKind()) {
2124 case tok::annot_pragma_loop_hint: {
2128 unsigned NumTokens =
Record[Idx++];
2130 Toks.reserve(NumTokens);
2131 for (
unsigned I = 0; I < NumTokens; ++I)
2133 Info->Toks =
llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2134 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2137 case tok::annot_pragma_pack: {
2142 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2144 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2148 case tok::annot_pragma_openmp:
2149 case tok::annot_pragma_openmp_end:
2150 case tok::annot_pragma_unused:
2151 case tok::annot_pragma_openacc:
2152 case tok::annot_pragma_openacc_end:
2153 case tok::annot_repl_input_end:
2156 llvm_unreachable(
"missing deserialization code for annotation token");
2161 Tok.setIdentifierInfo(II);
2173 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2175 consumeError(std::move(Err));
2187 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2189 Stream.advanceSkippingSubblocks(Flags);
2191 Error(MaybeEntry.takeError());
2194 llvm::BitstreamEntry Entry = MaybeEntry.get();
2196 switch (Entry.Kind) {
2197 case llvm::BitstreamEntry::SubBlock:
2198 case llvm::BitstreamEntry::Error:
2199 Error(
"malformed block record in AST file");
2201 case llvm::BitstreamEntry::EndBlock:
2203 case llvm::BitstreamEntry::Record:
2214 Error(MaybeRecType.takeError());
2230 unsigned NextIndex = 1;
2232 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2237 PP.getPreprocessorAllocator());
2240 bool isC99VarArgs =
Record[NextIndex++];
2241 bool isGNUVarArgs =
Record[NextIndex++];
2242 bool hasCommaPasting =
Record[NextIndex++];
2243 MacroParams.clear();
2244 unsigned NumArgs =
Record[NextIndex++];
2245 for (
unsigned i = 0; i != NumArgs; ++i)
2260 if (NextIndex + 1 ==
Record.size() && PP.getPreprocessingRecord() &&
2265 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2267 PreprocessingRecord::PPEntityID PPID =
2268 PPRec.getPPEntityID(Index,
true);
2270 PPRec.getPreprocessedEntity(PPID));
2272 PPRec.RegisterMacroDefinition(
Macro, PPDef);
2283 if (MacroTokens.empty()) {
2284 Error(
"unexpected number of macro tokens for a macro in AST file");
2290 MacroTokens = MacroTokens.drop_front();
2301 ReadModuleOffsetMap(M);
2303 unsigned ModuleFileIndex = LocalID >> 32;
2304 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2307 assert(MF &&
"malformed identifier ID encoding?");
2309 if (!ModuleFileIndex) {
2318HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
2321 return FileMgr.getOptionalFileRef(Key.Filename);
2325 return FileMgr.getOptionalFileRef(*Resolved);
2329 uint8_t buf[
sizeof(ikey.
Size) +
sizeof(ikey.
ModTime)];
2332 return llvm::xxh3_64bits(buf);
2353 return FEA && FEA == FEB;
2356std::pair<unsigned, unsigned>
2363 using namespace llvm::support;
2366 ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2368 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2377 using namespace llvm::support;
2379 const unsigned char *End = d + DataLen;
2381 unsigned Flags = *d++;
2384 bool Included = (Flags >> 6) & 0x01;
2386 if ((FE = getFile(key)))
2389 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2392 HFI.
isImport |= (Flags >> 5) & 0x01;
2394 HFI.
DirInfo = (Flags >> 1) & 0x07;
2396 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2398 assert((End - d) % 4 == 0 &&
2399 "Wrong data length in HeaderFileInfo deserialization");
2401 uint32_t LocalSMID =
2402 endian::readNext<uint32_t, llvm::endianness::little>(d);
2408 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2409 Module *Mod = Reader.getSubmodule(GlobalSMID);
2411 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2413 if (FE || (FE = getFile(key))) {
2416 ModMap.
addHeader(Mod, H, HeaderRole,
true);
2428 uint32_t MacroDirectivesOffset) {
2429 assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
2430 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2437 for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
2438 BitstreamCursor &MacroCursor = I.MacroCursor;
2441 if (MacroCursor.getBitcodeBytes().empty())
2444 BitstreamCursor Cursor = MacroCursor;
2445 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2446 Error(std::move(Err));
2454 Error(MaybeE.takeError());
2457 llvm::BitstreamEntry E = MaybeE.get();
2460 case llvm::BitstreamEntry::SubBlock:
2461 case llvm::BitstreamEntry::Error:
2462 Error(
"malformed block record in AST file");
2464 case llvm::BitstreamEntry::EndBlock:
2467 case llvm::BitstreamEntry::Record: {
2471 Error(MaybeRecord.takeError());
2474 switch (MaybeRecord.get()) {
2501 class IdentifierLookupVisitor {
2504 unsigned PriorGeneration;
2505 unsigned &NumIdentifierLookups;
2506 unsigned &NumIdentifierLookupHits;
2510 IdentifierLookupVisitor(StringRef Name,
unsigned PriorGeneration,
2511 unsigned &NumIdentifierLookups,
2512 unsigned &NumIdentifierLookupHits)
2514 PriorGeneration(PriorGeneration),
2515 NumIdentifierLookups(NumIdentifierLookups),
2516 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2530 ++NumIdentifierLookups;
2531 ASTIdentifierLookupTable::iterator Pos =
2532 IdTable->find_hashed(Name, NameHash, &Trait);
2533 if (Pos == IdTable->end())
2539 ++NumIdentifierLookupHits;
2541 if (Trait.hasMoreInformationInDependencies()) {
2550 IdentifierInfo *getIdentifierInfo()
const {
return Found; }
2559 unsigned PriorGeneration = 0;
2561 PriorGeneration = IdentifierGeneration[&II];
2568 if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
2573 IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
2574 NumIdentifierLookups,
2575 NumIdentifierLookupHits);
2576 ModuleMgr.visit(Visitor, HitsPtr);
2593 uint64_t ModuleFileIndex =
Record[Idx++] << 32;
2594 uint64_t LocalIndex =
Record[Idx++];
2599 const PendingMacroInfo &PMInfo) {
2604 if (llvm::Error Err =
2606 Error(std::move(Err));
2610 struct ModuleMacroRecord {
2623 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2625 Error(MaybeEntry.takeError());
2628 llvm::BitstreamEntry Entry = MaybeEntry.get();
2630 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2631 Error(
"malformed block record in AST file");
2638 Error(MaybePP.takeError());
2646 ModuleMacros.push_back(ModuleMacroRecord());
2647 auto &Info = ModuleMacros.back();
2651 for (
int I = Idx, N =
Record.size(); I != N; ++I)
2657 Error(
"malformed block record in AST file");
2668 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2670 for (
auto &MMR : ModuleMacros) {
2672 for (
unsigned ModID : MMR.Overrides) {
2674 auto *
Macro = PP.getModuleMacro(Mod, II);
2675 assert(
Macro &&
"missing definition for overridden macro");
2676 Overrides.push_back(
Macro);
2679 bool Inserted =
false;
2681 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2692 unsigned Idx = 0, N =
Record.size();
2700 MD = PP.AllocateDefMacroDirective(MI, Loc);
2704 MD = PP.AllocateUndefMacroDirective(Loc);
2707 bool isPublic =
Record[Idx++];
2708 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2720 PP.setLoadedMacroDirective(II, Earliest, Latest);
2723bool ASTReader::shouldDisableValidationForFile(
2746static std::pair<StringRef, StringRef>
2748 const StringRef InputBlob) {
2749 uint16_t AsRequestedLength =
Record[7];
2750 return {InputBlob.substr(0, AsRequestedLength),
2751 InputBlob.substr(AsRequestedLength)};
2765 SavedStreamPosition SavedPosition(Cursor);
2769 consumeError(std::move(Err));
2772 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
2775 consumeError(MaybeCode.takeError());
2777 unsigned Code = MaybeCode.get();
2781 if (Expected<unsigned> Maybe =
Cursor.readRecord(Code,
Record, &Blob))
2783 "invalid record type for input file");
2786 consumeError(
Maybe.takeError());
2789 assert(
Record[0] == ID &&
"Bogus stored ID or offset");
2791 R.StoredSize =
static_cast<off_t
>(
Record[1]);
2792 R.StoredTime =
static_cast<time_t
>(
Record[2]);
2793 R.Overridden =
static_cast<bool>(
Record[3]);
2794 R.Transient =
static_cast<bool>(
Record[4]);
2795 R.TopLevel =
static_cast<bool>(
Record[5]);
2796 R.ModuleMap =
static_cast<bool>(
Record[6]);
2797 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2799 R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2800 R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2801 ? UnresolvedFilenameAsRequested
2802 : UnresolvedFilename;
2804 Expected<llvm::BitstreamEntry> MaybeEntry =
Cursor.advance();
2806 consumeError(MaybeEntry.takeError());
2807 llvm::BitstreamEntry Entry = MaybeEntry.get();
2808 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2809 "expected record type for input file hash");
2812 if (Expected<unsigned> Maybe =
Cursor.readRecord(Entry.ID,
Record))
2814 "invalid record type for input file hash");
2817 consumeError(
Maybe.takeError());
2842 SavedStreamPosition SavedPosition(Cursor);
2846 consumeError(std::move(Err));
2861 const HeaderSearchOptions &HSOpts =
2862 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2875 if ((Overridden || Transient || SkipChecks) && !
File)
2880 std::string ErrorStr =
"could not find file '";
2881 ErrorStr += *Filename;
2882 ErrorStr +=
"' referenced by AST file '";
2896 SourceManager &
SM = getSourceManager();
2898 if ((!Overridden && !Transient) && !SkipChecks &&
2899 SM.isFileOverridden(*
File)) {
2901 Error(diag::err_fe_pch_file_overridden, *Filename);
2913 enum ModificationKind {
2919 std::optional<int64_t> Old = std::nullopt;
2920 std::optional<int64_t>
New = std::nullopt;
2922 auto HasInputContentChanged = [&](Change OriginalChange) {
2923 assert(ValidateASTInputFilesContent &&
2924 "We should only check the content of the inputs with "
2925 "ValidateASTInputFilesContent enabled.");
2927 if (StoredContentHash == 0)
2928 return OriginalChange;
2931 if (!MemBuffOrError) {
2933 return OriginalChange;
2934 std::string ErrorStr =
"could not get buffer for file '";
2935 ErrorStr +=
File->getName();
2938 return OriginalChange;
2941 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2942 if (StoredContentHash ==
static_cast<uint64_t>(ContentHash))
2943 return Change{Change::None};
2945 return Change{Change::Content};
2947 auto HasInputFileChanged = [&]() {
2948 if (StoredSize !=
File->getSize())
2949 return Change{Change::Size, StoredSize,
File->getSize()};
2950 if (!shouldDisableValidationForFile(F) && StoredTime &&
2951 StoredTime !=
File->getModificationTime()) {
2952 Change MTimeChange = {Change::ModTime, StoredTime,
2953 File->getModificationTime()};
2957 if (ValidateASTInputFilesContent)
2958 return HasInputContentChanged(MTimeChange);
2962 return Change{Change::None};
2965 bool IsOutOfDate =
false;
2966 auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
2972 FileChange = HasInputContentChanged(FileChange);
2978 if (!StoredTime && ValidateASTInputFilesContent &&
2979 FileChange.Kind == Change::None)
2980 FileChange = HasInputContentChanged(FileChange);
2983 if (!Overridden && FileChange.Kind != Change::None) {
2986 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2987 while (!ImportStack.back()->ImportedBy.empty())
2988 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2991 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
2992 Diag(diag::err_fe_ast_file_modified)
2994 << TopLevelASTFileName;
2995 Diag(diag::note_fe_ast_file_modified)
2996 << FileChange.Kind << (FileChange.Old && FileChange.New)
2997 << llvm::itostr(FileChange.Old.value_or(0))
2998 << llvm::itostr(FileChange.New.value_or(0));
3001 if (ImportStack.size() > 1) {
3002 Diag(diag::note_ast_file_required_by)
3003 << *Filename << ImportStack[0]->FileName;
3004 for (
unsigned I = 1; I < ImportStack.size(); ++I)
3005 Diag(diag::note_ast_file_required_by)
3006 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3010 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3011 Diag(diag::note_ast_file_input_files_validation_status)
3027ASTReader::TemporarilyOwnedStringRef
3033ASTReader::TemporarilyOwnedStringRef
3036 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
3038 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3039 Path ==
"<built-in>" || Path ==
"<command line>")
3043 llvm::sys::path::append(Buf, Prefix, Path);
3044 StringRef ResolvedPath{Buf.data(), Buf.size()};
3045 return {ResolvedPath, Buf};
3058 return ResolvedPath->str();
3073 llvm_unreachable(
"unknown ASTReadResult");
3077 BitstreamCursor &Stream, StringRef Filename,
3078 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3079 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3082 consumeError(std::move(Err));
3090 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3093 consumeError(MaybeEntry.takeError());
3096 llvm::BitstreamEntry Entry = MaybeEntry.get();
3098 switch (Entry.Kind) {
3099 case llvm::BitstreamEntry::Error:
3100 case llvm::BitstreamEntry::SubBlock:
3103 case llvm::BitstreamEntry::EndBlock:
3106 case llvm::BitstreamEntry::Record:
3113 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3114 if (!MaybeRecordType) {
3116 consumeError(MaybeRecordType.takeError());
3121 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3122 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3123 AllowCompatibleConfigurationMismatch))
3124 Result = ConfigurationMismatch;
3129 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3130 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3131 AllowCompatibleConfigurationMismatch))
3132 Result = ConfigurationMismatch;
3137 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3138 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3139 AllowCompatibleConfigurationMismatch))
3140 Result = ConfigurationMismatch;
3145 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3146 if (!AllowCompatibleConfigurationMismatch &&
3147 ParseFileSystemOptions(
Record, Complain, Listener))
3148 Result = ConfigurationMismatch;
3153 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3154 if (!AllowCompatibleConfigurationMismatch &&
3155 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3156 Result = ConfigurationMismatch;
3161 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3162 if (!AllowCompatibleConfigurationMismatch &&
3163 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3164 SuggestedPredefines))
3165 Result = ConfigurationMismatch;
3171ASTReader::RelocationResult
3172ASTReader::getModuleForRelocationChecks(
ModuleFile &F,
bool DirectoryCheck) {
3174 const bool IgnoreError =
3175 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3178 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3179 return {std::nullopt, IgnoreError};
3183 if (!DirectoryCheck &&
3184 (!IsImplicitModule || ModuleMgr.begin()->Kind ==
MK_MainFile))
3185 return {std::nullopt, IgnoreError};
3187 const HeaderSearchOptions &HSOpts =
3188 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3195 return {std::nullopt, IgnoreError};
3197 return {std::nullopt, IgnoreError};
3205 Module *M = PP.getHeaderSearchInfo().lookupModule(
3210 return {M, IgnoreError};
3215 SmallVectorImpl<ImportedModule> &Loaded,
3217 unsigned ClientLoadCapabilities) {
3218 BitstreamCursor &Stream = F.
Stream;
3221 Error(std::move(Err));
3231 bool HasReadUnhashedControlBlock =
false;
3232 auto readUnhashedControlBlockOnce = [&]() {
3233 if (!HasReadUnhashedControlBlock) {
3234 HasReadUnhashedControlBlock =
true;
3235 if (ASTReadResult
Result =
3236 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3242 bool DisableValidation = shouldDisableValidationForFile(F);
3246 unsigned NumInputs = 0;
3247 unsigned NumUserInputs = 0;
3248 StringRef BaseDirectoryAsWritten;
3250 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3252 Error(MaybeEntry.takeError());
3255 llvm::BitstreamEntry Entry = MaybeEntry.get();
3257 switch (Entry.Kind) {
3258 case llvm::BitstreamEntry::Error:
3259 Error(
"malformed block record in AST file");
3261 case llvm::BitstreamEntry::EndBlock: {
3264 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3268 const HeaderSearchOptions &HSOpts =
3269 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3276 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3282 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3289 N = ForceValidateUserInputs ? NumUserInputs : 0;
3291 ForceValidateUserInputs
3297 Diag(diag::remark_module_validation)
3300 for (
unsigned I = 0; I < N; ++I) {
3301 InputFile IF = getInputFile(F, I+1, Complain);
3315 for (
unsigned I = 0; I < N; ++I) {
3316 bool IsSystem = I >= NumUserInputs;
3318 auto FilenameAsRequested = ResolveImportedPath(
3321 *FilenameAsRequested, IsSystem, FI.
Overridden,
3329 case llvm::BitstreamEntry::SubBlock:
3333 if (llvm::Error Err = Stream.SkipBlock()) {
3334 Error(std::move(Err));
3338 Error(
"malformed block record in AST file");
3348 if (Listener && !ImportedBy) {
3354 bool AllowCompatibleConfigurationMismatch =
3358 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3359 AllowCompatibleConfigurationMismatch, *Listener,
3360 SuggestedPredefines);
3362 Error(
"malformed block record in AST file");
3366 if (DisableValidation ||
3367 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3375 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3376 Error(std::move(Err));
3382 if (llvm::Error Err = Stream.SkipBlock()) {
3383 Error(std::move(Err));
3389 case llvm::BitstreamEntry::Record:
3397 Expected<unsigned> MaybeRecordType =
3398 Stream.readRecord(Entry.ID,
Record, &Blob);
3399 if (!MaybeRecordType) {
3400 Error(MaybeRecordType.takeError());
3406 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3408 : diag::err_ast_file_version_too_new)
3413 bool hasErrors =
Record[7];
3414 if (hasErrors && !DisableValidation) {
3417 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3418 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3421 if (!AllowASTWithCompilerErrors) {
3422 Diag(diag::err_ast_file_with_compiler_errors)
3428 Diags.ErrorOccurred =
true;
3429 Diags.UncompilableErrorOccurred =
true;
3430 Diags.UnrecoverableErrorOccurred =
true;
3443 StringRef ASTBranch = Blob;
3444 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3445 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3446 Diag(diag::err_ast_file_different_branch)
3458 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3468 auto [ImportLoc, ImportModuleFileIndex] =
3469 ReadUntranslatedSourceLocation(
Record[Idx++]);
3471 assert(ImportModuleFileIndex == 0);
3473 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3475 bool IsImportingStdCXXModule =
Record[Idx++];
3477 off_t StoredSize = 0;
3478 time_t StoredModTime = 0;
3479 unsigned ImplicitModuleSuffixLength = 0;
3480 ASTFileSignature StoredSignature;
3481 ModuleFileName ImportedFile;
3482 std::string StoredFile;
3483 bool IgnoreImportedByNote =
false;
3492 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3493 ImportedName, !IsImportingStdCXXModule);
3495 if (IsImportingStdCXXModule && ImportedFile.
empty()) {
3496 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3500 if (!IsImportingStdCXXModule) {
3501 StoredSize = (off_t)
Record[Idx++];
3502 StoredModTime = (time_t)
Record[Idx++];
3503 ImplicitModuleSuffixLength = (unsigned)
Record[Idx++];
3507 SignatureBytes.end());
3510 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3511 if (ImportedFile.
empty()) {
3512 ImportedFile = ImplicitModuleSuffixLength
3514 StoredFile, ImplicitModuleSuffixLength)
3515 : ModuleFileName::makeExplicit(StoredFile);
3517 (ImplicitModuleSuffixLength != 0));
3518 }
else if (!getDiags().isIgnored(
3519 diag::warn_module_file_mapping_mismatch,
3520 CurrentImportLoc)) {
3521 auto ImportedFileRef =
3522 PP.getFileManager().getOptionalFileRef(ImportedFile);
3523 auto StoredFileRef =
3524 PP.getFileManager().getOptionalFileRef(StoredFile);
3525 if ((ImportedFileRef && StoredFileRef) &&
3526 (*ImportedFileRef != *StoredFileRef)) {
3527 Diag(diag::warn_module_file_mapping_mismatch)
3528 << ImportedFile << StoredFile;
3529 Diag(diag::note_module_file_imported_by)
3531 IgnoreImportedByNote =
true;
3538 unsigned Capabilities = ClientLoadCapabilities;
3539 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3540 Capabilities &= ~ARR_Missing;
3543 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3544 Loaded, StoredSize, StoredModTime,
3545 StoredSignature, Capabilities);
3550 if (IsImportingStdCXXModule) {
3551 if (
const auto *Imported =
3552 getModuleManager().lookupByFileName(ImportedFile);
3553 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3554 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3560 bool recompilingFinalized =
Result == OutOfDate &&
3561 (Capabilities & ARR_OutOfDate) &&
3564 .getInMemoryModuleCache()
3566 if (!IgnoreImportedByNote &&
3568 Diag(diag::note_module_file_imported_by)
3572 case Failure:
return Failure;
3575 case OutOfDate:
return OutOfDate;
3577 case ConfigurationMismatch:
return ConfigurationMismatch;
3578 case HadErrors:
return HadErrors;
3597 Diag(diag::remark_module_import)
3599 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3605 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3613 BaseDirectoryAsWritten = Blob;
3615 "MODULE_DIRECTORY found before MODULE_NAME");
3618 auto [MaybeM, IgnoreError] =
3619 getModuleForRelocationChecks(F,
true);
3620 if (!MaybeM.has_value())
3623 Module *M = MaybeM.value();
3635 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3636 if (BuildDir && (*BuildDir == M->
Directory)) {
3640 Diag(diag::remark_module_relocated)
3643 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3644 Diag(diag::err_imported_module_relocated)
3650 if (ASTReadResult
Result =
3651 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3657 NumUserInputs =
Record[1];
3659 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3668llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3669 unsigned ClientLoadCapabilities) {
3670 BitstreamCursor &Stream = F.
Stream;
3672 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3679 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3681 return MaybeEntry.takeError();
3682 llvm::BitstreamEntry Entry = MaybeEntry.get();
3684 switch (Entry.Kind) {
3685 case llvm::BitstreamEntry::Error:
3686 return llvm::createStringError(
3687 std::errc::illegal_byte_sequence,
3688 "error at end of module block in AST file");
3689 case llvm::BitstreamEntry::EndBlock:
3695 if (ASTContext *Ctx = ContextObj) {
3696 DeclContext *DC = Ctx->getTranslationUnitDecl();
3701 return llvm::Error::success();
3702 case llvm::BitstreamEntry::SubBlock:
3710 if (llvm::Error Err = Stream.SkipBlock())
3712 if (llvm::Error Err = ReadBlockAbbrevs(
3719 if (!PP.getExternalSource())
3720 PP.setExternalSource(
this);
3722 if (llvm::Error Err = Stream.SkipBlock())
3724 if (llvm::Error Err =
3733 if (llvm::Error Err = Stream.SkipBlock()) {
3742 if (!PP.getPreprocessingRecord())
3743 PP.createPreprocessingRecord();
3744 if (!PP.getPreprocessingRecord()->getExternalSource())
3745 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3749 if (llvm::Error Err = ReadSourceManagerBlock(F))
3754 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3759 BitstreamCursor
C = Stream;
3761 if (llvm::Error Err = Stream.SkipBlock())
3765 CommentsCursors.push_back(std::make_pair(
C, &F));
3770 if (llvm::Error Err = Stream.SkipBlock())
3776 case llvm::BitstreamEntry::Record:
3784 Expected<unsigned> MaybeRecordType =
3785 Stream.readRecord(Entry.ID,
Record, &Blob);
3786 if (!MaybeRecordType)
3787 return MaybeRecordType.takeError();
3792 switch (RecordType) {
3813 switch (RecordType) {
3819 return llvm::createStringError(
3820 std::errc::illegal_byte_sequence,
3821 "duplicate TYPE_OFFSET record in AST file");
3834 return llvm::createStringError(
3835 std::errc::illegal_byte_sequence,
3836 "duplicate DECL_OFFSET record in AST file");
3848 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3849 LexicalContents Contents(
3851 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3852 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3859 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3860 auto *
Data = (
const unsigned char*)Blob.data();
3861 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3864 if (Decl *D = GetExistingDecl(ID))
3865 PendingUpdateRecords.push_back(
3866 PendingUpdateRecord(ID, D,
false));
3872 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3873 auto *
Data = (
const unsigned char *)Blob.data();
3874 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3877 if (Decl *D = GetExistingDecl(ID))
3878 PendingUpdateRecords.push_back(
3879 PendingUpdateRecord(ID, D,
false));
3887 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3888 auto *
Data = (
const unsigned char *)Blob.data();
3889 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3892 if (Decl *D = GetExistingDecl(ID))
3893 PendingUpdateRecords.push_back(
3894 PendingUpdateRecord(ID, D,
false));
3900 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3901 auto *
Data = (
const unsigned char *)Blob.data();
3902 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3905 if (Decl *D = GetExistingDecl(ID))
3906 PendingUpdateRecords.push_back(
3907 PendingUpdateRecord(ID, D,
false));
3913 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3914 auto *
Data = (
const unsigned char *)Blob.data();
3915 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3918 if (Decl *D = GetExistingDecl(ID))
3919 PendingUpdateRecords.push_back(
3920 PendingUpdateRecord(ID, D,
false));
3926 reinterpret_cast<const unsigned char *
>(Blob.data());
3932 ASTIdentifierLookupTrait(*
this, F));
3934 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
3940 return llvm::createStringError(
3941 std::errc::illegal_byte_sequence,
3942 "duplicate IDENTIFIER_OFFSET record in AST file");
3948 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3960 for (
unsigned I = 0, N =
Record.size(); I != N; )
3961 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3968 getContext().getLangOpts().BuildingPCHWithObjectFile)
3969 for (
unsigned I = 0, N =
Record.size(); I != N; )
3970 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3974 if (SpecialTypes.empty()) {
3975 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
3976 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
3983 if (SpecialTypes.size() !=
Record.size())
3984 return llvm::createStringError(std::errc::illegal_byte_sequence,
3985 "invalid special-types record");
3987 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
3989 if (!SpecialTypes[I])
3990 SpecialTypes[I] =
ID;
3997 TotalNumStatements +=
Record[0];
3998 TotalNumMacros +=
Record[1];
3999 TotalLexicalDeclContexts +=
Record[2];
4000 TotalVisibleDeclContexts +=
Record[3];
4001 TotalModuleLocalVisibleDeclContexts +=
Record[4];
4002 TotalTULocalVisibleDeclContexts +=
Record[5];
4006 for (
unsigned I = 0, N =
Record.size(); I != N; )
4007 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
4011 for (
unsigned I = 0, N =
Record.size(); I != N; )
4012 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
4016 if (
Record.size() % 3 != 0)
4017 return llvm::createStringError(std::errc::illegal_byte_sequence,
4018 "invalid weak identifiers record");
4022 WeakUndeclaredIdentifiers.clear();
4025 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4026 WeakUndeclaredIdentifiers.push_back(
4027 getGlobalIdentifierID(F,
Record[I++]));
4028 WeakUndeclaredIdentifiers.push_back(
4029 getGlobalIdentifierID(F,
Record[I++]));
4030 WeakUndeclaredIdentifiers.push_back(
4031 ReadSourceLocation(F,
Record, I).getRawEncoding());
4038 unsigned LocalBaseSelectorID =
Record[1];
4044 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4049 std::make_pair(LocalBaseSelectorID,
4061 = ASTSelectorLookupTable::Create(
4064 ASTSelectorLookupTrait(*
this, F));
4065 TotalNumMethodPoolEntries +=
Record[1];
4070 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
4071 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4073 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
4082 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4083 ReadSourceLocation(F,
Record, Idx));
4089 SmallVector<SourceLocation, 64> SrcLocs;
4091 while (Idx <
Record.size())
4092 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
4093 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4100 unsigned Idx = 0, End =
Record.size() - 1;
4101 bool ReachedEOFWhileSkipping =
Record[Idx++];
4102 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4103 if (ReachedEOFWhileSkipping) {
4104 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4105 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4106 bool FoundNonSkipPortion =
Record[Idx++];
4107 bool FoundElse =
Record[Idx++];
4108 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4109 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4110 FoundElse, ElseLoc);
4112 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4114 auto Loc = ReadSourceLocation(F,
Record, Idx);
4115 bool WasSkipping =
Record[Idx++];
4116 bool FoundNonSkip =
Record[Idx++];
4117 bool FoundElse =
Record[Idx++];
4118 ConditionalStack.push_back(
4119 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4121 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4126 if (!
Record.empty() && Listener)
4144 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4145 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4146 return llvm::createStringError(std::errc::invalid_argument,
4147 "ran out of source locations");
4152 unsigned RangeStart =
4154 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4159 GlobalSLocOffsetMap.insert(
4161 - SLocSpaceSize,&F));
4172 ParseLineTable(F,
Record);
4176 for (
unsigned I = 0, N =
Record.size(); I != N; )
4177 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4181 if (
Record.size() % 3 != 0)
4182 return llvm::createStringError(std::errc::illegal_byte_sequence,
4183 "Invalid VTABLE_USES record");
4190 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4191 VTableUses.push_back(
4192 {ReadDeclID(F,
Record, Idx),
4193 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4200 if (
Record.size() % 2 != 0)
4201 return llvm::createStringError(
4202 std::errc::illegal_byte_sequence,
4203 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4208 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4209 PendingInstantiations.push_back(
4210 {ReadDeclID(F,
Record, I),
4211 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4218 return llvm::createStringError(std::errc::illegal_byte_sequence,
4219 "Invalid SEMA_DECL_REFS block");
4220 for (
unsigned I = 0, N =
Record.size(); I != N; )
4221 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4229 unsigned StartingID;
4230 if (!PP.getPreprocessingRecord())
4231 PP.createPreprocessingRecord();
4232 if (!PP.getPreprocessingRecord()->getExternalSource())
4233 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4235 = PP.getPreprocessingRecord()
4242 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4253 if (!PP.getPreprocessingRecord())
4254 PP.createPreprocessingRecord();
4255 if (!PP.getPreprocessingRecord()->getExternalSource())
4256 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4261 GlobalSkippedRangeMap.insert(
4267 if (
Record.size() % 2 != 0)
4268 return llvm::createStringError(
4269 std::errc::illegal_byte_sequence,
4270 "invalid DECL_UPDATE_OFFSETS block in AST file");
4271 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4272 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4273 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4277 if (Decl *D = GetExistingDecl(ID))
4278 PendingUpdateRecords.push_back(
4279 PendingUpdateRecord(ID, D,
false));
4284 if (
Record.size() % 5 != 0)
4285 return llvm::createStringError(
4286 std::errc::illegal_byte_sequence,
4287 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4289 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4290 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4293 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4296 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4299 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4302 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4305 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4307 DelayedNamespaceOffsetMap[
ID] = {
4308 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4310 assert(!GetExistingDecl(ID) &&
4311 "We shouldn't load the namespace in the front of delayed "
4312 "namespace lexical and visible block");
4318 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4319 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4320 auto &RelatedDecls = RelatedDeclsMap[
ID];
4321 unsigned NN =
Record[I++];
4322 RelatedDecls.reserve(NN);
4323 for (
unsigned II = 0; II < NN; II++)
4324 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4330 return llvm::createStringError(
4331 std::errc::illegal_byte_sequence,
4332 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4345 CUDASpecialDeclRefs.clear();
4346 for (
unsigned I = 0, N =
Record.size(); I != N; )
4347 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4357 HeaderFileInfoTrait(*
this, F));
4359 PP.getHeaderSearchInfo().SetExternalSource(
this);
4360 if (!PP.getHeaderSearchInfo().getExternalLookup())
4361 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4367 FPPragmaOptions.swap(
Record);
4371 for (
unsigned I = 0, N =
Record.size(); I != N; )
4372 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4376 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4377 auto Name = ReadString(
Record, I);
4378 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4379 OptInfo.Supported =
Record[I++] != 0;
4380 OptInfo.Enabled =
Record[I++] != 0;
4381 OptInfo.WithPragma =
Record[I++] != 0;
4382 OptInfo.Avail =
Record[I++];
4383 OptInfo.Core =
Record[I++];
4384 OptInfo.Opt =
Record[I++];
4389 for (
unsigned I = 0, N =
Record.size(); I != N; )
4390 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4394 for (
unsigned I = 0, N =
Record.size(); I != N; )
4395 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4399 if (
Record.size() % 2 != 0)
4400 return llvm::createStringError(std::errc::illegal_byte_sequence,
4401 "invalid undefined-but-used record");
4402 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4403 UndefinedButUsed.push_back(
4404 {ReadDeclID(F,
Record, I),
4405 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4410 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4411 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4413 DelayedDeleteExprs.push_back(Count);
4414 for (uint64_t
C = 0;
C < Count; ++
C) {
4415 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4416 bool IsArrayForm =
Record[I++] == 1;
4417 DelayedDeleteExprs.push_back(IsArrayForm);
4424 getContext().getLangOpts().BuildingPCHWithObjectFile)
4425 for (
unsigned I = 0, N =
Record.size(); I != N;)
4426 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4434 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4435 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4436 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4438 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4439 if (DeserializationListener)
4440 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4448 return llvm::createStringError(
4449 std::errc::illegal_byte_sequence,
4450 "duplicate MACRO_OFFSET record in AST file");
4462 LateParsedTemplates.emplace_back(
4463 std::piecewise_construct, std::forward_as_tuple(&F),
4469 return llvm::createStringError(std::errc::illegal_byte_sequence,
4470 "invalid pragma optimize record");
4471 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4476 return llvm::createStringError(std::errc::illegal_byte_sequence,
4477 "invalid pragma ms_struct record");
4478 PragmaMSStructState =
Record[0];
4483 return llvm::createStringError(
4484 std::errc::illegal_byte_sequence,
4485 "invalid pragma pointers to members record");
4486 PragmaMSPointersToMembersState =
Record[0];
4487 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4491 for (
unsigned I = 0, N =
Record.size(); I != N; )
4492 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4497 return llvm::createStringError(std::errc::illegal_byte_sequence,
4498 "invalid cuda pragma options record");
4499 ForceHostDeviceDepth =
Record[0];
4504 return llvm::createStringError(std::errc::illegal_byte_sequence,
4505 "invalid pragma pack record");
4506 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4507 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4508 unsigned NumStackEntries =
Record[2];
4511 PragmaAlignPackStack.clear();
4512 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4513 PragmaAlignPackStackEntry Entry;
4514 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4515 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4516 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4517 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4518 Entry.SlotLabel = PragmaAlignPackStrings.back();
4519 PragmaAlignPackStack.push_back(Entry);
4526 return llvm::createStringError(std::errc::illegal_byte_sequence,
4527 "invalid pragma float control record");
4529 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4530 unsigned NumStackEntries =
Record[2];
4533 FpPragmaStack.clear();
4534 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4535 FpPragmaStackEntry Entry;
4537 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4538 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4539 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4540 Entry.SlotLabel = FpPragmaStrings.back();
4541 FpPragmaStack.push_back(Entry);
4547 for (
unsigned I = 0, N =
Record.size(); I != N; )
4548 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4552 unsigned NumRecords =
Record.front();
4554 if (
Record.size() - 1 != NumRecords)
4555 return llvm::createStringError(std::errc::illegal_byte_sequence,
4556 "invalid rvv intrinsic pragma record");
4558 if (RISCVVecIntrinsicPragma.empty())
4559 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4562 for (
unsigned i = 0; i < NumRecords; ++i)
4563 RISCVVecIntrinsicPragma[i] |=
Record[i + 1];
4570void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4583 assert(ImportedModuleVector.empty());
4585 while (
Data < DataEnd) {
4589 using namespace llvm::support;
4591 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4592 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4593 StringRef Name = StringRef((
const char*)
Data, Len);
4598 ? ModuleMgr.lookupByModuleName(Name)
4601 std::string Msg =
"refers to unknown module, cannot find ";
4602 Msg.append(std::string(Name));
4607 ImportedModuleVector.push_back(OM);
4610 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4612 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4615 RemapBuilder &Remap) {
4616 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4618 Remap.insert(std::make_pair(Offset,
4619 static_cast<int>(BaseOffset - Offset)));
4630 unsigned ClientLoadCapabilities) {
4639 "MODULE_NAME should come before MODULE_MAP_FILE");
4640 auto [MaybeM, IgnoreError] =
4641 getModuleForRelocationChecks(F,
false);
4642 if (MaybeM.has_value()) {
4645 Module *M = MaybeM.value();
4646 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4648 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4649 if (!IgnoreError && !ModMap) {
4651 Diag(diag::remark_module_relocated)
4654 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4657 Diag(diag::err_module_file_conflict)
4662 Diag(diag::err_imported_module_not_found)
4669 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4670 Diag(diag::note_imported_by_pch_module_not_found)
4677 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4681 if (!StoredModMap || *StoredModMap != ModMap) {
4682 assert(ModMap &&
"found module is missing module map file");
4684 "top-level import should be verified");
4686 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4687 Diag(diag::err_imported_module_modmap_changed)
4694 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4696 std::string Filename = ReadPath(F,
Record, Idx);
4699 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4700 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4703 AdditionalStoredMaps.insert(*SF);
4708 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4709 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4712 if (!AdditionalStoredMaps.erase(ModMap)) {
4713 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4714 Diag(diag::err_module_different_modmap)
4723 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4724 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4725 Diag(diag::err_module_different_modmap)
4739 SemaObjC::GlobalMethodPool::iterator Known =
4745 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4746 : Known->second.second;
4750 if (List->getMethod() == Method) {
4758 if (List->getNext())
4759 List->setMethod(List->getNext()->getMethod());
4761 List->setMethod(Method);
4767 for (
Decl *D : Names) {
4771 if (wasHidden && SemaObj) {
4784 Stack.push_back(Mod);
4785 while (!Stack.empty()) {
4786 Mod = Stack.pop_back_val();
4788 if (NameVisibility <= Mod->NameVisibility) {
4804 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4805 if (Hidden != HiddenNamesMap.end()) {
4806 auto HiddenNames = std::move(*Hidden);
4807 HiddenNamesMap.erase(Hidden);
4809 assert(!HiddenNamesMap.contains(Mod) &&
4810 "making names visible added hidden names");
4817 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4819 if (Visited.insert(Exported).second)
4820 Stack.push_back(Exported);
4838 PendingMergedDefinitionsToDeduplicate.insert(Def);
4847 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4848 !PP.getLangOpts().Modules)
4852 TriedLoadingGlobalIndex =
true;
4853 StringRef SpecificModuleCachePath =
4855 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4857 if (llvm::Error Err = std::move(
Result.second)) {
4859 consumeError(std::move(Err));
4863 GlobalIndex.reset(
Result.first);
4864 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4869 return PP.getLangOpts().Modules && UseGlobalIndex &&
4881 consumeError(MaybeEntry.takeError());
4884 llvm::BitstreamEntry Entry = MaybeEntry.get();
4886 switch (Entry.Kind) {
4887 case llvm::BitstreamEntry::Error:
4888 case llvm::BitstreamEntry::EndBlock:
4891 case llvm::BitstreamEntry::Record:
4897 consumeError(Skipped.takeError());
4901 case llvm::BitstreamEntry::SubBlock:
4902 if (Entry.ID == BlockID) {
4903 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4905 consumeError(std::move(Err));
4912 if (llvm::Error Err = Cursor.SkipBlock()) {
4914 consumeError(std::move(Err));
4924 unsigned ClientLoadCapabilities,
4926 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
4930 CurrentDeserializingModuleKind,
Type);
4936 unsigned PreviousGeneration = 0;
4940 unsigned NumModules = ModuleMgr.size();
4945 ClientLoadCapabilities)) {
4946 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4950 GlobalIndex.reset();
4951 ModuleMgr.setGlobalIndex(
nullptr);
4955 if (NewLoadedModuleFile && !Loaded.empty())
4956 *NewLoadedModuleFile = Loaded.back().Mod;
4969 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
4972 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4973 Error(std::move(Err));
4979 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
4985 if (llvm::Error Err = ReadExtensionBlock(F)) {
4986 Error(std::move(Err));
5015 if (!PP.getLangOpts().CPlusPlus) {
5022 auto It = PP.getIdentifierTable().find(Key);
5023 if (It == PP.getIdentifierTable().end())
5032 II = &PP.getIdentifierTable().getOwn(Key);
5050 for (
auto &Id : PP.getIdentifierTable())
5051 Id.second->setOutOfDate(
true);
5054 for (
const auto &Sel : SelectorGeneration)
5055 SelectorOutOfDate[Sel.first] =
true;
5062 ModuleMgr.moduleFileAccepted(&F);
5075 for (
unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
5076 UnresolvedModuleRef &
Unresolved = UnresolvedModuleRefs[I];
5081 case UnresolvedModuleRef::Conflict:
5084 Conflict.
Other = ResolvedMod;
5086 Unresolved.Mod->Conflicts.push_back(Conflict);
5090 case UnresolvedModuleRef::Import:
5095 case UnresolvedModuleRef::Affecting:
5097 Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
5100 case UnresolvedModuleRef::Export:
5107 UnresolvedModuleRefs.clear();
5119 if (DeserializationListener)
5120 DeserializationListener->ReaderInitialized(
this);
5122 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5137 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5138 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5139 ObjCClassesLoaded[I], PreviousGeneration);
5144 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5149 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5168 if (!Stream.canSkipToPos(4))
5169 return llvm::createStringError(
5170 std::errc::illegal_byte_sequence,
5171 "file too small to contain precompiled file magic");
5172 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5175 return llvm::createStringError(
5176 std::errc::illegal_byte_sequence,
5177 "file doesn't start with precompiled file magic");
5179 return Res.takeError();
5180 return llvm::Error::success();
5195 llvm_unreachable(
"unknown module kind");
5201 off_t ExpectedSize, time_t ExpectedModTime,
5204 std::string ErrorStr;
5206 = ModuleMgr.addModule(
FileName,
Type, ImportLoc, ImportedBy,
5211 switch (AddResult) {
5213 Diag(diag::remark_module_import)
5215 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5229 Diag(diag::err_ast_file_not_found)
5241 Diag(diag::err_ast_file_out_of_date)
5247 assert(M &&
"Missing module file");
5249 bool ShouldFinalizePCM =
false;
5250 llvm::scope_exit FinalizeOrDropPCM([&]() {
5252 if (ShouldFinalizePCM)
5258 BitstreamCursor &Stream = F.
Stream;
5259 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5260 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5264 Diag(diag::err_ast_file_invalid)
5270 bool HaveReadControlBlock =
false;
5274 Error(MaybeEntry.takeError());
5277 llvm::BitstreamEntry Entry = MaybeEntry.get();
5279 switch (Entry.Kind) {
5280 case llvm::BitstreamEntry::Error:
5281 case llvm::BitstreamEntry::Record:
5282 case llvm::BitstreamEntry::EndBlock:
5283 Error(
"invalid record at top-level of AST file");
5286 case llvm::BitstreamEntry::SubBlock:
5292 HaveReadControlBlock =
true;
5293 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5301 F.ModuleName.empty()) {
5320 if (!HaveReadControlBlock) {
5322 Diag(diag::err_ast_file_version_too_old)
5329 ShouldFinalizePCM =
true;
5333 if (llvm::Error Err = Stream.SkipBlock()) {
5334 Error(std::move(Err));
5341 llvm_unreachable(
"unexpected break; expected return");
5345ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5346 unsigned ClientLoadCapabilities) {
5348 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5349 bool AllowCompatibleConfigurationMismatch =
5351 bool DisableValidation = shouldDisableValidationForFile(F);
5353 ASTReadResult
Result = readUnhashedControlBlockImpl(
5355 AllowCompatibleConfigurationMismatch, Listener.get(),
5360 if (DisableValidation || WasImportedBy ||
5361 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5365 Error(
"malformed block record in AST file");
5388 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5390 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5399 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5400 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5401 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5403 BitstreamCursor Stream(StreamData);
5408 consumeError(std::move(Err));
5420 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5423 consumeError(MaybeEntry.takeError());
5426 llvm::BitstreamEntry Entry = MaybeEntry.get();
5428 switch (Entry.Kind) {
5429 case llvm::BitstreamEntry::Error:
5430 case llvm::BitstreamEntry::SubBlock:
5433 case llvm::BitstreamEntry::EndBlock:
5436 case llvm::BitstreamEntry::Record:
5444 Expected<unsigned> MaybeRecordType =
5445 Stream.readRecord(Entry.ID,
Record, &Blob);
5446 if (!MaybeRecordType) {
5455 "Dummy AST file signature not backpatched in ASTWriter.");
5462 "Dummy AST block hash not backpatched in ASTWriter.");
5466 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5467 if (Listener && ValidateDiagnosticOptions &&
5468 !AllowCompatibleConfigurationMismatch &&
5469 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5474 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5475 if (Listener && !AllowCompatibleConfigurationMismatch &&
5476 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5477 Result = ConfigurationMismatch;
5506 if (
Record.size() < 4)
return true;
5511 unsigned BlockNameLen =
Record[2];
5512 unsigned UserInfoLen =
Record[3];
5514 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5516 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5517 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5518 Blob.data() + BlockNameLen + UserInfoLen);
5522llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5523 BitstreamCursor &Stream = F.
Stream;
5527 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5529 return MaybeEntry.takeError();
5530 llvm::BitstreamEntry Entry = MaybeEntry.get();
5532 switch (Entry.Kind) {
5533 case llvm::BitstreamEntry::SubBlock:
5534 if (llvm::Error Err = Stream.SkipBlock())
5537 case llvm::BitstreamEntry::EndBlock:
5538 return llvm::Error::success();
5539 case llvm::BitstreamEntry::Error:
5540 return llvm::createStringError(std::errc::illegal_byte_sequence,
5541 "malformed block record in AST file");
5542 case llvm::BitstreamEntry::Record:
5548 Expected<unsigned> MaybeRecCode =
5549 Stream.readRecord(Entry.ID,
Record, &Blob);
5551 return MaybeRecCode.takeError();
5552 switch (MaybeRecCode.get()) {
5554 ModuleFileExtensionMetadata Metadata;
5556 return llvm::createStringError(
5557 std::errc::illegal_byte_sequence,
5558 "malformed EXTENSION_METADATA in AST file");
5561 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5562 if (Known == ModuleFileExtensions.end())
break;
5565 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5575 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5579 assert(ContextObj &&
"no context to initialize");
5583 if (DeserializationListener)
5584 DeserializationListener->DeclRead(
5586 Context.getTranslationUnitDecl());
5594 if (!Context.CFConstantStringTypeDecl)
5595 Context.setCFConstantStringType(
GetType(String));
5600 if (FileType.isNull()) {
5601 Error(
"FILE type is NULL");
5605 if (!Context.FILEDecl) {
5607 Context.setFILEDecl(
Typedef->getDecl());
5609 const TagType *Tag = FileType->getAs<TagType>();
5611 Error(
"Invalid FILE type in AST file");
5614 Context.setFILEDecl(Tag->getDecl());
5621 if (Jmp_bufType.
isNull()) {
5622 Error(
"jmp_buf type is NULL");
5626 if (!Context.jmp_bufDecl) {
5628 Context.setjmp_bufDecl(
Typedef->getDecl());
5630 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5632 Error(
"Invalid jmp_buf type in AST file");
5635 Context.setjmp_bufDecl(Tag->getDecl());
5642 if (Sigjmp_bufType.
isNull()) {
5643 Error(
"sigjmp_buf type is NULL");
5647 if (!Context.sigjmp_bufDecl) {
5649 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5651 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5652 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5653 Context.setsigjmp_bufDecl(Tag->getDecl());
5659 if (Context.ObjCIdRedefinitionType.isNull())
5660 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5663 if (
TypeID ObjCClassRedef =
5665 if (Context.ObjCClassRedefinitionType.isNull())
5666 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5669 if (
TypeID ObjCSelRedef =
5671 if (Context.ObjCSelRedefinitionType.isNull())
5672 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5677 if (Ucontext_tType.
isNull()) {
5678 Error(
"ucontext_t type is NULL");
5682 if (!Context.ucontext_tDecl) {
5684 Context.setucontext_tDecl(
Typedef->getDecl());
5686 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5687 assert(Tag &&
"Invalid ucontext_t type in AST file");
5688 Context.setucontext_tDecl(Tag->getDecl());
5697 if (!CUDASpecialDeclRefs.empty()) {
5698 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5699 Context.setcudaConfigureCallDecl(
5700 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5701 Context.setcudaGetParameterBufferDecl(
5702 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5703 Context.setcudaLaunchDeviceDecl(
5704 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5709 for (
auto &Import : PendingImportedModules) {
5713 if (Import.ImportLoc.isValid())
5714 PP.makeModuleVisible(Imported, Import.ImportLoc);
5721 PendingImportedModulesSema.append(PendingImportedModules);
5722 PendingImportedModules.clear();
5732 BitstreamCursor Stream(
PCH);
5735 consumeError(std::move(Err));
5747 Stream.advanceSkippingSubblocks();
5750 consumeError(MaybeEntry.takeError());
5753 llvm::BitstreamEntry Entry = MaybeEntry.get();
5755 if (Entry.Kind != llvm::BitstreamEntry::Record)
5763 consumeError(MaybeRecord.takeError());
5769 "Dummy AST file signature not backpatched in ASTWriter.");
5779 const std::string &ASTFileName,
FileManager &FileMgr,
5782 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5787 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5788 << ASTFileName << Buffer.getError().message();
5789 return std::string();
5793 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5797 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5798 return std::string();
5803 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5804 return std::string();
5811 Stream.advanceSkippingSubblocks();
5814 consumeError(MaybeEntry.takeError());
5815 return std::string();
5817 llvm::BitstreamEntry Entry = MaybeEntry.get();
5819 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5820 return std::string();
5822 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5823 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5824 return std::string();
5832 consumeError(MaybeRecord.takeError());
5833 return std::string();
5848 std::string ExistingSpecificModuleCachePath;
5850 bool StrictOptionMatches;
5853 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5858 StringRef ExistingSpecificModuleCachePath,
5860 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5861 ExistingTargetOpts(ExistingTargetOpts),
5862 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
5863 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
5866 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5867 StringRef ModuleFilename,
bool Complain,
5868 bool AllowCompatibleDifferences)
override {
5870 nullptr, AllowCompatibleDifferences);
5873 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5874 StringRef ModuleFilename,
bool Complain,
5875 bool AllowCompatibleDifferences)
override {
5877 nullptr, AllowCompatibleDifferences);
5880 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5881 StringRef ModuleFilename,
bool Complain,
5882 bool AllowCompatibleDifferences)
override {
5884 nullptr, AllowCompatibleDifferences);
5887 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5888 StringRef ASTFilename, StringRef ContextHash,
5889 bool Complain)
override {
5891 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
5892 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
5895 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5896 StringRef ModuleFilename,
bool ReadMacros,
5898 std::string &SuggestedPredefines)
override {
5900 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5901 FileMgr, SuggestedPredefines, ExistingLangOpts,
5913 unsigned ClientLoadCapabilities) {
5915 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5916 llvm::MemoryBuffer *Buffer =
5926 Filename ==
"-" ? FileMgr.getSTDIN() : FileMgr.getFileRef(Filename);
5928 llvm::consumeError(Entry.takeError());
5931 auto BufferOrErr = FileMgr.getBufferForFile(*Entry);
5934 OwnedBuffer = std::move(*BufferOrErr);
5935 Buffer = OwnedBuffer.get();
5939 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
5940 BitstreamCursor Stream(Bytes);
5944 consumeError(std::move(Err));
5952 bool NeedsInputFiles = Listener.needsInputFileVisitation();
5953 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5954 bool NeedsImports = Listener.needsImportVisitation();
5955 BitstreamCursor InputFilesCursor;
5956 uint64_t InputFilesOffsetBase = 0;
5959 std::string ModuleDir;
5960 bool DoneWithControlBlock =
false;
5962 PathBuf.reserve(256);
5967 AdditionalPathBuf.reserve(256);
5968 while (!DoneWithControlBlock) {
5972 consumeError(MaybeEntry.takeError());
5975 llvm::BitstreamEntry Entry = MaybeEntry.get();
5977 switch (Entry.Kind) {
5978 case llvm::BitstreamEntry::SubBlock: {
5981 std::string IgnoredSuggestedPredefines;
5982 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
5984 Listener, IgnoredSuggestedPredefines) !=
Success)
5990 InputFilesCursor = Stream;
5991 if (llvm::Error Err = Stream.SkipBlock()) {
5993 consumeError(std::move(Err));
5996 if (NeedsInputFiles &&
5999 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6003 if (llvm::Error Err = Stream.SkipBlock()) {
6005 consumeError(std::move(Err));
6014 case llvm::BitstreamEntry::EndBlock:
6015 DoneWithControlBlock =
true;
6018 case llvm::BitstreamEntry::Error:
6021 case llvm::BitstreamEntry::Record:
6025 if (DoneWithControlBlock)
break;
6030 Stream.readRecord(Entry.ID,
Record, &Blob);
6031 if (!MaybeRecCode) {
6039 if (Listener.ReadFullVersionInformation(Blob))
6043 Listener.ReadModuleName(Blob);
6046 ModuleDir = std::string(Blob);
6052 Listener.ReadModuleMapFile(*Path);
6056 if (!NeedsInputFiles)
6059 unsigned NumInputFiles =
Record[0];
6060 unsigned NumUserFiles =
Record[1];
6061 const llvm::support::unaligned_uint64_t *InputFileOffs =
6062 (
const llvm::support::unaligned_uint64_t *)Blob.data();
6063 for (
unsigned I = 0; I != NumInputFiles; ++I) {
6065 bool isSystemFile = I >= NumUserFiles;
6067 if (isSystemFile && !NeedsSystemInputFiles)
6070 BitstreamCursor &Cursor = InputFilesCursor;
6072 if (llvm::Error Err =
6073 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6075 consumeError(std::move(Err));
6081 consumeError(MaybeCode.takeError());
6083 unsigned Code = MaybeCode.get();
6087 bool shouldContinue =
false;
6089 Cursor.readRecord(Code,
Record, &Blob);
6090 if (!MaybeRecordType) {
6092 consumeError(MaybeRecordType.takeError());
6098 time_t StoredTime =
static_cast<time_t
>(
Record[2]);
6099 bool Overridden =
static_cast<bool>(
Record[3]);
6100 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6103 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6105 if (UnresolvedFilename.empty())
6106 Filename = *FilenameAsRequestedBuf;
6109 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6110 Filename = *FilenameBuf;
6112 shouldContinue = Listener.visitInputFileAsRequested(
6113 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6117 if (!shouldContinue)
6138 bool IsStandardCXXModule =
Record[Idx++];
6142 if (IsStandardCXXModule) {
6143 Listener.visitImport(ModuleName,
"");
6154 Listener.visitImport(ModuleName, *Filename);
6165 if (FindModuleFileExtensions) {
6166 BitstreamCursor SavedStream = Stream;
6168 bool DoneWithExtensionBlock =
false;
6169 while (!DoneWithExtensionBlock) {
6175 llvm::BitstreamEntry Entry = MaybeEntry.get();
6177 switch (Entry.Kind) {
6178 case llvm::BitstreamEntry::SubBlock:
6179 if (llvm::Error Err = Stream.SkipBlock()) {
6181 consumeError(std::move(Err));
6186 case llvm::BitstreamEntry::EndBlock:
6187 DoneWithExtensionBlock =
true;
6190 case llvm::BitstreamEntry::Error:
6193 case llvm::BitstreamEntry::Record:
6200 Stream.readRecord(Entry.ID,
Record, &Blob);
6201 if (!MaybeRecCode) {
6205 switch (MaybeRecCode.get()) {
6211 Listener.readModuleFileExtension(Metadata);
6217 Stream = std::move(SavedStream);
6221 if (readUnhashedControlBlockImpl(
6222 nullptr, Bytes, Filename, ClientLoadCapabilities,
6224 ValidateDiagnosticOptions) !=
Success)
6235 StringRef SpecificModuleCachePath,
bool RequireStrictOptionMatches) {
6236 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6237 SpecificModuleCachePath, FileMgr,
6238 RequireStrictOptionMatches);
6244llvm::Error ASTReader::ReadSubmoduleBlock(
ModuleFile &F,
6245 unsigned ClientLoadCapabilities) {
6250 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6255 auto CreateModule = !KnowsTopLevelModule
6260 Module *CurrentModule =
nullptr;
6264 F.
Stream.advanceSkippingSubblocks();
6266 return MaybeEntry.takeError();
6267 llvm::BitstreamEntry Entry = MaybeEntry.get();
6269 switch (Entry.Kind) {
6270 case llvm::BitstreamEntry::SubBlock:
6271 case llvm::BitstreamEntry::Error:
6272 return llvm::createStringError(std::errc::illegal_byte_sequence,
6273 "malformed block record in AST file");
6274 case llvm::BitstreamEntry::EndBlock:
6275 return llvm::Error::success();
6276 case llvm::BitstreamEntry::Record:
6286 return MaybeKind.takeError();
6287 unsigned Kind = MaybeKind.get();
6290 return llvm::createStringError(
6291 std::errc::illegal_byte_sequence,
6292 "submodule metadata record should be at beginning of block");
6307 return llvm::createStringError(std::errc::illegal_byte_sequence,
6308 "malformed module definition");
6310 StringRef Name = Blob;
6317 bool IsFramework =
Record[Idx++];
6318 bool IsExplicit =
Record[Idx++];
6319 bool IsSystem =
Record[Idx++];
6320 bool IsExternC =
Record[Idx++];
6321 bool InferSubmodules =
Record[Idx++];
6322 bool InferExplicitSubmodules =
Record[Idx++];
6323 bool InferExportWildcard =
Record[Idx++];
6324 bool ConfigMacrosExhaustive =
Record[Idx++];
6325 bool ModuleMapIsPrivate =
Record[Idx++];
6326 bool NamedModuleHasInit =
Record[Idx++];
6328 Module *ParentModule =
nullptr;
6330 ParentModule = getSubmodule(Parent);
6332 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6333 IsFramework, IsExplicit);
6336 if (GlobalIndex >= SubmodulesLoaded.size() ||
6337 SubmodulesLoaded[GlobalIndex])
6338 return llvm::createStringError(std::errc::invalid_argument,
6339 "too many submodules");
6341 if (!ParentModule) {
6345 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6347 assert(*CurFileKey != F.
FileKey &&
6348 "ModuleManager did not de-duplicate");
6350 Diag(diag::err_module_file_conflict)
6354 auto CurModMapFile =
6357 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6358 Diag(diag::note_module_file_conflict)
6359 << CurModMapFile->getName() << ModMapFile->getName();
6361 return llvm::make_error<AlreadyReportedDiagnosticError>();
6380 if (InferredAllowedBy.
isValid())
6394 }
else if (ParentModule && ParentModule->
Directory) {
6399 if (DeserializationListener)
6400 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6402 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6424 SmallString<128> RelativePathName;
6426 CurrentModule, Blob.str(), RelativePathName)) {
6454 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6460 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6462 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6474 unsigned LocalBaseSubmoduleID =
Record[1];
6478 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
6483 std::make_pair(LocalBaseSubmoduleID,
6492 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6504 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6516 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6533 PP.getTargetInfo());
6539 Module::LinkLibrary(std::string(Blob),
Record[0]));
6563 SmallVector<GlobalDeclID, 16>
Inits;
6564 for (
unsigned I = 0; I <
Record.size(); )
6566 ContextObj->addLazyModuleInitializers(CurrentModule,
Inits);
6586bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6587 StringRef ModuleFilename,
bool Complain,
6588 ASTReaderListener &Listener,
6589 bool AllowCompatibleDifferences) {
6590 LangOptions LangOpts;
6592#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6593 LangOpts.Name = Record[Idx++];
6594#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6595 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6596#include "clang/Basic/LangOptions.def"
6597#define SANITIZER(NAME, ID) \
6598 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6599#include "clang/Basic/Sanitizers.def"
6601 for (
unsigned N =
Record[Idx++]; N; --N)
6605 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6606 LangOpts.
ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6611 for (
unsigned N =
Record[Idx++]; N; --N) {
6613 ReadString(
Record, Idx));
6618 for (
unsigned N =
Record[Idx++]; N; --N) {
6625 AllowCompatibleDifferences);
6628bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6629 StringRef ModuleFilename,
bool Complain,
6630 ASTReaderListener &Listener,
6631 bool AllowCompatibleDifferences) {
6633 CodeGenOptions CGOpts;
6635#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6636 if constexpr (CK::Compatibility != CK::Benign) \
6637 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6638#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6639 if constexpr (CK::Compatibility != CK::Benign) \
6640 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6641#define DEBUGOPT(Name, Bits, Default, Compatibility)
6642#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6643#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6644#include "clang/Basic/CodeGenOptions.def"
6647 AllowCompatibleDifferences);
6650bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6651 StringRef ModuleFilename,
bool Complain,
6652 ASTReaderListener &Listener,
6653 bool AllowCompatibleDifferences) {
6655 TargetOptions TargetOpts;
6657 TargetOpts.
CPU = ReadString(
Record, Idx);
6659 TargetOpts.
ABI = ReadString(
Record, Idx);
6660 for (
unsigned N =
Record[Idx++]; N; --N) {
6663 for (
unsigned N =
Record[Idx++]; N; --N) {
6668 AllowCompatibleDifferences);
6671bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6672 StringRef ModuleFilename,
bool Complain,
6673 ASTReaderListener &Listener) {
6674 DiagnosticOptions DiagOpts;
6676#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6677#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6678 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6679#include "clang/Basic/DiagnosticOptions.def"
6681 for (
unsigned N =
Record[Idx++]; N; --N)
6683 for (
unsigned N =
Record[Idx++]; N; --N)
6689bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6690 ASTReaderListener &Listener) {
6691 FileSystemOptions FSOpts;
6697bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6698 StringRef ModuleFilename,
6700 ASTReaderListener &Listener) {
6701 HeaderSearchOptions HSOpts;
6716 std::string ContextHash = ReadString(
Record, Idx);
6722bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6723 ASTReaderListener &Listener) {
6724 HeaderSearchOptions HSOpts;
6728 for (
unsigned N =
Record[Idx++]; N; --N) {
6729 std::string Path = ReadString(
Record, Idx);
6732 bool IsFramework =
Record[Idx++];
6733 bool IgnoreSysRoot =
Record[Idx++];
6734 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6739 for (
unsigned N =
Record[Idx++]; N; --N) {
6740 std::string Prefix = ReadString(
Record, Idx);
6741 bool IsSystemHeader =
Record[Idx++];
6746 for (
unsigned N =
Record[Idx++]; N; --N) {
6747 std::string VFSOverlayFile = ReadString(
Record, Idx);
6754bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6755 StringRef ModuleFilename,
6757 ASTReaderListener &Listener,
6758 std::string &SuggestedPredefines) {
6759 PreprocessorOptions PPOpts;
6763 bool ReadMacros =
Record[Idx++];
6765 for (
unsigned N =
Record[Idx++]; N; --N) {
6767 bool IsUndef =
Record[Idx++];
6768 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6773 for (
unsigned N =
Record[Idx++]; N; --N) {
6778 for (
unsigned N =
Record[Idx++]; N; --N) {
6787 SuggestedPredefines.clear();
6789 Complain, SuggestedPredefines);
6792std::pair<ModuleFile *, unsigned>
6793ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6794 GlobalPreprocessedEntityMapType::iterator
6795 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6796 assert(I != GlobalPreprocessedEntityMap.end() &&
6797 "Corrupted global preprocessed entity map");
6800 return std::make_pair(M, LocalIndex);
6803llvm::iterator_range<PreprocessingRecord::iterator>
6804ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6805 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6809 return llvm::make_range(PreprocessingRecord::iterator(),
6810 PreprocessingRecord::iterator());
6813bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6814 unsigned int ClientLoadCapabilities) {
6815 return ClientLoadCapabilities & ARR_OutOfDate &&
6818 .getInMemoryModuleCache()
6819 .isPCMFinal(ModuleFileName);
6822llvm::iterator_range<ASTReader::ModuleDeclIterator>
6824 return llvm::make_range(
6831 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6832 assert(I != GlobalSkippedRangeMap.end() &&
6833 "Corrupted global skipped range map");
6836 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6840 assert(Range.isValid());
6846 unsigned ModuleFileIndex = ID >> 32;
6847 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
6848 assert(getModuleManager().size() > ModuleFileIndex - 1);
6849 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6851 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6856 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6858 unsigned LocalIndex = PPInfo.second;
6863 if (!PP.getPreprocessingRecord()) {
6864 Error(
"no preprocessing record");
6871 Error(std::move(Err));
6878 Error(MaybeEntry.takeError());
6881 llvm::BitstreamEntry Entry = MaybeEntry.get();
6883 if (Entry.Kind != llvm::BitstreamEntry::Record)
6894 if (!MaybeRecType) {
6895 Error(MaybeRecType.takeError());
6900 bool isBuiltin =
Record[0];
6908 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
6928 if (DeserializationListener)
6929 DeserializationListener->MacroDefinitionRead(PPID, MD);
6935 const char *FullFileNameStart = Blob.data() +
Record[0];
6936 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
6938 if (!FullFileName.empty())
6939 File = PP.getFileManager().getOptionalFileRef(FullFileName);
6946 StringRef(Blob.data(),
Record[0]),
6954 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
6963unsigned ASTReader::findNextPreprocessedEntity(
6964 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
6966 for (GlobalSLocOffsetMapType::const_iterator
6967 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6973 return getTotalNumPreprocessedEntities();
6978struct PPEntityComp {
6979 const ASTReader &Reader;
6982 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6984 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
6985 SourceLocation LHS = getLoc(L);
6986 SourceLocation RHS = getLoc(R);
6990 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
6991 SourceLocation LHS = getLoc(L);
6995 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
6996 SourceLocation RHS = getLoc(R);
7000 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
7007unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7008 bool EndsAfter)
const {
7009 if (SourceMgr.isLocalSourceLocation(Loc))
7010 return getTotalNumPreprocessedEntities();
7012 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7013 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7014 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7015 "Corrupted global sloc offset map");
7017 if (SLocMapI->second->NumPreprocessedEntities == 0)
7018 return findNextPreprocessedEntity(SLocMapI);
7029 pp_iterator
First = pp_begin;
7033 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7034 PPEntityComp(*
this, M));
7043 std::advance(PPI,
Half);
7044 if (SourceMgr.isBeforeInTranslationUnit(
7045 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7048 Count = Count -
Half - 1;
7055 return findNextPreprocessedEntity(SLocMapI);
7062std::pair<unsigned, unsigned>
7064 if (Range.isInvalid())
7065 return std::make_pair(0,0);
7066 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7068 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
7069 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
7070 return std::make_pair(BeginID, EndID);
7080 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7082 unsigned LocalIndex = PPInfo.second;
7089 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7098 class HeaderFileInfoVisitor {
7100 std::optional<HeaderFileInfo> HFI;
7103 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7112 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7113 if (Pos == Table->end())
7120 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7126 HeaderFileInfoVisitor Visitor(FE);
7127 ModuleMgr.visit(Visitor);
7128 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7135 using DiagState = DiagnosticsEngine::DiagState;
7146 auto ReadDiagState = [&](
const DiagState &BasedOn,
7147 bool IncludeNonPragmaStates) {
7148 unsigned BackrefID =
Record[Idx++];
7150 return DiagStates[BackrefID - 1];
7153 Diag.DiagStates.push_back(BasedOn);
7154 DiagState *NewState = &
Diag.DiagStates.back();
7155 DiagStates.push_back(NewState);
7156 unsigned Size =
Record[Idx++];
7157 assert(Idx + Size * 2 <=
Record.size() &&
7158 "Invalid data, not enough diag/map pairs");
7160 unsigned DiagID =
Record[Idx++];
7163 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7176 Mapping = NewMapping;
7182 DiagState *FirstState;
7187 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7188 DiagStates.push_back(FirstState);
7192 "Invalid data, unexpected backref in initial state");
7194 assert(Idx <
Record.size() &&
7195 "Invalid data, not enough state change pairs in initial state");
7200 unsigned Flags =
Record[Idx++];
7201 DiagState Initial(*
Diag.getDiagnosticIDs());
7202 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7203 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7204 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7205 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7206 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7208 FirstState = ReadDiagState(Initial,
true);
7216 .StateTransitions.push_back({FirstState, 0});
7221 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7225 unsigned NumLocations =
Record[Idx++];
7226 while (NumLocations--) {
7227 assert(Idx <
Record.size() &&
7228 "Invalid data, missing pragma diagnostic states");
7230 assert(FID.
isValid() &&
"invalid FileID for transition");
7231 unsigned Transitions =
Record[Idx++];
7237 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7238 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7239 for (
unsigned I = 0; I != Transitions; ++I) {
7240 unsigned Offset =
Record[Idx++];
7241 auto *State = ReadDiagState(*FirstState,
false);
7242 F.StateTransitions.push_back({State, Offset});
7247 assert(Idx <
Record.size() &&
7248 "Invalid data, missing final pragma diagnostic state");
7250 auto *CurState = ReadDiagState(*FirstState,
false);
7253 Diag.DiagStatesByLoc.CurDiagState = CurState;
7254 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7259 auto &T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7261 T.push_back({CurState, 0});
7263 T[0].State = CurState;
7272ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7273 auto [M, Index] = translateTypeIDToIndex(ID);
7280#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7281 case TYPE_##CODE_ID: return Type::CLASS_ID;
7282#include "clang/Serialization/TypeBitCodes.def"
7284 return std::nullopt;
7294QualType ASTReader::readTypeRecord(
TypeID ID) {
7295 assert(ContextObj &&
"reading type with no AST context");
7296 ASTContext &Context = *ContextObj;
7297 RecordLocation Loc = TypeCursorForIndex(ID);
7298 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7302 SavedStreamPosition SavedPosition(DeclsCursor);
7304 ReadingKindTracker ReadingKind(Read_Type, *
this);
7307 Deserializing AType(
this);
7309 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7310 Error(std::move(Err));
7313 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7315 Error(RawCode.takeError());
7319 ASTRecordReader
Record(*
this, *Loc.F);
7320 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7322 Error(Code.takeError());
7326 QualType baseType =
Record.readQualType();
7327 Qualifiers quals =
Record.readQualifiers();
7333 Error(
"Unexpected code for type");
7337 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7338 return TypeReader.read(*maybeClass);
7346 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7347 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7350 return Reader.readTypeSourceInfo();
7354 return Reader.readNestedNameSpecifierLoc();
7358 return Reader.readAttr();
7367#define ABSTRACT_TYPELOC(CLASS, PARENT)
7368#define TYPELOC(CLASS, PARENT) \
7369 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7370#include "clang/AST/TypeLocNodes.def"
7379void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7383void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7393void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7397void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7401void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7405void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7409void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7413void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7417void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7421void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7425void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7429void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7437 if (Reader.readBool())
7444 VisitArrayTypeLoc(TL);
7448 VisitArrayTypeLoc(TL);
7451void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7452 VisitArrayTypeLoc(TL);
7455void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7456 DependentSizedArrayTypeLoc TL) {
7457 VisitArrayTypeLoc(TL);
7460void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7461 DependentAddressSpaceTypeLoc TL) {
7468void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7469 DependentSizedExtVectorTypeLoc TL) {
7473void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7477void TypeLocReader::VisitDependentVectorTypeLoc(
7478 DependentVectorTypeLoc TL) {
7482void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7486void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7493void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7494 DependentSizedMatrixTypeLoc TL) {
7507 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7513 VisitFunctionTypeLoc(TL);
7517 VisitFunctionTypeLoc(TL);
7520void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7521 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7522 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7523 SourceLocation NameLoc = readSourceLocation();
7524 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7527void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7528 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7529 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7530 SourceLocation NameLoc = readSourceLocation();
7531 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7534void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7535 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7536 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7537 SourceLocation NameLoc = readSourceLocation();
7538 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7541void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7547void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7554void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7559void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7563void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7577 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7582void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7584 if (Reader.readBool())
7586 if (Reader.readBool())
7590void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7604 VisitTagTypeLoc(TL);
7608 VisitTagTypeLoc(TL);
7611void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7613void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7617void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7621void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7625void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7629void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7630 HLSLAttributedResourceTypeLoc TL) {
7634void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7638void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7642void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7643 SubstTemplateTypeParmTypeLoc TL) {
7647void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7648 SubstTemplateTypeParmPackTypeLoc TL) {
7652void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7653 SubstBuiltinTemplatePackTypeLoc TL) {
7657void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7658 TemplateSpecializationTypeLoc TL) {
7659 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7660 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7661 SourceLocation TemplateKeywordLoc = readSourceLocation();
7662 SourceLocation NameLoc = readSourceLocation();
7663 SourceLocation LAngleLoc = readSourceLocation();
7664 SourceLocation RAngleLoc = readSourceLocation();
7665 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7666 LAngleLoc, RAngleLoc);
7667 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7668 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7669 Args[I] = Reader.readTemplateArgumentLocInfo(
7670 TL.
getTypePtr()->template_arguments()[I].getKind());
7673void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7678void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7684void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7688void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7693void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7702void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7714void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7718void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7724void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7728void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7732void TypeLocReader::VisitDependentBitIntTypeLoc(
7733 clang::DependentBitIntTypeLoc TL) {
7737void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7771std::pair<ModuleFile *, unsigned>
7774 "Predefined type shouldn't be in TypesLoaded");
7776 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7778 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7779 assert(OwningModuleFile &&
7780 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7782 return {OwningModuleFile,
7787 assert(ContextObj &&
"reading type with no AST context");
7798 llvm_unreachable(
"Invalid predefined type");
7814 T = Context.UnsignedCharTy;
7817 T = Context.UnsignedShortTy;
7820 T = Context.UnsignedIntTy;
7823 T = Context.UnsignedLongTy;
7826 T = Context.UnsignedLongLongTy;
7829 T = Context.UnsignedInt128Ty;
7832 T = Context.SignedCharTy;
7835 T = Context.WCharTy;
7838 T = Context.ShortTy;
7847 T = Context.LongLongTy;
7850 T = Context.Int128Ty;
7853 T = Context.BFloat16Ty;
7859 T = Context.FloatTy;
7862 T = Context.DoubleTy;
7865 T = Context.LongDoubleTy;
7868 T = Context.ShortAccumTy;
7871 T = Context.AccumTy;
7874 T = Context.LongAccumTy;
7877 T = Context.UnsignedShortAccumTy;
7880 T = Context.UnsignedAccumTy;
7883 T = Context.UnsignedLongAccumTy;
7886 T = Context.ShortFractTy;
7889 T = Context.FractTy;
7892 T = Context.LongFractTy;
7895 T = Context.UnsignedShortFractTy;
7898 T = Context.UnsignedFractTy;
7901 T = Context.UnsignedLongFractTy;
7904 T = Context.SatShortAccumTy;
7907 T = Context.SatAccumTy;
7910 T = Context.SatLongAccumTy;
7913 T = Context.SatUnsignedShortAccumTy;
7916 T = Context.SatUnsignedAccumTy;
7919 T = Context.SatUnsignedLongAccumTy;
7922 T = Context.SatShortFractTy;
7925 T = Context.SatFractTy;
7928 T = Context.SatLongFractTy;
7931 T = Context.SatUnsignedShortFractTy;
7934 T = Context.SatUnsignedFractTy;
7937 T = Context.SatUnsignedLongFractTy;
7940 T = Context.Float16Ty;
7943 T = Context.Float128Ty;
7946 T = Context.Ibm128Ty;
7949 T = Context.OverloadTy;
7952 T = Context.UnresolvedTemplateTy;
7955 T = Context.BoundMemberTy;
7958 T = Context.PseudoObjectTy;
7961 T = Context.DependentTy;
7964 T = Context.UnknownAnyTy;
7967 T = Context.NullPtrTy;
7970 T = Context.Char8Ty;
7973 T = Context.Char16Ty;
7976 T = Context.Char32Ty;
7979 T = Context.ObjCBuiltinIdTy;
7982 T = Context.ObjCBuiltinClassTy;
7985 T = Context.ObjCBuiltinSelTy;
7987#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7988 case PREDEF_TYPE_##Id##_ID: \
7989 T = Context.SingletonId; \
7991#include "clang/Basic/OpenCLImageTypes.def"
7992#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7993 case PREDEF_TYPE_##Id##_ID: \
7994 T = Context.Id##Ty; \
7996#include "clang/Basic/OpenCLExtensionTypes.def"
7998 T = Context.OCLSamplerTy;
8001 T = Context.OCLEventTy;
8004 T = Context.OCLClkEventTy;
8007 T = Context.OCLQueueTy;
8010 T = Context.OCLReserveIDTy;
8013 T = Context.getAutoDeductType();
8016 T = Context.getAutoRRefDeductType();
8019 T = Context.ARCUnbridgedCastTy;
8022 T = Context.BuiltinFnTy;
8025 T = Context.IncompleteMatrixIdxTy;
8028 T = Context.ArraySectionTy;
8031 T = Context.OMPArrayShapingTy;
8034 T = Context.OMPIteratorTy;
8036#define SVE_TYPE(Name, Id, SingletonId) \
8037 case PREDEF_TYPE_##Id##_ID: \
8038 T = Context.SingletonId; \
8040#include "clang/Basic/AArch64ACLETypes.def"
8041#define PPC_VECTOR_TYPE(Name, Id, Size) \
8042 case PREDEF_TYPE_##Id##_ID: \
8043 T = Context.Id##Ty; \
8045#include "clang/Basic/PPCTypes.def"
8046#define RVV_TYPE(Name, Id, SingletonId) \
8047 case PREDEF_TYPE_##Id##_ID: \
8048 T = Context.SingletonId; \
8050#include "clang/Basic/RISCVVTypes.def"
8051#define WASM_TYPE(Name, Id, SingletonId) \
8052 case PREDEF_TYPE_##Id##_ID: \
8053 T = Context.SingletonId; \
8055#include "clang/Basic/WebAssemblyReferenceTypes.def"
8056#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8057 case PREDEF_TYPE_##Id##_ID: \
8058 T = Context.SingletonId; \
8060#include "clang/Basic/AMDGPUTypes.def"
8061#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8062 case PREDEF_TYPE_##Id##_ID: \
8063 T = Context.SingletonId; \
8065#include "clang/Basic/HLSLIntangibleTypes.def"
8068 assert(!T.isNull() &&
"Unknown predefined type");
8069 return T.withFastQualifiers(FastQuals);
8072 unsigned Index = translateTypeIDToIndex(ID).second;
8074 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
8075 if (TypesLoaded[Index].isNull()) {
8076 TypesLoaded[Index] = readTypeRecord(ID);
8077 if (TypesLoaded[Index].isNull())
8080 TypesLoaded[Index]->setFromAST();
8081 if (DeserializationListener)
8083 TypesLoaded[Index]);
8086 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8099 ReadModuleOffsetMap(F);
8102 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8104 if (ModuleFileIndex == 0)
8109 ModuleFileIndex = MF.
Index + 1;
8110 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8129 TemplateNameLoc, EllipsisLoc);
8140 llvm_unreachable(
"unexpected template argument loc");
8157 unsigned NumArgsAsWritten =
readInt();
8158 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8172 if (NumCurrentElementsDeserializing) {
8177 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8200 auto *II = Name.getAsIdentifierInfo();
8201 assert(II &&
"non-identifier name in C?");
8202 if (II->isOutOfDate())
8219 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8220 Template = CTSD->getSpecializedTemplate();
8221 Args = CTSD->getTemplateArgs().asArray();
8222 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8223 Template = VTSD->getSpecializedTemplate();
8224 Args = VTSD->getTemplateArgs().asArray();
8225 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8226 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8228 Args = FD->getTemplateSpecializationArgs()->asArray();
8233 Template->loadLazySpecializationsImpl(Args);
8238 RecordLocation Loc = getLocalBitOffset(Offset);
8241 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8242 Error(std::move(Err));
8245 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8250 Error(MaybeCode.takeError());
8253 unsigned Code = MaybeCode.get();
8257 if (!MaybeRecCode) {
8258 Error(MaybeRecCode.takeError());
8262 Error(
"malformed AST file: missing C++ ctor initializers");
8266 return Record.readCXXCtorInitializers();
8270 assert(ContextObj &&
"reading base specifiers with no AST context");
8273 RecordLocation Loc = getLocalBitOffset(Offset);
8276 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8277 Error(std::move(Err));
8280 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8285 Error(MaybeCode.takeError());
8288 unsigned Code = MaybeCode.get();
8292 if (!MaybeRecCode) {
8293 Error(MaybeCode.takeError());
8296 unsigned RecCode = MaybeRecCode.get();
8299 Error(
"malformed AST file: missing C++ base specifiers");
8303 unsigned NumBases =
Record.readInt();
8306 for (
unsigned I = 0; I != NumBases; ++I)
8307 Bases[I] =
Record.readCXXBaseSpecifier();
8320 ReadModuleOffsetMap(F);
8323 OwningModuleFileIndex == 0
8327 if (OwningModuleFileIndex == 0)
8330 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8339 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8340 return M.
Index == ModuleFileIndex - 1;
8348 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8349 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8369 DeclCursorForID(ID, Loc);
8374 assert(ContextObj &&
"reading predefined decl without AST context");
8376 Decl *NewLoaded =
nullptr;
8382 return Context.getTranslationUnitDecl();
8385 if (Context.ObjCIdDecl)
8386 return Context.ObjCIdDecl;
8387 NewLoaded = Context.getObjCIdDecl();
8391 if (Context.ObjCSelDecl)
8392 return Context.ObjCSelDecl;
8393 NewLoaded = Context.getObjCSelDecl();
8397 if (Context.ObjCClassDecl)
8398 return Context.ObjCClassDecl;
8399 NewLoaded = Context.getObjCClassDecl();
8403 if (Context.ObjCProtocolClassDecl)
8404 return Context.ObjCProtocolClassDecl;
8405 NewLoaded = Context.getObjCProtocolDecl();
8409 if (Context.Int128Decl)
8410 return Context.Int128Decl;
8411 NewLoaded = Context.getInt128Decl();
8415 if (Context.UInt128Decl)
8416 return Context.UInt128Decl;
8417 NewLoaded = Context.getUInt128Decl();
8421 if (Context.ObjCInstanceTypeDecl)
8422 return Context.ObjCInstanceTypeDecl;
8423 NewLoaded = Context.getObjCInstanceTypeDecl();
8427 if (Context.BuiltinVaListDecl)
8428 return Context.BuiltinVaListDecl;
8429 NewLoaded = Context.getBuiltinVaListDecl();
8433 if (Context.VaListTagDecl)
8434 return Context.VaListTagDecl;
8435 NewLoaded = Context.getVaListTagDecl();
8439 if (Context.BuiltinMSVaListDecl)
8440 return Context.BuiltinMSVaListDecl;
8441 NewLoaded = Context.getBuiltinMSVaListDecl();
8446 return Context.getMSGuidTagDecl();
8449 if (Context.ExternCContext)
8450 return Context.ExternCContext;
8451 NewLoaded = Context.getExternCContextDecl();
8455 if (Context.CFConstantStringTypeDecl)
8456 return Context.CFConstantStringTypeDecl;
8457 NewLoaded = Context.getCFConstantStringDecl();
8461 if (Context.CFConstantStringTagDecl)
8462 return Context.CFConstantStringTagDecl;
8463 NewLoaded = Context.getCFConstantStringTagDecl();
8467 return Context.getMSTypeInfoTagDecl();
8469#define BuiltinTemplate(BTName) \
8470 case PREDEF_DECL##BTName##_ID: \
8471 if (Context.Decl##BTName) \
8472 return Context.Decl##BTName; \
8473 NewLoaded = Context.get##BTName##Decl(); \
8475#include "clang/Basic/BuiltinTemplates.inc"
8478 llvm_unreachable(
"Invalid decl ID");
8482 assert(NewLoaded &&
"Failed to load predefined decl?");
8484 if (DeserializationListener)
8485 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8490unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8491 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8492 if (!OwningModuleFile) {
8501 assert(ContextObj &&
"reading decl with no AST context");
8510 Merged.push_back(ID);
8515 unsigned Index = translateGlobalDeclIDToIndex(ID);
8517 if (Index >= DeclsLoaded.size()) {
8518 assert(0 &&
"declaration ID out-of-range for AST file");
8519 Error(
"declaration ID out-of-range for AST file");
8523 return DeclsLoaded[Index];
8530 unsigned Index = translateGlobalDeclIDToIndex(ID);
8532 if (Index >= DeclsLoaded.size()) {
8533 assert(0 &&
"declaration ID out-of-range for AST file");
8534 Error(
"declaration ID out-of-range for AST file");
8538 if (!DeclsLoaded[Index]) {
8540 if (DeserializationListener)
8541 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8544 return DeclsLoaded[Index];
8553 ReadModuleOffsetMap(M);
8563 uint64_t OrignalModuleFileIndex = 0;
8566 OrignalModuleFileIndex = I + 1;
8570 if (!OrignalModuleFileIndex)
8578 if (Idx >=
Record.size()) {
8579 Error(
"Corrupted AST file");
8596 RecordLocation Loc = getLocalBitOffset(Offset);
8597 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8598 Error(std::move(Err));
8601 assert(NumCurrentElementsDeserializing == 0 &&
8602 "should not be called while already deserializing");
8604 return ReadStmtFromStream(*Loc.F);
8607bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8611 auto It = SpecLookups.find(D);
8612 if (It == SpecLookups.end())
8618 It->second.Table.findAll();
8622 SpecLookups.erase(It);
8624 bool NewSpecsFound =
false;
8625 Deserializing LookupResults(
this);
8626 for (
auto &Info : Infos) {
8627 if (GetExistingDecl(Info))
8629 NewSpecsFound =
true;
8633 return NewSpecsFound;
8640 bool NewSpecsFound =
8641 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8643 return NewSpecsFound;
8645 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8646 return NewSpecsFound;
8649bool ASTReader::LoadExternalSpecializationsImpl(
8650 SpecLookupTableTy &SpecLookups,
const Decl *D,
8655 if (
auto It = SpecLookups.find(D); It != SpecLookups.end())
8656 LookupTable = &It->getSecond();
8662 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8664 llvm::raw_string_ostream OS(Name);
8671 Deserializing LookupResults(
this);
8676 LookupTable->
Table.find(HashValue);
8678 bool NewSpecsFound =
false;
8679 for (
auto &Info : Infos) {
8680 if (GetExistingDecl(Info))
8682 NewSpecsFound =
true;
8686 return NewSpecsFound;
8693 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8694 PartialSpecializationsLookups, D, TemplateArgs);
8696 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8698 return NewDeclsFound;
8706 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8707 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8708 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8710 if (!IsKindWeWant(K))
8713 auto ID = (
DeclID) + LexicalDecls[I + 1];
8718 if (PredefsVisited[ID])
8721 PredefsVisited[ID] =
true;
8725 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8733 for (
const auto &Lexical : TULexicalDecls)
8734 Visit(Lexical.first, Lexical.second);
8736 auto I = LexicalDecls.find(DC);
8737 if (I != LexicalDecls.end())
8738 Visit(I->second.first, I->second.second);
8741 ++NumLexicalDeclContextsRead;
8746class UnalignedDeclIDComp {
8752 : Reader(Reader), Mod(M) {}
8761 SourceLocation RHS = getLocation(R);
8766 SourceLocation LHS = getLocation(L);
8780 unsigned Offset,
unsigned Length,
8784 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8785 if (I == FileDeclIDs.end())
8788 FileDeclsInfo &DInfo = I->second;
8789 if (DInfo.Decls.empty())
8793 BeginLoc =
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
8796 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8798 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8799 if (BeginIt != DInfo.Decls.begin())
8805 while (BeginIt != DInfo.Decls.begin() &&
8808 ->isTopLevelDeclInObjCContainer())
8812 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8813 if (EndIt != DInfo.Decls.end())
8826 "DeclContext has no visible decls in storage");
8833 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8855 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8856 ++NumVisibleDeclContextsRead;
8857 Find(It->second.Table, Name);
8860 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8861 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8862 ++NumModuleLocalVisibleDeclContexts;
8863 Find(It->second.Table, std::make_pair(Name, NamedModule));
8866 if (
auto *NamedModule =
8867 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8869 FindModuleLocalLookup(NamedModule);
8874 if (ContextObj && ContextObj->getCurrentNamedModule())
8875 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8877 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8878 ++NumTULocalVisibleDeclContexts;
8879 Find(It->second.Table, Name);
8892 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
8893 auto It = LookupTables.find(DC);
8894 if (It == LookupTables.end())
8916 findAll(Lookups, NumVisibleDeclContextsRead);
8917 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8918 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8920 for (
auto &[Name, DS] : Decls)
8923 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
8928 auto I = Lookups.find(Primary);
8929 return I == Lookups.end() ?
nullptr : &I->second;
8934 auto I = ModuleLocalLookups.find(Primary);
8935 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
8940 auto I = TULocalLookups.find(Primary);
8941 return I == TULocalLookups.end() ?
nullptr : &I->second;
8948 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
8949 auto I = LookupTable.find(D);
8950 return I == LookupTable.end() ?
nullptr : &I->second;
8955 return PartialSpecializationsLookups.contains(D) ||
8956 SpecializationsLookups.contains(D);
8965 assert(ImplD && Consumer);
8967 for (
auto *I : ImplD->
methods())
8973void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
8974 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
8977 Consumer->HandleInterestingDecl(DeclGroupRef(D));
8980void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
8981 Consumer->HandleVTable(RD);
8985 this->Consumer = Consumer;
8988 PassInterestingDeclsToConsumer();
8990 if (DeserializationListener)
8991 DeserializationListener->ReaderInitialized(
this);
8995 std::fprintf(
stderr,
"*** AST File Statistics:\n");
8997 unsigned NumTypesLoaded =
8998 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
8999 unsigned NumDeclsLoaded =
9000 DeclsLoaded.size() -
9001 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
9002 unsigned NumIdentifiersLoaded =
9003 IdentifiersLoaded.size() -
9005 unsigned NumMacrosLoaded =
9006 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
9007 unsigned NumSelectorsLoaded =
9008 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
9011 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
9012 NumSLocEntriesRead, TotalNumSLocEntries,
9013 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9014 if (!TypesLoaded.empty())
9015 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
9016 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
9017 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
9018 if (!DeclsLoaded.empty())
9019 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
9020 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
9021 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9022 if (!IdentifiersLoaded.empty())
9023 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
9024 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
9025 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9026 if (!MacrosLoaded.empty())
9027 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9028 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
9029 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9030 if (!SelectorsLoaded.empty())
9031 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
9032 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
9033 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9034 if (TotalNumStatements)
9035 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
9036 NumStatementsRead, TotalNumStatements,
9037 ((
float)NumStatementsRead/TotalNumStatements * 100));
9039 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9040 NumMacrosRead, TotalNumMacros,
9041 ((
float)NumMacrosRead/TotalNumMacros * 100));
9042 if (TotalLexicalDeclContexts)
9043 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
9044 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9045 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9047 if (TotalVisibleDeclContexts)
9048 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
9049 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9050 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9052 if (TotalModuleLocalVisibleDeclContexts)
9054 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
9055 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9056 ((
float)NumModuleLocalVisibleDeclContexts /
9057 TotalModuleLocalVisibleDeclContexts * 100));
9058 if (TotalTULocalVisibleDeclContexts)
9059 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
9060 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9061 ((
float)NumTULocalVisibleDeclContexts /
9062 TotalTULocalVisibleDeclContexts * 100));
9063 if (TotalNumMethodPoolEntries)
9064 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
9065 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9066 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9068 if (NumMethodPoolLookups)
9069 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
9070 NumMethodPoolHits, NumMethodPoolLookups,
9071 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9072 if (NumMethodPoolTableLookups)
9073 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
9074 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9075 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9077 if (NumIdentifierLookupHits)
9079 " %u / %u identifier table lookups succeeded (%f%%)\n",
9080 NumIdentifierLookupHits, NumIdentifierLookups,
9081 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9084 std::fprintf(
stderr,
"\n");
9085 GlobalIndex->printStats();
9088 std::fprintf(
stderr,
"\n");
9090 std::fprintf(
stderr,
"\n");
9093template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9094LLVM_DUMP_METHOD
static void
9097 InitialCapacity> &Map) {
9098 if (Map.begin() == Map.end())
9103 llvm::errs() << Name <<
":\n";
9104 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9106 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9111 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9113 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9117 GlobalPreprocessedEntityMap);
9119 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9128 if (llvm::MemoryBuffer *buf = I.Buffer) {
9129 size_t bytes = buf->getBufferSize();
9130 switch (buf->getBufferKind()) {
9131 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9134 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9155 if (!FPPragmaOptions.empty()) {
9156 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9159 SemaObj->CurFPFeatures =
9165 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9166 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9167 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9168 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9170 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9172 DeclsWithEffectsToVerify.clear();
9174 SemaObj->OpenCLFeatures = OpenCLExtensions;
9180 assert(SemaObj &&
"no Sema to update");
9184 if (!SemaDeclRefs.empty()) {
9185 assert(SemaDeclRefs.size() % 3 == 0);
9186 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9187 if (!SemaObj->StdNamespace)
9188 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9189 if (!SemaObj->StdBadAlloc)
9190 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9191 if (!SemaObj->StdAlignValT)
9192 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9194 SemaDeclRefs.clear();
9199 if(OptimizeOffPragmaLocation.isValid())
9200 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9201 if (PragmaMSStructState != -1)
9203 if (PointersToMembersPragmaLocation.isValid()) {
9204 SemaObj->ActOnPragmaMSPointersToMembers(
9206 PragmaMSPointersToMembersState,
9207 PointersToMembersPragmaLocation);
9209 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9210 if (!RISCVVecIntrinsicPragma.empty()) {
9211 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9212 "Wrong number of RISCVVecIntrinsicPragma");
9213 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9214 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9215 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9218 if (PragmaAlignPackCurrentValue) {
9222 bool DropFirst =
false;
9223 if (!PragmaAlignPackStack.empty() &&
9224 PragmaAlignPackStack.front().Location.isInvalid()) {
9225 assert(PragmaAlignPackStack.front().Value ==
9226 SemaObj->AlignPackStack.DefaultValue &&
9227 "Expected a default alignment value");
9228 SemaObj->AlignPackStack.Stack.emplace_back(
9229 PragmaAlignPackStack.front().SlotLabel,
9230 SemaObj->AlignPackStack.CurrentValue,
9231 SemaObj->AlignPackStack.CurrentPragmaLocation,
9232 PragmaAlignPackStack.front().PushLocation);
9235 for (
const auto &Entry :
9236 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9237 SemaObj->AlignPackStack.Stack.emplace_back(
9238 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9240 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9241 assert(*PragmaAlignPackCurrentValue ==
9242 SemaObj->AlignPackStack.DefaultValue &&
9243 "Expected a default align and pack value");
9246 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9247 SemaObj->AlignPackStack.CurrentPragmaLocation =
9248 PragmaAlignPackCurrentLocation;
9251 if (FpPragmaCurrentValue) {
9255 bool DropFirst =
false;
9256 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9257 assert(FpPragmaStack.front().Value ==
9258 SemaObj->FpPragmaStack.DefaultValue &&
9259 "Expected a default pragma float_control value");
9260 SemaObj->FpPragmaStack.Stack.emplace_back(
9261 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9262 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9263 FpPragmaStack.front().PushLocation);
9266 for (
const auto &Entry :
9268 SemaObj->FpPragmaStack.Stack.emplace_back(
9269 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9270 if (FpPragmaCurrentLocation.isInvalid()) {
9271 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9272 "Expected a default pragma float_control value");
9275 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9276 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9281 for (
auto &Import : PendingImportedModulesSema) {
9282 if (Import.ImportLoc.isInvalid())
9285 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9288 PendingImportedModulesSema.clear();
9295 IdentifierLookupVisitor Visitor(Name, 0,
9296 NumIdentifierLookups,
9297 NumIdentifierLookupHits);
9303 if (PP.getLangOpts().CPlusPlus) {
9304 for (
auto *F : ModuleMgr.pch_modules())
9313 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9318 ModuleMgr.visit(Visitor, HitsPtr);
9340 ASTIdentifierLookupTable::key_iterator Current;
9344 ASTIdentifierLookupTable::key_iterator End;
9351 bool SkipModules =
false);
9353 StringRef
Next()
override;
9360 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9364 while (Current == End) {
9376 Current = IdTable->key_begin();
9377 End = IdTable->key_end();
9382 StringRef
Result = *Current;
9391 std::unique_ptr<IdentifierIterator> Current;
9392 std::unique_ptr<IdentifierIterator> Queued;
9395 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9396 std::unique_ptr<IdentifierIterator> Second)
9397 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9399 StringRef
Next()
override {
9403 StringRef result = Current->Next();
9404 if (!result.empty())
9409 std::swap(Current, Queued);
9418 std::unique_ptr<IdentifierIterator> ReaderIter(
9420 std::unique_ptr<IdentifierIterator> ModulesIter(
9421 GlobalIndex->createIdentifierIterator());
9422 return new ChainedIdentifierIterator(std::move(ReaderIter),
9423 std::move(ModulesIter));
9435 unsigned PriorGeneration;
9436 unsigned InstanceBits = 0;
9437 unsigned FactoryBits = 0;
9438 bool InstanceHasMoreThanOneDecl =
false;
9439 bool FactoryHasMoreThanOneDecl =
false;
9445 unsigned PriorGeneration)
9446 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9456 ++Reader.NumMethodPoolTableLookups;
9459 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9460 if (Pos == PoolTable->end())
9463 ++Reader.NumMethodPoolTableHits;
9464 ++Reader.NumSelectorsRead;
9468 ++Reader.NumMethodPoolEntriesRead;
9470 if (Reader.DeserializationListener)
9471 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9476 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9477 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9478 InstanceBits =
Data.InstanceBits;
9479 FactoryBits =
Data.FactoryBits;
9480 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9481 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9487 return InstanceMethods;
9492 return FactoryMethods;
9499 return InstanceHasMoreThanOneDecl;
9517 unsigned &Generation = SelectorGeneration[Sel];
9518 unsigned PriorGeneration = Generation;
9520 SelectorOutOfDate[Sel] =
false;
9523 ++NumMethodPoolLookups;
9525 ModuleMgr.visit(Visitor);
9531 ++NumMethodPoolHits;
9552 if (SelectorOutOfDate[Sel])
9560 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9562 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9563 Namespaces.push_back(Namespace);
9568 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9569 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9570 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9573 Undefined.insert(std::make_pair(D, Loc));
9575 UndefinedButUsed.clear();
9581 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9584 uint64_t Count = DelayedDeleteExprs[Idx++];
9585 for (uint64_t
C = 0;
C < Count; ++
C) {
9588 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9589 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9596 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9597 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9599 TentativeDefs.push_back(Var);
9601 TentativeDefinitions.clear();
9606 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9608 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9612 UnusedFileScopedDecls.clear();
9617 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9619 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9623 DelegatingCtorDecls.clear();
9627 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9629 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9633 ExtVectorDecls.clear();
9638 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9641 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9645 UnusedLocalTypedefNameCandidates.clear();
9650 for (
auto I : DeclsToCheckForDeferredDiags) {
9651 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9655 DeclsToCheckForDeferredDiags.clear();
9660 if (ReferencedSelectorsData.empty())
9665 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9667 while (I < DataSize) {
9671 Sels.push_back(std::make_pair(Sel, SelLoc));
9673 ReferencedSelectorsData.clear();
9678 if (WeakUndeclaredIdentifiers.empty())
9681 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9689 WeakIDs.push_back(std::make_pair(WeakId, WI));
9691 WeakUndeclaredIdentifiers.clear();
9695 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9697 VTableUse &TableInfo = VTableUses[Idx++];
9698 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9701 VTables.push_back(VT);
9709 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9710 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9714 Pending.push_back(std::make_pair(D, Loc));
9716 PendingInstantiations.clear();
9720 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9722 for (
auto &LPT : LateParsedTemplates) {
9725 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9729 auto LT = std::make_unique<LateParsedTemplate>();
9730 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9734 assert(F &&
"No module");
9736 unsigned TokN = LateParsed[Idx++];
9737 LT->Toks.reserve(TokN);
9738 for (
unsigned T = 0; T < TokN; ++T)
9739 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9741 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9745 LateParsedTemplates.clear();
9757 if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9758 Iter != LambdaDeclarationsForMerging.end() &&
9759 Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
9768 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9777 assert(ID &&
"Non-zero identifier ID required");
9778 unsigned Index = translateIdentifierIDToIndex(ID).second;
9779 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9780 IdentifiersLoaded[Index] = II;
9781 if (DeserializationListener)
9782 DeserializationListener->IdentifierRead(ID, II);
9804 if (NumCurrentElementsDeserializing && !Decls) {
9805 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9809 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9822 Decls->push_back(D);
9829 pushExternalDeclIntoScope(D, II);
9833std::pair<ModuleFile *, unsigned>
9834ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9836 return {
nullptr, 0};
9838 unsigned ModuleFileIndex = ID >> 32;
9839 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9841 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9853 if (IdentifiersLoaded.empty()) {
9854 Error(
"no identifier table in AST file");
9858 auto [M, Index] = translateIdentifierIDToIndex(ID);
9859 if (!IdentifiersLoaded[Index]) {
9860 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9863 const unsigned char *
Data =
9869 auto &II = PP.getIdentifierTable().get(Key);
9870 IdentifiersLoaded[Index] = &II;
9873 if (DeserializationListener)
9874 DeserializationListener->IdentifierRead(ID, &II);
9877 return IdentifiersLoaded[Index];
9889 ReadModuleOffsetMap(M);
9891 unsigned ModuleFileIndex = LocalID >> 32;
9892 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9895 assert(MF &&
"malformed identifier ID encoding?");
9897 if (!ModuleFileIndex)
9903std::pair<ModuleFile *, unsigned>
9904ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
9906 return {
nullptr, 0};
9908 unsigned ModuleFileIndex = ID >> 32;
9909 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
9913 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
9922 if (MacrosLoaded.empty()) {
9923 Error(
"no macro table in AST file");
9927 auto [M, Index] = translateMacroIDToIndex(ID);
9928 if (!MacrosLoaded[Index]) {
9929 assert(M !=
nullptr &&
"Untranslated Macro ID?");
9935 if (DeserializationListener)
9936 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
9939 return MacrosLoaded[Index];
9947 ReadModuleOffsetMap(M);
9949 unsigned ModuleFileIndex = LocalID >> 32;
9950 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
9953 assert(MF &&
"malformed identifier ID encoding?");
9955 if (!ModuleFileIndex) {
9960 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
9969 ReadModuleOffsetMap(M);
9974 &&
"Invalid index into submodule index remap");
9976 return LocalID + I->second;
9981 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
9985 if (GlobalID > SubmodulesLoaded.size()) {
9986 Error(
"submodule ID out of range in AST file");
10001 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
10004 int IndexFromEnd =
static_cast<int>(ID >> 1);
10005 assert(IndexFromEnd &&
"got reference to unknown module file");
10022 auto I = llvm::find(PCHModules, M);
10023 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
10024 return std::distance(I, PCHModules.end()) << 1;
10033 const auto &PCHChain = ModuleMgr.pch_modules();
10034 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10035 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10039 llvm::sys::path::parent_path(MF.
FileName),
10042 return std::nullopt;
10046 auto I = DefinitionSource.find(FD);
10047 if (I == DefinitionSource.end())
10053 return ThisDeclarationWasADefinitionSet.contains(FD);
10064 if (ID > SelectorsLoaded.size()) {
10065 Error(
"selector ID out of range in AST file");
10069 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
10072 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
10076 SelectorsLoaded[ID - 1] =
10078 if (DeserializationListener)
10079 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10082 return SelectorsLoaded[ID - 1];
10100 ReadModuleOffsetMap(M);
10105 &&
"Invalid index into selector index remap");
10107 return LocalID + I->second;
10138 NameInfo.
setName(readDeclarationName());
10152 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10153 assert(Op.isValid());
10159 unsigned NumTPLists =
readInt();
10164 for (
unsigned i = 0; i != NumTPLists; ++i)
10175 unsigned NumParams =
readInt();
10177 Params.reserve(NumParams);
10178 while (NumParams--)
10181 bool HasRequiresClause =
readBool();
10182 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10185 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10186 return TemplateParams;
10191 bool Canonicalize) {
10192 unsigned NumTemplateArgs =
readInt();
10193 TemplArgs.reserve(NumTemplateArgs);
10194 while (NumTemplateArgs--)
10200 unsigned NumDecls =
readInt();
10202 while (NumDecls--) {
10214 bool inheritConstructors =
readBool();
10220 Result.setInheritConstructors(inheritConstructors);
10227 unsigned NumInitializers =
readInt();
10228 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10230 for (
unsigned i = 0; i != NumInitializers; ++i) {
10232 bool IsBaseVirtual =
false;
10263 BOMInit =
new (Context)
10265 RParenLoc, MemberOrEllipsisLoc);
10267 BOMInit =
new (Context)
10270 BOMInit =
new (Context)
10274 BOMInit =
new (Context)
10276 LParenLoc,
Init, RParenLoc);
10279 unsigned SourceOrder =
readInt();
10283 CtorInitializers[i] = BOMInit;
10286 return CtorInitializers;
10294 for (
unsigned I = 0; I != N; ++I) {
10295 auto Kind = readNestedNameSpecifierKind();
10300 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10309 Builder.Make(Context, T->getTypeLoc(), ColonColonLoc);
10315 Builder.MakeGlobal(Context, ColonColonLoc);
10322 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10327 llvm_unreachable(
"unexpected null nested name specifier");
10342 const StringRef Blob) {
10343 unsigned Count =
Record[0];
10344 const char *Byte = Blob.data();
10345 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10346 for (
unsigned I = 0; I < Count; ++Byte)
10347 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10348 if (*Byte & (1 << Bit))
10355 return llvm::APFloat(Sem,
readAPInt());
10360 unsigned Len =
Record[Idx++];
10368 unsigned Len =
Record[Idx++];
10369 StringRef
Result = Blob.substr(0, Len);
10370 Blob = Blob.substr(Len);
10394 unsigned Major =
Record[Idx++];
10395 unsigned Minor =
Record[Idx++];
10396 unsigned Subminor =
Record[Idx++];
10398 return VersionTuple(Major);
10400 return VersionTuple(Major, Minor - 1);
10401 return VersionTuple(Major, Minor - 1, Subminor - 1);
10412 return Diag(CurrentImportLoc, DiagID);
10416 return Diags.Report(Loc, DiagID);
10420 llvm::function_ref<
void()> Fn) {
10423 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10427 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10433 return PP.getIdentifierTable();
10439 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10440 "Already have a SwitchCase with this ID");
10441 (*CurrSwitchCaseStmts)[ID] = SC;
10446 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10447 return (*CurrSwitchCaseStmts)[ID];
10451 CurrSwitchCaseStmts->clear();
10456 std::vector<RawComment *> Comments;
10463 BitstreamCursor &Cursor = I->first;
10470 Cursor.advanceSkippingSubblocks(
10471 BitstreamCursor::AF_DontPopBlockAtEnd);
10473 Error(MaybeEntry.takeError());
10476 llvm::BitstreamEntry Entry = MaybeEntry.get();
10478 switch (Entry.Kind) {
10479 case llvm::BitstreamEntry::SubBlock:
10480 case llvm::BitstreamEntry::Error:
10481 Error(
"malformed block record in AST file");
10483 case llvm::BitstreamEntry::EndBlock:
10485 case llvm::BitstreamEntry::Record:
10493 if (!MaybeComment) {
10494 Error(MaybeComment.takeError());
10503 bool IsTrailingComment =
Record[Idx++];
10504 bool IsAlmostTrailingComment =
Record[Idx++];
10505 Comments.push_back(
new (Context)
RawComment(
10506 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10516 if (Loc.first.isValid())
10517 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10530 assert(NumUserInputs <= NumInputs);
10531 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10532 for (
unsigned I = 0; I < N; ++I) {
10533 bool IsSystem = I >= NumUserInputs;
10535 Visitor(IFI, IsSystem);
10540 bool IncludeSystem,
bool Complain,
10542 bool isSystem)> Visitor) {
10545 assert(NumUserInputs <= NumInputs);
10546 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10547 for (
unsigned I = 0; I < N; ++I) {
10548 bool IsSystem = I >= NumUserInputs;
10549 InputFile IF = getInputFile(MF, I+1, Complain);
10550 Visitor(IF, IsSystem);
10558 for (
unsigned I = 0; I < NumInputs; ++I) {
10561 if (
auto FE = getInputFile(MF, I + 1).getFile())
10566void ASTReader::finishPendingActions() {
10567 while (!PendingIdentifierInfos.empty() ||
10568 !PendingDeducedFunctionTypes.empty() ||
10569 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10570 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10571 !PendingUpdateRecords.empty() ||
10572 !PendingObjCExtensionIvarRedeclarations.empty()) {
10575 using TopLevelDeclsMap =
10576 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10577 TopLevelDeclsMap TopLevelDecls;
10579 while (!PendingIdentifierInfos.empty()) {
10582 std::move(PendingIdentifierInfos.back().second);
10583 PendingIdentifierInfos.pop_back();
10590 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10591 auto *FD = PendingDeducedFunctionTypes[I].first;
10592 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10594 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10597 if (DT->isDeduced()) {
10598 PendingDeducedTypeUpdates.insert(
10599 {FD->getCanonicalDecl(), FD->getReturnType()});
10606 PendingUndeducedFunctionDecls.push_back(FD);
10610 PendingDeducedFunctionTypes.clear();
10614 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10615 auto *VD = PendingDeducedVarTypes[I].first;
10616 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10618 PendingDeducedVarTypes.clear();
10621 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10622 loadPendingDeclChain(PendingDeclChains[I].first,
10623 PendingDeclChains[I].second);
10624 PendingDeclChains.clear();
10627 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10628 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10629 IdentifierInfo *II = TLD->first;
10630 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10636 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10637 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10638 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10639 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10641 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10643 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10644 if (!Info.M->isModule())
10648 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10650 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10651 if (Info.M->isModule())
10655 PendingMacroIDs.clear();
10659 while (!PendingDeclContextInfos.empty()) {
10660 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10661 PendingDeclContextInfos.pop_front();
10664 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10668 while (!PendingUpdateRecords.empty()) {
10669 auto Update = PendingUpdateRecords.pop_back_val();
10670 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10671 loadDeclUpdateRecords(
Update);
10674 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10675 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10676 auto DuplicateIvars =
10677 PendingObjCExtensionIvarRedeclarations.back().second;
10679 StructuralEquivalenceContext Ctx(
10680 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10681 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10685 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10687 for (
auto IvarPair : DuplicateIvars) {
10688 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10690 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10696 ExtensionsPair.first->setInvalidDecl();
10697 ExtensionsPair.second->getClassInterface()
10699 ->setIvarList(
nullptr);
10701 for (
auto IvarPair : DuplicateIvars) {
10702 Diag(IvarPair.first->getLocation(),
10703 diag::err_duplicate_ivar_declaration)
10704 << IvarPair.first->getIdentifier();
10705 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10708 PendingObjCExtensionIvarRedeclarations.pop_back();
10714 assert(PendingFakeDefinitionData.empty() &&
10715 "faked up a class definition but never saw the real one");
10721 for (Decl *D : PendingDefinitions) {
10722 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10723 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10724 for (
auto *R = getMostRecentExistingDecl(RD);
R;
10725 R =
R->getPreviousDecl()) {
10728 "declaration thinks it's the definition but it isn't");
10736 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10741 for (
auto *R = getMostRecentExistingDecl(ID);
R;
R =
R->getPreviousDecl())
10747 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10748 for (
auto *R = getMostRecentExistingDecl(PD);
R;
R =
R->getPreviousDecl())
10755 for (
auto *R = getMostRecentExistingDecl(RTD);
R;
R =
R->getPreviousDecl())
10758 PendingDefinitions.clear();
10760 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10761 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10762 if (
auto *VD = dyn_cast<VarDecl>(D))
10763 return VD->isThisDeclarationADefinition() ||
10764 VD->isThisDeclarationADemotedDefinition();
10766 if (
auto *TD = dyn_cast<TagDecl>(D))
10767 return TD->isThisDeclarationADefinition() ||
10768 TD->isThisDeclarationADemotedDefinition();
10770 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10771 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10773 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10774 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10781 return hasDefinitionImpl(D, hasDefinitionImpl);
10797 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10803 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10804 PBEnd = PendingBodies.end();
10805 PB != PBEnd; ++PB) {
10806 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10808 const FunctionDecl *Defn =
nullptr;
10809 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10810 FD->setLazyBody(PB->second);
10812 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10815 if (!FD->isLateTemplateParsed() &&
10816 !NonConstDefn->isLateTemplateParsed() &&
10821 FD->getODRHash() != NonConstDefn->getODRHash()) {
10823 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10824 }
else if (FD->getLexicalParent()->isFileContext() &&
10825 NonConstDefn->getLexicalParent()->isFileContext()) {
10829 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10840 PendingBodies.clear();
10843 for (
auto [RD, MD] : PendingAddedClassMembers) {
10844 RD->addedMember(MD);
10846 PendingAddedClassMembers.clear();
10849 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10851 PendingMergedDefinitionsToDeduplicate.clear();
10855 for (Decl *D : PendingIncompleteDeclChains)
10856 markIncompleteDeclChain(D);
10857 PendingIncompleteDeclChains.clear();
10859 assert(PendingIdentifierInfos.empty() &&
10860 "Should be empty at the end of finishPendingActions");
10861 assert(PendingDeducedFunctionTypes.empty() &&
10862 "Should be empty at the end of finishPendingActions");
10863 assert(PendingDeducedVarTypes.empty() &&
10864 "Should be empty at the end of finishPendingActions");
10865 assert(PendingDeclChains.empty() &&
10866 "Should be empty at the end of finishPendingActions");
10867 assert(PendingMacroIDs.empty() &&
10868 "Should be empty at the end of finishPendingActions");
10869 assert(PendingDeclContextInfos.empty() &&
10870 "Should be empty at the end of finishPendingActions");
10871 assert(PendingUpdateRecords.empty() &&
10872 "Should be empty at the end of finishPendingActions");
10873 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10874 "Should be empty at the end of finishPendingActions");
10875 assert(PendingFakeDefinitionData.empty() &&
10876 "Should be empty at the end of finishPendingActions");
10877 assert(PendingDefinitions.empty() &&
10878 "Should be empty at the end of finishPendingActions");
10879 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10880 "Should be empty at the end of finishPendingActions");
10881 assert(PendingBodies.empty() &&
10882 "Should be empty at the end of finishPendingActions");
10883 assert(PendingAddedClassMembers.empty() &&
10884 "Should be empty at the end of finishPendingActions");
10885 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10886 "Should be empty at the end of finishPendingActions");
10887 assert(PendingIncompleteDeclChains.empty() &&
10888 "Should be empty at the end of finishPendingActions");
10891void ASTReader::diagnoseOdrViolations() {
10892 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10893 PendingRecordOdrMergeFailures.empty() &&
10894 PendingFunctionOdrMergeFailures.empty() &&
10895 PendingEnumOdrMergeFailures.empty() &&
10896 PendingObjCInterfaceOdrMergeFailures.empty() &&
10897 PendingObjCProtocolOdrMergeFailures.empty())
10904 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10905 PendingOdrMergeFailures.clear();
10906 for (
auto &Merge : OdrMergeFailures) {
10907 Merge.first->buildLookup();
10908 Merge.first->decls_begin();
10909 Merge.first->bases_begin();
10910 Merge.first->vbases_begin();
10911 for (
auto &RecordPair : Merge.second) {
10912 auto *RD = RecordPair.first;
10920 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
10921 PendingRecordOdrMergeFailures.clear();
10922 for (
auto &Merge : RecordOdrMergeFailures) {
10923 Merge.first->decls_begin();
10924 for (
auto &D : Merge.second)
10929 auto ObjCInterfaceOdrMergeFailures =
10930 std::move(PendingObjCInterfaceOdrMergeFailures);
10931 PendingObjCInterfaceOdrMergeFailures.clear();
10932 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
10933 Merge.first->decls_begin();
10934 for (
auto &InterfacePair : Merge.second)
10935 InterfacePair.first->decls_begin();
10939 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
10940 PendingFunctionOdrMergeFailures.clear();
10941 for (
auto &Merge : FunctionOdrMergeFailures) {
10942 Merge.first->buildLookup();
10943 Merge.first->decls_begin();
10944 Merge.first->getBody();
10945 for (
auto &FD : Merge.second) {
10953 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
10954 PendingEnumOdrMergeFailures.clear();
10955 for (
auto &Merge : EnumOdrMergeFailures) {
10956 Merge.first->decls_begin();
10957 for (
auto &
Enum : Merge.second) {
10958 Enum->decls_begin();
10963 auto ObjCProtocolOdrMergeFailures =
10964 std::move(PendingObjCProtocolOdrMergeFailures);
10965 PendingObjCProtocolOdrMergeFailures.clear();
10966 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
10967 Merge.first->decls_begin();
10968 for (
auto &ProtocolPair : Merge.second)
10969 ProtocolPair.first->decls_begin();
10978 while (!PendingOdrMergeChecks.empty()) {
10979 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
10990 bool Found =
false;
10993 for (
auto *RI : D->
redecls()) {
10994 if (RI->getLexicalDeclContext() == CanonDef) {
11008 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11009 for (
auto *CanonMember : CanonDef->
decls()) {
11010 if (CanonMember->getCanonicalDecl() == DCanon) {
11019 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
11021 Candidates.push_back(ND);
11034 std::string CanonDefModule =
11039 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11041 if (Candidates.empty())
11043 diag::note_module_odr_violation_no_possible_decls) << D;
11045 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
11046 Diag(Candidates[I]->getLocation(),
11047 diag::note_module_odr_violation_possible_decl)
11051 DiagnosedOdrMergeFailures.insert(CanonDef);
11055 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11056 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11057 ObjCInterfaceOdrMergeFailures.empty() &&
11058 ObjCProtocolOdrMergeFailures.empty())
11061 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
11065 for (
auto &Merge : OdrMergeFailures) {
11068 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11071 bool Diagnosed =
false;
11072 CXXRecordDecl *FirstRecord = Merge.first;
11073 for (
auto &RecordPair : Merge.second) {
11074 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11075 RecordPair.second)) {
11088 Diag(Merge.first->getLocation(),
11089 diag::err_module_odr_violation_different_instantiations)
11096 for (
auto &Merge : RecordOdrMergeFailures) {
11099 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11102 RecordDecl *FirstRecord = Merge.first;
11103 bool Diagnosed =
false;
11104 for (
auto *SecondRecord : Merge.second) {
11105 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11111 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11115 for (
auto &Merge : FunctionOdrMergeFailures) {
11116 FunctionDecl *FirstFunction = Merge.first;
11117 bool Diagnosed =
false;
11118 for (
auto &SecondFunction : Merge.second) {
11119 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11125 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11129 for (
auto &Merge : EnumOdrMergeFailures) {
11132 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11135 EnumDecl *FirstEnum = Merge.first;
11136 bool Diagnosed =
false;
11137 for (
auto &SecondEnum : Merge.second) {
11138 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11144 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11147 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11150 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11153 bool Diagnosed =
false;
11154 ObjCInterfaceDecl *FirstID = Merge.first;
11155 for (
auto &InterfacePair : Merge.second) {
11156 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11157 InterfacePair.second)) {
11163 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11166 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11169 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11172 ObjCProtocolDecl *FirstProtocol = Merge.first;
11173 bool Diagnosed =
false;
11174 for (
auto &ProtocolPair : Merge.second) {
11175 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11176 ProtocolPair.second)) {
11182 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11187 if (llvm::Timer *T = ReadTimer.get();
11188 ++NumCurrentElementsDeserializing == 1 && T)
11189 ReadTimeRegion.emplace(T);
11193 assert(NumCurrentElementsDeserializing &&
11194 "FinishedDeserializing not paired with StartedDeserializing");
11195 if (NumCurrentElementsDeserializing == 1) {
11198 finishPendingActions();
11200 --NumCurrentElementsDeserializing;
11202 if (NumCurrentElementsDeserializing == 0) {
11206 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11214 while (!PendingExceptionSpecUpdates.empty() ||
11215 !PendingDeducedTypeUpdates.empty() ||
11216 !PendingUndeducedFunctionDecls.empty()) {
11217 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11218 PendingExceptionSpecUpdates.clear();
11219 for (
auto Update : ESUpdates) {
11220 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11223 if (
auto *Listener =
getContext().getASTMutationListener())
11225 for (
auto *Redecl :
Update.second->redecls())
11229 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11230 PendingDeducedTypeUpdates.clear();
11231 for (
auto Update : DTUpdates) {
11232 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11239 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11240 PendingUndeducedFunctionDecls.clear();
11244 (void)UndeducedFD->getMostRecentDecl();
11247 ReadTimeRegion.reset();
11249 diagnoseOdrViolations();
11255 PassInterestingDeclsToConsumer();
11262 auto It = PendingFakeLookupResults.find(II);
11263 if (It != PendingFakeLookupResults.end()) {
11264 for (
auto *ND : It->second)
11269 It->second.clear();
11273 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11274 SemaObj->TUScope->AddDecl(D);
11275 }
else if (SemaObj->TUScope) {
11279 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11280 SemaObj->TUScope->AddDecl(D);
11288 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11289 StringRef isysroot,
11291 bool AllowASTWithCompilerErrors,
11292 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11293 bool ForceValidateUserInputs,
11294 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11295 std::unique_ptr<llvm::Timer> ReadTimer)
11300 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11301 StackHandler(Diags), PP(PP), ContextObj(Context),
11302 CodeGenOpts(CodeGenOpts),
11304 PP.getHeaderSearchInfo()),
11305 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11306 DisableValidationKind(DisableValidationKind),
11307 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11308 AllowConfigurationMismatch(AllowConfigurationMismatch),
11309 ValidateSystemInputs(ValidateSystemInputs),
11310 ForceValidateUserInputs(ForceValidateUserInputs),
11311 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11312 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11313 SourceMgr.setExternalSLocEntrySource(
this);
11315 PathBuf.reserve(256);
11317 for (
const auto &Ext : Extensions) {
11318 auto BlockName = Ext->getExtensionMetadata().BlockName;
11319 auto Known = ModuleFileExtensions.find(BlockName);
11320 if (Known != ModuleFileExtensions.end()) {
11321 Diags.Report(diag::warn_duplicate_module_file_extension)
11326 ModuleFileExtensions.insert({BlockName, Ext});
11331 if (OwnsDeserializationListener)
11332 delete DeserializationListener;
11336 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11340 unsigned AbbrevID) {
11343 return Cursor.readRecord(AbbrevID, Record);
11359 : Record(Record), Context(Record.getContext()) {}
11360#define GEN_CLANG_CLAUSE_CLASS
11361#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11362#include "llvm/Frontend/OpenMP/OMP.inc"
11376 switch (llvm::omp::Clause(Record.readInt())) {
11377 case llvm::omp::OMPC_if:
11380 case llvm::omp::OMPC_final:
11383 case llvm::omp::OMPC_num_threads:
11386 case llvm::omp::OMPC_safelen:
11389 case llvm::omp::OMPC_simdlen:
11392 case llvm::omp::OMPC_sizes: {
11393 unsigned NumSizes = Record.readInt();
11397 case llvm::omp::OMPC_permutation: {
11398 unsigned NumLoops = Record.readInt();
11402 case llvm::omp::OMPC_full:
11405 case llvm::omp::OMPC_partial:
11408 case llvm::omp::OMPC_looprange:
11411 case llvm::omp::OMPC_allocator:
11414 case llvm::omp::OMPC_collapse:
11417 case llvm::omp::OMPC_default:
11420 case llvm::omp::OMPC_proc_bind:
11421 C =
new (Context) OMPProcBindClause();
11423 case llvm::omp::OMPC_schedule:
11424 C =
new (Context) OMPScheduleClause();
11426 case llvm::omp::OMPC_ordered:
11427 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11429 case llvm::omp::OMPC_nowait:
11430 C =
new (Context) OMPNowaitClause();
11432 case llvm::omp::OMPC_untied:
11433 C =
new (Context) OMPUntiedClause();
11435 case llvm::omp::OMPC_mergeable:
11436 C =
new (Context) OMPMergeableClause();
11438 case llvm::omp::OMPC_threadset:
11441 case llvm::omp::OMPC_transparent:
11442 C =
new (Context) OMPTransparentClause();
11444 case llvm::omp::OMPC_read:
11445 C =
new (Context) OMPReadClause();
11447 case llvm::omp::OMPC_write:
11448 C =
new (Context) OMPWriteClause();
11450 case llvm::omp::OMPC_update:
11451 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11453 case llvm::omp::OMPC_capture:
11454 C =
new (Context) OMPCaptureClause();
11456 case llvm::omp::OMPC_compare:
11457 C =
new (Context) OMPCompareClause();
11459 case llvm::omp::OMPC_fail:
11460 C =
new (Context) OMPFailClause();
11462 case llvm::omp::OMPC_seq_cst:
11463 C =
new (Context) OMPSeqCstClause();
11465 case llvm::omp::OMPC_acq_rel:
11466 C =
new (Context) OMPAcqRelClause();
11468 case llvm::omp::OMPC_absent: {
11469 unsigned NumKinds = Record.readInt();
11470 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11473 case llvm::omp::OMPC_holds:
11474 C =
new (Context) OMPHoldsClause();
11476 case llvm::omp::OMPC_contains: {
11477 unsigned NumKinds = Record.readInt();
11478 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11481 case llvm::omp::OMPC_no_openmp:
11482 C =
new (Context) OMPNoOpenMPClause();
11484 case llvm::omp::OMPC_no_openmp_routines:
11485 C =
new (Context) OMPNoOpenMPRoutinesClause();
11487 case llvm::omp::OMPC_no_openmp_constructs:
11488 C =
new (Context) OMPNoOpenMPConstructsClause();
11490 case llvm::omp::OMPC_no_parallelism:
11491 C =
new (Context) OMPNoParallelismClause();
11493 case llvm::omp::OMPC_acquire:
11494 C =
new (Context) OMPAcquireClause();
11496 case llvm::omp::OMPC_release:
11497 C =
new (Context) OMPReleaseClause();
11499 case llvm::omp::OMPC_relaxed:
11500 C =
new (Context) OMPRelaxedClause();
11502 case llvm::omp::OMPC_weak:
11503 C =
new (Context) OMPWeakClause();
11505 case llvm::omp::OMPC_threads:
11508 case llvm::omp::OMPC_simd:
11511 case llvm::omp::OMPC_nogroup:
11514 case llvm::omp::OMPC_unified_address:
11515 C =
new (Context) OMPUnifiedAddressClause();
11517 case llvm::omp::OMPC_unified_shared_memory:
11518 C =
new (Context) OMPUnifiedSharedMemoryClause();
11520 case llvm::omp::OMPC_reverse_offload:
11521 C =
new (Context) OMPReverseOffloadClause();
11523 case llvm::omp::OMPC_dynamic_allocators:
11524 C =
new (Context) OMPDynamicAllocatorsClause();
11526 case llvm::omp::OMPC_atomic_default_mem_order:
11527 C =
new (Context) OMPAtomicDefaultMemOrderClause();
11529 case llvm::omp::OMPC_self_maps:
11530 C =
new (Context) OMPSelfMapsClause();
11532 case llvm::omp::OMPC_at:
11533 C =
new (Context) OMPAtClause();
11535 case llvm::omp::OMPC_severity:
11536 C =
new (Context) OMPSeverityClause();
11538 case llvm::omp::OMPC_message:
11539 C =
new (Context) OMPMessageClause();
11541 case llvm::omp::OMPC_private:
11542 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11544 case llvm::omp::OMPC_firstprivate:
11545 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11547 case llvm::omp::OMPC_lastprivate:
11548 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11550 case llvm::omp::OMPC_shared:
11551 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11553 case llvm::omp::OMPC_reduction: {
11554 unsigned N = Record.readInt();
11556 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11559 case llvm::omp::OMPC_task_reduction:
11560 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11562 case llvm::omp::OMPC_in_reduction:
11563 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11565 case llvm::omp::OMPC_linear:
11566 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11568 case llvm::omp::OMPC_aligned:
11571 case llvm::omp::OMPC_copyin:
11574 case llvm::omp::OMPC_copyprivate:
11577 case llvm::omp::OMPC_flush:
11580 case llvm::omp::OMPC_depobj:
11583 case llvm::omp::OMPC_depend: {
11584 unsigned NumVars = Record.readInt();
11585 unsigned NumLoops = Record.readInt();
11589 case llvm::omp::OMPC_device:
11592 case llvm::omp::OMPC_map: {
11594 Sizes.
NumVars = Record.readInt();
11601 case llvm::omp::OMPC_num_teams:
11604 case llvm::omp::OMPC_thread_limit:
11607 case llvm::omp::OMPC_priority:
11610 case llvm::omp::OMPC_grainsize:
11613 case llvm::omp::OMPC_num_tasks:
11616 case llvm::omp::OMPC_hint:
11619 case llvm::omp::OMPC_dist_schedule:
11622 case llvm::omp::OMPC_defaultmap:
11625 case llvm::omp::OMPC_to: {
11627 Sizes.
NumVars = Record.readInt();
11634 case llvm::omp::OMPC_from: {
11636 Sizes.
NumVars = Record.readInt();
11643 case llvm::omp::OMPC_use_device_ptr: {
11645 Sizes.
NumVars = Record.readInt();
11652 case llvm::omp::OMPC_use_device_addr: {
11654 Sizes.
NumVars = Record.readInt();
11661 case llvm::omp::OMPC_is_device_ptr: {
11663 Sizes.
NumVars = Record.readInt();
11670 case llvm::omp::OMPC_has_device_addr: {
11672 Sizes.
NumVars = Record.readInt();
11679 case llvm::omp::OMPC_allocate:
11682 case llvm::omp::OMPC_nontemporal:
11685 case llvm::omp::OMPC_inclusive:
11688 case llvm::omp::OMPC_exclusive:
11691 case llvm::omp::OMPC_order:
11694 case llvm::omp::OMPC_init:
11697 case llvm::omp::OMPC_use:
11700 case llvm::omp::OMPC_destroy:
11703 case llvm::omp::OMPC_novariants:
11706 case llvm::omp::OMPC_nocontext:
11709 case llvm::omp::OMPC_detach:
11712 case llvm::omp::OMPC_uses_allocators:
11715 case llvm::omp::OMPC_affinity:
11718 case llvm::omp::OMPC_filter:
11721 case llvm::omp::OMPC_bind:
11724 case llvm::omp::OMPC_align:
11727 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11730 case llvm::omp::OMPC_dyn_groupprivate:
11733 case llvm::omp::OMPC_doacross: {
11734 unsigned NumVars = Record.readInt();
11735 unsigned NumLoops = Record.readInt();
11739 case llvm::omp::OMPC_ompx_attribute:
11742 case llvm::omp::OMPC_ompx_bare:
11745#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11746 case llvm::omp::Enum: \
11748#include "llvm/Frontend/OpenMP/OMPKinds.def"
11752 assert(
C &&
"Unknown OMPClause type");
11755 C->setLocStart(Record.readSourceLocation());
11756 C->setLocEnd(Record.readSourceLocation());
11762 C->setPreInitStmt(Record.readSubStmt(),
11768 C->setPostUpdateExpr(Record.readSubExpr());
11771void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11774 C->setNameModifierLoc(
Record.readSourceLocation());
11775 C->setColonLoc(
Record.readSourceLocation());
11776 C->setCondition(
Record.readSubExpr());
11777 C->setLParenLoc(
Record.readSourceLocation());
11782 C->setCondition(
Record.readSubExpr());
11783 C->setLParenLoc(
Record.readSourceLocation());
11789 C->setNumThreads(Record.readSubExpr());
11790 C->setModifierLoc(Record.readSourceLocation());
11791 C->setLParenLoc(Record.readSourceLocation());
11795 C->setSafelen(Record.readSubExpr());
11796 C->setLParenLoc(Record.readSourceLocation());
11800 C->setSimdlen(Record.readSubExpr());
11801 C->setLParenLoc(Record.readSourceLocation());
11805 for (Expr *&E :
C->getSizesRefs())
11806 E = Record.readSubExpr();
11807 C->setLParenLoc(Record.readSourceLocation());
11811 for (Expr *&E :
C->getArgsRefs())
11812 E = Record.readSubExpr();
11813 C->setLParenLoc(Record.readSourceLocation());
11819 C->setFactor(Record.readSubExpr());
11820 C->setLParenLoc(Record.readSourceLocation());
11824 C->setFirst(Record.readSubExpr());
11825 C->setCount(Record.readSubExpr());
11826 C->setLParenLoc(Record.readSourceLocation());
11827 C->setFirstLoc(Record.readSourceLocation());
11828 C->setCountLoc(Record.readSourceLocation());
11832 C->setAllocator(Record.readExpr());
11833 C->setLParenLoc(Record.readSourceLocation());
11837 C->setNumForLoops(Record.readSubExpr());
11838 C->setLParenLoc(Record.readSourceLocation());
11842 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11843 C->setLParenLoc(Record.readSourceLocation());
11844 C->setDefaultKindKwLoc(Record.readSourceLocation());
11845 C->setDefaultVariableCategory(
11847 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11853 C->setLParenLoc(Record.readSourceLocation());
11854 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11855 C->setThreadsetKindLoc(ThreadsetKindLoc);
11858 C->setThreadsetKind(TKind);
11861void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *
C) {
11862 C->setLParenLoc(Record.readSourceLocation());
11863 C->setImpexTypeKind(Record.readSubExpr());
11866void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *
C) {
11867 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11868 C->setLParenLoc(Record.readSourceLocation());
11869 C->setProcBindKindKwLoc(Record.readSourceLocation());
11872void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *
C) {
11874 C->setScheduleKind(
11876 C->setFirstScheduleModifier(
11878 C->setSecondScheduleModifier(
11880 C->setChunkSize(Record.readSubExpr());
11881 C->setLParenLoc(Record.readSourceLocation());
11882 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11883 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11884 C->setScheduleKindLoc(Record.readSourceLocation());
11885 C->setCommaLoc(Record.readSourceLocation());
11888void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *
C) {
11889 C->setNumForLoops(Record.readSubExpr());
11890 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11891 C->setLoopNumIterations(I, Record.readSubExpr());
11892 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11893 C->setLoopCounter(I, Record.readSubExpr());
11894 C->setLParenLoc(Record.readSourceLocation());
11897void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *
C) {
11898 C->setEventHandler(Record.readSubExpr());
11899 C->setLParenLoc(Record.readSourceLocation());
11902void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *
C) {
11903 C->setCondition(Record.readSubExpr());
11904 C->setLParenLoc(Record.readSourceLocation());
11907void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
11909void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
11911void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
11913void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
11915void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *
C) {
11916 if (
C->isExtended()) {
11917 C->setLParenLoc(Record.readSourceLocation());
11918 C->setArgumentLoc(Record.readSourceLocation());
11923void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
11925void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
11929void OMPClauseReader::VisitOMPFailClause(OMPFailClause *
C) {
11930 C->setLParenLoc(Record.readSourceLocation());
11931 SourceLocation FailParameterLoc = Record.readSourceLocation();
11932 C->setFailParameterLoc(FailParameterLoc);
11934 C->setFailParameter(CKind);
11937void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *
C) {
11938 unsigned Count =
C->getDirectiveKinds().size();
11939 C->setLParenLoc(Record.readSourceLocation());
11940 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11941 DKVec.reserve(Count);
11942 for (
unsigned I = 0; I < Count; I++) {
11945 C->setDirectiveKinds(DKVec);
11948void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *
C) {
11949 C->setExpr(Record.readExpr());
11950 C->setLParenLoc(Record.readSourceLocation());
11953void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *
C) {
11954 unsigned Count =
C->getDirectiveKinds().size();
11955 C->setLParenLoc(Record.readSourceLocation());
11956 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11957 DKVec.reserve(Count);
11958 for (
unsigned I = 0; I < Count; I++) {
11961 C->setDirectiveKinds(DKVec);
11964void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
11966void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
11967 OMPNoOpenMPRoutinesClause *) {}
11969void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
11970 OMPNoOpenMPConstructsClause *) {}
11972void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
11974void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
11976void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
11978void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
11980void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
11982void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
11984void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
11986void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
11988void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
11990void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
11992void OMPClauseReader::VisitOMPInitClause(OMPInitClause *
C) {
11993 unsigned NumVars =
C->varlist_size();
11994 SmallVector<Expr *, 16> Vars;
11995 Vars.reserve(NumVars);
11996 for (
unsigned I = 0; I != NumVars; ++I)
11997 Vars.push_back(Record.readSubExpr());
11998 C->setVarRefs(Vars);
11999 C->setIsTarget(Record.readBool());
12000 C->setIsTargetSync(Record.readBool());
12001 C->setLParenLoc(Record.readSourceLocation());
12002 C->setVarLoc(Record.readSourceLocation());
12005void OMPClauseReader::VisitOMPUseClause(OMPUseClause *
C) {
12006 C->setInteropVar(Record.readSubExpr());
12007 C->setLParenLoc(Record.readSourceLocation());
12008 C->setVarLoc(Record.readSourceLocation());
12011void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *
C) {
12012 C->setInteropVar(Record.readSubExpr());
12013 C->setLParenLoc(Record.readSourceLocation());
12014 C->setVarLoc(Record.readSourceLocation());
12017void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
12019 C->setCondition(Record.readSubExpr());
12020 C->setLParenLoc(Record.readSourceLocation());
12023void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *
C) {
12025 C->setCondition(Record.readSubExpr());
12026 C->setLParenLoc(Record.readSourceLocation());
12029void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12031void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12032 OMPUnifiedSharedMemoryClause *) {}
12034void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12037OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12040void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12041 OMPAtomicDefaultMemOrderClause *
C) {
12042 C->setAtomicDefaultMemOrderKind(
12044 C->setLParenLoc(Record.readSourceLocation());
12045 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12048void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12050void OMPClauseReader::VisitOMPAtClause(OMPAtClause *
C) {
12052 C->setLParenLoc(Record.readSourceLocation());
12053 C->setAtKindKwLoc(Record.readSourceLocation());
12056void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *
C) {
12058 C->setLParenLoc(Record.readSourceLocation());
12059 C->setSeverityKindKwLoc(Record.readSourceLocation());
12062void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *
C) {
12064 C->setMessageString(Record.readSubExpr());
12065 C->setLParenLoc(Record.readSourceLocation());
12068void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *
C) {
12069 C->setLParenLoc(Record.readSourceLocation());
12070 unsigned NumVars =
C->varlist_size();
12071 SmallVector<Expr *, 16> Vars;
12072 Vars.reserve(NumVars);
12073 for (
unsigned i = 0; i != NumVars; ++i)
12074 Vars.push_back(Record.readSubExpr());
12075 C->setVarRefs(Vars);
12077 for (
unsigned i = 0; i != NumVars; ++i)
12078 Vars.push_back(Record.readSubExpr());
12079 C->setPrivateCopies(Vars);
12082void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
12084 C->setLParenLoc(Record.readSourceLocation());
12085 unsigned NumVars =
C->varlist_size();
12086 SmallVector<Expr *, 16> Vars;
12087 Vars.reserve(NumVars);
12088 for (
unsigned i = 0; i != NumVars; ++i)
12089 Vars.push_back(Record.readSubExpr());
12090 C->setVarRefs(Vars);
12092 for (
unsigned i = 0; i != NumVars; ++i)
12093 Vars.push_back(Record.readSubExpr());
12094 C->setPrivateCopies(Vars);
12096 for (
unsigned i = 0; i != NumVars; ++i)
12097 Vars.push_back(Record.readSubExpr());
12101void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
12103 C->setLParenLoc(Record.readSourceLocation());
12105 C->setKindLoc(Record.readSourceLocation());
12106 C->setColonLoc(Record.readSourceLocation());
12107 unsigned NumVars =
C->varlist_size();
12108 SmallVector<Expr *, 16> Vars;
12109 Vars.reserve(NumVars);
12110 for (
unsigned i = 0; i != NumVars; ++i)
12111 Vars.push_back(Record.readSubExpr());
12112 C->setVarRefs(Vars);
12114 for (
unsigned i = 0; i != NumVars; ++i)
12115 Vars.push_back(Record.readSubExpr());
12116 C->setPrivateCopies(Vars);
12118 for (
unsigned i = 0; i != NumVars; ++i)
12119 Vars.push_back(Record.readSubExpr());
12120 C->setSourceExprs(Vars);
12122 for (
unsigned i = 0; i != NumVars; ++i)
12123 Vars.push_back(Record.readSubExpr());
12124 C->setDestinationExprs(Vars);
12126 for (
unsigned i = 0; i != NumVars; ++i)
12127 Vars.push_back(Record.readSubExpr());
12128 C->setAssignmentOps(Vars);
12131void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *
C) {
12132 C->setLParenLoc(Record.readSourceLocation());
12133 unsigned NumVars =
C->varlist_size();
12134 SmallVector<Expr *, 16> Vars;
12135 Vars.reserve(NumVars);
12136 for (
unsigned i = 0; i != NumVars; ++i)
12137 Vars.push_back(Record.readSubExpr());
12138 C->setVarRefs(Vars);
12141void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *
C) {
12143 C->setLParenLoc(Record.readSourceLocation());
12144 C->setModifierLoc(Record.readSourceLocation());
12145 C->setColonLoc(Record.readSourceLocation());
12146 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12147 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12148 C->setQualifierLoc(NNSL);
12149 C->setNameInfo(DNI);
12151 unsigned NumVars =
C->varlist_size();
12152 SmallVector<Expr *, 16> Vars;
12153 Vars.reserve(NumVars);
12154 for (
unsigned i = 0; i != NumVars; ++i)
12155 Vars.push_back(Record.readSubExpr());
12156 C->setVarRefs(Vars);
12158 for (
unsigned i = 0; i != NumVars; ++i)
12159 Vars.push_back(Record.readSubExpr());
12160 C->setPrivates(Vars);
12162 for (
unsigned i = 0; i != NumVars; ++i)
12163 Vars.push_back(Record.readSubExpr());
12164 C->setLHSExprs(Vars);
12166 for (
unsigned i = 0; i != NumVars; ++i)
12167 Vars.push_back(Record.readSubExpr());
12168 C->setRHSExprs(Vars);
12170 for (
unsigned i = 0; i != NumVars; ++i)
12171 Vars.push_back(Record.readSubExpr());
12172 C->setReductionOps(Vars);
12173 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12175 for (
unsigned i = 0; i != NumVars; ++i)
12176 Vars.push_back(Record.readSubExpr());
12177 C->setInscanCopyOps(Vars);
12179 for (
unsigned i = 0; i != NumVars; ++i)
12180 Vars.push_back(Record.readSubExpr());
12181 C->setInscanCopyArrayTemps(Vars);
12183 for (
unsigned i = 0; i != NumVars; ++i)
12184 Vars.push_back(Record.readSubExpr());
12185 C->setInscanCopyArrayElems(Vars);
12187 unsigned NumFlags = Record.readInt();
12188 SmallVector<bool, 16> Flags;
12189 Flags.reserve(NumFlags);
12190 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12191 Flags.push_back(Record.readInt());
12192 C->setPrivateVariableReductionFlags(Flags);
12195void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
12197 C->setLParenLoc(Record.readSourceLocation());
12198 C->setColonLoc(Record.readSourceLocation());
12199 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12200 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12201 C->setQualifierLoc(NNSL);
12202 C->setNameInfo(DNI);
12204 unsigned NumVars =
C->varlist_size();
12205 SmallVector<Expr *, 16> Vars;
12206 Vars.reserve(NumVars);
12207 for (
unsigned I = 0; I != NumVars; ++I)
12208 Vars.push_back(Record.readSubExpr());
12209 C->setVarRefs(Vars);
12211 for (
unsigned I = 0; I != NumVars; ++I)
12212 Vars.push_back(Record.readSubExpr());
12213 C->setPrivates(Vars);
12215 for (
unsigned I = 0; I != NumVars; ++I)
12216 Vars.push_back(Record.readSubExpr());
12217 C->setLHSExprs(Vars);
12219 for (
unsigned I = 0; I != NumVars; ++I)
12220 Vars.push_back(Record.readSubExpr());
12221 C->setRHSExprs(Vars);
12223 for (
unsigned I = 0; I != NumVars; ++I)
12224 Vars.push_back(Record.readSubExpr());
12225 C->setReductionOps(Vars);
12228void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *
C) {
12230 C->setLParenLoc(Record.readSourceLocation());
12231 C->setColonLoc(Record.readSourceLocation());
12232 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12233 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12234 C->setQualifierLoc(NNSL);
12235 C->setNameInfo(DNI);
12237 unsigned NumVars =
C->varlist_size();
12238 SmallVector<Expr *, 16> Vars;
12239 Vars.reserve(NumVars);
12240 for (
unsigned I = 0; I != NumVars; ++I)
12241 Vars.push_back(Record.readSubExpr());
12242 C->setVarRefs(Vars);
12244 for (
unsigned I = 0; I != NumVars; ++I)
12245 Vars.push_back(Record.readSubExpr());
12246 C->setPrivates(Vars);
12248 for (
unsigned I = 0; I != NumVars; ++I)
12249 Vars.push_back(Record.readSubExpr());
12250 C->setLHSExprs(Vars);
12252 for (
unsigned I = 0; I != NumVars; ++I)
12253 Vars.push_back(Record.readSubExpr());
12254 C->setRHSExprs(Vars);
12256 for (
unsigned I = 0; I != NumVars; ++I)
12257 Vars.push_back(Record.readSubExpr());
12258 C->setReductionOps(Vars);
12260 for (
unsigned I = 0; I != NumVars; ++I)
12261 Vars.push_back(Record.readSubExpr());
12262 C->setTaskgroupDescriptors(Vars);
12265void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *
C) {
12267 C->setLParenLoc(Record.readSourceLocation());
12268 C->setColonLoc(Record.readSourceLocation());
12270 C->setModifierLoc(Record.readSourceLocation());
12271 unsigned NumVars =
C->varlist_size();
12272 SmallVector<Expr *, 16> Vars;
12273 Vars.reserve(NumVars);
12274 for (
unsigned i = 0; i != NumVars; ++i)
12275 Vars.push_back(Record.readSubExpr());
12276 C->setVarRefs(Vars);
12278 for (
unsigned i = 0; i != NumVars; ++i)
12279 Vars.push_back(Record.readSubExpr());
12280 C->setPrivates(Vars);
12282 for (
unsigned i = 0; i != NumVars; ++i)
12283 Vars.push_back(Record.readSubExpr());
12286 for (
unsigned i = 0; i != NumVars; ++i)
12287 Vars.push_back(Record.readSubExpr());
12288 C->setUpdates(Vars);
12290 for (
unsigned i = 0; i != NumVars; ++i)
12291 Vars.push_back(Record.readSubExpr());
12292 C->setFinals(Vars);
12293 C->setStep(Record.readSubExpr());
12294 C->setCalcStep(Record.readSubExpr());
12296 for (
unsigned I = 0; I != NumVars + 1; ++I)
12297 Vars.push_back(Record.readSubExpr());
12298 C->setUsedExprs(Vars);
12301void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *
C) {
12302 C->setLParenLoc(Record.readSourceLocation());
12303 C->setColonLoc(Record.readSourceLocation());
12304 unsigned NumVars =
C->varlist_size();
12305 SmallVector<Expr *, 16> Vars;
12306 Vars.reserve(NumVars);
12307 for (
unsigned i = 0; i != NumVars; ++i)
12308 Vars.push_back(Record.readSubExpr());
12309 C->setVarRefs(Vars);
12310 C->setAlignment(Record.readSubExpr());
12313void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *
C) {
12314 C->setLParenLoc(Record.readSourceLocation());
12315 unsigned NumVars =
C->varlist_size();
12316 SmallVector<Expr *, 16> Exprs;
12317 Exprs.reserve(NumVars);
12318 for (
unsigned i = 0; i != NumVars; ++i)
12319 Exprs.push_back(Record.readSubExpr());
12320 C->setVarRefs(Exprs);
12322 for (
unsigned i = 0; i != NumVars; ++i)
12323 Exprs.push_back(Record.readSubExpr());
12324 C->setSourceExprs(Exprs);
12326 for (
unsigned i = 0; i != NumVars; ++i)
12327 Exprs.push_back(Record.readSubExpr());
12328 C->setDestinationExprs(Exprs);
12330 for (
unsigned i = 0; i != NumVars; ++i)
12331 Exprs.push_back(Record.readSubExpr());
12332 C->setAssignmentOps(Exprs);
12335void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
12336 C->setLParenLoc(Record.readSourceLocation());
12337 unsigned NumVars =
C->varlist_size();
12338 SmallVector<Expr *, 16> Exprs;
12339 Exprs.reserve(NumVars);
12340 for (
unsigned i = 0; i != NumVars; ++i)
12341 Exprs.push_back(Record.readSubExpr());
12342 C->setVarRefs(Exprs);
12344 for (
unsigned i = 0; i != NumVars; ++i)
12345 Exprs.push_back(Record.readSubExpr());
12346 C->setSourceExprs(Exprs);
12348 for (
unsigned i = 0; i != NumVars; ++i)
12349 Exprs.push_back(Record.readSubExpr());
12350 C->setDestinationExprs(Exprs);
12352 for (
unsigned i = 0; i != NumVars; ++i)
12353 Exprs.push_back(Record.readSubExpr());
12354 C->setAssignmentOps(Exprs);
12357void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *
C) {
12358 C->setLParenLoc(Record.readSourceLocation());
12359 unsigned NumVars =
C->varlist_size();
12360 SmallVector<Expr *, 16> Vars;
12361 Vars.reserve(NumVars);
12362 for (
unsigned i = 0; i != NumVars; ++i)
12363 Vars.push_back(Record.readSubExpr());
12364 C->setVarRefs(Vars);
12367void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *
C) {
12368 C->setDepobj(Record.readSubExpr());
12369 C->setLParenLoc(Record.readSourceLocation());
12372void OMPClauseReader::VisitOMPDependClause(OMPDependClause *
C) {
12373 C->setLParenLoc(Record.readSourceLocation());
12374 C->setModifier(Record.readSubExpr());
12375 C->setDependencyKind(
12377 C->setDependencyLoc(Record.readSourceLocation());
12378 C->setColonLoc(Record.readSourceLocation());
12379 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12380 unsigned NumVars =
C->varlist_size();
12381 SmallVector<Expr *, 16> Vars;
12382 Vars.reserve(NumVars);
12383 for (
unsigned I = 0; I != NumVars; ++I)
12384 Vars.push_back(Record.readSubExpr());
12385 C->setVarRefs(Vars);
12386 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12387 C->setLoopData(I, Record.readSubExpr());
12390void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *
C) {
12393 C->setDevice(Record.readSubExpr());
12394 C->setModifierLoc(Record.readSourceLocation());
12395 C->setLParenLoc(Record.readSourceLocation());
12398void OMPClauseReader::VisitOMPMapClause(OMPMapClause *
C) {
12399 C->setLParenLoc(Record.readSourceLocation());
12400 bool HasIteratorModifier =
false;
12402 C->setMapTypeModifier(
12404 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12405 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12406 HasIteratorModifier =
true;
12408 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12409 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12412 C->setMapLoc(Record.readSourceLocation());
12413 C->setColonLoc(Record.readSourceLocation());
12414 auto NumVars =
C->varlist_size();
12415 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12416 auto TotalLists =
C->getTotalComponentListNum();
12417 auto TotalComponents =
C->getTotalComponentsNum();
12419 SmallVector<Expr *, 16> Vars;
12420 Vars.reserve(NumVars);
12421 for (
unsigned i = 0; i != NumVars; ++i)
12422 Vars.push_back(Record.readExpr());
12423 C->setVarRefs(Vars);
12425 SmallVector<Expr *, 16> UDMappers;
12426 UDMappers.reserve(NumVars);
12427 for (
unsigned I = 0; I < NumVars; ++I)
12428 UDMappers.push_back(Record.readExpr());
12429 C->setUDMapperRefs(UDMappers);
12431 if (HasIteratorModifier)
12432 C->setIteratorModifier(Record.readExpr());
12434 SmallVector<ValueDecl *, 16> Decls;
12435 Decls.reserve(UniqueDecls);
12436 for (
unsigned i = 0; i < UniqueDecls; ++i)
12437 Decls.push_back(Record.readDeclAs<ValueDecl>());
12438 C->setUniqueDecls(Decls);
12440 SmallVector<unsigned, 16> ListsPerDecl;
12441 ListsPerDecl.reserve(UniqueDecls);
12442 for (
unsigned i = 0; i < UniqueDecls; ++i)
12443 ListsPerDecl.push_back(Record.readInt());
12444 C->setDeclNumLists(ListsPerDecl);
12446 SmallVector<unsigned, 32> ListSizes;
12447 ListSizes.reserve(TotalLists);
12448 for (
unsigned i = 0; i < TotalLists; ++i)
12449 ListSizes.push_back(Record.readInt());
12450 C->setComponentListSizes(ListSizes);
12452 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12453 Components.reserve(TotalComponents);
12454 for (
unsigned i = 0; i < TotalComponents; ++i) {
12455 Expr *AssociatedExprPr = Record.readExpr();
12456 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12457 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12460 C->setComponents(Components, ListSizes);
12466 C->setLParenLoc(Record.readSourceLocation());
12467 C->setColonLoc(Record.readSourceLocation());
12468 C->setAllocator(Record.readSubExpr());
12469 C->setAlignment(Record.readSubExpr());
12470 unsigned NumVars =
C->varlist_size();
12471 SmallVector<Expr *, 16> Vars;
12472 Vars.reserve(NumVars);
12473 for (
unsigned i = 0; i != NumVars; ++i)
12474 Vars.push_back(Record.readSubExpr());
12475 C->setVarRefs(Vars);
12478void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
12480 C->setLParenLoc(Record.readSourceLocation());
12481 unsigned NumVars =
C->varlist_size();
12482 SmallVector<Expr *, 16> Vars;
12483 Vars.reserve(NumVars);
12484 for (
unsigned I = 0; I != NumVars; ++I)
12485 Vars.push_back(Record.readSubExpr());
12486 C->setVarRefs(Vars);
12489void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
12491 C->setLParenLoc(Record.readSourceLocation());
12492 unsigned NumVars =
C->varlist_size();
12493 SmallVector<Expr *, 16> Vars;
12494 Vars.reserve(NumVars);
12495 for (
unsigned I = 0; I != NumVars; ++I)
12496 Vars.push_back(Record.readSubExpr());
12497 C->setVarRefs(Vars);
12500void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *
C) {
12502 C->setPriority(Record.readSubExpr());
12503 C->setLParenLoc(Record.readSourceLocation());
12506void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
12509 C->setGrainsize(Record.readSubExpr());
12510 C->setModifierLoc(Record.readSourceLocation());
12511 C->setLParenLoc(Record.readSourceLocation());
12514void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
12517 C->setNumTasks(Record.readSubExpr());
12518 C->setModifierLoc(Record.readSourceLocation());
12519 C->setLParenLoc(Record.readSourceLocation());
12522void OMPClauseReader::VisitOMPHintClause(OMPHintClause *
C) {
12523 C->setHint(Record.readSubExpr());
12524 C->setLParenLoc(Record.readSourceLocation());
12527void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
12529 C->setDistScheduleKind(
12531 C->setChunkSize(Record.readSubExpr());
12532 C->setLParenLoc(Record.readSourceLocation());
12533 C->setDistScheduleKindLoc(Record.readSourceLocation());
12534 C->setCommaLoc(Record.readSourceLocation());
12537void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
12538 C->setDefaultmapKind(
12540 C->setDefaultmapModifier(
12542 C->setLParenLoc(Record.readSourceLocation());
12543 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12544 C->setDefaultmapKindLoc(Record.readSourceLocation());
12547void OMPClauseReader::VisitOMPToClause(OMPToClause *
C) {
12548 C->setLParenLoc(Record.readSourceLocation());
12550 C->setMotionModifier(
12552 C->setMotionModifierLoc(I, Record.readSourceLocation());
12553 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12554 C->setIteratorModifier(Record.readExpr());
12556 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12557 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12558 C->setColonLoc(Record.readSourceLocation());
12559 auto NumVars =
C->varlist_size();
12560 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12561 auto TotalLists =
C->getTotalComponentListNum();
12562 auto TotalComponents =
C->getTotalComponentsNum();
12564 SmallVector<Expr *, 16> Vars;
12565 Vars.reserve(NumVars);
12566 for (
unsigned i = 0; i != NumVars; ++i)
12567 Vars.push_back(Record.readSubExpr());
12568 C->setVarRefs(Vars);
12570 SmallVector<Expr *, 16> UDMappers;
12571 UDMappers.reserve(NumVars);
12572 for (
unsigned I = 0; I < NumVars; ++I)
12573 UDMappers.push_back(Record.readSubExpr());
12574 C->setUDMapperRefs(UDMappers);
12576 SmallVector<ValueDecl *, 16> Decls;
12577 Decls.reserve(UniqueDecls);
12578 for (
unsigned i = 0; i < UniqueDecls; ++i)
12579 Decls.push_back(Record.readDeclAs<ValueDecl>());
12580 C->setUniqueDecls(Decls);
12582 SmallVector<unsigned, 16> ListsPerDecl;
12583 ListsPerDecl.reserve(UniqueDecls);
12584 for (
unsigned i = 0; i < UniqueDecls; ++i)
12585 ListsPerDecl.push_back(Record.readInt());
12586 C->setDeclNumLists(ListsPerDecl);
12588 SmallVector<unsigned, 32> ListSizes;
12589 ListSizes.reserve(TotalLists);
12590 for (
unsigned i = 0; i < TotalLists; ++i)
12591 ListSizes.push_back(Record.readInt());
12592 C->setComponentListSizes(ListSizes);
12594 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12595 Components.reserve(TotalComponents);
12596 for (
unsigned i = 0; i < TotalComponents; ++i) {
12597 Expr *AssociatedExprPr = Record.readSubExpr();
12598 bool IsNonContiguous = Record.readBool();
12599 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12600 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12602 C->setComponents(Components, ListSizes);
12605void OMPClauseReader::VisitOMPFromClause(OMPFromClause *
C) {
12606 C->setLParenLoc(Record.readSourceLocation());
12608 C->setMotionModifier(
12610 C->setMotionModifierLoc(I, Record.readSourceLocation());
12611 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12612 C->setIteratorModifier(Record.readExpr());
12614 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12615 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12616 C->setColonLoc(Record.readSourceLocation());
12617 auto NumVars =
C->varlist_size();
12618 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12619 auto TotalLists =
C->getTotalComponentListNum();
12620 auto TotalComponents =
C->getTotalComponentsNum();
12622 SmallVector<Expr *, 16> Vars;
12623 Vars.reserve(NumVars);
12624 for (
unsigned i = 0; i != NumVars; ++i)
12625 Vars.push_back(Record.readSubExpr());
12626 C->setVarRefs(Vars);
12628 SmallVector<Expr *, 16> UDMappers;
12629 UDMappers.reserve(NumVars);
12630 for (
unsigned I = 0; I < NumVars; ++I)
12631 UDMappers.push_back(Record.readSubExpr());
12632 C->setUDMapperRefs(UDMappers);
12634 SmallVector<ValueDecl *, 16> Decls;
12635 Decls.reserve(UniqueDecls);
12636 for (
unsigned i = 0; i < UniqueDecls; ++i)
12637 Decls.push_back(Record.readDeclAs<ValueDecl>());
12638 C->setUniqueDecls(Decls);
12640 SmallVector<unsigned, 16> ListsPerDecl;
12641 ListsPerDecl.reserve(UniqueDecls);
12642 for (
unsigned i = 0; i < UniqueDecls; ++i)
12643 ListsPerDecl.push_back(Record.readInt());
12644 C->setDeclNumLists(ListsPerDecl);
12646 SmallVector<unsigned, 32> ListSizes;
12647 ListSizes.reserve(TotalLists);
12648 for (
unsigned i = 0; i < TotalLists; ++i)
12649 ListSizes.push_back(Record.readInt());
12650 C->setComponentListSizes(ListSizes);
12652 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12653 Components.reserve(TotalComponents);
12654 for (
unsigned i = 0; i < TotalComponents; ++i) {
12655 Expr *AssociatedExprPr = Record.readSubExpr();
12656 bool IsNonContiguous = Record.readBool();
12657 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12658 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12660 C->setComponents(Components, ListSizes);
12663void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
12664 C->setLParenLoc(Record.readSourceLocation());
12666 C->setFallbackModifierLoc(Record.readSourceLocation());
12667 auto NumVars =
C->varlist_size();
12668 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12669 auto TotalLists =
C->getTotalComponentListNum();
12670 auto TotalComponents =
C->getTotalComponentsNum();
12672 SmallVector<Expr *, 16> Vars;
12673 Vars.reserve(NumVars);
12674 for (
unsigned i = 0; i != NumVars; ++i)
12675 Vars.push_back(Record.readSubExpr());
12676 C->setVarRefs(Vars);
12678 for (
unsigned i = 0; i != NumVars; ++i)
12679 Vars.push_back(Record.readSubExpr());
12680 C->setPrivateCopies(Vars);
12682 for (
unsigned i = 0; i != NumVars; ++i)
12683 Vars.push_back(Record.readSubExpr());
12686 SmallVector<ValueDecl *, 16> Decls;
12687 Decls.reserve(UniqueDecls);
12688 for (
unsigned i = 0; i < UniqueDecls; ++i)
12689 Decls.push_back(Record.readDeclAs<ValueDecl>());
12690 C->setUniqueDecls(Decls);
12692 SmallVector<unsigned, 16> ListsPerDecl;
12693 ListsPerDecl.reserve(UniqueDecls);
12694 for (
unsigned i = 0; i < UniqueDecls; ++i)
12695 ListsPerDecl.push_back(Record.readInt());
12696 C->setDeclNumLists(ListsPerDecl);
12698 SmallVector<unsigned, 32> ListSizes;
12699 ListSizes.reserve(TotalLists);
12700 for (
unsigned i = 0; i < TotalLists; ++i)
12701 ListSizes.push_back(Record.readInt());
12702 C->setComponentListSizes(ListSizes);
12704 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12705 Components.reserve(TotalComponents);
12706 for (
unsigned i = 0; i < TotalComponents; ++i) {
12707 auto *AssociatedExprPr = Record.readSubExpr();
12708 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12709 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12712 C->setComponents(Components, ListSizes);
12715void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
12716 C->setLParenLoc(Record.readSourceLocation());
12717 auto NumVars =
C->varlist_size();
12718 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12719 auto TotalLists =
C->getTotalComponentListNum();
12720 auto TotalComponents =
C->getTotalComponentsNum();
12722 SmallVector<Expr *, 16> Vars;
12723 Vars.reserve(NumVars);
12724 for (
unsigned i = 0; i != NumVars; ++i)
12725 Vars.push_back(Record.readSubExpr());
12726 C->setVarRefs(Vars);
12728 SmallVector<ValueDecl *, 16> Decls;
12729 Decls.reserve(UniqueDecls);
12730 for (
unsigned i = 0; i < UniqueDecls; ++i)
12731 Decls.push_back(Record.readDeclAs<ValueDecl>());
12732 C->setUniqueDecls(Decls);
12734 SmallVector<unsigned, 16> ListsPerDecl;
12735 ListsPerDecl.reserve(UniqueDecls);
12736 for (
unsigned i = 0; i < UniqueDecls; ++i)
12737 ListsPerDecl.push_back(Record.readInt());
12738 C->setDeclNumLists(ListsPerDecl);
12740 SmallVector<unsigned, 32> ListSizes;
12741 ListSizes.reserve(TotalLists);
12742 for (
unsigned i = 0; i < TotalLists; ++i)
12743 ListSizes.push_back(Record.readInt());
12744 C->setComponentListSizes(ListSizes);
12746 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12747 Components.reserve(TotalComponents);
12748 for (
unsigned i = 0; i < TotalComponents; ++i) {
12749 Expr *AssociatedExpr = Record.readSubExpr();
12750 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12751 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12754 C->setComponents(Components, ListSizes);
12757void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
12758 C->setLParenLoc(Record.readSourceLocation());
12759 auto NumVars =
C->varlist_size();
12760 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12761 auto TotalLists =
C->getTotalComponentListNum();
12762 auto TotalComponents =
C->getTotalComponentsNum();
12764 SmallVector<Expr *, 16> Vars;
12765 Vars.reserve(NumVars);
12766 for (
unsigned i = 0; i != NumVars; ++i)
12767 Vars.push_back(Record.readSubExpr());
12768 C->setVarRefs(Vars);
12771 SmallVector<ValueDecl *, 16> Decls;
12772 Decls.reserve(UniqueDecls);
12773 for (
unsigned i = 0; i < UniqueDecls; ++i)
12774 Decls.push_back(Record.readDeclAs<ValueDecl>());
12775 C->setUniqueDecls(Decls);
12777 SmallVector<unsigned, 16> ListsPerDecl;
12778 ListsPerDecl.reserve(UniqueDecls);
12779 for (
unsigned i = 0; i < UniqueDecls; ++i)
12780 ListsPerDecl.push_back(Record.readInt());
12781 C->setDeclNumLists(ListsPerDecl);
12783 SmallVector<unsigned, 32> ListSizes;
12784 ListSizes.reserve(TotalLists);
12785 for (
unsigned i = 0; i < TotalLists; ++i)
12786 ListSizes.push_back(Record.readInt());
12787 C->setComponentListSizes(ListSizes);
12789 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12790 Components.reserve(TotalComponents);
12791 for (
unsigned i = 0; i < TotalComponents; ++i) {
12792 Expr *AssociatedExpr = Record.readSubExpr();
12793 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12794 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12797 C->setComponents(Components, ListSizes);
12800void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
12801 C->setLParenLoc(Record.readSourceLocation());
12802 auto NumVars =
C->varlist_size();
12803 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12804 auto TotalLists =
C->getTotalComponentListNum();
12805 auto TotalComponents =
C->getTotalComponentsNum();
12807 SmallVector<Expr *, 16> Vars;
12808 Vars.reserve(NumVars);
12809 for (
unsigned I = 0; I != NumVars; ++I)
12810 Vars.push_back(Record.readSubExpr());
12811 C->setVarRefs(Vars);
12814 SmallVector<ValueDecl *, 16> Decls;
12815 Decls.reserve(UniqueDecls);
12816 for (
unsigned I = 0; I < UniqueDecls; ++I)
12817 Decls.push_back(Record.readDeclAs<ValueDecl>());
12818 C->setUniqueDecls(Decls);
12820 SmallVector<unsigned, 16> ListsPerDecl;
12821 ListsPerDecl.reserve(UniqueDecls);
12822 for (
unsigned I = 0; I < UniqueDecls; ++I)
12823 ListsPerDecl.push_back(Record.readInt());
12824 C->setDeclNumLists(ListsPerDecl);
12826 SmallVector<unsigned, 32> ListSizes;
12827 ListSizes.reserve(TotalLists);
12828 for (
unsigned i = 0; i < TotalLists; ++i)
12829 ListSizes.push_back(Record.readInt());
12830 C->setComponentListSizes(ListSizes);
12832 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12833 Components.reserve(TotalComponents);
12834 for (
unsigned I = 0; I < TotalComponents; ++I) {
12835 Expr *AssociatedExpr = Record.readSubExpr();
12836 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12837 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12840 C->setComponents(Components, ListSizes);
12843void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
12844 C->setLParenLoc(Record.readSourceLocation());
12845 unsigned NumVars =
C->varlist_size();
12846 SmallVector<Expr *, 16> Vars;
12847 Vars.reserve(NumVars);
12848 for (
unsigned i = 0; i != NumVars; ++i)
12849 Vars.push_back(Record.readSubExpr());
12850 C->setVarRefs(Vars);
12852 Vars.reserve(NumVars);
12853 for (
unsigned i = 0; i != NumVars; ++i)
12854 Vars.push_back(Record.readSubExpr());
12855 C->setPrivateRefs(Vars);
12858void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
12859 C->setLParenLoc(Record.readSourceLocation());
12860 unsigned NumVars =
C->varlist_size();
12861 SmallVector<Expr *, 16> Vars;
12862 Vars.reserve(NumVars);
12863 for (
unsigned i = 0; i != NumVars; ++i)
12864 Vars.push_back(Record.readSubExpr());
12865 C->setVarRefs(Vars);
12868void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
12869 C->setLParenLoc(Record.readSourceLocation());
12870 unsigned NumVars =
C->varlist_size();
12871 SmallVector<Expr *, 16> Vars;
12872 Vars.reserve(NumVars);
12873 for (
unsigned i = 0; i != NumVars; ++i)
12874 Vars.push_back(Record.readSubExpr());
12875 C->setVarRefs(Vars);
12878void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
12879 C->setLParenLoc(Record.readSourceLocation());
12880 unsigned NumOfAllocators =
C->getNumberOfAllocators();
12881 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
12882 Data.reserve(NumOfAllocators);
12883 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
12884 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
12887 D.
LParenLoc = Record.readSourceLocation();
12888 D.
RParenLoc = Record.readSourceLocation();
12890 C->setAllocatorsData(
Data);
12893void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *
C) {
12894 C->setLParenLoc(Record.readSourceLocation());
12895 C->setModifier(Record.readSubExpr());
12896 C->setColonLoc(Record.readSourceLocation());
12897 unsigned NumOfLocators =
C->varlist_size();
12898 SmallVector<Expr *, 4> Locators;
12899 Locators.reserve(NumOfLocators);
12900 for (
unsigned I = 0; I != NumOfLocators; ++I)
12901 Locators.push_back(Record.readSubExpr());
12902 C->setVarRefs(Locators);
12905void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *
C) {
12908 C->setLParenLoc(Record.readSourceLocation());
12909 C->setKindKwLoc(Record.readSourceLocation());
12910 C->setModifierKwLoc(Record.readSourceLocation());
12913void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *
C) {
12915 C->setThreadID(Record.readSubExpr());
12916 C->setLParenLoc(Record.readSourceLocation());
12919void OMPClauseReader::VisitOMPBindClause(OMPBindClause *
C) {
12921 C->setLParenLoc(Record.readSourceLocation());
12922 C->setBindKindLoc(Record.readSourceLocation());
12926 C->setAlignment(Record.readExpr());
12927 C->setLParenLoc(Record.readSourceLocation());
12930void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
12932 C->setSize(Record.readSubExpr());
12933 C->setLParenLoc(Record.readSourceLocation());
12936void OMPClauseReader::VisitOMPDynGroupprivateClause(
12937 OMPDynGroupprivateClause *
C) {
12939 C->setDynGroupprivateModifier(
12941 C->setDynGroupprivateFallbackModifier(
12943 C->setSize(Record.readSubExpr());
12944 C->setLParenLoc(Record.readSourceLocation());
12945 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
12946 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
12949void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
12950 C->setLParenLoc(Record.readSourceLocation());
12951 C->setDependenceType(
12953 C->setDependenceLoc(Record.readSourceLocation());
12954 C->setColonLoc(Record.readSourceLocation());
12955 unsigned NumVars =
C->varlist_size();
12956 SmallVector<Expr *, 16> Vars;
12957 Vars.reserve(NumVars);
12958 for (
unsigned I = 0; I != NumVars; ++I)
12959 Vars.push_back(Record.readSubExpr());
12960 C->setVarRefs(Vars);
12961 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12962 C->setLoopData(I, Record.readSubExpr());
12965void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
12967 Record.readAttributes(Attrs);
12968 C->setAttrs(Attrs);
12969 C->setLocStart(Record.readSourceLocation());
12970 C->setLParenLoc(Record.readSourceLocation());
12971 C->setLocEnd(Record.readSourceLocation());
12974void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *
C) {}
12984 Selector.ScoreOrCondition =
nullptr;
12986 Selector.ScoreOrCondition = readExprRef();
12998 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13003 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
13005 Data->setClauses(Clauses);
13006 if (
Data->hasAssociatedStmt())
13008 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
13013 unsigned NumVars =
readInt();
13015 for (
unsigned I = 0; I < NumVars; ++I)
13021 unsigned NumExprs =
readInt();
13023 for (
unsigned I = 0; I < NumExprs; ++I)
13033 switch (ClauseKind) {
13048 bool isConditionExprClause =
readBool();
13049 if (isConditionExprClause) {
13054 unsigned NumVars =
readInt();
13056 for (
unsigned I = 0; I < NumVars; ++I)
13063 unsigned NumClauses =
readInt();
13065 for (
unsigned I = 0; I < NumClauses; ++I)
13099 for (
unsigned I = 0; I < VarList.size(); ++I) {
13102 RecipeList.push_back({Alloca});
13106 VarList, RecipeList, EndLoc);
13124 for (
unsigned I = 0; I < VarList.size(); ++I) {
13128 RecipeList.push_back({Recipe, RecipeTemp});
13132 VarList, RecipeList, EndLoc);
13183 LParenLoc, ModList, VarList, EndLoc);
13192 LParenLoc, ModList, VarList, EndLoc);
13201 LParenLoc, ModList, VarList, EndLoc);
13210 LParenLoc, ModList, VarList, EndLoc);
13216 AsyncExpr, EndLoc);
13224 DevNumExpr, QueuesLoc, QueueIdExprs,
13231 unsigned NumArchs =
readInt();
13233 for (
unsigned I = 0; I < NumArchs; ++I) {
13236 Archs.emplace_back(Loc, Ident);
13240 LParenLoc, Archs, EndLoc);
13248 for (
unsigned I = 0; I < VarList.size(); ++I) {
13252 3 *
sizeof(
int *));
13255 unsigned NumCombiners =
readInt();
13256 for (
unsigned I = 0; I < NumCombiners; ++I) {
13261 Combiners.push_back({LHS, RHS, Op});
13264 RecipeList.push_back({Recipe, Combiners});
13268 VarList, RecipeList, EndLoc);
13287 HasForce, LoopCount, EndLoc);
13291 unsigned NumClauses =
readInt();
13293 for (
unsigned I = 0; I < NumClauses; ++I)
13296 SizeExprs, EndLoc);
13300 unsigned NumExprs =
readInt();
13303 for (
unsigned I = 0; I < NumExprs; ++I) {
13309 GangKinds, Exprs, EndLoc);
13315 WorkerExpr, EndLoc);
13321 VectorExpr, EndLoc);
13333 LParenLoc, VarList, EndLoc);
13347 llvm_unreachable(
"Clause serialization not yet implemented");
13349 llvm_unreachable(
"Invalid Clause Kind");
13354 for (
unsigned I = 0; I < Clauses.size(); ++I)
13359 unsigned NumVars =
readInt();
13360 A->Clauses.resize(NumVars);
13367 llvm::FoldingSetNodeID ID;
13368 ID.AddString(PrimaryModuleName);
13369 return ID.computeStableHash();
13374 return std::nullopt;
13377 return std::nullopt;
13380 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 bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags)
static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID)
static void collectMacroDefinitions(const PreprocessorOptions &PPOpts, MacroDefinitionsMap &Macros, SmallVectorImpl< StringRef > *MacroNames=nullptr)
Collect the macro definitions provided by the given preprocessor options.
static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II, bool IsModule)
static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method)
Move the given method to the back of the global list of methods.
static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps)
static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)
Whether the given identifier is "interesting".
static bool parseModuleFileExtensionMetadata(const SmallVectorImpl< uint64_t > &Record, StringRef Blob, ModuleFileExtensionMetadata &Metadata)
Parse a record and blob containing module file extension metadata.
static Module * getTopImportImplicitModule(ModuleManager &ModuleMgr, Preprocessor &PP)
Return the top import module if it is implicit, nullptr otherwise.
static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename, bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr, std::string &SuggestedPredefines, const LangOptions &LangOpts, OptionValidation Validation=OptionValidateContradictions)
Check the preprocessor options deserialized from the control block against the preprocessor options i...
static void addMethodsToPool(Sema &S, ArrayRef< ObjCMethodDecl * > Methods, ObjCMethodList &List)
Add the given set of methods to the method list.
static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool IsSystem, bool SystemHeaderWarningsInModule, bool Complain)
static bool isPredefinedType(serialization::TypeID ID)
static bool readBit(unsigned &Bits)
static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool Complain)
static std::optional< Type::TypeClass > getTypeClassForCode(TypeCode code)
static std::pair< unsigned, unsigned > readULEBKeyDataLength(const unsigned char *&P)
Read ULEB-encoded key length and data length.
static unsigned getStableHashForModuleName(StringRef PrimaryModuleName)
static LLVM_DUMP_METHOD void dumpModuleIDMap(StringRef Name, const ContinuousRangeMap< Key, ModuleFile *, InitialCapacity > &Map)
@ OptionValidateStrictMatches
@ OptionValidateContradictions
static bool checkTargetOptions(const TargetOptions &TargetOpts, const TargetOptions &ExistingTargetOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of target options against an existing set of target options.
static bool checkLanguageOptions(const LangOptions &LangOpts, const LangOptions &ExistingLangOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of language options against an existing set of language options.
static std::pair< StringRef, StringRef > getUnresolvedInputFilenames(const ASTReader::RecordData &Record, const StringRef InputBlob)
#define CHECK_TARGET_OPT(Field, Name)
static ASTFileSignature readASTFileSignature(StringRef PCH)
Reads and return the signature record from PCH's control block, or else returns 0.
static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID)
Given a cursor at the start of an AST file, scan ahead and drop the cursor into the start of the give...
static unsigned getIndexForTypeID(serialization::TypeID ID)
static uint64_t readULEB(const unsigned char *&P)
static bool checkModuleCachePath(FileManager &FileMgr, StringRef ContextHash, StringRef ExistingSpecificModuleCachePath, StringRef ASTFilename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, const HeaderSearchOptions &ASTFileHSOpts)
Check that the specified and the existing module cache paths are equivalent.
Defines the clang::ASTSourceDescriptor class, which abstracts clang modules and precompiled header fi...
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines the Diagnostic-related interfaces.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the Diagnostic IDs-related interfaces.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::FileManager interface and associated types.
Defines the clang::FileSystemOptions interface.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
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 void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind)
This is called for each AST file loaded.
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 ~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 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.
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...
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
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.
void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind) override
This is called for each AST file loaded.
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.
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,...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Get a FileEntryRef if it exists, without doing anything on error.
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...
OptionalDirectoryEntryRef getOptionalDirectoryRef(StringRef DirName, bool CacheFailure=true)
Get a DirectoryEntryRef 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) const
Get a pointer to the pCM if it exists; else nullptr.
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
Represents a field injected from an anonymous union/struct into the parent scope.
Wrapper for source info for injected class names of class templates.
void setAmpLoc(SourceLocation Loc)
PragmaMSPointersToMembersKind
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
An UnresolvedSet-like class that might not have been loaded from the external AST source yet.
unsigned getLineTableFilenameID(StringRef Str)
void AddEntry(FileID FID, const std::vector< LineEntry > &Entries)
Add a new line entry that has already been encoded into the internal representation of the line table...
static LocalDeclID get(ASTReader &Reader, serialization::ModuleFile &MF, DeclID ID)
Record the location of a macro definition.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
void setPrevious(MacroDirective *Prev)
Set previous definition of the macro with the same name.
Records the location of a macro expansion.
Encapsulates the data about a macro definition (e.g.
void setUsedForHeaderGuard(bool Val)
void setHasCommaPasting()
void setDefinitionEndLoc(SourceLocation EndLoc)
Set the location of the last token in the macro.
void setParameterList(ArrayRef< IdentifierInfo * > List, llvm::BumpPtrAllocator &PPAllocator)
Set the specified list of identifiers as the parameter list for this macro.
llvm::MutableArrayRef< Token > allocateTokens(unsigned NumTokens, llvm::BumpPtrAllocator &PPAllocator)
void setIsFunctionLike()
Function/Object-likeness.
void setIsC99Varargs()
Varargs querying methods. This can only be set for function-like macros.
void setIsUsed(bool Val)
Set the value of the IsUsed flag.
void setExpansionLoc(SourceLocation Loc)
void setAttrRowOperand(Expr *e)
void setAttrColumnOperand(Expr *e)
void setAttrOperandParensRange(SourceRange range)
void setAttrNameLoc(SourceLocation loc)
void setStarLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
The module cache used for compiling modules implicitly.
virtual InMemoryModuleCache & getInMemoryModuleCache()=0
Returns this process's view of the module cache.
Deduplication key for a loaded module file in ModuleManager.
Identifies a module file to be loaded.
bool empty() const
Checks whether the module file name is empty.
static ModuleFileName makeImplicit(std::string Name, unsigned SuffixLength)
Creates a file name for an implicit module.
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
StringRef str() const
Returns the plain module file name.
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory)
Sets the umbrella directory of the given module to the given directory.
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
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 setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory)
Sets the umbrella header of the given module to the given header.
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.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false)
Adds this header to the given module.
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.
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.
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.
llvm::PointerIntPair< Module *, 1, bool > ExportDecl
Describes an exported module.
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.
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 '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)
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.
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.
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 unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
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.
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.
std::string ModuleMapPath
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.
AddModuleResult
The result of attempting to add a new module.
@ 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.
@ AlreadyLoaded
The module file had already been loaded.
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.
@ 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_METADATA
Metadata for submodules as a whole.
@ 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_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ 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.
@ 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.
@ 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.
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.
Module * Other
The module that this module conflicts with.
std::string Message
The message provided to the user when there is a conflict.
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 the categories of an Objective-C class.
void insert(GlobalDeclID ID)
MultiOnDiskHashTable< LazySpecializationInfoLookupTrait > Table
void insert(LazySpecializationInfo Info)