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 SpecificModuleCachePath,
bool Complain) {
212 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
213 SpecificModuleCachePath, Complain) ||
214 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
215 SpecificModuleCachePath, Complain);
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 llvm::vfs::FileSystem &VFS, StringRef SpecificModuleCachePath,
965 StringRef ExistingSpecificModuleCachePath, StringRef ASTFilename,
970 SpecificModuleCachePath == ExistingSpecificModuleCachePath)
973 VFS.equivalent(SpecificModuleCachePath, ExistingSpecificModuleCachePath);
974 if (EqualOrErr && *EqualOrErr)
982 if (EqualOrErr && *EqualOrErr)
983 Diags->
Report(clang::diag::warn_ast_file_config_mismatch) << ASTFilename;
985 Diags->
Report(diag::err_ast_file_modulecache_mismatch)
986 << SpecificModuleCachePath << ExistingSpecificModuleCachePath
993 StringRef ASTFilename,
994 StringRef SpecificModuleCachePath,
996 const HeaderSearch &HeaderSearchInfo = PP.getHeaderSearchInfo();
998 Reader.getFileManager().getVirtualFileSystem(), SpecificModuleCachePath,
1000 Complain ? &Reader.Diags :
nullptr, PP.getLangOpts(),
1005 PP.setCounterValue(
Value);
1013 unsigned Length = 0;
1014 const char *
Error =
nullptr;
1016 uint64_t Val = llvm::decodeULEB128(P, &Length,
nullptr, &
Error);
1018 llvm::report_fatal_error(
Error);
1024static std::pair<unsigned, unsigned>
1027 if ((
unsigned)KeyLen != KeyLen)
1028 llvm::report_fatal_error(
"key too large");
1031 if ((
unsigned)DataLen != DataLen)
1032 llvm::report_fatal_error(
"data too large");
1034 return std::make_pair(KeyLen, DataLen);
1038 bool TakeOwnership) {
1039 DeserializationListener = Listener;
1040 OwnsDeserializationListener = TakeOwnership;
1051 Reader.ReadModuleOffsetMap(MF);
1053 unsigned ModuleFileIndex =
ID.getModuleFileIndex();
1054 unsigned LocalDeclID =
ID.getLocalDeclIndex();
1060 assert(OwningModuleFile);
1064 if (!ModuleFileIndex)
1067 assert(LocalDeclID < LocalNumDecls);
1075 unsigned ModuleFileIndex,
unsigned LocalDeclID) {
1080std::pair<unsigned, unsigned>
1087 using namespace llvm::support;
1090 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1092 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1099 Args.push_back(FirstII);
1100 for (
unsigned I = 1; I != N; ++I)
1101 Args.push_back(Reader.getLocalIdentifier(
1102 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1110 using namespace llvm::support;
1114 Result.ID = Reader.getGlobalSelectorID(
1115 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1116 unsigned FullInstanceBits =
1117 endian::readNext<uint16_t, llvm::endianness::little>(d);
1118 unsigned FullFactoryBits =
1119 endian::readNext<uint16_t, llvm::endianness::little>(d);
1120 Result.InstanceBits = FullInstanceBits & 0x3;
1121 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1122 Result.FactoryBits = FullFactoryBits & 0x3;
1123 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1124 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1125 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1128 for (
unsigned I = 0; I != NumInstanceMethods; ++I) {
1132 endian::readNext<DeclID, llvm::endianness::little>(d))))
1137 for (
unsigned I = 0; I != NumFactoryMethods; ++I) {
1141 endian::readNext<DeclID, llvm::endianness::little>(d))))
1149 return llvm::djbHash(a);
1152std::pair<unsigned, unsigned>
1159 assert(n >= 2 && d[n-1] ==
'\0');
1160 return StringRef((
const char*) d, n-1);
1166 bool IsInteresting =
1177 bool Value = Bits & 0x1;
1183 using namespace llvm::support;
1186 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1187 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1200 const unsigned char* d,
1202 using namespace llvm::support;
1205 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1206 bool IsInteresting = RawID & 0x01;
1216 II = &Reader.getIdentifierTable().getOwn(k);
1219 bool IsModule = Reader.getPreprocessor().getCurrentModule() !=
nullptr;
1221 Reader.markIdentifierUpToDate(II);
1223 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1224 if (!IsInteresting) {
1227 Reader.SetIdentifierInfo(ID, II);
1231 unsigned ObjCOrBuiltinID =
1232 endian::readNext<uint16_t, llvm::endianness::little>(d);
1233 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1234 bool CPlusPlusOperatorKeyword =
readBit(Bits);
1235 bool HasRevertedTokenIDToIdentifier =
readBit(Bits);
1236 bool Poisoned =
readBit(Bits);
1237 bool ExtensionToken =
readBit(Bits);
1238 bool HasMacroDefinition =
readBit(Bits);
1240 assert(Bits == 0 &&
"Extra bits in the identifier?");
1241 DataLen -=
sizeof(uint16_t) * 2;
1245 if (HasRevertedTokenIDToIdentifier && II->
getTokenID() != tok::identifier)
1250 "Incorrect extension token flag");
1251 (void)ExtensionToken;
1255 "Incorrect C++ operator keyword flag");
1256 (void)CPlusPlusOperatorKeyword;
1260 if (HasMacroDefinition) {
1261 uint32_t MacroDirectivesOffset =
1262 endian::readNext<uint32_t, llvm::endianness::little>(d);
1265 if (MacroDirectivesOffset)
1266 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1268 hasMacroDefinitionInDependencies =
true;
1271 Reader.SetIdentifierInfo(ID, II);
1277 for (; DataLen > 0; DataLen -=
sizeof(
DeclID))
1278 DeclIDs.push_back(Reader.getGlobalDeclID(
1281 endian::readNext<DeclID, llvm::endianness::little>(d))));
1282 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1289 : Kind(Name.getNameKind()) {
1319 llvm::FoldingSetNodeID ID;
1320 ID.AddInteger(Kind);
1343 return ID.computeStableHash();
1348 using namespace llvm::support;
1350 uint32_t ModuleFileID =
1351 endian::readNext<uint32_t, llvm::endianness::little>(d);
1352 return Reader.getLocalModuleFile(
F, ModuleFileID);
1355std::pair<unsigned, unsigned>
1362 using namespace llvm::support;
1371 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1378 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1402 using namespace llvm::support;
1404 for (
unsigned NumDecls = DataLen /
sizeof(
DeclID); NumDecls; --NumDecls) {
1406 Reader,
F, endian::readNext<DeclID, llvm::endianness::little>(d));
1412 const unsigned char *d,
1420 llvm::FoldingSetNodeID ID;
1421 ID.AddInteger(Key.first.getHash());
1422 ID.AddInteger(Key.second);
1423 return ID.computeStableHash();
1434 return {Name, *ModuleHash};
1440 unsigned PrimaryModuleHash =
1441 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1442 return {Name, PrimaryModuleHash};
1446 const unsigned char *d,
1454 using namespace llvm::support;
1456 uint32_t ModuleFileID =
1457 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1458 return Reader.getLocalModuleFile(F, ModuleFileID);
1463 using namespace llvm::support;
1464 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1467std::pair<unsigned, unsigned>
1473 const unsigned char *d,
1476 using namespace llvm::support;
1478 for (
unsigned NumDecls =
1480 NumDecls; --NumDecls) {
1483 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1484 Val.
insert(Reader.getGlobalDeclID(F, LocalID));
1488bool ASTReader::ReadLexicalDeclContextStorage(
ModuleFile &M,
1489 BitstreamCursor &Cursor,
1492 assert(Offset != 0);
1495 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1496 Error(std::move(Err));
1504 Error(MaybeCode.takeError());
1507 unsigned Code = MaybeCode.get();
1510 if (!MaybeRecCode) {
1511 Error(MaybeRecCode.takeError());
1514 unsigned RecCode = MaybeRecCode.get();
1516 Error(
"Expected lexical block");
1521 "expected a TU_UPDATE_LEXICAL record for TU");
1526 auto &Lex = LexicalDecls[DC];
1528 Lex = std::make_pair(
1531 Blob.size() /
sizeof(
DeclID)));
1537bool ASTReader::ReadVisibleDeclContextStorage(
1538 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1539 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1540 assert(Offset != 0);
1542 SavedStreamPosition SavedPosition(Cursor);
1543 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1544 Error(std::move(Err));
1550 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1552 Error(MaybeCode.takeError());
1555 unsigned Code = MaybeCode.get();
1557 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1558 if (!MaybeRecCode) {
1559 Error(MaybeRecCode.takeError());
1562 unsigned RecCode = MaybeRecCode.get();
1563 switch (VisibleKind) {
1564 case VisibleDeclContextStorageKind::GenerallyVisible:
1566 Error(
"Expected visible lookup table block");
1570 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1572 Error(
"Expected module local visible lookup table block");
1576 case VisibleDeclContextStorageKind::TULocalVisible:
1578 Error(
"Expected TU local lookup table block");
1586 auto *
Data = (
const unsigned char*)Blob.data();
1587 switch (VisibleKind) {
1588 case VisibleDeclContextStorageKind::GenerallyVisible:
1589 PendingVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1591 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1592 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1594 case VisibleDeclContextStorageKind::TULocalVisible:
1596 TULocalUpdates[
ID].push_back(UpdateData{&M,
Data});
1602void ASTReader::AddSpecializations(
const Decl *D,
const unsigned char *
Data,
1606 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1607 SpecLookups[D].Table.add(&M,
Data,
1611bool ASTReader::ReadSpecializations(
ModuleFile &M, BitstreamCursor &Cursor,
1612 uint64_t Offset, Decl *D,
bool IsPartial) {
1613 assert(Offset != 0);
1615 SavedStreamPosition SavedPosition(Cursor);
1616 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1617 Error(std::move(Err));
1623 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1625 Error(MaybeCode.takeError());
1628 unsigned Code = MaybeCode.get();
1630 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1631 if (!MaybeRecCode) {
1632 Error(MaybeRecCode.takeError());
1635 unsigned RecCode = MaybeRecCode.get();
1638 Error(
"Expected decl specs block");
1642 auto *
Data = (
const unsigned char *)Blob.data();
1643 AddSpecializations(D,
Data, M, IsPartial);
1647void ASTReader::Error(StringRef Msg)
const {
1648 Error(diag::err_fe_ast_file_malformed, Msg);
1649 if (PP.getLangOpts().Modules &&
1650 !PP.getHeaderSearchInfo().getSpecificModuleCachePath().empty()) {
1651 Diag(diag::note_module_cache_path)
1652 << PP.getHeaderSearchInfo().getSpecificModuleCachePath();
1656void ASTReader::Error(
unsigned DiagID, StringRef Arg1, StringRef Arg2,
1657 StringRef Arg3)
const {
1658 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1662struct AlreadyReportedDiagnosticError
1663 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1666 void log(raw_ostream &OS)
const override {
1667 llvm_unreachable(
"reporting an already-reported diagnostic error");
1670 std::error_code convertToErrorCode()
const override {
1671 return llvm::inconvertibleErrorCode();
1675char AlreadyReportedDiagnosticError::ID = 0;
1678void ASTReader::Error(llvm::Error &&Err)
const {
1680 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1681 [&](llvm::ErrorInfoBase &E) {
return Error(E.message()); });
1691 LineTableInfo &LineTable = SourceMgr.getLineTable();
1694 std::map<int, int> FileIDs;
1696 for (
unsigned I = 0;
Record[Idx]; ++I) {
1698 auto Filename = ReadPath(F,
Record, Idx);
1704 std::vector<LineEntry> Entries;
1705 while (Idx <
Record.size()) {
1706 FileID FID = ReadFileID(F,
Record, Idx);
1709 unsigned NumEntries =
Record[Idx++];
1710 assert(NumEntries &&
"no line entries for file ID");
1712 Entries.reserve(NumEntries);
1713 for (
unsigned I = 0; I != NumEntries; ++I) {
1714 unsigned FileOffset =
Record[Idx++];
1715 unsigned LineNo =
Record[Idx++];
1716 int FilenameID = FileIDs[
Record[Idx++]];
1719 unsigned IncludeOffset =
Record[Idx++];
1721 FileKind, IncludeOffset));
1728llvm::Error ASTReader::ReadSourceManagerBlock(
ModuleFile &F) {
1729 using namespace SrcMgr;
1737 SLocEntryCursor = F.
Stream;
1740 if (llvm::Error Err = F.
Stream.SkipBlock())
1750 Expected<llvm::BitstreamEntry> MaybeE =
1751 SLocEntryCursor.advanceSkippingSubblocks();
1753 return MaybeE.takeError();
1754 llvm::BitstreamEntry E = MaybeE.get();
1757 case llvm::BitstreamEntry::SubBlock:
1758 case llvm::BitstreamEntry::Error:
1759 return llvm::createStringError(std::errc::illegal_byte_sequence,
1760 "malformed block record in AST file");
1761 case llvm::BitstreamEntry::EndBlock:
1762 return llvm::Error::success();
1763 case llvm::BitstreamEntry::Record:
1771 Expected<unsigned> MaybeRecord =
1772 SLocEntryCursor.readRecord(E.ID,
Record, &Blob);
1774 return MaybeRecord.takeError();
1775 switch (MaybeRecord.get()) {
1783 return llvm::Error::success();
1788llvm::Expected<SourceLocation::UIntTy>
1794 return std::move(Err);
1798 return MaybeEntry.takeError();
1800 llvm::BitstreamEntry Entry = MaybeEntry.get();
1801 if (Entry.Kind != llvm::BitstreamEntry::Record)
1802 return llvm::createStringError(
1803 std::errc::illegal_byte_sequence,
1804 "incorrectly-formatted source location entry in AST file");
1810 return MaybeSLOC.takeError();
1812 switch (MaybeSLOC.get()) {
1814 return llvm::createStringError(
1815 std::errc::illegal_byte_sequence,
1816 "incorrectly-formatted source location entry in AST file");
1826 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1827 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1828 "Corrupted global sloc offset map");
1833 auto It = llvm::upper_bound(
1836 int ID = F->SLocEntryBaseID + LocalIndex;
1837 std::size_t Index = -ID - 2;
1838 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1839 assert(!SourceMgr.SLocEntryLoaded[Index]);
1840 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1841 if (!MaybeEntryOffset) {
1842 Error(MaybeEntryOffset.takeError());
1846 SourceMgr.LoadedSLocEntryTable[Index] =
1847 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1848 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1850 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1866 Error(
"source location entry ID out-of-range for AST file");
1872 auto ReadBuffer = [
this](
1873 BitstreamCursor &SLocEntryCursor,
1874 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1879 Error(MaybeCode.takeError());
1882 unsigned Code = MaybeCode.get();
1885 SLocEntryCursor.readRecord(Code,
Record, &Blob);
1886 if (!MaybeRecCode) {
1887 Error(MaybeRecCode.takeError());
1890 unsigned RecCode = MaybeRecCode.get();
1895 const llvm::compression::Format F =
1896 Blob.size() > 0 && Blob.data()[0] == 0x78
1897 ? llvm::compression::Format::Zlib
1898 : llvm::compression::Format::Zstd;
1899 if (
const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1904 if (llvm::Error E = llvm::compression::decompress(
1905 F, llvm::arrayRefFromStringRef(Blob), Decompressed,
Record[0])) {
1906 Error(
"could not decompress embedded file contents: " +
1907 llvm::toString(std::move(E)));
1910 return llvm::MemoryBuffer::getMemBufferCopy(
1911 llvm::toStringRef(Decompressed), Name);
1913 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name,
true);
1915 Error(
"AST record has invalid code");
1920 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1924 Error(std::move(Err));
1931 ++NumSLocEntriesRead;
1934 Error(MaybeEntry.takeError());
1937 llvm::BitstreamEntry Entry = MaybeEntry.get();
1939 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1940 Error(
"incorrectly-formatted source location entry in AST file");
1947 SLocEntryCursor.readRecord(Entry.ID,
Record, &Blob);
1949 Error(MaybeSLOC.takeError());
1952 switch (MaybeSLOC.get()) {
1954 Error(
"incorrectly-formatted source location entry in AST file");
1960 unsigned InputID =
Record[4];
1961 InputFile IF = getInputFile(*F, InputID);
1974 IncludeLoc = getImportLocation(F);
1978 FileID FID = SourceMgr.createFileID(*
File, IncludeLoc, FileCharacter, ID,
1981 FileInfo.NumCreatedFIDs =
Record[5];
1985 unsigned NumFileDecls =
Record[7];
1986 if (NumFileDecls && ContextObj) {
1988 assert(F->
FileSortedDecls &&
"FILE_SORTED_DECLS not encountered yet ?");
1994 SourceMgr.getOrCreateContentCache(*
File, isSystem(FileCharacter));
1998 auto Buffer = ReadBuffer(SLocEntryCursor,
File->getName());
2001 SourceMgr.overrideFileContents(*
File, std::move(Buffer));
2008 const char *Name = Blob.data();
2009 unsigned Offset =
Record[0];
2014 IncludeLoc = getImportLocation(F);
2017 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2020 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2021 BaseOffset + Offset, IncludeLoc);
2023 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2024 FileInfo.setHasLineDirectives();
2033 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2048 Error(
"source location entry ID out-of-range for AST file");
2053 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2071 assert(SourceMgr.getMainFileID().isValid() &&
"missing main file");
2072 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2082 uint64_t *StartOfBlockOffset) {
2083 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2086 if (StartOfBlockOffset)
2087 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2090 uint64_t Offset = Cursor.GetCurrentBitNo();
2093 return MaybeCode.takeError();
2094 unsigned Code = MaybeCode.get();
2097 if (Code != llvm::bitc::DEFINE_ABBREV) {
2098 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2100 return llvm::Error::success();
2102 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2115 if (
Tok.isAnnotation()) {
2117 switch (
Tok.getKind()) {
2118 case tok::annot_pragma_loop_hint: {
2122 unsigned NumTokens =
Record[Idx++];
2124 Toks.reserve(NumTokens);
2125 for (
unsigned I = 0; I < NumTokens; ++I)
2127 Info->Toks =
llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2128 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2131 case tok::annot_pragma_pack: {
2136 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2138 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2142 case tok::annot_pragma_openmp:
2143 case tok::annot_pragma_openmp_end:
2144 case tok::annot_pragma_unused:
2145 case tok::annot_pragma_openacc:
2146 case tok::annot_pragma_openacc_end:
2147 case tok::annot_repl_input_end:
2150 llvm_unreachable(
"missing deserialization code for annotation token");
2155 Tok.setIdentifierInfo(II);
2167 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2169 consumeError(std::move(Err));
2181 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2183 Stream.advanceSkippingSubblocks(Flags);
2185 Error(MaybeEntry.takeError());
2188 llvm::BitstreamEntry Entry = MaybeEntry.get();
2190 switch (Entry.Kind) {
2191 case llvm::BitstreamEntry::SubBlock:
2192 case llvm::BitstreamEntry::Error:
2193 Error(
"malformed block record in AST file");
2195 case llvm::BitstreamEntry::EndBlock:
2197 case llvm::BitstreamEntry::Record:
2208 Error(MaybeRecType.takeError());
2224 unsigned NextIndex = 1;
2226 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2231 PP.getPreprocessorAllocator());
2234 bool isC99VarArgs =
Record[NextIndex++];
2235 bool isGNUVarArgs =
Record[NextIndex++];
2236 bool hasCommaPasting =
Record[NextIndex++];
2237 MacroParams.clear();
2238 unsigned NumArgs =
Record[NextIndex++];
2239 for (
unsigned i = 0; i != NumArgs; ++i)
2254 if (NextIndex + 1 ==
Record.size() && PP.getPreprocessingRecord() &&
2259 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2261 PreprocessingRecord::PPEntityID PPID =
2262 PPRec.getPPEntityID(Index,
true);
2264 PPRec.getPreprocessedEntity(PPID));
2266 PPRec.RegisterMacroDefinition(
Macro, PPDef);
2277 if (MacroTokens.empty()) {
2278 Error(
"unexpected number of macro tokens for a macro in AST file");
2284 MacroTokens = MacroTokens.drop_front();
2295 ReadModuleOffsetMap(M);
2297 unsigned ModuleFileIndex = LocalID >> 32;
2298 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2301 assert(MF &&
"malformed identifier ID encoding?");
2303 if (!ModuleFileIndex) {
2312HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
2315 return FileMgr.getOptionalFileRef(Key.Filename);
2319 return FileMgr.getOptionalFileRef(*Resolved);
2323 uint8_t buf[
sizeof(ikey.
Size) +
sizeof(ikey.
ModTime)];
2326 return llvm::xxh3_64bits(buf);
2347 return FEA && FEA == FEB;
2350std::pair<unsigned, unsigned>
2357 using namespace llvm::support;
2360 ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2362 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2371 using namespace llvm::support;
2373 const unsigned char *End = d + DataLen;
2375 unsigned Flags = *d++;
2378 bool Included = (Flags >> 6) & 0x01;
2380 if ((FE = getFile(key)))
2383 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2386 HFI.
isImport |= (Flags >> 5) & 0x01;
2388 HFI.
DirInfo = (Flags >> 1) & 0x07;
2390 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2392 assert((End - d) % 4 == 0 &&
2393 "Wrong data length in HeaderFileInfo deserialization");
2395 uint32_t LocalSMID =
2396 endian::readNext<uint32_t, llvm::endianness::little>(d);
2402 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2403 Module *Mod = Reader.getSubmodule(GlobalSMID);
2405 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2407 if (FE || (FE = getFile(key))) {
2410 ModMap.
addHeader(Mod, H, HeaderRole,
true);
2422 uint32_t MacroDirectivesOffset) {
2423 assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
2424 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2431 for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
2432 BitstreamCursor &MacroCursor = I.MacroCursor;
2435 if (MacroCursor.getBitcodeBytes().empty())
2438 BitstreamCursor Cursor = MacroCursor;
2439 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2440 Error(std::move(Err));
2448 Error(MaybeE.takeError());
2451 llvm::BitstreamEntry E = MaybeE.get();
2454 case llvm::BitstreamEntry::SubBlock:
2455 case llvm::BitstreamEntry::Error:
2456 Error(
"malformed block record in AST file");
2458 case llvm::BitstreamEntry::EndBlock:
2461 case llvm::BitstreamEntry::Record: {
2465 Error(MaybeRecord.takeError());
2468 switch (MaybeRecord.get()) {
2495 class IdentifierLookupVisitor {
2498 unsigned PriorGeneration;
2499 unsigned &NumIdentifierLookups;
2500 unsigned &NumIdentifierLookupHits;
2504 IdentifierLookupVisitor(StringRef Name,
unsigned PriorGeneration,
2505 unsigned &NumIdentifierLookups,
2506 unsigned &NumIdentifierLookupHits)
2508 PriorGeneration(PriorGeneration),
2509 NumIdentifierLookups(NumIdentifierLookups),
2510 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2524 ++NumIdentifierLookups;
2525 ASTIdentifierLookupTable::iterator Pos =
2526 IdTable->find_hashed(Name, NameHash, &Trait);
2527 if (Pos == IdTable->end())
2533 ++NumIdentifierLookupHits;
2535 if (Trait.hasMoreInformationInDependencies()) {
2544 IdentifierInfo *getIdentifierInfo()
const {
return Found; }
2553 unsigned PriorGeneration = 0;
2555 PriorGeneration = IdentifierGeneration[&II];
2562 if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
2567 IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
2568 NumIdentifierLookups,
2569 NumIdentifierLookupHits);
2570 ModuleMgr.visit(Visitor, HitsPtr);
2587 uint64_t ModuleFileIndex =
Record[Idx++] << 32;
2588 uint64_t LocalIndex =
Record[Idx++];
2593 const PendingMacroInfo &PMInfo) {
2598 if (llvm::Error Err =
2600 Error(std::move(Err));
2604 struct ModuleMacroRecord {
2617 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2619 Error(MaybeEntry.takeError());
2622 llvm::BitstreamEntry Entry = MaybeEntry.get();
2624 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2625 Error(
"malformed block record in AST file");
2632 Error(MaybePP.takeError());
2640 ModuleMacros.push_back(ModuleMacroRecord());
2641 auto &Info = ModuleMacros.back();
2645 for (
int I = Idx, N =
Record.size(); I != N; ++I)
2651 Error(
"malformed block record in AST file");
2662 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2664 for (
auto &MMR : ModuleMacros) {
2666 for (
unsigned ModID : MMR.Overrides) {
2668 auto *
Macro = PP.getModuleMacro(Mod, II);
2669 assert(
Macro &&
"missing definition for overridden macro");
2670 Overrides.push_back(
Macro);
2673 bool Inserted =
false;
2675 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2686 unsigned Idx = 0, N =
Record.size();
2694 MD = PP.AllocateDefMacroDirective(MI, Loc);
2698 MD = PP.AllocateUndefMacroDirective(Loc);
2701 bool isPublic =
Record[Idx++];
2702 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2714 PP.setLoadedMacroDirective(II, Earliest, Latest);
2717bool ASTReader::shouldDisableValidationForFile(
2740static std::pair<StringRef, StringRef>
2742 const StringRef InputBlob) {
2743 uint16_t AsRequestedLength =
Record[7];
2744 return {InputBlob.substr(0, AsRequestedLength),
2745 InputBlob.substr(AsRequestedLength)};
2759 SavedStreamPosition SavedPosition(Cursor);
2763 consumeError(std::move(Err));
2766 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
2769 consumeError(MaybeCode.takeError());
2771 unsigned Code = MaybeCode.get();
2775 if (Expected<unsigned> Maybe =
Cursor.readRecord(Code,
Record, &Blob))
2777 "invalid record type for input file");
2780 consumeError(
Maybe.takeError());
2783 assert(
Record[0] == ID &&
"Bogus stored ID or offset");
2791 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2795 ? UnresolvedFilenameAsRequested
2796 : UnresolvedFilename;
2798 Expected<llvm::BitstreamEntry> MaybeEntry =
Cursor.advance();
2800 consumeError(MaybeEntry.takeError());
2801 llvm::BitstreamEntry Entry = MaybeEntry.get();
2802 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2803 "expected record type for input file hash");
2806 if (Expected<unsigned> Maybe =
Cursor.readRecord(Entry.ID,
Record))
2808 "invalid record type for input file hash");
2811 consumeError(
Maybe.takeError());
2836 SavedStreamPosition SavedPosition(Cursor);
2840 consumeError(std::move(Err));
2855 const HeaderSearchOptions &HSOpts =
2856 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2869 if ((Overridden || Transient || SkipChecks) && !
File)
2874 std::string ErrorStr =
"could not find file '";
2875 ErrorStr += *Filename;
2876 ErrorStr +=
"' referenced by AST file '";
2890 SourceManager &
SM = getSourceManager();
2892 if ((!Overridden && !Transient) && !SkipChecks &&
2893 SM.isFileOverridden(*
File)) {
2895 Error(diag::err_fe_pch_file_overridden, *Filename);
2907 enum ModificationKind {
2913 std::optional<int64_t> Old = std::nullopt;
2914 std::optional<int64_t>
New = std::nullopt;
2916 auto HasInputContentChanged = [&](Change OriginalChange) {
2917 assert(ValidateASTInputFilesContent &&
2918 "We should only check the content of the inputs with "
2919 "ValidateASTInputFilesContent enabled.");
2921 if (StoredContentHash == 0)
2922 return OriginalChange;
2925 if (!MemBuffOrError) {
2927 return OriginalChange;
2928 std::string ErrorStr =
"could not get buffer for file '";
2929 ErrorStr +=
File->getName();
2932 return OriginalChange;
2935 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2936 if (StoredContentHash ==
static_cast<uint64_t>(ContentHash))
2937 return Change{Change::None};
2939 return Change{Change::Content};
2941 auto HasInputFileChanged = [&]() {
2942 if (StoredSize !=
File->getSize())
2943 return Change{Change::Size, StoredSize,
File->getSize()};
2944 if (!shouldDisableValidationForFile(F) && StoredTime &&
2945 StoredTime !=
File->getModificationTime()) {
2946 Change MTimeChange = {Change::ModTime, StoredTime,
2947 File->getModificationTime()};
2951 if (ValidateASTInputFilesContent)
2952 return HasInputContentChanged(MTimeChange);
2956 return Change{Change::None};
2959 bool IsOutOfDate =
false;
2960 auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
2966 FileChange = HasInputContentChanged(FileChange);
2972 if (!StoredTime && ValidateASTInputFilesContent &&
2973 FileChange.Kind == Change::None)
2974 FileChange = HasInputContentChanged(FileChange);
2977 if (!Overridden && FileChange.Kind != Change::None) {
2980 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2981 while (!ImportStack.back()->ImportedBy.empty())
2982 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2985 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
2986 Diag(diag::err_fe_ast_file_modified)
2988 << TopLevelASTFileName;
2989 Diag(diag::note_fe_ast_file_modified)
2990 << FileChange.Kind << (FileChange.Old && FileChange.New)
2991 << llvm::itostr(FileChange.Old.value_or(0))
2992 << llvm::itostr(FileChange.New.value_or(0));
2995 if (ImportStack.size() > 1) {
2996 Diag(diag::note_ast_file_required_by)
2997 << *Filename << ImportStack[0]->FileName;
2998 for (
unsigned I = 1; I < ImportStack.size(); ++I)
2999 Diag(diag::note_ast_file_required_by)
3000 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3004 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3005 Diag(diag::note_ast_file_input_files_validation_status)
3021ASTReader::TemporarilyOwnedStringRef
3027ASTReader::TemporarilyOwnedStringRef
3030 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
3032 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3033 Path ==
"<built-in>" || Path ==
"<command line>")
3037 llvm::sys::path::append(Buf, Prefix, Path);
3038 StringRef ResolvedPath{Buf.data(), Buf.size()};
3039 return {ResolvedPath, Buf};
3052 return ResolvedPath->str();
3067 llvm_unreachable(
"unknown ASTReadResult");
3071 BitstreamCursor &Stream, StringRef Filename,
3072 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3073 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3076 consumeError(std::move(Err));
3084 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3087 consumeError(MaybeEntry.takeError());
3090 llvm::BitstreamEntry Entry = MaybeEntry.get();
3092 switch (Entry.Kind) {
3093 case llvm::BitstreamEntry::Error:
3094 case llvm::BitstreamEntry::SubBlock:
3097 case llvm::BitstreamEntry::EndBlock:
3100 case llvm::BitstreamEntry::Record:
3107 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3108 if (!MaybeRecordType) {
3110 consumeError(MaybeRecordType.takeError());
3115 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3116 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3117 AllowCompatibleConfigurationMismatch))
3118 Result = ConfigurationMismatch;
3123 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3124 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3125 AllowCompatibleConfigurationMismatch))
3126 Result = ConfigurationMismatch;
3131 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3132 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3133 AllowCompatibleConfigurationMismatch))
3134 Result = ConfigurationMismatch;
3139 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3140 if (!AllowCompatibleConfigurationMismatch &&
3141 ParseFileSystemOptions(
Record, Complain, Listener))
3142 Result = ConfigurationMismatch;
3147 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3148 if (!AllowCompatibleConfigurationMismatch &&
3149 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3150 Result = ConfigurationMismatch;
3155 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3156 if (!AllowCompatibleConfigurationMismatch &&
3157 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3158 SuggestedPredefines))
3159 Result = ConfigurationMismatch;
3165ASTReader::RelocationResult
3166ASTReader::getModuleForRelocationChecks(
ModuleFile &F,
bool DirectoryCheck) {
3168 const bool IgnoreError =
3169 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3172 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3173 return {std::nullopt, IgnoreError};
3177 if (!DirectoryCheck &&
3178 (!IsImplicitModule || ModuleMgr.begin()->Kind ==
MK_MainFile))
3179 return {std::nullopt, IgnoreError};
3181 const HeaderSearchOptions &HSOpts =
3182 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3189 return {std::nullopt, IgnoreError};
3192 return {std::nullopt, IgnoreError};
3200 Module *M = PP.getHeaderSearchInfo().lookupModule(
3205 return {M, IgnoreError};
3210 SmallVectorImpl<ImportedModule> &Loaded,
3212 unsigned ClientLoadCapabilities) {
3213 BitstreamCursor &Stream = F.
Stream;
3216 Error(std::move(Err));
3226 bool HasReadUnhashedControlBlock =
false;
3227 auto readUnhashedControlBlockOnce = [&]() {
3228 if (!HasReadUnhashedControlBlock) {
3229 HasReadUnhashedControlBlock =
true;
3230 if (ASTReadResult
Result =
3231 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3237 bool DisableValidation = shouldDisableValidationForFile(F);
3241 unsigned NumInputs = 0;
3242 unsigned NumUserInputs = 0;
3243 StringRef BaseDirectoryAsWritten;
3245 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3247 Error(MaybeEntry.takeError());
3250 llvm::BitstreamEntry Entry = MaybeEntry.get();
3252 switch (Entry.Kind) {
3253 case llvm::BitstreamEntry::Error:
3254 Error(
"malformed block record in AST file");
3256 case llvm::BitstreamEntry::EndBlock: {
3259 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3263 const HeaderSearchOptions &HSOpts =
3264 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3271 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3277 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3284 N = ForceValidateUserInputs ? NumUserInputs : 0;
3286 ForceValidateUserInputs
3292 Diag(diag::remark_module_validation)
3295 for (
unsigned I = 0; I < N; ++I) {
3296 InputFile IF = getInputFile(F, I+1, Complain);
3310 for (
unsigned I = 0; I < N; ++I) {
3311 bool IsSystem = I >= NumUserInputs;
3313 auto FilenameAsRequested = ResolveImportedPath(
3316 *FilenameAsRequested, IsSystem, FI.
Overridden,
3324 case llvm::BitstreamEntry::SubBlock:
3328 if (llvm::Error Err = Stream.SkipBlock()) {
3329 Error(std::move(Err));
3333 Error(
"malformed block record in AST file");
3343 if (Listener && !ImportedBy) {
3349 bool AllowCompatibleConfigurationMismatch =
3353 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3354 AllowCompatibleConfigurationMismatch, *Listener,
3355 SuggestedPredefines);
3357 Error(
"malformed block record in AST file");
3361 if (DisableValidation ||
3362 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3370 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3371 Error(std::move(Err));
3377 if (llvm::Error Err = Stream.SkipBlock()) {
3378 Error(std::move(Err));
3384 case llvm::BitstreamEntry::Record:
3392 Expected<unsigned> MaybeRecordType =
3393 Stream.readRecord(Entry.ID,
Record, &Blob);
3394 if (!MaybeRecordType) {
3395 Error(MaybeRecordType.takeError());
3401 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3403 : diag::err_ast_file_version_too_new)
3408 bool hasErrors =
Record[7];
3409 if (hasErrors && !DisableValidation) {
3412 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3413 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3416 if (!AllowASTWithCompilerErrors) {
3417 Diag(diag::err_ast_file_with_compiler_errors)
3423 Diags.ErrorOccurred =
true;
3424 Diags.UncompilableErrorOccurred =
true;
3425 Diags.UnrecoverableErrorOccurred =
true;
3438 StringRef ASTBranch = Blob;
3439 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3440 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3441 Diag(diag::err_ast_file_different_branch)
3453 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3463 auto [ImportLoc, ImportModuleFileIndex] =
3464 ReadUntranslatedSourceLocation(
Record[Idx++]);
3466 assert(ImportModuleFileIndex == 0);
3468 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3470 bool IsImportingStdCXXModule =
Record[Idx++];
3472 off_t StoredSize = 0;
3473 time_t StoredModTime = 0;
3474 ASTFileSignature StoredSignature;
3475 std::string ImportedFile;
3476 std::string StoredFile;
3477 bool IgnoreImportedByNote =
false;
3486 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3487 ImportedName, !IsImportingStdCXXModule);
3489 if (IsImportingStdCXXModule && ImportedFile.empty()) {
3490 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3494 if (!IsImportingStdCXXModule) {
3495 StoredSize = (off_t)
Record[Idx++];
3496 StoredModTime = (time_t)
Record[Idx++];
3500 SignatureBytes.end());
3505 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3506 if (ImportedFile.empty()) {
3507 ImportedFile = StoredFile;
3508 }
else if (!getDiags().isIgnored(
3509 diag::warn_module_file_mapping_mismatch,
3510 CurrentImportLoc)) {
3511 auto ImportedFileRef =
3512 PP.getFileManager().getOptionalFileRef(ImportedFile);
3513 auto StoredFileRef =
3514 PP.getFileManager().getOptionalFileRef(StoredFile);
3515 if ((ImportedFileRef && StoredFileRef) &&
3516 (*ImportedFileRef != *StoredFileRef)) {
3517 Diag(diag::warn_module_file_mapping_mismatch)
3518 << ImportedFile << StoredFile;
3519 Diag(diag::note_module_file_imported_by)
3521 IgnoreImportedByNote =
true;
3528 unsigned Capabilities = ClientLoadCapabilities;
3529 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3530 Capabilities &= ~ARR_Missing;
3533 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3534 Loaded, StoredSize, StoredModTime,
3535 StoredSignature, Capabilities);
3540 if (IsImportingStdCXXModule) {
3541 if (
const auto *Imported =
3542 getModuleManager().lookupByFileName(ImportedFile);
3543 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3544 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3550 bool recompilingFinalized =
Result == OutOfDate &&
3551 (Capabilities & ARR_OutOfDate) &&
3554 .getInMemoryModuleCache()
3556 if (!IgnoreImportedByNote &&
3558 Diag(diag::note_module_file_imported_by)
3562 case Failure:
return Failure;
3565 case OutOfDate:
return OutOfDate;
3567 case ConfigurationMismatch:
return ConfigurationMismatch;
3568 case HadErrors:
return HadErrors;
3587 Diag(diag::remark_module_import)
3589 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3595 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3603 BaseDirectoryAsWritten = Blob;
3605 "MODULE_DIRECTORY found before MODULE_NAME");
3608 auto [MaybeM, IgnoreError] =
3609 getModuleForRelocationChecks(F,
true);
3610 if (!MaybeM.has_value())
3613 Module *M = MaybeM.value();
3625 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3626 if (BuildDir && (*BuildDir == M->
Directory)) {
3630 Diag(diag::remark_module_relocated)
3633 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3634 Diag(diag::err_imported_module_relocated)
3640 if (ASTReadResult
Result =
3641 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3647 NumUserInputs =
Record[1];
3649 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3658llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3659 unsigned ClientLoadCapabilities) {
3660 BitstreamCursor &Stream = F.
Stream;
3662 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3669 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3671 return MaybeEntry.takeError();
3672 llvm::BitstreamEntry Entry = MaybeEntry.get();
3674 switch (Entry.Kind) {
3675 case llvm::BitstreamEntry::Error:
3676 return llvm::createStringError(
3677 std::errc::illegal_byte_sequence,
3678 "error at end of module block in AST file");
3679 case llvm::BitstreamEntry::EndBlock:
3685 if (ASTContext *Ctx = ContextObj) {
3686 DeclContext *DC = Ctx->getTranslationUnitDecl();
3691 return llvm::Error::success();
3692 case llvm::BitstreamEntry::SubBlock:
3700 if (llvm::Error Err = Stream.SkipBlock())
3702 if (llvm::Error Err = ReadBlockAbbrevs(
3709 if (!PP.getExternalSource())
3710 PP.setExternalSource(
this);
3712 if (llvm::Error Err = Stream.SkipBlock())
3714 if (llvm::Error Err =
3723 if (llvm::Error Err = Stream.SkipBlock()) {
3732 if (!PP.getPreprocessingRecord())
3733 PP.createPreprocessingRecord();
3734 if (!PP.getPreprocessingRecord()->getExternalSource())
3735 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3739 if (llvm::Error Err = ReadSourceManagerBlock(F))
3744 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3749 BitstreamCursor
C = Stream;
3751 if (llvm::Error Err = Stream.SkipBlock())
3755 CommentsCursors.push_back(std::make_pair(
C, &F));
3760 if (llvm::Error Err = Stream.SkipBlock())
3766 case llvm::BitstreamEntry::Record:
3774 Expected<unsigned> MaybeRecordType =
3775 Stream.readRecord(Entry.ID,
Record, &Blob);
3776 if (!MaybeRecordType)
3777 return MaybeRecordType.takeError();
3782 switch (RecordType) {
3803 switch (RecordType) {
3809 return llvm::createStringError(
3810 std::errc::illegal_byte_sequence,
3811 "duplicate TYPE_OFFSET record in AST file");
3824 return llvm::createStringError(
3825 std::errc::illegal_byte_sequence,
3826 "duplicate DECL_OFFSET record in AST file");
3838 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3839 LexicalContents Contents(
3841 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3842 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3849 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3850 auto *
Data = (
const unsigned char*)Blob.data();
3851 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3854 if (Decl *D = GetExistingDecl(ID))
3855 PendingUpdateRecords.push_back(
3856 PendingUpdateRecord(ID, D,
false));
3862 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3863 auto *
Data = (
const unsigned char *)Blob.data();
3864 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3867 if (Decl *D = GetExistingDecl(ID))
3868 PendingUpdateRecords.push_back(
3869 PendingUpdateRecord(ID, D,
false));
3877 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3878 auto *
Data = (
const unsigned char *)Blob.data();
3879 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3882 if (Decl *D = GetExistingDecl(ID))
3883 PendingUpdateRecords.push_back(
3884 PendingUpdateRecord(ID, D,
false));
3890 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3891 auto *
Data = (
const unsigned char *)Blob.data();
3892 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3895 if (Decl *D = GetExistingDecl(ID))
3896 PendingUpdateRecords.push_back(
3897 PendingUpdateRecord(ID, D,
false));
3903 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3904 auto *
Data = (
const unsigned char *)Blob.data();
3905 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3908 if (Decl *D = GetExistingDecl(ID))
3909 PendingUpdateRecords.push_back(
3910 PendingUpdateRecord(ID, D,
false));
3916 reinterpret_cast<const unsigned char *
>(Blob.data());
3922 ASTIdentifierLookupTrait(*
this, F));
3924 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
3930 return llvm::createStringError(
3931 std::errc::illegal_byte_sequence,
3932 "duplicate IDENTIFIER_OFFSET record in AST file");
3938 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3950 for (
unsigned I = 0, N =
Record.size(); I != N; )
3951 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3958 getContext().getLangOpts().BuildingPCHWithObjectFile)
3959 for (
unsigned I = 0, N =
Record.size(); I != N; )
3960 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3964 if (SpecialTypes.empty()) {
3965 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
3966 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
3973 if (SpecialTypes.size() !=
Record.size())
3974 return llvm::createStringError(std::errc::illegal_byte_sequence,
3975 "invalid special-types record");
3977 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
3979 if (!SpecialTypes[I])
3980 SpecialTypes[I] =
ID;
3987 TotalNumStatements +=
Record[0];
3988 TotalNumMacros +=
Record[1];
3989 TotalLexicalDeclContexts +=
Record[2];
3990 TotalVisibleDeclContexts +=
Record[3];
3991 TotalModuleLocalVisibleDeclContexts +=
Record[4];
3992 TotalTULocalVisibleDeclContexts +=
Record[5];
3996 for (
unsigned I = 0, N =
Record.size(); I != N; )
3997 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
4001 for (
unsigned I = 0, N =
Record.size(); I != N; )
4002 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
4006 if (
Record.size() % 3 != 0)
4007 return llvm::createStringError(std::errc::illegal_byte_sequence,
4008 "invalid weak identifiers record");
4012 WeakUndeclaredIdentifiers.clear();
4015 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4016 WeakUndeclaredIdentifiers.push_back(
4017 getGlobalIdentifierID(F,
Record[I++]));
4018 WeakUndeclaredIdentifiers.push_back(
4019 getGlobalIdentifierID(F,
Record[I++]));
4020 WeakUndeclaredIdentifiers.push_back(
4021 ReadSourceLocation(F,
Record, I).getRawEncoding());
4028 unsigned LocalBaseSelectorID =
Record[1];
4034 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4039 std::make_pair(LocalBaseSelectorID,
4051 = ASTSelectorLookupTable::Create(
4054 ASTSelectorLookupTrait(*
this, F));
4055 TotalNumMethodPoolEntries +=
Record[1];
4060 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
4061 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4063 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
4072 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4073 ReadSourceLocation(F,
Record, Idx));
4079 SmallVector<SourceLocation, 64> SrcLocs;
4081 while (Idx <
Record.size())
4082 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
4083 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4090 unsigned Idx = 0, End =
Record.size() - 1;
4091 bool ReachedEOFWhileSkipping =
Record[Idx++];
4092 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4093 if (ReachedEOFWhileSkipping) {
4094 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4095 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4096 bool FoundNonSkipPortion =
Record[Idx++];
4097 bool FoundElse =
Record[Idx++];
4098 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4099 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4100 FoundElse, ElseLoc);
4102 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4104 auto Loc = ReadSourceLocation(F,
Record, Idx);
4105 bool WasSkipping =
Record[Idx++];
4106 bool FoundNonSkip =
Record[Idx++];
4107 bool FoundElse =
Record[Idx++];
4108 ConditionalStack.push_back(
4109 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4111 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4116 if (!
Record.empty() && Listener)
4134 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4135 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4136 return llvm::createStringError(std::errc::invalid_argument,
4137 "ran out of source locations");
4142 unsigned RangeStart =
4144 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4149 GlobalSLocOffsetMap.insert(
4151 - SLocSpaceSize,&F));
4162 ParseLineTable(F,
Record);
4166 for (
unsigned I = 0, N =
Record.size(); I != N; )
4167 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4171 if (
Record.size() % 3 != 0)
4172 return llvm::createStringError(std::errc::illegal_byte_sequence,
4173 "Invalid VTABLE_USES record");
4180 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4181 VTableUses.push_back(
4182 {ReadDeclID(F,
Record, Idx),
4183 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4190 if (
Record.size() % 2 != 0)
4191 return llvm::createStringError(
4192 std::errc::illegal_byte_sequence,
4193 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4198 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4199 PendingInstantiations.push_back(
4200 {ReadDeclID(F,
Record, I),
4201 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4208 return llvm::createStringError(std::errc::illegal_byte_sequence,
4209 "Invalid SEMA_DECL_REFS block");
4210 for (
unsigned I = 0, N =
Record.size(); I != N; )
4211 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4219 unsigned StartingID;
4220 if (!PP.getPreprocessingRecord())
4221 PP.createPreprocessingRecord();
4222 if (!PP.getPreprocessingRecord()->getExternalSource())
4223 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4225 = PP.getPreprocessingRecord()
4232 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4243 if (!PP.getPreprocessingRecord())
4244 PP.createPreprocessingRecord();
4245 if (!PP.getPreprocessingRecord()->getExternalSource())
4246 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4251 GlobalSkippedRangeMap.insert(
4257 if (
Record.size() % 2 != 0)
4258 return llvm::createStringError(
4259 std::errc::illegal_byte_sequence,
4260 "invalid DECL_UPDATE_OFFSETS block in AST file");
4261 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4262 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4263 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4267 if (Decl *D = GetExistingDecl(ID))
4268 PendingUpdateRecords.push_back(
4269 PendingUpdateRecord(ID, D,
false));
4274 if (
Record.size() % 5 != 0)
4275 return llvm::createStringError(
4276 std::errc::illegal_byte_sequence,
4277 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4279 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4280 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4283 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4286 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4289 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4292 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4295 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4297 DelayedNamespaceOffsetMap[
ID] = {
4298 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4300 assert(!GetExistingDecl(ID) &&
4301 "We shouldn't load the namespace in the front of delayed "
4302 "namespace lexical and visible block");
4308 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4309 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4310 auto &RelatedDecls = RelatedDeclsMap[
ID];
4311 unsigned NN =
Record[I++];
4312 RelatedDecls.reserve(NN);
4313 for (
unsigned II = 0; II < NN; II++)
4314 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4320 return llvm::createStringError(
4321 std::errc::illegal_byte_sequence,
4322 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4335 CUDASpecialDeclRefs.clear();
4336 for (
unsigned I = 0, N =
Record.size(); I != N; )
4337 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4347 HeaderFileInfoTrait(*
this, F));
4349 PP.getHeaderSearchInfo().SetExternalSource(
this);
4350 if (!PP.getHeaderSearchInfo().getExternalLookup())
4351 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4357 FPPragmaOptions.swap(
Record);
4361 for (
unsigned I = 0, N =
Record.size(); I != N; )
4362 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4366 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4367 auto Name = ReadString(
Record, I);
4368 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4369 OptInfo.Supported =
Record[I++] != 0;
4370 OptInfo.Enabled =
Record[I++] != 0;
4371 OptInfo.WithPragma =
Record[I++] != 0;
4372 OptInfo.Avail =
Record[I++];
4373 OptInfo.Core =
Record[I++];
4374 OptInfo.Opt =
Record[I++];
4379 for (
unsigned I = 0, N =
Record.size(); I != N; )
4380 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4384 for (
unsigned I = 0, N =
Record.size(); I != N; )
4385 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4389 if (
Record.size() % 2 != 0)
4390 return llvm::createStringError(std::errc::illegal_byte_sequence,
4391 "invalid undefined-but-used record");
4392 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4393 UndefinedButUsed.push_back(
4394 {ReadDeclID(F,
Record, I),
4395 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4400 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4401 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4403 DelayedDeleteExprs.push_back(Count);
4404 for (uint64_t
C = 0;
C < Count; ++
C) {
4405 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4406 bool IsArrayForm =
Record[I++] == 1;
4407 DelayedDeleteExprs.push_back(IsArrayForm);
4414 getContext().getLangOpts().BuildingPCHWithObjectFile)
4415 for (
unsigned I = 0, N =
Record.size(); I != N;)
4416 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4424 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4425 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4426 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4428 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4429 if (DeserializationListener)
4430 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4438 return llvm::createStringError(
4439 std::errc::illegal_byte_sequence,
4440 "duplicate MACRO_OFFSET record in AST file");
4452 LateParsedTemplates.emplace_back(
4453 std::piecewise_construct, std::forward_as_tuple(&F),
4459 return llvm::createStringError(std::errc::illegal_byte_sequence,
4460 "invalid pragma optimize record");
4461 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4466 return llvm::createStringError(std::errc::illegal_byte_sequence,
4467 "invalid pragma ms_struct record");
4468 PragmaMSStructState =
Record[0];
4473 return llvm::createStringError(
4474 std::errc::illegal_byte_sequence,
4475 "invalid pragma pointers to members record");
4476 PragmaMSPointersToMembersState =
Record[0];
4477 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4481 for (
unsigned I = 0, N =
Record.size(); I != N; )
4482 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4487 return llvm::createStringError(std::errc::illegal_byte_sequence,
4488 "invalid cuda pragma options record");
4489 ForceHostDeviceDepth =
Record[0];
4494 return llvm::createStringError(std::errc::illegal_byte_sequence,
4495 "invalid pragma pack record");
4496 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4497 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4498 unsigned NumStackEntries =
Record[2];
4501 PragmaAlignPackStack.clear();
4502 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4503 PragmaAlignPackStackEntry Entry;
4504 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4505 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4506 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4507 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4508 Entry.SlotLabel = PragmaAlignPackStrings.back();
4509 PragmaAlignPackStack.push_back(Entry);
4516 return llvm::createStringError(std::errc::illegal_byte_sequence,
4517 "invalid pragma float control record");
4519 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4520 unsigned NumStackEntries =
Record[2];
4523 FpPragmaStack.clear();
4524 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4525 FpPragmaStackEntry Entry;
4527 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4528 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4529 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4530 Entry.SlotLabel = FpPragmaStrings.back();
4531 FpPragmaStack.push_back(Entry);
4537 for (
unsigned I = 0, N =
Record.size(); I != N; )
4538 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4542 unsigned NumRecords =
Record.front();
4544 if (
Record.size() - 1 != NumRecords)
4545 return llvm::createStringError(std::errc::illegal_byte_sequence,
4546 "invalid rvv intrinsic pragma record");
4548 if (RISCVVecIntrinsicPragma.empty())
4549 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4552 for (
unsigned i = 0; i < NumRecords; ++i)
4553 RISCVVecIntrinsicPragma[i] |=
Record[i + 1];
4560void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4573 assert(ImportedModuleVector.empty());
4575 while (
Data < DataEnd) {
4579 using namespace llvm::support;
4581 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4582 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4583 StringRef Name = StringRef((
const char*)
Data, Len);
4587 ? ModuleMgr.lookupByModuleName(Name)
4588 : ModuleMgr.lookupByFileName(Name));
4590 std::string Msg =
"refers to unknown module, cannot find ";
4591 Msg.append(std::string(Name));
4596 ImportedModuleVector.push_back(OM);
4599 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4601 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4604 RemapBuilder &Remap) {
4605 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4607 Remap.insert(std::make_pair(Offset,
4608 static_cast<int>(BaseOffset - Offset)));
4619 unsigned ClientLoadCapabilities) {
4628 "MODULE_NAME should come before MODULE_MAP_FILE");
4629 auto [MaybeM, IgnoreError] =
4630 getModuleForRelocationChecks(F,
false);
4631 if (MaybeM.has_value()) {
4634 Module *M = MaybeM.value();
4635 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4637 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4638 if (!IgnoreError && !ModMap) {
4640 Diag(diag::remark_module_relocated)
4643 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4644 if (
auto ASTFE = M ? M->
getASTFile() : std::nullopt) {
4647 << ASTFE->getName();
4651 Diag(diag::err_imported_module_not_found)
4658 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4659 Diag(diag::note_imported_by_pch_module_not_found)
4666 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4670 if (!StoredModMap || *StoredModMap != ModMap) {
4671 assert(ModMap &&
"found module is missing module map file");
4673 "top-level import should be verified");
4675 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4676 Diag(diag::err_imported_module_modmap_changed)
4683 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4685 std::string Filename = ReadPath(F,
Record, Idx);
4688 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4689 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4692 AdditionalStoredMaps.insert(*SF);
4697 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4698 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4701 if (!AdditionalStoredMaps.erase(ModMap)) {
4702 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4703 Diag(diag::err_module_different_modmap)
4712 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4713 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4714 Diag(diag::err_module_different_modmap)
4728 SemaObjC::GlobalMethodPool::iterator Known =
4734 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4735 : Known->second.second;
4739 if (List->getMethod() == Method) {
4747 if (List->getNext())
4748 List->setMethod(List->getNext()->getMethod());
4750 List->setMethod(Method);
4756 for (
Decl *D : Names) {
4760 if (wasHidden && SemaObj) {
4773 Stack.push_back(Mod);
4774 while (!Stack.empty()) {
4775 Mod = Stack.pop_back_val();
4777 if (NameVisibility <= Mod->NameVisibility) {
4793 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4794 if (Hidden != HiddenNamesMap.end()) {
4795 auto HiddenNames = std::move(*Hidden);
4796 HiddenNamesMap.erase(Hidden);
4798 assert(!HiddenNamesMap.contains(Mod) &&
4799 "making names visible added hidden names");
4806 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4808 if (Visited.insert(Exported).second)
4809 Stack.push_back(Exported);
4827 PendingMergedDefinitionsToDeduplicate.insert(Def);
4836 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4837 !PP.getLangOpts().Modules)
4841 TriedLoadingGlobalIndex =
true;
4842 StringRef SpecificModuleCachePath =
4844 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4846 if (llvm::Error Err = std::move(
Result.second)) {
4848 consumeError(std::move(Err));
4852 GlobalIndex.reset(
Result.first);
4853 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4858 return PP.getLangOpts().Modules && UseGlobalIndex &&
4870 consumeError(MaybeEntry.takeError());
4873 llvm::BitstreamEntry Entry = MaybeEntry.get();
4875 switch (Entry.Kind) {
4876 case llvm::BitstreamEntry::Error:
4877 case llvm::BitstreamEntry::EndBlock:
4880 case llvm::BitstreamEntry::Record:
4886 consumeError(Skipped.takeError());
4890 case llvm::BitstreamEntry::SubBlock:
4891 if (Entry.ID == BlockID) {
4892 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4894 consumeError(std::move(Err));
4901 if (llvm::Error Err = Cursor.SkipBlock()) {
4903 consumeError(std::move(Err));
4912 unsigned ClientLoadCapabilities,
4914 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
4918 CurrentDeserializingModuleKind,
Type);
4924 unsigned PreviousGeneration = 0;
4928 unsigned NumModules = ModuleMgr.size();
4933 ClientLoadCapabilities)) {
4934 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4938 GlobalIndex.reset();
4939 ModuleMgr.setGlobalIndex(
nullptr);
4943 if (NewLoadedModuleFile && !Loaded.empty())
4944 *NewLoadedModuleFile = Loaded.back().Mod;
4957 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
4960 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4961 Error(std::move(Err));
4967 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
4973 if (llvm::Error Err = ReadExtensionBlock(F)) {
4974 Error(std::move(Err));
5003 if (!PP.getLangOpts().CPlusPlus) {
5010 auto It = PP.getIdentifierTable().find(Key);
5011 if (It == PP.getIdentifierTable().end())
5020 II = &PP.getIdentifierTable().getOwn(Key);
5038 for (
auto &Id : PP.getIdentifierTable())
5039 Id.second->setOutOfDate(
true);
5042 for (
const auto &Sel : SelectorGeneration)
5043 SelectorOutOfDate[Sel.first] =
true;
5050 ModuleMgr.moduleFileAccepted(&F);
5063 for (
unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
5064 UnresolvedModuleRef &
Unresolved = UnresolvedModuleRefs[I];
5069 case UnresolvedModuleRef::Conflict:
5072 Conflict.
Other = ResolvedMod;
5074 Unresolved.Mod->Conflicts.push_back(Conflict);
5078 case UnresolvedModuleRef::Import:
5083 case UnresolvedModuleRef::Affecting:
5085 Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
5088 case UnresolvedModuleRef::Export:
5095 UnresolvedModuleRefs.clear();
5107 if (DeserializationListener)
5108 DeserializationListener->ReaderInitialized(
this);
5110 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5125 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5126 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5127 ObjCClassesLoaded[I], PreviousGeneration);
5132 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5137 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5156 if (!Stream.canSkipToPos(4))
5157 return llvm::createStringError(
5158 std::errc::illegal_byte_sequence,
5159 "file too small to contain precompiled file magic");
5160 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5163 return llvm::createStringError(
5164 std::errc::illegal_byte_sequence,
5165 "file doesn't start with precompiled file magic");
5167 return Res.takeError();
5168 return llvm::Error::success();
5183 llvm_unreachable(
"unknown module kind");
5192 off_t ExpectedSize, time_t ExpectedModTime,
5194 unsigned ClientLoadCapabilities) {
5196 std::string ErrorStr;
5198 = ModuleMgr.addModule(
FileName,
Type, ImportLoc, ImportedBy,
5203 switch (AddResult) {
5205 Diag(diag::remark_module_import)
5207 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5221 Diag(diag::err_ast_file_not_found)
5233 Diag(diag::err_ast_file_out_of_date)
5239 assert(M &&
"Missing module file");
5241 bool ShouldFinalizePCM =
false;
5242 llvm::scope_exit FinalizeOrDropPCM([&]() {
5244 if (ShouldFinalizePCM)
5250 BitstreamCursor &Stream = F.
Stream;
5251 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5252 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5256 Diag(diag::err_ast_file_invalid)
5262 bool HaveReadControlBlock =
false;
5266 Error(MaybeEntry.takeError());
5269 llvm::BitstreamEntry Entry = MaybeEntry.get();
5271 switch (Entry.Kind) {
5272 case llvm::BitstreamEntry::Error:
5273 case llvm::BitstreamEntry::Record:
5274 case llvm::BitstreamEntry::EndBlock:
5275 Error(
"invalid record at top-level of AST file");
5278 case llvm::BitstreamEntry::SubBlock:
5284 HaveReadControlBlock =
true;
5285 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5293 F.ModuleName.empty()) {
5312 if (!HaveReadControlBlock) {
5314 Diag(diag::err_ast_file_version_too_old)
5321 ShouldFinalizePCM =
true;
5325 if (llvm::Error Err = Stream.SkipBlock()) {
5326 Error(std::move(Err));
5333 llvm_unreachable(
"unexpected break; expected return");
5337ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5338 unsigned ClientLoadCapabilities) {
5340 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5341 bool AllowCompatibleConfigurationMismatch =
5343 bool DisableValidation = shouldDisableValidationForFile(F);
5345 ASTReadResult
Result = readUnhashedControlBlockImpl(
5347 AllowCompatibleConfigurationMismatch, Listener.get(),
5352 if (DisableValidation || WasImportedBy ||
5353 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5357 Error(
"malformed block record in AST file");
5380 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5382 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5391 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5392 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5393 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5395 BitstreamCursor Stream(StreamData);
5400 consumeError(std::move(Err));
5412 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5415 consumeError(MaybeEntry.takeError());
5418 llvm::BitstreamEntry Entry = MaybeEntry.get();
5420 switch (Entry.Kind) {
5421 case llvm::BitstreamEntry::Error:
5422 case llvm::BitstreamEntry::SubBlock:
5425 case llvm::BitstreamEntry::EndBlock:
5428 case llvm::BitstreamEntry::Record:
5436 Expected<unsigned> MaybeRecordType =
5437 Stream.readRecord(Entry.ID,
Record, &Blob);
5438 if (!MaybeRecordType) {
5447 "Dummy AST file signature not backpatched in ASTWriter.");
5454 "Dummy AST block hash not backpatched in ASTWriter.");
5458 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5459 if (Listener && ValidateDiagnosticOptions &&
5460 !AllowCompatibleConfigurationMismatch &&
5461 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5466 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5467 if (Listener && !AllowCompatibleConfigurationMismatch &&
5468 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5469 Result = ConfigurationMismatch;
5498 if (
Record.size() < 4)
return true;
5503 unsigned BlockNameLen =
Record[2];
5504 unsigned UserInfoLen =
Record[3];
5506 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5508 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5509 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5510 Blob.data() + BlockNameLen + UserInfoLen);
5514llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5515 BitstreamCursor &Stream = F.
Stream;
5519 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5521 return MaybeEntry.takeError();
5522 llvm::BitstreamEntry Entry = MaybeEntry.get();
5524 switch (Entry.Kind) {
5525 case llvm::BitstreamEntry::SubBlock:
5526 if (llvm::Error Err = Stream.SkipBlock())
5529 case llvm::BitstreamEntry::EndBlock:
5530 return llvm::Error::success();
5531 case llvm::BitstreamEntry::Error:
5532 return llvm::createStringError(std::errc::illegal_byte_sequence,
5533 "malformed block record in AST file");
5534 case llvm::BitstreamEntry::Record:
5540 Expected<unsigned> MaybeRecCode =
5541 Stream.readRecord(Entry.ID,
Record, &Blob);
5543 return MaybeRecCode.takeError();
5544 switch (MaybeRecCode.get()) {
5546 ModuleFileExtensionMetadata Metadata;
5548 return llvm::createStringError(
5549 std::errc::illegal_byte_sequence,
5550 "malformed EXTENSION_METADATA in AST file");
5553 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5554 if (Known == ModuleFileExtensions.end())
break;
5557 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5567 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5571 assert(ContextObj &&
"no context to initialize");
5575 if (DeserializationListener)
5576 DeserializationListener->DeclRead(
5578 Context.getTranslationUnitDecl());
5586 if (!Context.CFConstantStringTypeDecl)
5587 Context.setCFConstantStringType(
GetType(String));
5592 if (FileType.isNull()) {
5593 Error(
"FILE type is NULL");
5597 if (!Context.FILEDecl) {
5599 Context.setFILEDecl(
Typedef->getDecl());
5601 const TagType *Tag = FileType->getAs<TagType>();
5603 Error(
"Invalid FILE type in AST file");
5606 Context.setFILEDecl(Tag->getDecl());
5613 if (Jmp_bufType.
isNull()) {
5614 Error(
"jmp_buf type is NULL");
5618 if (!Context.jmp_bufDecl) {
5620 Context.setjmp_bufDecl(
Typedef->getDecl());
5622 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5624 Error(
"Invalid jmp_buf type in AST file");
5627 Context.setjmp_bufDecl(Tag->getDecl());
5634 if (Sigjmp_bufType.
isNull()) {
5635 Error(
"sigjmp_buf type is NULL");
5639 if (!Context.sigjmp_bufDecl) {
5641 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5643 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5644 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5645 Context.setsigjmp_bufDecl(Tag->getDecl());
5651 if (Context.ObjCIdRedefinitionType.isNull())
5652 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5655 if (
TypeID ObjCClassRedef =
5657 if (Context.ObjCClassRedefinitionType.isNull())
5658 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5661 if (
TypeID ObjCSelRedef =
5663 if (Context.ObjCSelRedefinitionType.isNull())
5664 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5669 if (Ucontext_tType.
isNull()) {
5670 Error(
"ucontext_t type is NULL");
5674 if (!Context.ucontext_tDecl) {
5676 Context.setucontext_tDecl(
Typedef->getDecl());
5678 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5679 assert(Tag &&
"Invalid ucontext_t type in AST file");
5680 Context.setucontext_tDecl(Tag->getDecl());
5689 if (!CUDASpecialDeclRefs.empty()) {
5690 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5691 Context.setcudaConfigureCallDecl(
5692 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5693 Context.setcudaGetParameterBufferDecl(
5694 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5695 Context.setcudaLaunchDeviceDecl(
5696 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5701 for (
auto &Import : PendingImportedModules) {
5705 if (Import.ImportLoc.isValid())
5706 PP.makeModuleVisible(Imported, Import.ImportLoc);
5713 PendingImportedModulesSema.append(PendingImportedModules);
5714 PendingImportedModules.clear();
5724 BitstreamCursor Stream(
PCH);
5727 consumeError(std::move(Err));
5739 Stream.advanceSkippingSubblocks();
5742 consumeError(MaybeEntry.takeError());
5745 llvm::BitstreamEntry Entry = MaybeEntry.get();
5747 if (Entry.Kind != llvm::BitstreamEntry::Record)
5755 consumeError(MaybeRecord.takeError());
5761 "Dummy AST file signature not backpatched in ASTWriter.");
5771 const std::string &ASTFileName,
FileManager &FileMgr,
5774 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5779 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5780 << ASTFileName << Buffer.getError().message();
5781 return std::string();
5785 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5789 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5790 return std::string();
5795 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5796 return std::string();
5803 Stream.advanceSkippingSubblocks();
5806 consumeError(MaybeEntry.takeError());
5807 return std::string();
5809 llvm::BitstreamEntry Entry = MaybeEntry.get();
5811 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5812 return std::string();
5814 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5815 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5816 return std::string();
5824 consumeError(MaybeRecord.takeError());
5825 return std::string();
5840 std::string ExistingSpecificModuleCachePath;
5842 bool StrictOptionMatches;
5845 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5850 StringRef ExistingSpecificModuleCachePath,
5852 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5853 ExistingTargetOpts(ExistingTargetOpts),
5854 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
5855 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
5858 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5859 StringRef ModuleFilename,
bool Complain,
5860 bool AllowCompatibleDifferences)
override {
5862 nullptr, AllowCompatibleDifferences);
5865 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5866 StringRef ModuleFilename,
bool Complain,
5867 bool AllowCompatibleDifferences)
override {
5869 nullptr, AllowCompatibleDifferences);
5872 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5873 StringRef ModuleFilename,
bool Complain,
5874 bool AllowCompatibleDifferences)
override {
5876 nullptr, AllowCompatibleDifferences);
5879 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5880 StringRef ASTFilename,
5881 StringRef SpecificModuleCachePath,
5882 bool Complain)
override {
5885 ExistingSpecificModuleCachePath, ASTFilename,
nullptr,
5886 ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
5889 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5890 StringRef ModuleFilename,
bool ReadMacros,
5892 std::string &SuggestedPredefines)
override {
5894 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5895 FileMgr, SuggestedPredefines, ExistingLangOpts,
5907 unsigned ClientLoadCapabilities) {
5909 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5910 llvm::MemoryBuffer *Buffer =
5920 Filename ==
"-" ? FileMgr.getSTDIN() : FileMgr.getFileRef(Filename);
5922 llvm::consumeError(Entry.takeError());
5925 auto BufferOrErr = FileMgr.getBufferForFile(*Entry);
5928 OwnedBuffer = std::move(*BufferOrErr);
5929 Buffer = OwnedBuffer.get();
5933 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
5934 BitstreamCursor Stream(Bytes);
5938 consumeError(std::move(Err));
5946 bool NeedsInputFiles = Listener.needsInputFileVisitation();
5947 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5948 bool NeedsImports = Listener.needsImportVisitation();
5949 BitstreamCursor InputFilesCursor;
5950 uint64_t InputFilesOffsetBase = 0;
5953 std::string ModuleDir;
5954 bool DoneWithControlBlock =
false;
5956 PathBuf.reserve(256);
5961 AdditionalPathBuf.reserve(256);
5962 while (!DoneWithControlBlock) {
5966 consumeError(MaybeEntry.takeError());
5969 llvm::BitstreamEntry Entry = MaybeEntry.get();
5971 switch (Entry.Kind) {
5972 case llvm::BitstreamEntry::SubBlock: {
5975 std::string IgnoredSuggestedPredefines;
5976 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
5978 Listener, IgnoredSuggestedPredefines) !=
Success)
5984 InputFilesCursor = Stream;
5985 if (llvm::Error Err = Stream.SkipBlock()) {
5987 consumeError(std::move(Err));
5990 if (NeedsInputFiles &&
5993 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
5997 if (llvm::Error Err = Stream.SkipBlock()) {
5999 consumeError(std::move(Err));
6008 case llvm::BitstreamEntry::EndBlock:
6009 DoneWithControlBlock =
true;
6012 case llvm::BitstreamEntry::Error:
6015 case llvm::BitstreamEntry::Record:
6019 if (DoneWithControlBlock)
break;
6024 Stream.readRecord(Entry.ID,
Record, &Blob);
6025 if (!MaybeRecCode) {
6033 if (Listener.ReadFullVersionInformation(Blob))
6037 Listener.ReadModuleName(Blob);
6040 ModuleDir = std::string(Blob);
6046 Listener.ReadModuleMapFile(*Path);
6050 if (!NeedsInputFiles)
6053 unsigned NumInputFiles =
Record[0];
6054 unsigned NumUserFiles =
Record[1];
6055 const llvm::support::unaligned_uint64_t *InputFileOffs =
6056 (
const llvm::support::unaligned_uint64_t *)Blob.data();
6057 for (
unsigned I = 0; I != NumInputFiles; ++I) {
6059 bool isSystemFile = I >= NumUserFiles;
6061 if (isSystemFile && !NeedsSystemInputFiles)
6064 BitstreamCursor &Cursor = InputFilesCursor;
6066 if (llvm::Error Err =
6067 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6069 consumeError(std::move(Err));
6075 consumeError(MaybeCode.takeError());
6077 unsigned Code = MaybeCode.get();
6081 bool shouldContinue =
false;
6083 Cursor.readRecord(Code,
Record, &Blob);
6084 if (!MaybeRecordType) {
6086 consumeError(MaybeRecordType.takeError());
6092 time_t StoredTime =
static_cast<time_t
>(
Record[2]);
6093 bool Overridden =
static_cast<bool>(
Record[3]);
6094 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6097 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6099 if (UnresolvedFilename.empty())
6100 Filename = *FilenameAsRequestedBuf;
6103 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6104 Filename = *FilenameBuf;
6106 shouldContinue = Listener.visitInputFileAsRequested(
6107 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6111 if (!shouldContinue)
6132 bool IsStandardCXXModule =
Record[Idx++];
6136 if (IsStandardCXXModule) {
6137 Listener.visitImport(ModuleName,
"");
6148 Listener.visitImport(ModuleName, *Filename);
6159 if (FindModuleFileExtensions) {
6160 BitstreamCursor SavedStream = Stream;
6162 bool DoneWithExtensionBlock =
false;
6163 while (!DoneWithExtensionBlock) {
6169 llvm::BitstreamEntry Entry = MaybeEntry.get();
6171 switch (Entry.Kind) {
6172 case llvm::BitstreamEntry::SubBlock:
6173 if (llvm::Error Err = Stream.SkipBlock()) {
6175 consumeError(std::move(Err));
6180 case llvm::BitstreamEntry::EndBlock:
6181 DoneWithExtensionBlock =
true;
6184 case llvm::BitstreamEntry::Error:
6187 case llvm::BitstreamEntry::Record:
6194 Stream.readRecord(Entry.ID,
Record, &Blob);
6195 if (!MaybeRecCode) {
6199 switch (MaybeRecCode.get()) {
6205 Listener.readModuleFileExtension(Metadata);
6211 Stream = std::move(SavedStream);
6215 if (readUnhashedControlBlockImpl(
6216 nullptr, Bytes, Filename, ClientLoadCapabilities,
6218 ValidateDiagnosticOptions) !=
Success)
6229 StringRef SpecificModuleCachePath,
bool RequireStrictOptionMatches) {
6230 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6231 SpecificModuleCachePath, FileMgr,
6232 RequireStrictOptionMatches);
6238llvm::Error ASTReader::ReadSubmoduleBlock(
ModuleFile &F,
6239 unsigned ClientLoadCapabilities) {
6244 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6249 auto CreateModule = !KnowsTopLevelModule
6254 Module *CurrentModule =
nullptr;
6258 F.
Stream.advanceSkippingSubblocks();
6260 return MaybeEntry.takeError();
6261 llvm::BitstreamEntry Entry = MaybeEntry.get();
6263 switch (Entry.Kind) {
6264 case llvm::BitstreamEntry::SubBlock:
6265 case llvm::BitstreamEntry::Error:
6266 return llvm::createStringError(std::errc::illegal_byte_sequence,
6267 "malformed block record in AST file");
6268 case llvm::BitstreamEntry::EndBlock:
6269 return llvm::Error::success();
6270 case llvm::BitstreamEntry::Record:
6280 return MaybeKind.takeError();
6281 unsigned Kind = MaybeKind.get();
6284 return llvm::createStringError(
6285 std::errc::illegal_byte_sequence,
6286 "submodule metadata record should be at beginning of block");
6301 return llvm::createStringError(std::errc::illegal_byte_sequence,
6302 "malformed module definition");
6304 StringRef Name = Blob;
6311 bool IsFramework =
Record[Idx++];
6312 bool IsExplicit =
Record[Idx++];
6313 bool IsSystem =
Record[Idx++];
6314 bool IsExternC =
Record[Idx++];
6315 bool InferSubmodules =
Record[Idx++];
6316 bool InferExplicitSubmodules =
Record[Idx++];
6317 bool InferExportWildcard =
Record[Idx++];
6318 bool ConfigMacrosExhaustive =
Record[Idx++];
6319 bool ModuleMapIsPrivate =
Record[Idx++];
6320 bool NamedModuleHasInit =
Record[Idx++];
6322 Module *ParentModule =
nullptr;
6324 ParentModule = getSubmodule(Parent);
6326 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6327 IsFramework, IsExplicit);
6330 if (GlobalIndex >= SubmodulesLoaded.size() ||
6331 SubmodulesLoaded[GlobalIndex])
6332 return llvm::createStringError(std::errc::invalid_argument,
6333 "too many submodules");
6335 if (!ParentModule) {
6338 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6340 assert(CurFile != F.
File &&
"ModuleManager did not de-duplicate");
6342 Diag(diag::err_module_file_conflict)
6346 auto CurModMapFile =
6349 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6350 Diag(diag::note_module_file_conflict)
6351 << CurModMapFile->getName() << ModMapFile->getName();
6353 return llvm::make_error<AlreadyReportedDiagnosticError>();
6372 if (InferredAllowedBy.
isValid())
6386 }
else if (ParentModule && ParentModule->
Directory) {
6391 if (DeserializationListener)
6392 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6394 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6416 SmallString<128> RelativePathName;
6418 CurrentModule, Blob.str(), RelativePathName)) {
6446 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6452 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6454 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6466 unsigned LocalBaseSubmoduleID =
Record[1];
6470 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
6475 std::make_pair(LocalBaseSubmoduleID,
6484 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6496 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6508 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6525 PP.getTargetInfo());
6531 Module::LinkLibrary(std::string(Blob),
Record[0]));
6555 SmallVector<GlobalDeclID, 16>
Inits;
6556 for (
unsigned I = 0; I <
Record.size(); )
6558 ContextObj->addLazyModuleInitializers(CurrentModule,
Inits);
6578bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6579 StringRef ModuleFilename,
bool Complain,
6580 ASTReaderListener &Listener,
6581 bool AllowCompatibleDifferences) {
6582 LangOptions LangOpts;
6584#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6585 LangOpts.Name = Record[Idx++];
6586#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6587 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6588#include "clang/Basic/LangOptions.def"
6589#define SANITIZER(NAME, ID) \
6590 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6591#include "clang/Basic/Sanitizers.def"
6593 for (
unsigned N =
Record[Idx++]; N; --N)
6597 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6598 LangOpts.
ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6603 for (
unsigned N =
Record[Idx++]; N; --N) {
6605 ReadString(
Record, Idx));
6610 for (
unsigned N =
Record[Idx++]; N; --N) {
6617 AllowCompatibleDifferences);
6620bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6621 StringRef ModuleFilename,
bool Complain,
6622 ASTReaderListener &Listener,
6623 bool AllowCompatibleDifferences) {
6625 CodeGenOptions CGOpts;
6627#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6628 if constexpr (CK::Compatibility != CK::Benign) \
6629 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6630#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6631 if constexpr (CK::Compatibility != CK::Benign) \
6632 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6633#define DEBUGOPT(Name, Bits, Default, Compatibility)
6634#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6635#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6636#include "clang/Basic/CodeGenOptions.def"
6639 AllowCompatibleDifferences);
6642bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6643 StringRef ModuleFilename,
bool Complain,
6644 ASTReaderListener &Listener,
6645 bool AllowCompatibleDifferences) {
6647 TargetOptions TargetOpts;
6649 TargetOpts.
CPU = ReadString(
Record, Idx);
6651 TargetOpts.
ABI = ReadString(
Record, Idx);
6652 for (
unsigned N =
Record[Idx++]; N; --N) {
6655 for (
unsigned N =
Record[Idx++]; N; --N) {
6660 AllowCompatibleDifferences);
6663bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6664 StringRef ModuleFilename,
bool Complain,
6665 ASTReaderListener &Listener) {
6666 DiagnosticOptions DiagOpts;
6668#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6669#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6670 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6671#include "clang/Basic/DiagnosticOptions.def"
6673 for (
unsigned N =
Record[Idx++]; N; --N)
6675 for (
unsigned N =
Record[Idx++]; N; --N)
6681bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6682 ASTReaderListener &Listener) {
6683 FileSystemOptions FSOpts;
6689bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6690 StringRef ModuleFilename,
6692 ASTReaderListener &Listener) {
6693 HeaderSearchOptions HSOpts;
6708 std::string SpecificModuleCachePath = ReadString(
Record, Idx);
6711 SpecificModuleCachePath, Complain);
6714bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6715 ASTReaderListener &Listener) {
6716 HeaderSearchOptions HSOpts;
6720 for (
unsigned N =
Record[Idx++]; N; --N) {
6721 std::string Path = ReadString(
Record, Idx);
6724 bool IsFramework =
Record[Idx++];
6725 bool IgnoreSysRoot =
Record[Idx++];
6726 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6731 for (
unsigned N =
Record[Idx++]; N; --N) {
6732 std::string Prefix = ReadString(
Record, Idx);
6733 bool IsSystemHeader =
Record[Idx++];
6738 for (
unsigned N =
Record[Idx++]; N; --N) {
6739 std::string VFSOverlayFile = ReadString(
Record, Idx);
6746bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6747 StringRef ModuleFilename,
6749 ASTReaderListener &Listener,
6750 std::string &SuggestedPredefines) {
6751 PreprocessorOptions PPOpts;
6755 bool ReadMacros =
Record[Idx++];
6757 for (
unsigned N =
Record[Idx++]; N; --N) {
6759 bool IsUndef =
Record[Idx++];
6760 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6765 for (
unsigned N =
Record[Idx++]; N; --N) {
6770 for (
unsigned N =
Record[Idx++]; N; --N) {
6779 SuggestedPredefines.clear();
6781 Complain, SuggestedPredefines);
6784std::pair<ModuleFile *, unsigned>
6785ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6786 GlobalPreprocessedEntityMapType::iterator
6787 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6788 assert(I != GlobalPreprocessedEntityMap.end() &&
6789 "Corrupted global preprocessed entity map");
6792 return std::make_pair(M, LocalIndex);
6795llvm::iterator_range<PreprocessingRecord::iterator>
6796ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6797 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6801 return llvm::make_range(PreprocessingRecord::iterator(),
6802 PreprocessingRecord::iterator());
6805bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6806 unsigned int ClientLoadCapabilities) {
6807 return ClientLoadCapabilities & ARR_OutOfDate &&
6810 .getInMemoryModuleCache()
6811 .isPCMFinal(ModuleFileName);
6814llvm::iterator_range<ASTReader::ModuleDeclIterator>
6816 return llvm::make_range(
6823 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6824 assert(I != GlobalSkippedRangeMap.end() &&
6825 "Corrupted global skipped range map");
6828 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6832 assert(Range.isValid());
6838 unsigned ModuleFileIndex = ID >> 32;
6839 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
6840 assert(getModuleManager().size() > ModuleFileIndex - 1);
6841 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6843 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6848 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6850 unsigned LocalIndex = PPInfo.second;
6855 if (!PP.getPreprocessingRecord()) {
6856 Error(
"no preprocessing record");
6863 Error(std::move(Err));
6870 Error(MaybeEntry.takeError());
6873 llvm::BitstreamEntry Entry = MaybeEntry.get();
6875 if (Entry.Kind != llvm::BitstreamEntry::Record)
6886 if (!MaybeRecType) {
6887 Error(MaybeRecType.takeError());
6892 bool isBuiltin =
Record[0];
6900 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
6920 if (DeserializationListener)
6921 DeserializationListener->MacroDefinitionRead(PPID, MD);
6927 const char *FullFileNameStart = Blob.data() +
Record[0];
6928 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
6930 if (!FullFileName.empty())
6931 File = PP.getFileManager().getOptionalFileRef(FullFileName);
6938 StringRef(Blob.data(),
Record[0]),
6946 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
6955unsigned ASTReader::findNextPreprocessedEntity(
6956 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
6958 for (GlobalSLocOffsetMapType::const_iterator
6959 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6965 return getTotalNumPreprocessedEntities();
6970struct PPEntityComp {
6971 const ASTReader &Reader;
6974 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6976 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
6977 SourceLocation LHS = getLoc(L);
6978 SourceLocation RHS = getLoc(R);
6982 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
6983 SourceLocation LHS = getLoc(L);
6987 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
6988 SourceLocation RHS = getLoc(R);
6992 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
6999unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7000 bool EndsAfter)
const {
7001 if (SourceMgr.isLocalSourceLocation(Loc))
7002 return getTotalNumPreprocessedEntities();
7004 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7005 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7006 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7007 "Corrupted global sloc offset map");
7009 if (SLocMapI->second->NumPreprocessedEntities == 0)
7010 return findNextPreprocessedEntity(SLocMapI);
7021 pp_iterator
First = pp_begin;
7025 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7026 PPEntityComp(*
this, M));
7035 std::advance(PPI,
Half);
7036 if (SourceMgr.isBeforeInTranslationUnit(
7037 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7040 Count = Count -
Half - 1;
7047 return findNextPreprocessedEntity(SLocMapI);
7054std::pair<unsigned, unsigned>
7056 if (Range.isInvalid())
7057 return std::make_pair(0,0);
7058 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7060 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
7061 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
7062 return std::make_pair(BeginID, EndID);
7072 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7074 unsigned LocalIndex = PPInfo.second;
7081 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7090 class HeaderFileInfoVisitor {
7092 std::optional<HeaderFileInfo> HFI;
7095 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7104 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7105 if (Pos == Table->end())
7112 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7118 HeaderFileInfoVisitor Visitor(FE);
7119 ModuleMgr.visit(Visitor);
7120 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7127 using DiagState = DiagnosticsEngine::DiagState;
7138 auto ReadDiagState = [&](
const DiagState &BasedOn,
7139 bool IncludeNonPragmaStates) {
7140 unsigned BackrefID =
Record[Idx++];
7142 return DiagStates[BackrefID - 1];
7145 Diag.DiagStates.push_back(BasedOn);
7146 DiagState *NewState = &
Diag.DiagStates.back();
7147 DiagStates.push_back(NewState);
7148 unsigned Size =
Record[Idx++];
7149 assert(Idx + Size * 2 <=
Record.size() &&
7150 "Invalid data, not enough diag/map pairs");
7152 unsigned DiagID =
Record[Idx++];
7155 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7168 Mapping = NewMapping;
7174 DiagState *FirstState;
7179 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7180 DiagStates.push_back(FirstState);
7184 "Invalid data, unexpected backref in initial state");
7186 assert(Idx <
Record.size() &&
7187 "Invalid data, not enough state change pairs in initial state");
7192 unsigned Flags =
Record[Idx++];
7193 DiagState Initial(*
Diag.getDiagnosticIDs());
7194 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7195 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7196 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7197 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7198 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7200 FirstState = ReadDiagState(Initial,
true);
7208 .StateTransitions.push_back({FirstState, 0});
7213 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7217 unsigned NumLocations =
Record[Idx++];
7218 while (NumLocations--) {
7219 assert(Idx <
Record.size() &&
7220 "Invalid data, missing pragma diagnostic states");
7222 assert(FID.
isValid() &&
"invalid FileID for transition");
7223 unsigned Transitions =
Record[Idx++];
7229 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7230 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7231 for (
unsigned I = 0; I != Transitions; ++I) {
7232 unsigned Offset =
Record[Idx++];
7233 auto *State = ReadDiagState(*FirstState,
false);
7234 F.StateTransitions.push_back({State, Offset});
7239 assert(Idx <
Record.size() &&
7240 "Invalid data, missing final pragma diagnostic state");
7242 auto *CurState = ReadDiagState(*FirstState,
false);
7245 Diag.DiagStatesByLoc.CurDiagState = CurState;
7246 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7251 auto &T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7253 T.push_back({CurState, 0});
7255 T[0].State = CurState;
7264ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7265 auto [M, Index] = translateTypeIDToIndex(ID);
7272#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7273 case TYPE_##CODE_ID: return Type::CLASS_ID;
7274#include "clang/Serialization/TypeBitCodes.def"
7276 return std::nullopt;
7286QualType ASTReader::readTypeRecord(
TypeID ID) {
7287 assert(ContextObj &&
"reading type with no AST context");
7288 ASTContext &Context = *ContextObj;
7289 RecordLocation Loc = TypeCursorForIndex(ID);
7290 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7294 SavedStreamPosition SavedPosition(DeclsCursor);
7296 ReadingKindTracker ReadingKind(Read_Type, *
this);
7299 Deserializing AType(
this);
7301 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7302 Error(std::move(Err));
7305 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7307 Error(RawCode.takeError());
7311 ASTRecordReader
Record(*
this, *Loc.F);
7312 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7314 Error(Code.takeError());
7318 QualType baseType =
Record.readQualType();
7319 Qualifiers quals =
Record.readQualifiers();
7325 Error(
"Unexpected code for type");
7329 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7330 return TypeReader.read(*maybeClass);
7338 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7339 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7342 return Reader.readTypeSourceInfo();
7346 return Reader.readNestedNameSpecifierLoc();
7350 return Reader.readAttr();
7359#define ABSTRACT_TYPELOC(CLASS, PARENT)
7360#define TYPELOC(CLASS, PARENT) \
7361 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7362#include "clang/AST/TypeLocNodes.def"
7371void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7375void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7385void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7389void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7393void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7397void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7401void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7405void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7409void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7413void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7417void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7421void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7429 if (Reader.readBool())
7436 VisitArrayTypeLoc(TL);
7440 VisitArrayTypeLoc(TL);
7443void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7444 VisitArrayTypeLoc(TL);
7447void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7448 DependentSizedArrayTypeLoc TL) {
7449 VisitArrayTypeLoc(TL);
7452void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7453 DependentAddressSpaceTypeLoc TL) {
7460void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7461 DependentSizedExtVectorTypeLoc TL) {
7465void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7469void TypeLocReader::VisitDependentVectorTypeLoc(
7470 DependentVectorTypeLoc TL) {
7474void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7478void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7485void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7486 DependentSizedMatrixTypeLoc TL) {
7499 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7505 VisitFunctionTypeLoc(TL);
7509 VisitFunctionTypeLoc(TL);
7512void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7513 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7514 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7515 SourceLocation NameLoc = readSourceLocation();
7516 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7519void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7520 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7521 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7522 SourceLocation NameLoc = readSourceLocation();
7523 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7526void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7527 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7528 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7529 SourceLocation NameLoc = readSourceLocation();
7530 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7533void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7539void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7546void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7551void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7555void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7569 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7574void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7576 if (Reader.readBool())
7578 if (Reader.readBool())
7582void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7596 VisitTagTypeLoc(TL);
7600 VisitTagTypeLoc(TL);
7603void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7605void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7609void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7613void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7617void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7621void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7622 HLSLAttributedResourceTypeLoc TL) {
7626void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7630void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7634void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7635 SubstTemplateTypeParmTypeLoc TL) {
7639void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7640 SubstTemplateTypeParmPackTypeLoc TL) {
7644void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7645 SubstBuiltinTemplatePackTypeLoc TL) {
7649void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7650 TemplateSpecializationTypeLoc TL) {
7651 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7652 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7653 SourceLocation TemplateKeywordLoc = readSourceLocation();
7654 SourceLocation NameLoc = readSourceLocation();
7655 SourceLocation LAngleLoc = readSourceLocation();
7656 SourceLocation RAngleLoc = readSourceLocation();
7657 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7658 LAngleLoc, RAngleLoc);
7659 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7660 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7661 Args[I] = Reader.readTemplateArgumentLocInfo(
7662 TL.
getTypePtr()->template_arguments()[I].getKind());
7665void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7670void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7676void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7680void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7685void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7694void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7706void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7710void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7716void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7720void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7724void TypeLocReader::VisitDependentBitIntTypeLoc(
7725 clang::DependentBitIntTypeLoc TL) {
7729void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7763std::pair<ModuleFile *, unsigned>
7766 "Predefined type shouldn't be in TypesLoaded");
7768 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7770 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7771 assert(OwningModuleFile &&
7772 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7774 return {OwningModuleFile,
7779 assert(ContextObj &&
"reading type with no AST context");
7790 llvm_unreachable(
"Invalid predefined type");
7806 T = Context.UnsignedCharTy;
7809 T = Context.UnsignedShortTy;
7812 T = Context.UnsignedIntTy;
7815 T = Context.UnsignedLongTy;
7818 T = Context.UnsignedLongLongTy;
7821 T = Context.UnsignedInt128Ty;
7824 T = Context.SignedCharTy;
7827 T = Context.WCharTy;
7830 T = Context.ShortTy;
7839 T = Context.LongLongTy;
7842 T = Context.Int128Ty;
7845 T = Context.BFloat16Ty;
7851 T = Context.FloatTy;
7854 T = Context.DoubleTy;
7857 T = Context.LongDoubleTy;
7860 T = Context.ShortAccumTy;
7863 T = Context.AccumTy;
7866 T = Context.LongAccumTy;
7869 T = Context.UnsignedShortAccumTy;
7872 T = Context.UnsignedAccumTy;
7875 T = Context.UnsignedLongAccumTy;
7878 T = Context.ShortFractTy;
7881 T = Context.FractTy;
7884 T = Context.LongFractTy;
7887 T = Context.UnsignedShortFractTy;
7890 T = Context.UnsignedFractTy;
7893 T = Context.UnsignedLongFractTy;
7896 T = Context.SatShortAccumTy;
7899 T = Context.SatAccumTy;
7902 T = Context.SatLongAccumTy;
7905 T = Context.SatUnsignedShortAccumTy;
7908 T = Context.SatUnsignedAccumTy;
7911 T = Context.SatUnsignedLongAccumTy;
7914 T = Context.SatShortFractTy;
7917 T = Context.SatFractTy;
7920 T = Context.SatLongFractTy;
7923 T = Context.SatUnsignedShortFractTy;
7926 T = Context.SatUnsignedFractTy;
7929 T = Context.SatUnsignedLongFractTy;
7932 T = Context.Float16Ty;
7935 T = Context.Float128Ty;
7938 T = Context.Ibm128Ty;
7941 T = Context.OverloadTy;
7944 T = Context.UnresolvedTemplateTy;
7947 T = Context.BoundMemberTy;
7950 T = Context.PseudoObjectTy;
7953 T = Context.DependentTy;
7956 T = Context.UnknownAnyTy;
7959 T = Context.NullPtrTy;
7962 T = Context.Char8Ty;
7965 T = Context.Char16Ty;
7968 T = Context.Char32Ty;
7971 T = Context.ObjCBuiltinIdTy;
7974 T = Context.ObjCBuiltinClassTy;
7977 T = Context.ObjCBuiltinSelTy;
7979#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7980 case PREDEF_TYPE_##Id##_ID: \
7981 T = Context.SingletonId; \
7983#include "clang/Basic/OpenCLImageTypes.def"
7984#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7985 case PREDEF_TYPE_##Id##_ID: \
7986 T = Context.Id##Ty; \
7988#include "clang/Basic/OpenCLExtensionTypes.def"
7990 T = Context.OCLSamplerTy;
7993 T = Context.OCLEventTy;
7996 T = Context.OCLClkEventTy;
7999 T = Context.OCLQueueTy;
8002 T = Context.OCLReserveIDTy;
8005 T = Context.getAutoDeductType();
8008 T = Context.getAutoRRefDeductType();
8011 T = Context.ARCUnbridgedCastTy;
8014 T = Context.BuiltinFnTy;
8017 T = Context.IncompleteMatrixIdxTy;
8020 T = Context.ArraySectionTy;
8023 T = Context.OMPArrayShapingTy;
8026 T = Context.OMPIteratorTy;
8028#define SVE_TYPE(Name, Id, SingletonId) \
8029 case PREDEF_TYPE_##Id##_ID: \
8030 T = Context.SingletonId; \
8032#include "clang/Basic/AArch64ACLETypes.def"
8033#define PPC_VECTOR_TYPE(Name, Id, Size) \
8034 case PREDEF_TYPE_##Id##_ID: \
8035 T = Context.Id##Ty; \
8037#include "clang/Basic/PPCTypes.def"
8038#define RVV_TYPE(Name, Id, SingletonId) \
8039 case PREDEF_TYPE_##Id##_ID: \
8040 T = Context.SingletonId; \
8042#include "clang/Basic/RISCVVTypes.def"
8043#define WASM_TYPE(Name, Id, SingletonId) \
8044 case PREDEF_TYPE_##Id##_ID: \
8045 T = Context.SingletonId; \
8047#include "clang/Basic/WebAssemblyReferenceTypes.def"
8048#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8049 case PREDEF_TYPE_##Id##_ID: \
8050 T = Context.SingletonId; \
8052#include "clang/Basic/AMDGPUTypes.def"
8053#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8054 case PREDEF_TYPE_##Id##_ID: \
8055 T = Context.SingletonId; \
8057#include "clang/Basic/HLSLIntangibleTypes.def"
8060 assert(!T.isNull() &&
"Unknown predefined type");
8061 return T.withFastQualifiers(FastQuals);
8064 unsigned Index = translateTypeIDToIndex(ID).second;
8066 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
8067 if (TypesLoaded[Index].isNull()) {
8068 TypesLoaded[Index] = readTypeRecord(ID);
8069 if (TypesLoaded[Index].isNull())
8072 TypesLoaded[Index]->setFromAST();
8073 if (DeserializationListener)
8075 TypesLoaded[Index]);
8078 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8091 ReadModuleOffsetMap(F);
8094 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8096 if (ModuleFileIndex == 0)
8101 ModuleFileIndex = MF.
Index + 1;
8102 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8121 TemplateNameLoc, EllipsisLoc);
8132 llvm_unreachable(
"unexpected template argument loc");
8149 unsigned NumArgsAsWritten =
readInt();
8150 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8164 if (NumCurrentElementsDeserializing) {
8169 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8192 auto *II = Name.getAsIdentifierInfo();
8193 assert(II &&
"non-identifier name in C?");
8194 if (II->isOutOfDate())
8211 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8212 Template = CTSD->getSpecializedTemplate();
8213 Args = CTSD->getTemplateArgs().asArray();
8214 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8215 Template = VTSD->getSpecializedTemplate();
8216 Args = VTSD->getTemplateArgs().asArray();
8217 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8218 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8220 Args = FD->getTemplateSpecializationArgs()->asArray();
8225 Template->loadLazySpecializationsImpl(Args);
8230 RecordLocation Loc = getLocalBitOffset(Offset);
8233 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8234 Error(std::move(Err));
8237 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8242 Error(MaybeCode.takeError());
8245 unsigned Code = MaybeCode.get();
8249 if (!MaybeRecCode) {
8250 Error(MaybeRecCode.takeError());
8254 Error(
"malformed AST file: missing C++ ctor initializers");
8258 return Record.readCXXCtorInitializers();
8262 assert(ContextObj &&
"reading base specifiers with no AST context");
8265 RecordLocation Loc = getLocalBitOffset(Offset);
8268 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8269 Error(std::move(Err));
8272 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8277 Error(MaybeCode.takeError());
8280 unsigned Code = MaybeCode.get();
8284 if (!MaybeRecCode) {
8285 Error(MaybeCode.takeError());
8288 unsigned RecCode = MaybeRecCode.get();
8291 Error(
"malformed AST file: missing C++ base specifiers");
8295 unsigned NumBases =
Record.readInt();
8298 for (
unsigned I = 0; I != NumBases; ++I)
8299 Bases[I] =
Record.readCXXBaseSpecifier();
8312 ReadModuleOffsetMap(F);
8315 OwningModuleFileIndex == 0
8319 if (OwningModuleFileIndex == 0)
8322 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8331 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8332 return M.
Index == ModuleFileIndex - 1;
8340 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8341 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8361 DeclCursorForID(ID, Loc);
8366 assert(ContextObj &&
"reading predefined decl without AST context");
8368 Decl *NewLoaded =
nullptr;
8374 return Context.getTranslationUnitDecl();
8377 if (Context.ObjCIdDecl)
8378 return Context.ObjCIdDecl;
8379 NewLoaded = Context.getObjCIdDecl();
8383 if (Context.ObjCSelDecl)
8384 return Context.ObjCSelDecl;
8385 NewLoaded = Context.getObjCSelDecl();
8389 if (Context.ObjCClassDecl)
8390 return Context.ObjCClassDecl;
8391 NewLoaded = Context.getObjCClassDecl();
8395 if (Context.ObjCProtocolClassDecl)
8396 return Context.ObjCProtocolClassDecl;
8397 NewLoaded = Context.getObjCProtocolDecl();
8401 if (Context.Int128Decl)
8402 return Context.Int128Decl;
8403 NewLoaded = Context.getInt128Decl();
8407 if (Context.UInt128Decl)
8408 return Context.UInt128Decl;
8409 NewLoaded = Context.getUInt128Decl();
8413 if (Context.ObjCInstanceTypeDecl)
8414 return Context.ObjCInstanceTypeDecl;
8415 NewLoaded = Context.getObjCInstanceTypeDecl();
8419 if (Context.BuiltinVaListDecl)
8420 return Context.BuiltinVaListDecl;
8421 NewLoaded = Context.getBuiltinVaListDecl();
8425 if (Context.VaListTagDecl)
8426 return Context.VaListTagDecl;
8427 NewLoaded = Context.getVaListTagDecl();
8431 if (Context.BuiltinMSVaListDecl)
8432 return Context.BuiltinMSVaListDecl;
8433 NewLoaded = Context.getBuiltinMSVaListDecl();
8438 return Context.getMSGuidTagDecl();
8441 if (Context.ExternCContext)
8442 return Context.ExternCContext;
8443 NewLoaded = Context.getExternCContextDecl();
8447 if (Context.CFConstantStringTypeDecl)
8448 return Context.CFConstantStringTypeDecl;
8449 NewLoaded = Context.getCFConstantStringDecl();
8453 if (Context.CFConstantStringTagDecl)
8454 return Context.CFConstantStringTagDecl;
8455 NewLoaded = Context.getCFConstantStringTagDecl();
8459 return Context.getMSTypeInfoTagDecl();
8461#define BuiltinTemplate(BTName) \
8462 case PREDEF_DECL##BTName##_ID: \
8463 if (Context.Decl##BTName) \
8464 return Context.Decl##BTName; \
8465 NewLoaded = Context.get##BTName##Decl(); \
8467#include "clang/Basic/BuiltinTemplates.inc"
8470 llvm_unreachable(
"Invalid decl ID");
8474 assert(NewLoaded &&
"Failed to load predefined decl?");
8476 if (DeserializationListener)
8477 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8482unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8483 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8484 if (!OwningModuleFile) {
8493 assert(ContextObj &&
"reading decl with no AST context");
8502 Merged.push_back(ID);
8507 unsigned Index = translateGlobalDeclIDToIndex(ID);
8509 if (Index >= DeclsLoaded.size()) {
8510 assert(0 &&
"declaration ID out-of-range for AST file");
8511 Error(
"declaration ID out-of-range for AST file");
8515 return DeclsLoaded[Index];
8522 unsigned Index = translateGlobalDeclIDToIndex(ID);
8524 if (Index >= DeclsLoaded.size()) {
8525 assert(0 &&
"declaration ID out-of-range for AST file");
8526 Error(
"declaration ID out-of-range for AST file");
8530 if (!DeclsLoaded[Index]) {
8532 if (DeserializationListener)
8533 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8536 return DeclsLoaded[Index];
8545 ReadModuleOffsetMap(M);
8555 uint64_t OrignalModuleFileIndex = 0;
8558 OrignalModuleFileIndex = I + 1;
8562 if (!OrignalModuleFileIndex)
8570 if (Idx >=
Record.size()) {
8571 Error(
"Corrupted AST file");
8588 RecordLocation Loc = getLocalBitOffset(Offset);
8589 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8590 Error(std::move(Err));
8593 assert(NumCurrentElementsDeserializing == 0 &&
8594 "should not be called while already deserializing");
8596 return ReadStmtFromStream(*Loc.F);
8599bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8603 auto It = SpecLookups.find(D);
8604 if (It == SpecLookups.end())
8610 It->second.Table.findAll();
8614 SpecLookups.erase(It);
8616 bool NewSpecsFound =
false;
8617 Deserializing LookupResults(
this);
8618 for (
auto &Info : Infos) {
8619 if (GetExistingDecl(Info))
8621 NewSpecsFound =
true;
8625 return NewSpecsFound;
8632 bool NewSpecsFound =
8633 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8635 return NewSpecsFound;
8637 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8638 return NewSpecsFound;
8641bool ASTReader::LoadExternalSpecializationsImpl(
8642 SpecLookupTableTy &SpecLookups,
const Decl *D,
8647 if (
auto It = SpecLookups.find(D); It != SpecLookups.end())
8648 LookupTable = &It->getSecond();
8654 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8656 llvm::raw_string_ostream OS(Name);
8663 Deserializing LookupResults(
this);
8668 LookupTable->
Table.find(HashValue);
8670 bool NewSpecsFound =
false;
8671 for (
auto &Info : Infos) {
8672 if (GetExistingDecl(Info))
8674 NewSpecsFound =
true;
8678 return NewSpecsFound;
8685 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8686 PartialSpecializationsLookups, D, TemplateArgs);
8688 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8690 return NewDeclsFound;
8698 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8699 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8700 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8702 if (!IsKindWeWant(K))
8705 auto ID = (
DeclID) + LexicalDecls[I + 1];
8710 if (PredefsVisited[ID])
8713 PredefsVisited[ID] =
true;
8717 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8725 for (
const auto &Lexical : TULexicalDecls)
8726 Visit(Lexical.first, Lexical.second);
8728 auto I = LexicalDecls.find(DC);
8729 if (I != LexicalDecls.end())
8730 Visit(I->second.first, I->second.second);
8733 ++NumLexicalDeclContextsRead;
8738class UnalignedDeclIDComp {
8744 : Reader(Reader), Mod(M) {}
8753 SourceLocation RHS = getLocation(R);
8758 SourceLocation LHS = getLocation(L);
8772 unsigned Offset,
unsigned Length,
8776 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8777 if (I == FileDeclIDs.end())
8780 FileDeclsInfo &DInfo = I->second;
8781 if (DInfo.Decls.empty())
8785 BeginLoc =
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
8788 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8790 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8791 if (BeginIt != DInfo.Decls.begin())
8797 while (BeginIt != DInfo.Decls.begin() &&
8800 ->isTopLevelDeclInObjCContainer())
8804 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8805 if (EndIt != DInfo.Decls.end())
8818 "DeclContext has no visible decls in storage");
8825 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8847 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8848 ++NumVisibleDeclContextsRead;
8849 Find(It->second.Table, Name);
8852 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8853 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8854 ++NumModuleLocalVisibleDeclContexts;
8855 Find(It->second.Table, std::make_pair(Name, NamedModule));
8858 if (
auto *NamedModule =
8859 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8861 FindModuleLocalLookup(NamedModule);
8866 if (ContextObj && ContextObj->getCurrentNamedModule())
8867 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8869 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8870 ++NumTULocalVisibleDeclContexts;
8871 Find(It->second.Table, Name);
8884 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
8885 auto It = LookupTables.find(DC);
8886 if (It == LookupTables.end())
8908 findAll(Lookups, NumVisibleDeclContextsRead);
8909 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8910 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8912 for (
auto &[Name, DS] : Decls)
8915 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
8920 auto I = Lookups.find(Primary);
8921 return I == Lookups.end() ?
nullptr : &I->second;
8926 auto I = ModuleLocalLookups.find(Primary);
8927 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
8932 auto I = TULocalLookups.find(Primary);
8933 return I == TULocalLookups.end() ?
nullptr : &I->second;
8940 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
8941 auto I = LookupTable.find(D);
8942 return I == LookupTable.end() ?
nullptr : &I->second;
8947 return PartialSpecializationsLookups.contains(D) ||
8948 SpecializationsLookups.contains(D);
8957 assert(ImplD && Consumer);
8959 for (
auto *I : ImplD->
methods())
8965void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
8966 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
8969 Consumer->HandleInterestingDecl(DeclGroupRef(D));
8972void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
8973 Consumer->HandleVTable(RD);
8977 this->Consumer = Consumer;
8980 PassInterestingDeclsToConsumer();
8982 if (DeserializationListener)
8983 DeserializationListener->ReaderInitialized(
this);
8987 std::fprintf(
stderr,
"*** AST File Statistics:\n");
8989 unsigned NumTypesLoaded =
8990 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
8991 unsigned NumDeclsLoaded =
8992 DeclsLoaded.size() -
8993 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
8994 unsigned NumIdentifiersLoaded =
8995 IdentifiersLoaded.size() -
8997 unsigned NumMacrosLoaded =
8998 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
8999 unsigned NumSelectorsLoaded =
9000 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
9003 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
9004 NumSLocEntriesRead, TotalNumSLocEntries,
9005 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9006 if (!TypesLoaded.empty())
9007 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
9008 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
9009 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
9010 if (!DeclsLoaded.empty())
9011 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
9012 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
9013 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9014 if (!IdentifiersLoaded.empty())
9015 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
9016 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
9017 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9018 if (!MacrosLoaded.empty())
9019 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9020 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
9021 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9022 if (!SelectorsLoaded.empty())
9023 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
9024 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
9025 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9026 if (TotalNumStatements)
9027 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
9028 NumStatementsRead, TotalNumStatements,
9029 ((
float)NumStatementsRead/TotalNumStatements * 100));
9031 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9032 NumMacrosRead, TotalNumMacros,
9033 ((
float)NumMacrosRead/TotalNumMacros * 100));
9034 if (TotalLexicalDeclContexts)
9035 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
9036 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9037 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9039 if (TotalVisibleDeclContexts)
9040 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
9041 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9042 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9044 if (TotalModuleLocalVisibleDeclContexts)
9046 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
9047 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9048 ((
float)NumModuleLocalVisibleDeclContexts /
9049 TotalModuleLocalVisibleDeclContexts * 100));
9050 if (TotalTULocalVisibleDeclContexts)
9051 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
9052 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9053 ((
float)NumTULocalVisibleDeclContexts /
9054 TotalTULocalVisibleDeclContexts * 100));
9055 if (TotalNumMethodPoolEntries)
9056 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
9057 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9058 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9060 if (NumMethodPoolLookups)
9061 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
9062 NumMethodPoolHits, NumMethodPoolLookups,
9063 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9064 if (NumMethodPoolTableLookups)
9065 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
9066 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9067 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9069 if (NumIdentifierLookupHits)
9071 " %u / %u identifier table lookups succeeded (%f%%)\n",
9072 NumIdentifierLookupHits, NumIdentifierLookups,
9073 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9076 std::fprintf(
stderr,
"\n");
9077 GlobalIndex->printStats();
9080 std::fprintf(
stderr,
"\n");
9082 std::fprintf(
stderr,
"\n");
9085template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9086LLVM_DUMP_METHOD
static void
9089 InitialCapacity> &Map) {
9090 if (Map.begin() == Map.end())
9095 llvm::errs() << Name <<
":\n";
9096 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9098 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9103 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9105 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9109 GlobalPreprocessedEntityMap);
9111 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9120 if (llvm::MemoryBuffer *buf = I.Buffer) {
9121 size_t bytes = buf->getBufferSize();
9122 switch (buf->getBufferKind()) {
9123 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9126 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9147 if (!FPPragmaOptions.empty()) {
9148 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9151 SemaObj->CurFPFeatures =
9157 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9158 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9159 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9160 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9162 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9164 DeclsWithEffectsToVerify.clear();
9166 SemaObj->OpenCLFeatures = OpenCLExtensions;
9172 assert(SemaObj &&
"no Sema to update");
9176 if (!SemaDeclRefs.empty()) {
9177 assert(SemaDeclRefs.size() % 3 == 0);
9178 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9179 if (!SemaObj->StdNamespace)
9180 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9181 if (!SemaObj->StdBadAlloc)
9182 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9183 if (!SemaObj->StdAlignValT)
9184 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9186 SemaDeclRefs.clear();
9191 if(OptimizeOffPragmaLocation.isValid())
9192 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9193 if (PragmaMSStructState != -1)
9195 if (PointersToMembersPragmaLocation.isValid()) {
9196 SemaObj->ActOnPragmaMSPointersToMembers(
9198 PragmaMSPointersToMembersState,
9199 PointersToMembersPragmaLocation);
9201 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9202 if (!RISCVVecIntrinsicPragma.empty()) {
9203 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9204 "Wrong number of RISCVVecIntrinsicPragma");
9205 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9206 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9207 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9210 if (PragmaAlignPackCurrentValue) {
9214 bool DropFirst =
false;
9215 if (!PragmaAlignPackStack.empty() &&
9216 PragmaAlignPackStack.front().Location.isInvalid()) {
9217 assert(PragmaAlignPackStack.front().Value ==
9218 SemaObj->AlignPackStack.DefaultValue &&
9219 "Expected a default alignment value");
9220 SemaObj->AlignPackStack.Stack.emplace_back(
9221 PragmaAlignPackStack.front().SlotLabel,
9222 SemaObj->AlignPackStack.CurrentValue,
9223 SemaObj->AlignPackStack.CurrentPragmaLocation,
9224 PragmaAlignPackStack.front().PushLocation);
9227 for (
const auto &Entry :
9228 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9229 SemaObj->AlignPackStack.Stack.emplace_back(
9230 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9232 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9233 assert(*PragmaAlignPackCurrentValue ==
9234 SemaObj->AlignPackStack.DefaultValue &&
9235 "Expected a default align and pack value");
9238 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9239 SemaObj->AlignPackStack.CurrentPragmaLocation =
9240 PragmaAlignPackCurrentLocation;
9243 if (FpPragmaCurrentValue) {
9247 bool DropFirst =
false;
9248 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9249 assert(FpPragmaStack.front().Value ==
9250 SemaObj->FpPragmaStack.DefaultValue &&
9251 "Expected a default pragma float_control value");
9252 SemaObj->FpPragmaStack.Stack.emplace_back(
9253 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9254 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9255 FpPragmaStack.front().PushLocation);
9258 for (
const auto &Entry :
9260 SemaObj->FpPragmaStack.Stack.emplace_back(
9261 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9262 if (FpPragmaCurrentLocation.isInvalid()) {
9263 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9264 "Expected a default pragma float_control value");
9267 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9268 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9273 for (
auto &Import : PendingImportedModulesSema) {
9274 if (Import.ImportLoc.isInvalid())
9277 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9280 PendingImportedModulesSema.clear();
9287 IdentifierLookupVisitor Visitor(Name, 0,
9288 NumIdentifierLookups,
9289 NumIdentifierLookupHits);
9295 if (PP.getLangOpts().CPlusPlus) {
9296 for (
auto *F : ModuleMgr.pch_modules())
9305 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9310 ModuleMgr.visit(Visitor, HitsPtr);
9332 ASTIdentifierLookupTable::key_iterator Current;
9336 ASTIdentifierLookupTable::key_iterator End;
9343 bool SkipModules =
false);
9345 StringRef
Next()
override;
9352 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9356 while (Current == End) {
9368 Current = IdTable->key_begin();
9369 End = IdTable->key_end();
9374 StringRef
Result = *Current;
9383 std::unique_ptr<IdentifierIterator> Current;
9384 std::unique_ptr<IdentifierIterator> Queued;
9387 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9388 std::unique_ptr<IdentifierIterator> Second)
9389 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9391 StringRef
Next()
override {
9395 StringRef result = Current->Next();
9396 if (!result.empty())
9401 std::swap(Current, Queued);
9410 std::unique_ptr<IdentifierIterator> ReaderIter(
9412 std::unique_ptr<IdentifierIterator> ModulesIter(
9413 GlobalIndex->createIdentifierIterator());
9414 return new ChainedIdentifierIterator(std::move(ReaderIter),
9415 std::move(ModulesIter));
9427 unsigned PriorGeneration;
9428 unsigned InstanceBits = 0;
9429 unsigned FactoryBits = 0;
9430 bool InstanceHasMoreThanOneDecl =
false;
9431 bool FactoryHasMoreThanOneDecl =
false;
9437 unsigned PriorGeneration)
9438 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9448 ++Reader.NumMethodPoolTableLookups;
9451 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9452 if (Pos == PoolTable->end())
9455 ++Reader.NumMethodPoolTableHits;
9456 ++Reader.NumSelectorsRead;
9460 ++Reader.NumMethodPoolEntriesRead;
9462 if (Reader.DeserializationListener)
9463 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9468 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9469 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9470 InstanceBits =
Data.InstanceBits;
9471 FactoryBits =
Data.FactoryBits;
9472 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9473 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9479 return InstanceMethods;
9484 return FactoryMethods;
9491 return InstanceHasMoreThanOneDecl;
9509 unsigned &Generation = SelectorGeneration[Sel];
9510 unsigned PriorGeneration = Generation;
9512 SelectorOutOfDate[Sel] =
false;
9515 ++NumMethodPoolLookups;
9517 ModuleMgr.visit(Visitor);
9523 ++NumMethodPoolHits;
9544 if (SelectorOutOfDate[Sel])
9552 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9554 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9555 Namespaces.push_back(Namespace);
9560 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9561 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9562 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9565 Undefined.insert(std::make_pair(D, Loc));
9567 UndefinedButUsed.clear();
9573 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9576 uint64_t Count = DelayedDeleteExprs[Idx++];
9577 for (uint64_t
C = 0;
C < Count; ++
C) {
9580 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9581 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9588 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9589 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9591 TentativeDefs.push_back(Var);
9593 TentativeDefinitions.clear();
9598 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9600 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9604 UnusedFileScopedDecls.clear();
9609 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9611 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9615 DelegatingCtorDecls.clear();
9619 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9621 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9625 ExtVectorDecls.clear();
9630 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9633 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9637 UnusedLocalTypedefNameCandidates.clear();
9642 for (
auto I : DeclsToCheckForDeferredDiags) {
9643 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9647 DeclsToCheckForDeferredDiags.clear();
9652 if (ReferencedSelectorsData.empty())
9657 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9659 while (I < DataSize) {
9663 Sels.push_back(std::make_pair(Sel, SelLoc));
9665 ReferencedSelectorsData.clear();
9670 if (WeakUndeclaredIdentifiers.empty())
9673 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9681 WeakIDs.push_back(std::make_pair(WeakId, WI));
9683 WeakUndeclaredIdentifiers.clear();
9687 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9689 VTableUse &TableInfo = VTableUses[Idx++];
9690 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9693 VTables.push_back(VT);
9701 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9702 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9706 Pending.push_back(std::make_pair(D, Loc));
9708 PendingInstantiations.clear();
9712 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9714 for (
auto &LPT : LateParsedTemplates) {
9717 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9721 auto LT = std::make_unique<LateParsedTemplate>();
9722 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9726 assert(F &&
"No module");
9728 unsigned TokN = LateParsed[Idx++];
9729 LT->Toks.reserve(TokN);
9730 for (
unsigned T = 0; T < TokN; ++T)
9731 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9733 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9737 LateParsedTemplates.clear();
9749 if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9750 Iter != LambdaDeclarationsForMerging.end() &&
9751 Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
9760 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9769 assert(ID &&
"Non-zero identifier ID required");
9770 unsigned Index = translateIdentifierIDToIndex(ID).second;
9771 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9772 IdentifiersLoaded[Index] = II;
9773 if (DeserializationListener)
9774 DeserializationListener->IdentifierRead(ID, II);
9796 if (NumCurrentElementsDeserializing && !Decls) {
9797 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9801 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9814 Decls->push_back(D);
9821 pushExternalDeclIntoScope(D, II);
9825std::pair<ModuleFile *, unsigned>
9826ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9828 return {
nullptr, 0};
9830 unsigned ModuleFileIndex = ID >> 32;
9831 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9833 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9845 if (IdentifiersLoaded.empty()) {
9846 Error(
"no identifier table in AST file");
9850 auto [M, Index] = translateIdentifierIDToIndex(ID);
9851 if (!IdentifiersLoaded[Index]) {
9852 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9855 const unsigned char *
Data =
9861 auto &II = PP.getIdentifierTable().get(Key);
9862 IdentifiersLoaded[Index] = &II;
9865 if (DeserializationListener)
9866 DeserializationListener->IdentifierRead(ID, &II);
9869 return IdentifiersLoaded[Index];
9881 ReadModuleOffsetMap(M);
9883 unsigned ModuleFileIndex = LocalID >> 32;
9884 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9887 assert(MF &&
"malformed identifier ID encoding?");
9889 if (!ModuleFileIndex)
9895std::pair<ModuleFile *, unsigned>
9896ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
9898 return {
nullptr, 0};
9900 unsigned ModuleFileIndex = ID >> 32;
9901 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
9905 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
9914 if (MacrosLoaded.empty()) {
9915 Error(
"no macro table in AST file");
9919 auto [M, Index] = translateMacroIDToIndex(ID);
9920 if (!MacrosLoaded[Index]) {
9921 assert(M !=
nullptr &&
"Untranslated Macro ID?");
9927 if (DeserializationListener)
9928 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
9931 return MacrosLoaded[Index];
9939 ReadModuleOffsetMap(M);
9941 unsigned ModuleFileIndex = LocalID >> 32;
9942 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
9945 assert(MF &&
"malformed identifier ID encoding?");
9947 if (!ModuleFileIndex) {
9952 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
9961 ReadModuleOffsetMap(M);
9966 &&
"Invalid index into submodule index remap");
9968 return LocalID + I->second;
9973 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
9977 if (GlobalID > SubmodulesLoaded.size()) {
9978 Error(
"submodule ID out of range in AST file");
9993 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
9996 int IndexFromEnd =
static_cast<int>(ID >> 1);
9997 assert(IndexFromEnd &&
"got reference to unknown module file");
10014 auto I = llvm::find(PCHModules, M);
10015 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
10016 return std::distance(I, PCHModules.end()) << 1;
10025 const auto &PCHChain = ModuleMgr.pch_modules();
10026 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10027 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10031 llvm::sys::path::parent_path(MF.
FileName),
10034 return std::nullopt;
10038 auto I = DefinitionSource.find(FD);
10039 if (I == DefinitionSource.end())
10045 return ThisDeclarationWasADefinitionSet.contains(FD);
10056 if (ID > SelectorsLoaded.size()) {
10057 Error(
"selector ID out of range in AST file");
10061 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
10064 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
10068 SelectorsLoaded[ID - 1] =
10070 if (DeserializationListener)
10071 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10074 return SelectorsLoaded[ID - 1];
10092 ReadModuleOffsetMap(M);
10097 &&
"Invalid index into selector index remap");
10099 return LocalID + I->second;
10130 NameInfo.
setName(readDeclarationName());
10144 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10145 assert(Op.isValid());
10151 unsigned NumTPLists =
readInt();
10156 for (
unsigned i = 0; i != NumTPLists; ++i)
10167 unsigned NumParams =
readInt();
10169 Params.reserve(NumParams);
10170 while (NumParams--)
10173 bool HasRequiresClause =
readBool();
10174 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10177 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10178 return TemplateParams;
10183 bool Canonicalize) {
10184 unsigned NumTemplateArgs =
readInt();
10185 TemplArgs.reserve(NumTemplateArgs);
10186 while (NumTemplateArgs--)
10192 unsigned NumDecls =
readInt();
10194 while (NumDecls--) {
10206 bool inheritConstructors =
readBool();
10212 Result.setInheritConstructors(inheritConstructors);
10219 unsigned NumInitializers =
readInt();
10220 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10222 for (
unsigned i = 0; i != NumInitializers; ++i) {
10224 bool IsBaseVirtual =
false;
10255 BOMInit =
new (Context)
10257 RParenLoc, MemberOrEllipsisLoc);
10259 BOMInit =
new (Context)
10262 BOMInit =
new (Context)
10266 BOMInit =
new (Context)
10268 LParenLoc,
Init, RParenLoc);
10271 unsigned SourceOrder =
readInt();
10275 CtorInitializers[i] = BOMInit;
10278 return CtorInitializers;
10286 for (
unsigned I = 0; I != N; ++I) {
10287 auto Kind = readNestedNameSpecifierKind();
10292 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10301 Builder.Make(Context, T->getTypeLoc(), ColonColonLoc);
10307 Builder.MakeGlobal(Context, ColonColonLoc);
10314 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10319 llvm_unreachable(
"unexpected null nested name specifier");
10334 const StringRef Blob) {
10335 unsigned Count =
Record[0];
10336 const char *Byte = Blob.data();
10337 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10338 for (
unsigned I = 0; I < Count; ++Byte)
10339 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10340 if (*Byte & (1 << Bit))
10347 return llvm::APFloat(Sem,
readAPInt());
10352 unsigned Len =
Record[Idx++];
10360 unsigned Len =
Record[Idx++];
10361 StringRef
Result = Blob.substr(0, Len);
10362 Blob = Blob.substr(Len);
10386 unsigned Major =
Record[Idx++];
10387 unsigned Minor =
Record[Idx++];
10388 unsigned Subminor =
Record[Idx++];
10390 return VersionTuple(Major);
10392 return VersionTuple(Major, Minor - 1);
10393 return VersionTuple(Major, Minor - 1, Subminor - 1);
10404 return Diag(CurrentImportLoc, DiagID);
10408 return Diags.Report(Loc, DiagID);
10412 llvm::function_ref<
void()> Fn) {
10415 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10419 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10425 return PP.getIdentifierTable();
10431 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10432 "Already have a SwitchCase with this ID");
10433 (*CurrSwitchCaseStmts)[ID] = SC;
10438 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10439 return (*CurrSwitchCaseStmts)[ID];
10443 CurrSwitchCaseStmts->clear();
10448 std::vector<RawComment *> Comments;
10455 BitstreamCursor &Cursor = I->first;
10462 Cursor.advanceSkippingSubblocks(
10463 BitstreamCursor::AF_DontPopBlockAtEnd);
10465 Error(MaybeEntry.takeError());
10468 llvm::BitstreamEntry Entry = MaybeEntry.get();
10470 switch (Entry.Kind) {
10471 case llvm::BitstreamEntry::SubBlock:
10472 case llvm::BitstreamEntry::Error:
10473 Error(
"malformed block record in AST file");
10475 case llvm::BitstreamEntry::EndBlock:
10477 case llvm::BitstreamEntry::Record:
10485 if (!MaybeComment) {
10486 Error(MaybeComment.takeError());
10495 bool IsTrailingComment =
Record[Idx++];
10496 bool IsAlmostTrailingComment =
Record[Idx++];
10497 Comments.push_back(
new (Context)
RawComment(
10498 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10508 if (Loc.first.isValid())
10509 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10522 assert(NumUserInputs <= NumInputs);
10523 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10524 for (
unsigned I = 0; I < N; ++I) {
10525 bool IsSystem = I >= NumUserInputs;
10527 Visitor(IFI, IsSystem);
10532 bool IncludeSystem,
bool Complain,
10534 bool isSystem)> Visitor) {
10537 assert(NumUserInputs <= NumInputs);
10538 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10539 for (
unsigned I = 0; I < N; ++I) {
10540 bool IsSystem = I >= NumUserInputs;
10541 InputFile IF = getInputFile(MF, I+1, Complain);
10542 Visitor(IF, IsSystem);
10550 for (
unsigned I = 0; I < NumInputs; ++I) {
10553 if (
auto FE = getInputFile(MF, I + 1).getFile())
10558void ASTReader::finishPendingActions() {
10559 while (!PendingIdentifierInfos.empty() ||
10560 !PendingDeducedFunctionTypes.empty() ||
10561 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10562 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10563 !PendingUpdateRecords.empty() ||
10564 !PendingObjCExtensionIvarRedeclarations.empty()) {
10567 using TopLevelDeclsMap =
10568 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10569 TopLevelDeclsMap TopLevelDecls;
10571 while (!PendingIdentifierInfos.empty()) {
10574 std::move(PendingIdentifierInfos.back().second);
10575 PendingIdentifierInfos.pop_back();
10582 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10583 auto *FD = PendingDeducedFunctionTypes[I].first;
10584 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10586 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10589 if (DT->isDeduced()) {
10590 PendingDeducedTypeUpdates.insert(
10591 {FD->getCanonicalDecl(), FD->getReturnType()});
10598 PendingUndeducedFunctionDecls.push_back(FD);
10602 PendingDeducedFunctionTypes.clear();
10606 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10607 auto *VD = PendingDeducedVarTypes[I].first;
10608 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10610 PendingDeducedVarTypes.clear();
10613 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10614 loadPendingDeclChain(PendingDeclChains[I].first,
10615 PendingDeclChains[I].second);
10616 PendingDeclChains.clear();
10619 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10620 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10621 IdentifierInfo *II = TLD->first;
10622 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10628 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10629 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10630 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10631 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10633 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10635 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10636 if (!Info.M->isModule())
10640 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10642 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10643 if (Info.M->isModule())
10647 PendingMacroIDs.clear();
10651 while (!PendingDeclContextInfos.empty()) {
10652 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10653 PendingDeclContextInfos.pop_front();
10656 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10660 while (!PendingUpdateRecords.empty()) {
10661 auto Update = PendingUpdateRecords.pop_back_val();
10662 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10663 loadDeclUpdateRecords(
Update);
10666 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10667 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10668 auto DuplicateIvars =
10669 PendingObjCExtensionIvarRedeclarations.back().second;
10671 StructuralEquivalenceContext Ctx(
10672 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10673 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10677 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10679 for (
auto IvarPair : DuplicateIvars) {
10680 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10682 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10688 ExtensionsPair.first->setInvalidDecl();
10689 ExtensionsPair.second->getClassInterface()
10691 ->setIvarList(
nullptr);
10693 for (
auto IvarPair : DuplicateIvars) {
10694 Diag(IvarPair.first->getLocation(),
10695 diag::err_duplicate_ivar_declaration)
10696 << IvarPair.first->getIdentifier();
10697 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10700 PendingObjCExtensionIvarRedeclarations.pop_back();
10706 assert(PendingFakeDefinitionData.empty() &&
10707 "faked up a class definition but never saw the real one");
10713 for (Decl *D : PendingDefinitions) {
10714 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10715 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10716 for (
auto *R = getMostRecentExistingDecl(RD); R;
10717 R = R->getPreviousDecl()) {
10720 "declaration thinks it's the definition but it isn't");
10728 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10733 for (
auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10739 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10740 for (
auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10747 for (
auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10750 PendingDefinitions.clear();
10752 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10753 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10754 if (
auto *VD = dyn_cast<VarDecl>(D))
10755 return VD->isThisDeclarationADefinition() ||
10756 VD->isThisDeclarationADemotedDefinition();
10758 if (
auto *TD = dyn_cast<TagDecl>(D))
10759 return TD->isThisDeclarationADefinition() ||
10760 TD->isThisDeclarationADemotedDefinition();
10762 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10763 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10765 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10766 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10773 return hasDefinitionImpl(D, hasDefinitionImpl);
10789 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10795 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10796 PBEnd = PendingBodies.end();
10797 PB != PBEnd; ++PB) {
10798 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10800 const FunctionDecl *Defn =
nullptr;
10801 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10802 FD->setLazyBody(PB->second);
10804 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10807 if (!FD->isLateTemplateParsed() &&
10808 !NonConstDefn->isLateTemplateParsed() &&
10813 FD->getODRHash() != NonConstDefn->getODRHash()) {
10815 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10816 }
else if (FD->getLexicalParent()->isFileContext() &&
10817 NonConstDefn->getLexicalParent()->isFileContext()) {
10821 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10832 PendingBodies.clear();
10835 for (
auto [RD, MD] : PendingAddedClassMembers) {
10836 RD->addedMember(MD);
10838 PendingAddedClassMembers.clear();
10841 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10843 PendingMergedDefinitionsToDeduplicate.clear();
10847 for (Decl *D : PendingIncompleteDeclChains)
10848 markIncompleteDeclChain(D);
10849 PendingIncompleteDeclChains.clear();
10851 assert(PendingIdentifierInfos.empty() &&
10852 "Should be empty at the end of finishPendingActions");
10853 assert(PendingDeducedFunctionTypes.empty() &&
10854 "Should be empty at the end of finishPendingActions");
10855 assert(PendingDeducedVarTypes.empty() &&
10856 "Should be empty at the end of finishPendingActions");
10857 assert(PendingDeclChains.empty() &&
10858 "Should be empty at the end of finishPendingActions");
10859 assert(PendingMacroIDs.empty() &&
10860 "Should be empty at the end of finishPendingActions");
10861 assert(PendingDeclContextInfos.empty() &&
10862 "Should be empty at the end of finishPendingActions");
10863 assert(PendingUpdateRecords.empty() &&
10864 "Should be empty at the end of finishPendingActions");
10865 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10866 "Should be empty at the end of finishPendingActions");
10867 assert(PendingFakeDefinitionData.empty() &&
10868 "Should be empty at the end of finishPendingActions");
10869 assert(PendingDefinitions.empty() &&
10870 "Should be empty at the end of finishPendingActions");
10871 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10872 "Should be empty at the end of finishPendingActions");
10873 assert(PendingBodies.empty() &&
10874 "Should be empty at the end of finishPendingActions");
10875 assert(PendingAddedClassMembers.empty() &&
10876 "Should be empty at the end of finishPendingActions");
10877 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10878 "Should be empty at the end of finishPendingActions");
10879 assert(PendingIncompleteDeclChains.empty() &&
10880 "Should be empty at the end of finishPendingActions");
10883void ASTReader::diagnoseOdrViolations() {
10884 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10885 PendingRecordOdrMergeFailures.empty() &&
10886 PendingFunctionOdrMergeFailures.empty() &&
10887 PendingEnumOdrMergeFailures.empty() &&
10888 PendingObjCInterfaceOdrMergeFailures.empty() &&
10889 PendingObjCProtocolOdrMergeFailures.empty())
10896 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10897 PendingOdrMergeFailures.clear();
10898 for (
auto &Merge : OdrMergeFailures) {
10899 Merge.first->buildLookup();
10900 Merge.first->decls_begin();
10901 Merge.first->bases_begin();
10902 Merge.first->vbases_begin();
10903 for (
auto &RecordPair : Merge.second) {
10904 auto *RD = RecordPair.first;
10912 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
10913 PendingRecordOdrMergeFailures.clear();
10914 for (
auto &Merge : RecordOdrMergeFailures) {
10915 Merge.first->decls_begin();
10916 for (
auto &D : Merge.second)
10921 auto ObjCInterfaceOdrMergeFailures =
10922 std::move(PendingObjCInterfaceOdrMergeFailures);
10923 PendingObjCInterfaceOdrMergeFailures.clear();
10924 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
10925 Merge.first->decls_begin();
10926 for (
auto &InterfacePair : Merge.second)
10927 InterfacePair.first->decls_begin();
10931 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
10932 PendingFunctionOdrMergeFailures.clear();
10933 for (
auto &Merge : FunctionOdrMergeFailures) {
10934 Merge.first->buildLookup();
10935 Merge.first->decls_begin();
10936 Merge.first->getBody();
10937 for (
auto &FD : Merge.second) {
10945 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
10946 PendingEnumOdrMergeFailures.clear();
10947 for (
auto &Merge : EnumOdrMergeFailures) {
10948 Merge.first->decls_begin();
10949 for (
auto &
Enum : Merge.second) {
10950 Enum->decls_begin();
10955 auto ObjCProtocolOdrMergeFailures =
10956 std::move(PendingObjCProtocolOdrMergeFailures);
10957 PendingObjCProtocolOdrMergeFailures.clear();
10958 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
10959 Merge.first->decls_begin();
10960 for (
auto &ProtocolPair : Merge.second)
10961 ProtocolPair.first->decls_begin();
10970 while (!PendingOdrMergeChecks.empty()) {
10971 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
10982 bool Found =
false;
10985 for (
auto *RI : D->
redecls()) {
10986 if (RI->getLexicalDeclContext() == CanonDef) {
11000 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11001 for (
auto *CanonMember : CanonDef->
decls()) {
11002 if (CanonMember->getCanonicalDecl() == DCanon) {
11011 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
11013 Candidates.push_back(ND);
11026 std::string CanonDefModule =
11031 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11033 if (Candidates.empty())
11035 diag::note_module_odr_violation_no_possible_decls) << D;
11037 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
11038 Diag(Candidates[I]->getLocation(),
11039 diag::note_module_odr_violation_possible_decl)
11043 DiagnosedOdrMergeFailures.insert(CanonDef);
11047 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11048 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11049 ObjCInterfaceOdrMergeFailures.empty() &&
11050 ObjCProtocolOdrMergeFailures.empty())
11053 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
11057 for (
auto &Merge : OdrMergeFailures) {
11060 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11063 bool Diagnosed =
false;
11064 CXXRecordDecl *FirstRecord = Merge.first;
11065 for (
auto &RecordPair : Merge.second) {
11066 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11067 RecordPair.second)) {
11080 Diag(Merge.first->getLocation(),
11081 diag::err_module_odr_violation_different_instantiations)
11088 for (
auto &Merge : RecordOdrMergeFailures) {
11091 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11094 RecordDecl *FirstRecord = Merge.first;
11095 bool Diagnosed =
false;
11096 for (
auto *SecondRecord : Merge.second) {
11097 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11103 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11107 for (
auto &Merge : FunctionOdrMergeFailures) {
11108 FunctionDecl *FirstFunction = Merge.first;
11109 bool Diagnosed =
false;
11110 for (
auto &SecondFunction : Merge.second) {
11111 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11117 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11121 for (
auto &Merge : EnumOdrMergeFailures) {
11124 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11127 EnumDecl *FirstEnum = Merge.first;
11128 bool Diagnosed =
false;
11129 for (
auto &SecondEnum : Merge.second) {
11130 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11136 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11139 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11142 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11145 bool Diagnosed =
false;
11146 ObjCInterfaceDecl *FirstID = Merge.first;
11147 for (
auto &InterfacePair : Merge.second) {
11148 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11149 InterfacePair.second)) {
11155 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11158 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11161 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11164 ObjCProtocolDecl *FirstProtocol = Merge.first;
11165 bool Diagnosed =
false;
11166 for (
auto &ProtocolPair : Merge.second) {
11167 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11168 ProtocolPair.second)) {
11174 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11179 if (llvm::Timer *T = ReadTimer.get();
11180 ++NumCurrentElementsDeserializing == 1 && T)
11181 ReadTimeRegion.emplace(T);
11185 assert(NumCurrentElementsDeserializing &&
11186 "FinishedDeserializing not paired with StartedDeserializing");
11187 if (NumCurrentElementsDeserializing == 1) {
11190 finishPendingActions();
11192 --NumCurrentElementsDeserializing;
11194 if (NumCurrentElementsDeserializing == 0) {
11198 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11206 while (!PendingExceptionSpecUpdates.empty() ||
11207 !PendingDeducedTypeUpdates.empty() ||
11208 !PendingUndeducedFunctionDecls.empty()) {
11209 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11210 PendingExceptionSpecUpdates.clear();
11211 for (
auto Update : ESUpdates) {
11212 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11215 if (
auto *Listener =
getContext().getASTMutationListener())
11217 for (
auto *Redecl :
Update.second->redecls())
11221 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11222 PendingDeducedTypeUpdates.clear();
11223 for (
auto Update : DTUpdates) {
11224 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11231 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11232 PendingUndeducedFunctionDecls.clear();
11236 (void)UndeducedFD->getMostRecentDecl();
11239 ReadTimeRegion.reset();
11241 diagnoseOdrViolations();
11247 PassInterestingDeclsToConsumer();
11254 auto It = PendingFakeLookupResults.find(II);
11255 if (It != PendingFakeLookupResults.end()) {
11256 for (
auto *ND : It->second)
11261 It->second.clear();
11265 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11266 SemaObj->TUScope->AddDecl(D);
11267 }
else if (SemaObj->TUScope) {
11271 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11272 SemaObj->TUScope->AddDecl(D);
11280 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11281 StringRef isysroot,
11283 bool AllowASTWithCompilerErrors,
11284 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11285 bool ForceValidateUserInputs,
11286 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11287 std::unique_ptr<llvm::Timer> ReadTimer)
11292 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11293 StackHandler(Diags), PP(PP), ContextObj(Context),
11294 CodeGenOpts(CodeGenOpts),
11296 PP.getHeaderSearchInfo()),
11297 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11298 DisableValidationKind(DisableValidationKind),
11299 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11300 AllowConfigurationMismatch(AllowConfigurationMismatch),
11301 ValidateSystemInputs(ValidateSystemInputs),
11302 ForceValidateUserInputs(ForceValidateUserInputs),
11303 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11304 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11305 SourceMgr.setExternalSLocEntrySource(
this);
11307 PathBuf.reserve(256);
11309 for (
const auto &Ext : Extensions) {
11310 auto BlockName = Ext->getExtensionMetadata().BlockName;
11311 auto Known = ModuleFileExtensions.find(BlockName);
11312 if (Known != ModuleFileExtensions.end()) {
11313 Diags.Report(diag::warn_duplicate_module_file_extension)
11318 ModuleFileExtensions.insert({BlockName, Ext});
11323 if (OwnsDeserializationListener)
11324 delete DeserializationListener;
11328 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11332 unsigned AbbrevID) {
11335 return Cursor.readRecord(AbbrevID, Record);
11351 : Record(Record), Context(Record.getContext()) {}
11352#define GEN_CLANG_CLAUSE_CLASS
11353#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11354#include "llvm/Frontend/OpenMP/OMP.inc"
11368 switch (llvm::omp::Clause(Record.readInt())) {
11369 case llvm::omp::OMPC_if:
11372 case llvm::omp::OMPC_final:
11375 case llvm::omp::OMPC_num_threads:
11378 case llvm::omp::OMPC_safelen:
11381 case llvm::omp::OMPC_simdlen:
11384 case llvm::omp::OMPC_sizes: {
11385 unsigned NumSizes = Record.readInt();
11389 case llvm::omp::OMPC_permutation: {
11390 unsigned NumLoops = Record.readInt();
11394 case llvm::omp::OMPC_full:
11397 case llvm::omp::OMPC_partial:
11400 case llvm::omp::OMPC_looprange:
11403 case llvm::omp::OMPC_allocator:
11406 case llvm::omp::OMPC_collapse:
11409 case llvm::omp::OMPC_default:
11412 case llvm::omp::OMPC_proc_bind:
11413 C =
new (Context) OMPProcBindClause();
11415 case llvm::omp::OMPC_schedule:
11416 C =
new (Context) OMPScheduleClause();
11418 case llvm::omp::OMPC_ordered:
11419 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11421 case llvm::omp::OMPC_nowait:
11422 C =
new (Context) OMPNowaitClause();
11424 case llvm::omp::OMPC_untied:
11425 C =
new (Context) OMPUntiedClause();
11427 case llvm::omp::OMPC_mergeable:
11428 C =
new (Context) OMPMergeableClause();
11430 case llvm::omp::OMPC_threadset:
11433 case llvm::omp::OMPC_transparent:
11434 C =
new (Context) OMPTransparentClause();
11436 case llvm::omp::OMPC_read:
11437 C =
new (Context) OMPReadClause();
11439 case llvm::omp::OMPC_write:
11440 C =
new (Context) OMPWriteClause();
11442 case llvm::omp::OMPC_update:
11443 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11445 case llvm::omp::OMPC_capture:
11446 C =
new (Context) OMPCaptureClause();
11448 case llvm::omp::OMPC_compare:
11449 C =
new (Context) OMPCompareClause();
11451 case llvm::omp::OMPC_fail:
11452 C =
new (Context) OMPFailClause();
11454 case llvm::omp::OMPC_seq_cst:
11455 C =
new (Context) OMPSeqCstClause();
11457 case llvm::omp::OMPC_acq_rel:
11458 C =
new (Context) OMPAcqRelClause();
11460 case llvm::omp::OMPC_absent: {
11461 unsigned NumKinds = Record.readInt();
11462 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11465 case llvm::omp::OMPC_holds:
11466 C =
new (Context) OMPHoldsClause();
11468 case llvm::omp::OMPC_contains: {
11469 unsigned NumKinds = Record.readInt();
11470 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11473 case llvm::omp::OMPC_no_openmp:
11474 C =
new (Context) OMPNoOpenMPClause();
11476 case llvm::omp::OMPC_no_openmp_routines:
11477 C =
new (Context) OMPNoOpenMPRoutinesClause();
11479 case llvm::omp::OMPC_no_openmp_constructs:
11480 C =
new (Context) OMPNoOpenMPConstructsClause();
11482 case llvm::omp::OMPC_no_parallelism:
11483 C =
new (Context) OMPNoParallelismClause();
11485 case llvm::omp::OMPC_acquire:
11486 C =
new (Context) OMPAcquireClause();
11488 case llvm::omp::OMPC_release:
11489 C =
new (Context) OMPReleaseClause();
11491 case llvm::omp::OMPC_relaxed:
11492 C =
new (Context) OMPRelaxedClause();
11494 case llvm::omp::OMPC_weak:
11495 C =
new (Context) OMPWeakClause();
11497 case llvm::omp::OMPC_threads:
11500 case llvm::omp::OMPC_simd:
11503 case llvm::omp::OMPC_nogroup:
11506 case llvm::omp::OMPC_unified_address:
11507 C =
new (Context) OMPUnifiedAddressClause();
11509 case llvm::omp::OMPC_unified_shared_memory:
11510 C =
new (Context) OMPUnifiedSharedMemoryClause();
11512 case llvm::omp::OMPC_reverse_offload:
11513 C =
new (Context) OMPReverseOffloadClause();
11515 case llvm::omp::OMPC_dynamic_allocators:
11516 C =
new (Context) OMPDynamicAllocatorsClause();
11518 case llvm::omp::OMPC_atomic_default_mem_order:
11519 C =
new (Context) OMPAtomicDefaultMemOrderClause();
11521 case llvm::omp::OMPC_self_maps:
11522 C =
new (Context) OMPSelfMapsClause();
11524 case llvm::omp::OMPC_at:
11525 C =
new (Context) OMPAtClause();
11527 case llvm::omp::OMPC_severity:
11528 C =
new (Context) OMPSeverityClause();
11530 case llvm::omp::OMPC_message:
11531 C =
new (Context) OMPMessageClause();
11533 case llvm::omp::OMPC_private:
11534 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11536 case llvm::omp::OMPC_firstprivate:
11537 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11539 case llvm::omp::OMPC_lastprivate:
11540 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11542 case llvm::omp::OMPC_shared:
11543 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11545 case llvm::omp::OMPC_reduction: {
11546 unsigned N = Record.readInt();
11548 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11551 case llvm::omp::OMPC_task_reduction:
11552 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11554 case llvm::omp::OMPC_in_reduction:
11555 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11557 case llvm::omp::OMPC_linear:
11558 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11560 case llvm::omp::OMPC_aligned:
11563 case llvm::omp::OMPC_copyin:
11566 case llvm::omp::OMPC_copyprivate:
11569 case llvm::omp::OMPC_flush:
11572 case llvm::omp::OMPC_depobj:
11575 case llvm::omp::OMPC_depend: {
11576 unsigned NumVars = Record.readInt();
11577 unsigned NumLoops = Record.readInt();
11581 case llvm::omp::OMPC_device:
11584 case llvm::omp::OMPC_map: {
11586 Sizes.
NumVars = Record.readInt();
11593 case llvm::omp::OMPC_num_teams:
11596 case llvm::omp::OMPC_thread_limit:
11599 case llvm::omp::OMPC_priority:
11602 case llvm::omp::OMPC_grainsize:
11605 case llvm::omp::OMPC_num_tasks:
11608 case llvm::omp::OMPC_hint:
11611 case llvm::omp::OMPC_dist_schedule:
11614 case llvm::omp::OMPC_defaultmap:
11617 case llvm::omp::OMPC_to: {
11619 Sizes.
NumVars = Record.readInt();
11626 case llvm::omp::OMPC_from: {
11628 Sizes.
NumVars = Record.readInt();
11635 case llvm::omp::OMPC_use_device_ptr: {
11637 Sizes.
NumVars = Record.readInt();
11644 case llvm::omp::OMPC_use_device_addr: {
11646 Sizes.
NumVars = Record.readInt();
11653 case llvm::omp::OMPC_is_device_ptr: {
11655 Sizes.
NumVars = Record.readInt();
11662 case llvm::omp::OMPC_has_device_addr: {
11664 Sizes.
NumVars = Record.readInt();
11671 case llvm::omp::OMPC_allocate:
11674 case llvm::omp::OMPC_nontemporal:
11677 case llvm::omp::OMPC_inclusive:
11680 case llvm::omp::OMPC_exclusive:
11683 case llvm::omp::OMPC_order:
11686 case llvm::omp::OMPC_init:
11689 case llvm::omp::OMPC_use:
11692 case llvm::omp::OMPC_destroy:
11695 case llvm::omp::OMPC_novariants:
11698 case llvm::omp::OMPC_nocontext:
11701 case llvm::omp::OMPC_detach:
11704 case llvm::omp::OMPC_uses_allocators:
11707 case llvm::omp::OMPC_affinity:
11710 case llvm::omp::OMPC_filter:
11713 case llvm::omp::OMPC_bind:
11716 case llvm::omp::OMPC_align:
11719 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11722 case llvm::omp::OMPC_dyn_groupprivate:
11725 case llvm::omp::OMPC_doacross: {
11726 unsigned NumVars = Record.readInt();
11727 unsigned NumLoops = Record.readInt();
11731 case llvm::omp::OMPC_ompx_attribute:
11734 case llvm::omp::OMPC_ompx_bare:
11737#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11738 case llvm::omp::Enum: \
11740#include "llvm/Frontend/OpenMP/OMPKinds.def"
11744 assert(
C &&
"Unknown OMPClause type");
11747 C->setLocStart(Record.readSourceLocation());
11748 C->setLocEnd(Record.readSourceLocation());
11754 C->setPreInitStmt(Record.readSubStmt(),
11760 C->setPostUpdateExpr(Record.readSubExpr());
11763void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11766 C->setNameModifierLoc(
Record.readSourceLocation());
11767 C->setColonLoc(
Record.readSourceLocation());
11768 C->setCondition(
Record.readSubExpr());
11769 C->setLParenLoc(
Record.readSourceLocation());
11774 C->setCondition(
Record.readSubExpr());
11775 C->setLParenLoc(
Record.readSourceLocation());
11781 C->setNumThreads(Record.readSubExpr());
11782 C->setModifierLoc(Record.readSourceLocation());
11783 C->setLParenLoc(Record.readSourceLocation());
11787 C->setSafelen(Record.readSubExpr());
11788 C->setLParenLoc(Record.readSourceLocation());
11792 C->setSimdlen(Record.readSubExpr());
11793 C->setLParenLoc(Record.readSourceLocation());
11797 for (Expr *&E :
C->getSizesRefs())
11798 E = Record.readSubExpr();
11799 C->setLParenLoc(Record.readSourceLocation());
11803 for (Expr *&E :
C->getArgsRefs())
11804 E = Record.readSubExpr();
11805 C->setLParenLoc(Record.readSourceLocation());
11811 C->setFactor(Record.readSubExpr());
11812 C->setLParenLoc(Record.readSourceLocation());
11816 C->setFirst(Record.readSubExpr());
11817 C->setCount(Record.readSubExpr());
11818 C->setLParenLoc(Record.readSourceLocation());
11819 C->setFirstLoc(Record.readSourceLocation());
11820 C->setCountLoc(Record.readSourceLocation());
11824 C->setAllocator(Record.readExpr());
11825 C->setLParenLoc(Record.readSourceLocation());
11829 C->setNumForLoops(Record.readSubExpr());
11830 C->setLParenLoc(Record.readSourceLocation());
11834 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11835 C->setLParenLoc(Record.readSourceLocation());
11836 C->setDefaultKindKwLoc(Record.readSourceLocation());
11837 C->setDefaultVariableCategory(
11839 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11845 C->setLParenLoc(Record.readSourceLocation());
11846 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11847 C->setThreadsetKindLoc(ThreadsetKindLoc);
11850 C->setThreadsetKind(TKind);
11853void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *
C) {
11854 C->setLParenLoc(Record.readSourceLocation());
11855 C->setImpexTypeKind(Record.readSubExpr());
11858void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *
C) {
11859 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11860 C->setLParenLoc(Record.readSourceLocation());
11861 C->setProcBindKindKwLoc(Record.readSourceLocation());
11864void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *
C) {
11866 C->setScheduleKind(
11868 C->setFirstScheduleModifier(
11870 C->setSecondScheduleModifier(
11872 C->setChunkSize(Record.readSubExpr());
11873 C->setLParenLoc(Record.readSourceLocation());
11874 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11875 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11876 C->setScheduleKindLoc(Record.readSourceLocation());
11877 C->setCommaLoc(Record.readSourceLocation());
11880void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *
C) {
11881 C->setNumForLoops(Record.readSubExpr());
11882 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11883 C->setLoopNumIterations(I, Record.readSubExpr());
11884 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11885 C->setLoopCounter(I, Record.readSubExpr());
11886 C->setLParenLoc(Record.readSourceLocation());
11889void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *
C) {
11890 C->setEventHandler(Record.readSubExpr());
11891 C->setLParenLoc(Record.readSourceLocation());
11894void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *
C) {
11895 C->setCondition(Record.readSubExpr());
11896 C->setLParenLoc(Record.readSourceLocation());
11899void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
11901void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
11903void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
11905void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
11907void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *
C) {
11908 if (
C->isExtended()) {
11909 C->setLParenLoc(Record.readSourceLocation());
11910 C->setArgumentLoc(Record.readSourceLocation());
11915void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
11917void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
11921void OMPClauseReader::VisitOMPFailClause(OMPFailClause *
C) {
11922 C->setLParenLoc(Record.readSourceLocation());
11923 SourceLocation FailParameterLoc = Record.readSourceLocation();
11924 C->setFailParameterLoc(FailParameterLoc);
11926 C->setFailParameter(CKind);
11929void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *
C) {
11930 unsigned Count =
C->getDirectiveKinds().size();
11931 C->setLParenLoc(Record.readSourceLocation());
11932 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11933 DKVec.reserve(Count);
11934 for (
unsigned I = 0; I < Count; I++) {
11937 C->setDirectiveKinds(DKVec);
11940void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *
C) {
11941 C->setExpr(Record.readExpr());
11942 C->setLParenLoc(Record.readSourceLocation());
11945void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *
C) {
11946 unsigned Count =
C->getDirectiveKinds().size();
11947 C->setLParenLoc(Record.readSourceLocation());
11948 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11949 DKVec.reserve(Count);
11950 for (
unsigned I = 0; I < Count; I++) {
11953 C->setDirectiveKinds(DKVec);
11956void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
11958void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
11959 OMPNoOpenMPRoutinesClause *) {}
11961void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
11962 OMPNoOpenMPConstructsClause *) {}
11964void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
11966void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
11968void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
11970void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
11972void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
11974void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
11976void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
11978void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
11980void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
11982void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
11984void OMPClauseReader::VisitOMPInitClause(OMPInitClause *
C) {
11985 unsigned NumVars =
C->varlist_size();
11986 SmallVector<Expr *, 16> Vars;
11987 Vars.reserve(NumVars);
11988 for (
unsigned I = 0; I != NumVars; ++I)
11989 Vars.push_back(Record.readSubExpr());
11990 C->setVarRefs(Vars);
11991 C->setIsTarget(Record.readBool());
11992 C->setIsTargetSync(Record.readBool());
11993 C->setLParenLoc(Record.readSourceLocation());
11994 C->setVarLoc(Record.readSourceLocation());
11997void OMPClauseReader::VisitOMPUseClause(OMPUseClause *
C) {
11998 C->setInteropVar(Record.readSubExpr());
11999 C->setLParenLoc(Record.readSourceLocation());
12000 C->setVarLoc(Record.readSourceLocation());
12003void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *
C) {
12004 C->setInteropVar(Record.readSubExpr());
12005 C->setLParenLoc(Record.readSourceLocation());
12006 C->setVarLoc(Record.readSourceLocation());
12009void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
12011 C->setCondition(Record.readSubExpr());
12012 C->setLParenLoc(Record.readSourceLocation());
12015void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *
C) {
12017 C->setCondition(Record.readSubExpr());
12018 C->setLParenLoc(Record.readSourceLocation());
12021void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12023void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12024 OMPUnifiedSharedMemoryClause *) {}
12026void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12029OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12032void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12033 OMPAtomicDefaultMemOrderClause *
C) {
12034 C->setAtomicDefaultMemOrderKind(
12036 C->setLParenLoc(Record.readSourceLocation());
12037 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12040void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12042void OMPClauseReader::VisitOMPAtClause(OMPAtClause *
C) {
12044 C->setLParenLoc(Record.readSourceLocation());
12045 C->setAtKindKwLoc(Record.readSourceLocation());
12048void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *
C) {
12050 C->setLParenLoc(Record.readSourceLocation());
12051 C->setSeverityKindKwLoc(Record.readSourceLocation());
12054void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *
C) {
12056 C->setMessageString(Record.readSubExpr());
12057 C->setLParenLoc(Record.readSourceLocation());
12060void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *
C) {
12061 C->setLParenLoc(Record.readSourceLocation());
12062 unsigned NumVars =
C->varlist_size();
12063 SmallVector<Expr *, 16> Vars;
12064 Vars.reserve(NumVars);
12065 for (
unsigned i = 0; i != NumVars; ++i)
12066 Vars.push_back(Record.readSubExpr());
12067 C->setVarRefs(Vars);
12069 for (
unsigned i = 0; i != NumVars; ++i)
12070 Vars.push_back(Record.readSubExpr());
12071 C->setPrivateCopies(Vars);
12074void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
12076 C->setLParenLoc(Record.readSourceLocation());
12077 unsigned NumVars =
C->varlist_size();
12078 SmallVector<Expr *, 16> Vars;
12079 Vars.reserve(NumVars);
12080 for (
unsigned i = 0; i != NumVars; ++i)
12081 Vars.push_back(Record.readSubExpr());
12082 C->setVarRefs(Vars);
12084 for (
unsigned i = 0; i != NumVars; ++i)
12085 Vars.push_back(Record.readSubExpr());
12086 C->setPrivateCopies(Vars);
12088 for (
unsigned i = 0; i != NumVars; ++i)
12089 Vars.push_back(Record.readSubExpr());
12093void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
12095 C->setLParenLoc(Record.readSourceLocation());
12097 C->setKindLoc(Record.readSourceLocation());
12098 C->setColonLoc(Record.readSourceLocation());
12099 unsigned NumVars =
C->varlist_size();
12100 SmallVector<Expr *, 16> Vars;
12101 Vars.reserve(NumVars);
12102 for (
unsigned i = 0; i != NumVars; ++i)
12103 Vars.push_back(Record.readSubExpr());
12104 C->setVarRefs(Vars);
12106 for (
unsigned i = 0; i != NumVars; ++i)
12107 Vars.push_back(Record.readSubExpr());
12108 C->setPrivateCopies(Vars);
12110 for (
unsigned i = 0; i != NumVars; ++i)
12111 Vars.push_back(Record.readSubExpr());
12112 C->setSourceExprs(Vars);
12114 for (
unsigned i = 0; i != NumVars; ++i)
12115 Vars.push_back(Record.readSubExpr());
12116 C->setDestinationExprs(Vars);
12118 for (
unsigned i = 0; i != NumVars; ++i)
12119 Vars.push_back(Record.readSubExpr());
12120 C->setAssignmentOps(Vars);
12123void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *
C) {
12124 C->setLParenLoc(Record.readSourceLocation());
12125 unsigned NumVars =
C->varlist_size();
12126 SmallVector<Expr *, 16> Vars;
12127 Vars.reserve(NumVars);
12128 for (
unsigned i = 0; i != NumVars; ++i)
12129 Vars.push_back(Record.readSubExpr());
12130 C->setVarRefs(Vars);
12133void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *
C) {
12135 C->setLParenLoc(Record.readSourceLocation());
12136 C->setModifierLoc(Record.readSourceLocation());
12137 C->setColonLoc(Record.readSourceLocation());
12138 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12139 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12140 C->setQualifierLoc(NNSL);
12141 C->setNameInfo(DNI);
12143 unsigned NumVars =
C->varlist_size();
12144 SmallVector<Expr *, 16> Vars;
12145 Vars.reserve(NumVars);
12146 for (
unsigned i = 0; i != NumVars; ++i)
12147 Vars.push_back(Record.readSubExpr());
12148 C->setVarRefs(Vars);
12150 for (
unsigned i = 0; i != NumVars; ++i)
12151 Vars.push_back(Record.readSubExpr());
12152 C->setPrivates(Vars);
12154 for (
unsigned i = 0; i != NumVars; ++i)
12155 Vars.push_back(Record.readSubExpr());
12156 C->setLHSExprs(Vars);
12158 for (
unsigned i = 0; i != NumVars; ++i)
12159 Vars.push_back(Record.readSubExpr());
12160 C->setRHSExprs(Vars);
12162 for (
unsigned i = 0; i != NumVars; ++i)
12163 Vars.push_back(Record.readSubExpr());
12164 C->setReductionOps(Vars);
12165 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12167 for (
unsigned i = 0; i != NumVars; ++i)
12168 Vars.push_back(Record.readSubExpr());
12169 C->setInscanCopyOps(Vars);
12171 for (
unsigned i = 0; i != NumVars; ++i)
12172 Vars.push_back(Record.readSubExpr());
12173 C->setInscanCopyArrayTemps(Vars);
12175 for (
unsigned i = 0; i != NumVars; ++i)
12176 Vars.push_back(Record.readSubExpr());
12177 C->setInscanCopyArrayElems(Vars);
12179 unsigned NumFlags = Record.readInt();
12180 SmallVector<bool, 16> Flags;
12181 Flags.reserve(NumFlags);
12182 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12183 Flags.push_back(Record.readInt());
12184 C->setPrivateVariableReductionFlags(Flags);
12187void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
12189 C->setLParenLoc(Record.readSourceLocation());
12190 C->setColonLoc(Record.readSourceLocation());
12191 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12192 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12193 C->setQualifierLoc(NNSL);
12194 C->setNameInfo(DNI);
12196 unsigned NumVars =
C->varlist_size();
12197 SmallVector<Expr *, 16> Vars;
12198 Vars.reserve(NumVars);
12199 for (
unsigned I = 0; I != NumVars; ++I)
12200 Vars.push_back(Record.readSubExpr());
12201 C->setVarRefs(Vars);
12203 for (
unsigned I = 0; I != NumVars; ++I)
12204 Vars.push_back(Record.readSubExpr());
12205 C->setPrivates(Vars);
12207 for (
unsigned I = 0; I != NumVars; ++I)
12208 Vars.push_back(Record.readSubExpr());
12209 C->setLHSExprs(Vars);
12211 for (
unsigned I = 0; I != NumVars; ++I)
12212 Vars.push_back(Record.readSubExpr());
12213 C->setRHSExprs(Vars);
12215 for (
unsigned I = 0; I != NumVars; ++I)
12216 Vars.push_back(Record.readSubExpr());
12217 C->setReductionOps(Vars);
12220void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *
C) {
12222 C->setLParenLoc(Record.readSourceLocation());
12223 C->setColonLoc(Record.readSourceLocation());
12224 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12225 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12226 C->setQualifierLoc(NNSL);
12227 C->setNameInfo(DNI);
12229 unsigned NumVars =
C->varlist_size();
12230 SmallVector<Expr *, 16> Vars;
12231 Vars.reserve(NumVars);
12232 for (
unsigned I = 0; I != NumVars; ++I)
12233 Vars.push_back(Record.readSubExpr());
12234 C->setVarRefs(Vars);
12236 for (
unsigned I = 0; I != NumVars; ++I)
12237 Vars.push_back(Record.readSubExpr());
12238 C->setPrivates(Vars);
12240 for (
unsigned I = 0; I != NumVars; ++I)
12241 Vars.push_back(Record.readSubExpr());
12242 C->setLHSExprs(Vars);
12244 for (
unsigned I = 0; I != NumVars; ++I)
12245 Vars.push_back(Record.readSubExpr());
12246 C->setRHSExprs(Vars);
12248 for (
unsigned I = 0; I != NumVars; ++I)
12249 Vars.push_back(Record.readSubExpr());
12250 C->setReductionOps(Vars);
12252 for (
unsigned I = 0; I != NumVars; ++I)
12253 Vars.push_back(Record.readSubExpr());
12254 C->setTaskgroupDescriptors(Vars);
12257void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *
C) {
12259 C->setLParenLoc(Record.readSourceLocation());
12260 C->setColonLoc(Record.readSourceLocation());
12262 C->setModifierLoc(Record.readSourceLocation());
12263 unsigned NumVars =
C->varlist_size();
12264 SmallVector<Expr *, 16> Vars;
12265 Vars.reserve(NumVars);
12266 for (
unsigned i = 0; i != NumVars; ++i)
12267 Vars.push_back(Record.readSubExpr());
12268 C->setVarRefs(Vars);
12270 for (
unsigned i = 0; i != NumVars; ++i)
12271 Vars.push_back(Record.readSubExpr());
12272 C->setPrivates(Vars);
12274 for (
unsigned i = 0; i != NumVars; ++i)
12275 Vars.push_back(Record.readSubExpr());
12278 for (
unsigned i = 0; i != NumVars; ++i)
12279 Vars.push_back(Record.readSubExpr());
12280 C->setUpdates(Vars);
12282 for (
unsigned i = 0; i != NumVars; ++i)
12283 Vars.push_back(Record.readSubExpr());
12284 C->setFinals(Vars);
12285 C->setStep(Record.readSubExpr());
12286 C->setCalcStep(Record.readSubExpr());
12288 for (
unsigned I = 0; I != NumVars + 1; ++I)
12289 Vars.push_back(Record.readSubExpr());
12290 C->setUsedExprs(Vars);
12293void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *
C) {
12294 C->setLParenLoc(Record.readSourceLocation());
12295 C->setColonLoc(Record.readSourceLocation());
12296 unsigned NumVars =
C->varlist_size();
12297 SmallVector<Expr *, 16> Vars;
12298 Vars.reserve(NumVars);
12299 for (
unsigned i = 0; i != NumVars; ++i)
12300 Vars.push_back(Record.readSubExpr());
12301 C->setVarRefs(Vars);
12302 C->setAlignment(Record.readSubExpr());
12305void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *
C) {
12306 C->setLParenLoc(Record.readSourceLocation());
12307 unsigned NumVars =
C->varlist_size();
12308 SmallVector<Expr *, 16> Exprs;
12309 Exprs.reserve(NumVars);
12310 for (
unsigned i = 0; i != NumVars; ++i)
12311 Exprs.push_back(Record.readSubExpr());
12312 C->setVarRefs(Exprs);
12314 for (
unsigned i = 0; i != NumVars; ++i)
12315 Exprs.push_back(Record.readSubExpr());
12316 C->setSourceExprs(Exprs);
12318 for (
unsigned i = 0; i != NumVars; ++i)
12319 Exprs.push_back(Record.readSubExpr());
12320 C->setDestinationExprs(Exprs);
12322 for (
unsigned i = 0; i != NumVars; ++i)
12323 Exprs.push_back(Record.readSubExpr());
12324 C->setAssignmentOps(Exprs);
12327void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
12328 C->setLParenLoc(Record.readSourceLocation());
12329 unsigned NumVars =
C->varlist_size();
12330 SmallVector<Expr *, 16> Exprs;
12331 Exprs.reserve(NumVars);
12332 for (
unsigned i = 0; i != NumVars; ++i)
12333 Exprs.push_back(Record.readSubExpr());
12334 C->setVarRefs(Exprs);
12336 for (
unsigned i = 0; i != NumVars; ++i)
12337 Exprs.push_back(Record.readSubExpr());
12338 C->setSourceExprs(Exprs);
12340 for (
unsigned i = 0; i != NumVars; ++i)
12341 Exprs.push_back(Record.readSubExpr());
12342 C->setDestinationExprs(Exprs);
12344 for (
unsigned i = 0; i != NumVars; ++i)
12345 Exprs.push_back(Record.readSubExpr());
12346 C->setAssignmentOps(Exprs);
12349void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *
C) {
12350 C->setLParenLoc(Record.readSourceLocation());
12351 unsigned NumVars =
C->varlist_size();
12352 SmallVector<Expr *, 16> Vars;
12353 Vars.reserve(NumVars);
12354 for (
unsigned i = 0; i != NumVars; ++i)
12355 Vars.push_back(Record.readSubExpr());
12356 C->setVarRefs(Vars);
12359void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *
C) {
12360 C->setDepobj(Record.readSubExpr());
12361 C->setLParenLoc(Record.readSourceLocation());
12364void OMPClauseReader::VisitOMPDependClause(OMPDependClause *
C) {
12365 C->setLParenLoc(Record.readSourceLocation());
12366 C->setModifier(Record.readSubExpr());
12367 C->setDependencyKind(
12369 C->setDependencyLoc(Record.readSourceLocation());
12370 C->setColonLoc(Record.readSourceLocation());
12371 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12372 unsigned NumVars =
C->varlist_size();
12373 SmallVector<Expr *, 16> Vars;
12374 Vars.reserve(NumVars);
12375 for (
unsigned I = 0; I != NumVars; ++I)
12376 Vars.push_back(Record.readSubExpr());
12377 C->setVarRefs(Vars);
12378 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12379 C->setLoopData(I, Record.readSubExpr());
12382void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *
C) {
12385 C->setDevice(Record.readSubExpr());
12386 C->setModifierLoc(Record.readSourceLocation());
12387 C->setLParenLoc(Record.readSourceLocation());
12390void OMPClauseReader::VisitOMPMapClause(OMPMapClause *
C) {
12391 C->setLParenLoc(Record.readSourceLocation());
12392 bool HasIteratorModifier =
false;
12394 C->setMapTypeModifier(
12396 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12397 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12398 HasIteratorModifier =
true;
12400 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12401 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12404 C->setMapLoc(Record.readSourceLocation());
12405 C->setColonLoc(Record.readSourceLocation());
12406 auto NumVars =
C->varlist_size();
12407 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12408 auto TotalLists =
C->getTotalComponentListNum();
12409 auto TotalComponents =
C->getTotalComponentsNum();
12411 SmallVector<Expr *, 16> Vars;
12412 Vars.reserve(NumVars);
12413 for (
unsigned i = 0; i != NumVars; ++i)
12414 Vars.push_back(Record.readExpr());
12415 C->setVarRefs(Vars);
12417 SmallVector<Expr *, 16> UDMappers;
12418 UDMappers.reserve(NumVars);
12419 for (
unsigned I = 0; I < NumVars; ++I)
12420 UDMappers.push_back(Record.readExpr());
12421 C->setUDMapperRefs(UDMappers);
12423 if (HasIteratorModifier)
12424 C->setIteratorModifier(Record.readExpr());
12426 SmallVector<ValueDecl *, 16> Decls;
12427 Decls.reserve(UniqueDecls);
12428 for (
unsigned i = 0; i < UniqueDecls; ++i)
12429 Decls.push_back(Record.readDeclAs<ValueDecl>());
12430 C->setUniqueDecls(Decls);
12432 SmallVector<unsigned, 16> ListsPerDecl;
12433 ListsPerDecl.reserve(UniqueDecls);
12434 for (
unsigned i = 0; i < UniqueDecls; ++i)
12435 ListsPerDecl.push_back(Record.readInt());
12436 C->setDeclNumLists(ListsPerDecl);
12438 SmallVector<unsigned, 32> ListSizes;
12439 ListSizes.reserve(TotalLists);
12440 for (
unsigned i = 0; i < TotalLists; ++i)
12441 ListSizes.push_back(Record.readInt());
12442 C->setComponentListSizes(ListSizes);
12444 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12445 Components.reserve(TotalComponents);
12446 for (
unsigned i = 0; i < TotalComponents; ++i) {
12447 Expr *AssociatedExprPr = Record.readExpr();
12448 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12449 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12452 C->setComponents(Components, ListSizes);
12458 C->setLParenLoc(Record.readSourceLocation());
12459 C->setColonLoc(Record.readSourceLocation());
12460 C->setAllocator(Record.readSubExpr());
12461 C->setAlignment(Record.readSubExpr());
12462 unsigned NumVars =
C->varlist_size();
12463 SmallVector<Expr *, 16> Vars;
12464 Vars.reserve(NumVars);
12465 for (
unsigned i = 0; i != NumVars; ++i)
12466 Vars.push_back(Record.readSubExpr());
12467 C->setVarRefs(Vars);
12470void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
12472 C->setLParenLoc(Record.readSourceLocation());
12473 unsigned NumVars =
C->varlist_size();
12474 SmallVector<Expr *, 16> Vars;
12475 Vars.reserve(NumVars);
12476 for (
unsigned I = 0; I != NumVars; ++I)
12477 Vars.push_back(Record.readSubExpr());
12478 C->setVarRefs(Vars);
12481void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
12483 C->setLParenLoc(Record.readSourceLocation());
12484 unsigned NumVars =
C->varlist_size();
12485 SmallVector<Expr *, 16> Vars;
12486 Vars.reserve(NumVars);
12487 for (
unsigned I = 0; I != NumVars; ++I)
12488 Vars.push_back(Record.readSubExpr());
12489 C->setVarRefs(Vars);
12492void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *
C) {
12494 C->setPriority(Record.readSubExpr());
12495 C->setLParenLoc(Record.readSourceLocation());
12498void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
12501 C->setGrainsize(Record.readSubExpr());
12502 C->setModifierLoc(Record.readSourceLocation());
12503 C->setLParenLoc(Record.readSourceLocation());
12506void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
12509 C->setNumTasks(Record.readSubExpr());
12510 C->setModifierLoc(Record.readSourceLocation());
12511 C->setLParenLoc(Record.readSourceLocation());
12514void OMPClauseReader::VisitOMPHintClause(OMPHintClause *
C) {
12515 C->setHint(Record.readSubExpr());
12516 C->setLParenLoc(Record.readSourceLocation());
12519void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
12521 C->setDistScheduleKind(
12523 C->setChunkSize(Record.readSubExpr());
12524 C->setLParenLoc(Record.readSourceLocation());
12525 C->setDistScheduleKindLoc(Record.readSourceLocation());
12526 C->setCommaLoc(Record.readSourceLocation());
12529void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
12530 C->setDefaultmapKind(
12532 C->setDefaultmapModifier(
12534 C->setLParenLoc(Record.readSourceLocation());
12535 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12536 C->setDefaultmapKindLoc(Record.readSourceLocation());
12539void OMPClauseReader::VisitOMPToClause(OMPToClause *
C) {
12540 C->setLParenLoc(Record.readSourceLocation());
12542 C->setMotionModifier(
12544 C->setMotionModifierLoc(I, Record.readSourceLocation());
12545 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12546 C->setIteratorModifier(Record.readExpr());
12548 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12549 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12550 C->setColonLoc(Record.readSourceLocation());
12551 auto NumVars =
C->varlist_size();
12552 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12553 auto TotalLists =
C->getTotalComponentListNum();
12554 auto TotalComponents =
C->getTotalComponentsNum();
12556 SmallVector<Expr *, 16> Vars;
12557 Vars.reserve(NumVars);
12558 for (
unsigned i = 0; i != NumVars; ++i)
12559 Vars.push_back(Record.readSubExpr());
12560 C->setVarRefs(Vars);
12562 SmallVector<Expr *, 16> UDMappers;
12563 UDMappers.reserve(NumVars);
12564 for (
unsigned I = 0; I < NumVars; ++I)
12565 UDMappers.push_back(Record.readSubExpr());
12566 C->setUDMapperRefs(UDMappers);
12568 SmallVector<ValueDecl *, 16> Decls;
12569 Decls.reserve(UniqueDecls);
12570 for (
unsigned i = 0; i < UniqueDecls; ++i)
12571 Decls.push_back(Record.readDeclAs<ValueDecl>());
12572 C->setUniqueDecls(Decls);
12574 SmallVector<unsigned, 16> ListsPerDecl;
12575 ListsPerDecl.reserve(UniqueDecls);
12576 for (
unsigned i = 0; i < UniqueDecls; ++i)
12577 ListsPerDecl.push_back(Record.readInt());
12578 C->setDeclNumLists(ListsPerDecl);
12580 SmallVector<unsigned, 32> ListSizes;
12581 ListSizes.reserve(TotalLists);
12582 for (
unsigned i = 0; i < TotalLists; ++i)
12583 ListSizes.push_back(Record.readInt());
12584 C->setComponentListSizes(ListSizes);
12586 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12587 Components.reserve(TotalComponents);
12588 for (
unsigned i = 0; i < TotalComponents; ++i) {
12589 Expr *AssociatedExprPr = Record.readSubExpr();
12590 bool IsNonContiguous = Record.readBool();
12591 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12592 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12594 C->setComponents(Components, ListSizes);
12597void OMPClauseReader::VisitOMPFromClause(OMPFromClause *
C) {
12598 C->setLParenLoc(Record.readSourceLocation());
12600 C->setMotionModifier(
12602 C->setMotionModifierLoc(I, Record.readSourceLocation());
12603 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12604 C->setIteratorModifier(Record.readExpr());
12606 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12607 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12608 C->setColonLoc(Record.readSourceLocation());
12609 auto NumVars =
C->varlist_size();
12610 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12611 auto TotalLists =
C->getTotalComponentListNum();
12612 auto TotalComponents =
C->getTotalComponentsNum();
12614 SmallVector<Expr *, 16> Vars;
12615 Vars.reserve(NumVars);
12616 for (
unsigned i = 0; i != NumVars; ++i)
12617 Vars.push_back(Record.readSubExpr());
12618 C->setVarRefs(Vars);
12620 SmallVector<Expr *, 16> UDMappers;
12621 UDMappers.reserve(NumVars);
12622 for (
unsigned I = 0; I < NumVars; ++I)
12623 UDMappers.push_back(Record.readSubExpr());
12624 C->setUDMapperRefs(UDMappers);
12626 SmallVector<ValueDecl *, 16> Decls;
12627 Decls.reserve(UniqueDecls);
12628 for (
unsigned i = 0; i < UniqueDecls; ++i)
12629 Decls.push_back(Record.readDeclAs<ValueDecl>());
12630 C->setUniqueDecls(Decls);
12632 SmallVector<unsigned, 16> ListsPerDecl;
12633 ListsPerDecl.reserve(UniqueDecls);
12634 for (
unsigned i = 0; i < UniqueDecls; ++i)
12635 ListsPerDecl.push_back(Record.readInt());
12636 C->setDeclNumLists(ListsPerDecl);
12638 SmallVector<unsigned, 32> ListSizes;
12639 ListSizes.reserve(TotalLists);
12640 for (
unsigned i = 0; i < TotalLists; ++i)
12641 ListSizes.push_back(Record.readInt());
12642 C->setComponentListSizes(ListSizes);
12644 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12645 Components.reserve(TotalComponents);
12646 for (
unsigned i = 0; i < TotalComponents; ++i) {
12647 Expr *AssociatedExprPr = Record.readSubExpr();
12648 bool IsNonContiguous = Record.readBool();
12649 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12650 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12652 C->setComponents(Components, ListSizes);
12655void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
12656 C->setLParenLoc(Record.readSourceLocation());
12658 C->setFallbackModifierLoc(Record.readSourceLocation());
12659 auto NumVars =
C->varlist_size();
12660 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12661 auto TotalLists =
C->getTotalComponentListNum();
12662 auto TotalComponents =
C->getTotalComponentsNum();
12664 SmallVector<Expr *, 16> Vars;
12665 Vars.reserve(NumVars);
12666 for (
unsigned i = 0; i != NumVars; ++i)
12667 Vars.push_back(Record.readSubExpr());
12668 C->setVarRefs(Vars);
12670 for (
unsigned i = 0; i != NumVars; ++i)
12671 Vars.push_back(Record.readSubExpr());
12672 C->setPrivateCopies(Vars);
12674 for (
unsigned i = 0; i != NumVars; ++i)
12675 Vars.push_back(Record.readSubExpr());
12678 SmallVector<ValueDecl *, 16> Decls;
12679 Decls.reserve(UniqueDecls);
12680 for (
unsigned i = 0; i < UniqueDecls; ++i)
12681 Decls.push_back(Record.readDeclAs<ValueDecl>());
12682 C->setUniqueDecls(Decls);
12684 SmallVector<unsigned, 16> ListsPerDecl;
12685 ListsPerDecl.reserve(UniqueDecls);
12686 for (
unsigned i = 0; i < UniqueDecls; ++i)
12687 ListsPerDecl.push_back(Record.readInt());
12688 C->setDeclNumLists(ListsPerDecl);
12690 SmallVector<unsigned, 32> ListSizes;
12691 ListSizes.reserve(TotalLists);
12692 for (
unsigned i = 0; i < TotalLists; ++i)
12693 ListSizes.push_back(Record.readInt());
12694 C->setComponentListSizes(ListSizes);
12696 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12697 Components.reserve(TotalComponents);
12698 for (
unsigned i = 0; i < TotalComponents; ++i) {
12699 auto *AssociatedExprPr = Record.readSubExpr();
12700 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12701 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12704 C->setComponents(Components, ListSizes);
12707void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
12708 C->setLParenLoc(Record.readSourceLocation());
12709 auto NumVars =
C->varlist_size();
12710 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12711 auto TotalLists =
C->getTotalComponentListNum();
12712 auto TotalComponents =
C->getTotalComponentsNum();
12714 SmallVector<Expr *, 16> Vars;
12715 Vars.reserve(NumVars);
12716 for (
unsigned i = 0; i != NumVars; ++i)
12717 Vars.push_back(Record.readSubExpr());
12718 C->setVarRefs(Vars);
12720 SmallVector<ValueDecl *, 16> Decls;
12721 Decls.reserve(UniqueDecls);
12722 for (
unsigned i = 0; i < UniqueDecls; ++i)
12723 Decls.push_back(Record.readDeclAs<ValueDecl>());
12724 C->setUniqueDecls(Decls);
12726 SmallVector<unsigned, 16> ListsPerDecl;
12727 ListsPerDecl.reserve(UniqueDecls);
12728 for (
unsigned i = 0; i < UniqueDecls; ++i)
12729 ListsPerDecl.push_back(Record.readInt());
12730 C->setDeclNumLists(ListsPerDecl);
12732 SmallVector<unsigned, 32> ListSizes;
12733 ListSizes.reserve(TotalLists);
12734 for (
unsigned i = 0; i < TotalLists; ++i)
12735 ListSizes.push_back(Record.readInt());
12736 C->setComponentListSizes(ListSizes);
12738 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12739 Components.reserve(TotalComponents);
12740 for (
unsigned i = 0; i < TotalComponents; ++i) {
12741 Expr *AssociatedExpr = Record.readSubExpr();
12742 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12743 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12746 C->setComponents(Components, ListSizes);
12749void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
12750 C->setLParenLoc(Record.readSourceLocation());
12751 auto NumVars =
C->varlist_size();
12752 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12753 auto TotalLists =
C->getTotalComponentListNum();
12754 auto TotalComponents =
C->getTotalComponentsNum();
12756 SmallVector<Expr *, 16> Vars;
12757 Vars.reserve(NumVars);
12758 for (
unsigned i = 0; i != NumVars; ++i)
12759 Vars.push_back(Record.readSubExpr());
12760 C->setVarRefs(Vars);
12763 SmallVector<ValueDecl *, 16> Decls;
12764 Decls.reserve(UniqueDecls);
12765 for (
unsigned i = 0; i < UniqueDecls; ++i)
12766 Decls.push_back(Record.readDeclAs<ValueDecl>());
12767 C->setUniqueDecls(Decls);
12769 SmallVector<unsigned, 16> ListsPerDecl;
12770 ListsPerDecl.reserve(UniqueDecls);
12771 for (
unsigned i = 0; i < UniqueDecls; ++i)
12772 ListsPerDecl.push_back(Record.readInt());
12773 C->setDeclNumLists(ListsPerDecl);
12775 SmallVector<unsigned, 32> ListSizes;
12776 ListSizes.reserve(TotalLists);
12777 for (
unsigned i = 0; i < TotalLists; ++i)
12778 ListSizes.push_back(Record.readInt());
12779 C->setComponentListSizes(ListSizes);
12781 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12782 Components.reserve(TotalComponents);
12783 for (
unsigned i = 0; i < TotalComponents; ++i) {
12784 Expr *AssociatedExpr = Record.readSubExpr();
12785 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12786 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12789 C->setComponents(Components, ListSizes);
12792void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
12793 C->setLParenLoc(Record.readSourceLocation());
12794 auto NumVars =
C->varlist_size();
12795 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12796 auto TotalLists =
C->getTotalComponentListNum();
12797 auto TotalComponents =
C->getTotalComponentsNum();
12799 SmallVector<Expr *, 16> Vars;
12800 Vars.reserve(NumVars);
12801 for (
unsigned I = 0; I != NumVars; ++I)
12802 Vars.push_back(Record.readSubExpr());
12803 C->setVarRefs(Vars);
12806 SmallVector<ValueDecl *, 16> Decls;
12807 Decls.reserve(UniqueDecls);
12808 for (
unsigned I = 0; I < UniqueDecls; ++I)
12809 Decls.push_back(Record.readDeclAs<ValueDecl>());
12810 C->setUniqueDecls(Decls);
12812 SmallVector<unsigned, 16> ListsPerDecl;
12813 ListsPerDecl.reserve(UniqueDecls);
12814 for (
unsigned I = 0; I < UniqueDecls; ++I)
12815 ListsPerDecl.push_back(Record.readInt());
12816 C->setDeclNumLists(ListsPerDecl);
12818 SmallVector<unsigned, 32> ListSizes;
12819 ListSizes.reserve(TotalLists);
12820 for (
unsigned i = 0; i < TotalLists; ++i)
12821 ListSizes.push_back(Record.readInt());
12822 C->setComponentListSizes(ListSizes);
12824 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12825 Components.reserve(TotalComponents);
12826 for (
unsigned I = 0; I < TotalComponents; ++I) {
12827 Expr *AssociatedExpr = Record.readSubExpr();
12828 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12829 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12832 C->setComponents(Components, ListSizes);
12835void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
12836 C->setLParenLoc(Record.readSourceLocation());
12837 unsigned NumVars =
C->varlist_size();
12838 SmallVector<Expr *, 16> Vars;
12839 Vars.reserve(NumVars);
12840 for (
unsigned i = 0; i != NumVars; ++i)
12841 Vars.push_back(Record.readSubExpr());
12842 C->setVarRefs(Vars);
12844 Vars.reserve(NumVars);
12845 for (
unsigned i = 0; i != NumVars; ++i)
12846 Vars.push_back(Record.readSubExpr());
12847 C->setPrivateRefs(Vars);
12850void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
12851 C->setLParenLoc(Record.readSourceLocation());
12852 unsigned NumVars =
C->varlist_size();
12853 SmallVector<Expr *, 16> Vars;
12854 Vars.reserve(NumVars);
12855 for (
unsigned i = 0; i != NumVars; ++i)
12856 Vars.push_back(Record.readSubExpr());
12857 C->setVarRefs(Vars);
12860void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
12861 C->setLParenLoc(Record.readSourceLocation());
12862 unsigned NumVars =
C->varlist_size();
12863 SmallVector<Expr *, 16> Vars;
12864 Vars.reserve(NumVars);
12865 for (
unsigned i = 0; i != NumVars; ++i)
12866 Vars.push_back(Record.readSubExpr());
12867 C->setVarRefs(Vars);
12870void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
12871 C->setLParenLoc(Record.readSourceLocation());
12872 unsigned NumOfAllocators =
C->getNumberOfAllocators();
12873 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
12874 Data.reserve(NumOfAllocators);
12875 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
12876 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
12879 D.
LParenLoc = Record.readSourceLocation();
12880 D.
RParenLoc = Record.readSourceLocation();
12882 C->setAllocatorsData(
Data);
12885void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *
C) {
12886 C->setLParenLoc(Record.readSourceLocation());
12887 C->setModifier(Record.readSubExpr());
12888 C->setColonLoc(Record.readSourceLocation());
12889 unsigned NumOfLocators =
C->varlist_size();
12890 SmallVector<Expr *, 4> Locators;
12891 Locators.reserve(NumOfLocators);
12892 for (
unsigned I = 0; I != NumOfLocators; ++I)
12893 Locators.push_back(Record.readSubExpr());
12894 C->setVarRefs(Locators);
12897void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *
C) {
12900 C->setLParenLoc(Record.readSourceLocation());
12901 C->setKindKwLoc(Record.readSourceLocation());
12902 C->setModifierKwLoc(Record.readSourceLocation());
12905void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *
C) {
12907 C->setThreadID(Record.readSubExpr());
12908 C->setLParenLoc(Record.readSourceLocation());
12911void OMPClauseReader::VisitOMPBindClause(OMPBindClause *
C) {
12913 C->setLParenLoc(Record.readSourceLocation());
12914 C->setBindKindLoc(Record.readSourceLocation());
12918 C->setAlignment(Record.readExpr());
12919 C->setLParenLoc(Record.readSourceLocation());
12922void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
12924 C->setSize(Record.readSubExpr());
12925 C->setLParenLoc(Record.readSourceLocation());
12928void OMPClauseReader::VisitOMPDynGroupprivateClause(
12929 OMPDynGroupprivateClause *
C) {
12931 C->setDynGroupprivateModifier(
12933 C->setDynGroupprivateFallbackModifier(
12935 C->setSize(Record.readSubExpr());
12936 C->setLParenLoc(Record.readSourceLocation());
12937 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
12938 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
12941void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
12942 C->setLParenLoc(Record.readSourceLocation());
12943 C->setDependenceType(
12945 C->setDependenceLoc(Record.readSourceLocation());
12946 C->setColonLoc(Record.readSourceLocation());
12947 unsigned NumVars =
C->varlist_size();
12948 SmallVector<Expr *, 16> Vars;
12949 Vars.reserve(NumVars);
12950 for (
unsigned I = 0; I != NumVars; ++I)
12951 Vars.push_back(Record.readSubExpr());
12952 C->setVarRefs(Vars);
12953 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12954 C->setLoopData(I, Record.readSubExpr());
12957void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
12959 Record.readAttributes(Attrs);
12960 C->setAttrs(Attrs);
12961 C->setLocStart(Record.readSourceLocation());
12962 C->setLParenLoc(Record.readSourceLocation());
12963 C->setLocEnd(Record.readSourceLocation());
12966void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *
C) {}
12976 Selector.ScoreOrCondition =
nullptr;
12978 Selector.ScoreOrCondition = readExprRef();
12990 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
12995 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
12997 Data->setClauses(Clauses);
12998 if (
Data->hasAssociatedStmt())
13000 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
13005 unsigned NumVars =
readInt();
13007 for (
unsigned I = 0; I < NumVars; ++I)
13013 unsigned NumExprs =
readInt();
13015 for (
unsigned I = 0; I < NumExprs; ++I)
13025 switch (ClauseKind) {
13040 bool isConditionExprClause =
readBool();
13041 if (isConditionExprClause) {
13046 unsigned NumVars =
readInt();
13048 for (
unsigned I = 0; I < NumVars; ++I)
13055 unsigned NumClauses =
readInt();
13057 for (
unsigned I = 0; I < NumClauses; ++I)
13091 for (
unsigned I = 0; I < VarList.size(); ++I) {
13094 RecipeList.push_back({Alloca});
13098 VarList, RecipeList, EndLoc);
13116 for (
unsigned I = 0; I < VarList.size(); ++I) {
13120 RecipeList.push_back({Recipe, RecipeTemp});
13124 VarList, RecipeList, EndLoc);
13175 LParenLoc, ModList, VarList, EndLoc);
13184 LParenLoc, ModList, VarList, EndLoc);
13193 LParenLoc, ModList, VarList, EndLoc);
13202 LParenLoc, ModList, VarList, EndLoc);
13208 AsyncExpr, EndLoc);
13216 DevNumExpr, QueuesLoc, QueueIdExprs,
13223 unsigned NumArchs =
readInt();
13225 for (
unsigned I = 0; I < NumArchs; ++I) {
13228 Archs.emplace_back(Loc, Ident);
13232 LParenLoc, Archs, EndLoc);
13240 for (
unsigned I = 0; I < VarList.size(); ++I) {
13244 3 *
sizeof(
int *));
13247 unsigned NumCombiners =
readInt();
13248 for (
unsigned I = 0; I < NumCombiners; ++I) {
13253 Combiners.push_back({LHS, RHS, Op});
13256 RecipeList.push_back({Recipe, Combiners});
13260 VarList, RecipeList, EndLoc);
13279 HasForce, LoopCount, EndLoc);
13283 unsigned NumClauses =
readInt();
13285 for (
unsigned I = 0; I < NumClauses; ++I)
13288 SizeExprs, EndLoc);
13292 unsigned NumExprs =
readInt();
13295 for (
unsigned I = 0; I < NumExprs; ++I) {
13301 GangKinds, Exprs, EndLoc);
13307 WorkerExpr, EndLoc);
13313 VectorExpr, EndLoc);
13325 LParenLoc, VarList, EndLoc);
13339 llvm_unreachable(
"Clause serialization not yet implemented");
13341 llvm_unreachable(
"Invalid Clause Kind");
13346 for (
unsigned I = 0; I < Clauses.size(); ++I)
13351 unsigned NumVars =
readInt();
13352 A->Clauses.resize(NumVars);
13359 llvm::FoldingSetNodeID ID;
13360 ID.AddString(PrimaryModuleName);
13361 return ID.computeStableHash();
13366 return std::nullopt;
13369 return std::nullopt;
13372 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 bool checkModuleCachePath(llvm::vfs::FileSystem &VFS, StringRef SpecificModuleCachePath, 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.
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)
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 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 ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain)
Receives the header search options.
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
virtual void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind)
This is called for each AST file loaded.
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.
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)
ASTReadResult ReadAST(StringRef FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
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.
ASTReadResult ReadASTCore(StringRef FileName, ModuleKind Type, SourceLocation ImportLoc, ModuleFile *ImportedBy, SmallVectorImpl< ImportedModule > &Loaded, off_t ExpectedSize, time_t ExpectedModTime, ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities)
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.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::ModuleFile ModuleFile
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, serialization::PreprocessedEntityID LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
void setKWLoc(SourceLocation Loc)
Attr - This represents one attribute.
void setAttr(const Attr *A)
void setConceptReference(ConceptReference *CR)
void setRParenLoc(SourceLocation Loc)
void setCaretLoc(SourceLocation Loc)
void setWrittenTypeSpec(TypeSpecifierType written)
bool needsExtraLocalData() const
void setModeAttr(bool written)
void setBuiltinLoc(SourceLocation Loc)
void setWrittenWidthSpec(TypeSpecifierWidth written)
void setWrittenSignSpec(TypeSpecifierSign written)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
void setSourceOrder(int Pos)
Set the source order of this initializer.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
unsigned getLambdaIndexInContext() const
Retrieve the index of this lambda within the context declaration returned by getLambdaContextDecl().
base_class_iterator bases_begin()
base_class_iterator vbases_begin()
Represents a C++ temporary.
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule) override
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, 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.
void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind) override
This is called for each AST file loaded.
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::vfs::FileSystem & getVirtualFileSystem() const
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.
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.
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 setASTFile(OptionalFileEntryRef File)
Set the serialized AST 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.
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.
OptionalFileEntryRef getASTFile() const
The serialized AST file for this module, if one was created.
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.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain) override
Receives the header search 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 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.
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.
FileEntryRef File
The file entry for 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
std::string FileName
The file name of the module file.
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.
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.
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)