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 << FileChange.Kind
2989 << (FileChange.Old && FileChange.New)
2990 << llvm::itostr(FileChange.Old.value_or(0))
2991 << llvm::itostr(FileChange.New.value_or(0));
2994 if (ImportStack.size() > 1) {
2995 Diag(diag::note_ast_file_required_by)
2996 << *Filename << ImportStack[0]->FileName;
2997 for (
unsigned I = 1; I < ImportStack.size(); ++I)
2998 Diag(diag::note_ast_file_required_by)
2999 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3002 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3017ASTReader::TemporarilyOwnedStringRef
3023ASTReader::TemporarilyOwnedStringRef
3026 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
3028 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3029 Path ==
"<built-in>" || Path ==
"<command line>")
3033 llvm::sys::path::append(Buf, Prefix, Path);
3034 StringRef ResolvedPath{Buf.data(), Buf.size()};
3035 return {ResolvedPath, Buf};
3048 return ResolvedPath->str();
3063 llvm_unreachable(
"unknown ASTReadResult");
3067 BitstreamCursor &Stream, StringRef Filename,
3068 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3069 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3072 consumeError(std::move(Err));
3080 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3083 consumeError(MaybeEntry.takeError());
3086 llvm::BitstreamEntry Entry = MaybeEntry.get();
3088 switch (Entry.Kind) {
3089 case llvm::BitstreamEntry::Error:
3090 case llvm::BitstreamEntry::SubBlock:
3093 case llvm::BitstreamEntry::EndBlock:
3096 case llvm::BitstreamEntry::Record:
3103 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3104 if (!MaybeRecordType) {
3106 consumeError(MaybeRecordType.takeError());
3111 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3112 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3113 AllowCompatibleConfigurationMismatch))
3114 Result = ConfigurationMismatch;
3119 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3120 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3121 AllowCompatibleConfigurationMismatch))
3122 Result = ConfigurationMismatch;
3127 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3128 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3129 AllowCompatibleConfigurationMismatch))
3130 Result = ConfigurationMismatch;
3135 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3136 if (!AllowCompatibleConfigurationMismatch &&
3137 ParseFileSystemOptions(
Record, Complain, Listener))
3138 Result = ConfigurationMismatch;
3143 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3144 if (!AllowCompatibleConfigurationMismatch &&
3145 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3146 Result = ConfigurationMismatch;
3151 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3152 if (!AllowCompatibleConfigurationMismatch &&
3153 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3154 SuggestedPredefines))
3155 Result = ConfigurationMismatch;
3163 SmallVectorImpl<ImportedModule> &Loaded,
3165 unsigned ClientLoadCapabilities) {
3166 BitstreamCursor &Stream = F.
Stream;
3169 Error(std::move(Err));
3179 bool HasReadUnhashedControlBlock =
false;
3180 auto readUnhashedControlBlockOnce = [&]() {
3181 if (!HasReadUnhashedControlBlock) {
3182 HasReadUnhashedControlBlock =
true;
3183 if (ASTReadResult
Result =
3184 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3190 bool DisableValidation = shouldDisableValidationForFile(F);
3194 unsigned NumInputs = 0;
3195 unsigned NumUserInputs = 0;
3196 StringRef BaseDirectoryAsWritten;
3198 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3200 Error(MaybeEntry.takeError());
3203 llvm::BitstreamEntry Entry = MaybeEntry.get();
3205 switch (Entry.Kind) {
3206 case llvm::BitstreamEntry::Error:
3207 Error(
"malformed block record in AST file");
3209 case llvm::BitstreamEntry::EndBlock: {
3212 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3216 const HeaderSearchOptions &HSOpts =
3217 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3224 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3230 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3234 N = ForceValidateUserInputs ? NumUserInputs : 0;
3237 Diag(diag::remark_module_validation)
3240 for (
unsigned I = 0; I < N; ++I) {
3241 InputFile IF = getInputFile(F, I+1, Complain);
3253 for (
unsigned I = 0; I < N; ++I) {
3254 bool IsSystem = I >= NumUserInputs;
3256 auto FilenameAsRequested = ResolveImportedPath(
3259 *FilenameAsRequested, IsSystem, FI.
Overridden,
3267 case llvm::BitstreamEntry::SubBlock:
3271 if (llvm::Error Err = Stream.SkipBlock()) {
3272 Error(std::move(Err));
3276 Error(
"malformed block record in AST file");
3286 if (Listener && !ImportedBy) {
3292 bool AllowCompatibleConfigurationMismatch =
3296 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3297 AllowCompatibleConfigurationMismatch, *Listener,
3298 SuggestedPredefines);
3300 Error(
"malformed block record in AST file");
3304 if (DisableValidation ||
3305 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3313 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3314 Error(std::move(Err));
3320 if (llvm::Error Err = Stream.SkipBlock()) {
3321 Error(std::move(Err));
3327 case llvm::BitstreamEntry::Record:
3335 Expected<unsigned> MaybeRecordType =
3336 Stream.readRecord(Entry.ID,
Record, &Blob);
3337 if (!MaybeRecordType) {
3338 Error(MaybeRecordType.takeError());
3344 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3346 : diag::err_ast_file_version_too_new)
3351 bool hasErrors =
Record[7];
3352 if (hasErrors && !DisableValidation) {
3355 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3356 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3359 if (!AllowASTWithCompilerErrors) {
3360 Diag(diag::err_ast_file_with_compiler_errors)
3366 Diags.ErrorOccurred =
true;
3367 Diags.UncompilableErrorOccurred =
true;
3368 Diags.UnrecoverableErrorOccurred =
true;
3381 StringRef ASTBranch = Blob;
3382 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3383 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3384 Diag(diag::err_ast_file_different_branch)
3396 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3406 auto [ImportLoc, ImportModuleFileIndex] =
3407 ReadUntranslatedSourceLocation(
Record[Idx++]);
3409 assert(ImportModuleFileIndex == 0);
3411 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3413 bool IsImportingStdCXXModule =
Record[Idx++];
3415 off_t StoredSize = 0;
3416 time_t StoredModTime = 0;
3417 ASTFileSignature StoredSignature;
3418 std::string ImportedFile;
3419 std::string StoredFile;
3420 bool IgnoreImportedByNote =
false;
3429 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3430 ImportedName, !IsImportingStdCXXModule);
3432 if (IsImportingStdCXXModule && ImportedFile.empty()) {
3433 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3437 if (!IsImportingStdCXXModule) {
3438 StoredSize = (off_t)
Record[Idx++];
3439 StoredModTime = (time_t)
Record[Idx++];
3443 SignatureBytes.end());
3448 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3449 if (ImportedFile.empty()) {
3450 ImportedFile = StoredFile;
3451 }
else if (!getDiags().isIgnored(
3452 diag::warn_module_file_mapping_mismatch,
3453 CurrentImportLoc)) {
3454 auto ImportedFileRef =
3455 PP.getFileManager().getOptionalFileRef(ImportedFile);
3456 auto StoredFileRef =
3457 PP.getFileManager().getOptionalFileRef(StoredFile);
3458 if ((ImportedFileRef && StoredFileRef) &&
3459 (*ImportedFileRef != *StoredFileRef)) {
3460 Diag(diag::warn_module_file_mapping_mismatch)
3461 << ImportedFile << StoredFile;
3462 Diag(diag::note_module_file_imported_by)
3464 IgnoreImportedByNote =
true;
3471 unsigned Capabilities = ClientLoadCapabilities;
3472 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3473 Capabilities &= ~ARR_Missing;
3476 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3477 Loaded, StoredSize, StoredModTime,
3478 StoredSignature, Capabilities);
3483 if (IsImportingStdCXXModule) {
3484 if (
const auto *Imported =
3485 getModuleManager().lookupByFileName(ImportedFile);
3486 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3487 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3493 bool recompilingFinalized =
Result == OutOfDate &&
3494 (Capabilities & ARR_OutOfDate) &&
3497 .getInMemoryModuleCache()
3499 if (!IgnoreImportedByNote &&
3501 Diag(diag::note_module_file_imported_by)
3505 case Failure:
return Failure;
3508 case OutOfDate:
return OutOfDate;
3510 case ConfigurationMismatch:
return ConfigurationMismatch;
3511 case HadErrors:
return HadErrors;
3530 Diag(diag::remark_module_import)
3532 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3538 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3546 BaseDirectoryAsWritten = Blob;
3548 "MODULE_DIRECTORY found before MODULE_NAME");
3550 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3554 Module *M = PP.getHeaderSearchInfo().lookupModule(
3561 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3564 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3565 if (!BuildDir || *BuildDir != M->
Directory) {
3566 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3567 Diag(diag::err_imported_module_relocated)
3578 if (ASTReadResult
Result =
3579 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3585 NumUserInputs =
Record[1];
3587 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3596llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3597 unsigned ClientLoadCapabilities) {
3598 BitstreamCursor &Stream = F.
Stream;
3600 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3607 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3609 return MaybeEntry.takeError();
3610 llvm::BitstreamEntry Entry = MaybeEntry.get();
3612 switch (Entry.Kind) {
3613 case llvm::BitstreamEntry::Error:
3614 return llvm::createStringError(
3615 std::errc::illegal_byte_sequence,
3616 "error at end of module block in AST file");
3617 case llvm::BitstreamEntry::EndBlock:
3623 if (ASTContext *Ctx = ContextObj) {
3624 DeclContext *DC = Ctx->getTranslationUnitDecl();
3629 return llvm::Error::success();
3630 case llvm::BitstreamEntry::SubBlock:
3638 if (llvm::Error Err = Stream.SkipBlock())
3640 if (llvm::Error Err = ReadBlockAbbrevs(
3647 if (!PP.getExternalSource())
3648 PP.setExternalSource(
this);
3650 if (llvm::Error Err = Stream.SkipBlock())
3652 if (llvm::Error Err =
3661 if (llvm::Error Err = Stream.SkipBlock()) {
3670 if (!PP.getPreprocessingRecord())
3671 PP.createPreprocessingRecord();
3672 if (!PP.getPreprocessingRecord()->getExternalSource())
3673 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3677 if (llvm::Error Err = ReadSourceManagerBlock(F))
3682 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3687 BitstreamCursor
C = Stream;
3689 if (llvm::Error Err = Stream.SkipBlock())
3693 CommentsCursors.push_back(std::make_pair(
C, &F));
3698 if (llvm::Error Err = Stream.SkipBlock())
3704 case llvm::BitstreamEntry::Record:
3712 Expected<unsigned> MaybeRecordType =
3713 Stream.readRecord(Entry.ID,
Record, &Blob);
3714 if (!MaybeRecordType)
3715 return MaybeRecordType.takeError();
3720 switch (RecordType) {
3741 switch (RecordType) {
3747 return llvm::createStringError(
3748 std::errc::illegal_byte_sequence,
3749 "duplicate TYPE_OFFSET record in AST file");
3762 return llvm::createStringError(
3763 std::errc::illegal_byte_sequence,
3764 "duplicate DECL_OFFSET record in AST file");
3776 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3777 LexicalContents Contents(
3779 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3780 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3787 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3788 auto *
Data = (
const unsigned char*)Blob.data();
3789 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3792 if (Decl *D = GetExistingDecl(ID))
3793 PendingUpdateRecords.push_back(
3794 PendingUpdateRecord(ID, D,
false));
3800 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3801 auto *
Data = (
const unsigned char *)Blob.data();
3802 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3805 if (Decl *D = GetExistingDecl(ID))
3806 PendingUpdateRecords.push_back(
3807 PendingUpdateRecord(ID, D,
false));
3815 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3816 auto *
Data = (
const unsigned char *)Blob.data();
3817 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3820 if (Decl *D = GetExistingDecl(ID))
3821 PendingUpdateRecords.push_back(
3822 PendingUpdateRecord(ID, D,
false));
3828 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3829 auto *
Data = (
const unsigned char *)Blob.data();
3830 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3833 if (Decl *D = GetExistingDecl(ID))
3834 PendingUpdateRecords.push_back(
3835 PendingUpdateRecord(ID, D,
false));
3841 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3842 auto *
Data = (
const unsigned char *)Blob.data();
3843 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3846 if (Decl *D = GetExistingDecl(ID))
3847 PendingUpdateRecords.push_back(
3848 PendingUpdateRecord(ID, D,
false));
3854 reinterpret_cast<const unsigned char *
>(Blob.data());
3860 ASTIdentifierLookupTrait(*
this, F));
3862 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
3868 return llvm::createStringError(
3869 std::errc::illegal_byte_sequence,
3870 "duplicate IDENTIFIER_OFFSET record in AST file");
3876 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3888 for (
unsigned I = 0, N =
Record.size(); I != N; )
3889 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3896 getContext().getLangOpts().BuildingPCHWithObjectFile)
3897 for (
unsigned I = 0, N =
Record.size(); I != N; )
3898 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3902 if (SpecialTypes.empty()) {
3903 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
3904 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
3911 if (SpecialTypes.size() !=
Record.size())
3912 return llvm::createStringError(std::errc::illegal_byte_sequence,
3913 "invalid special-types record");
3915 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
3917 if (!SpecialTypes[I])
3918 SpecialTypes[I] =
ID;
3925 TotalNumStatements +=
Record[0];
3926 TotalNumMacros +=
Record[1];
3927 TotalLexicalDeclContexts +=
Record[2];
3928 TotalVisibleDeclContexts +=
Record[3];
3929 TotalModuleLocalVisibleDeclContexts +=
Record[4];
3930 TotalTULocalVisibleDeclContexts +=
Record[5];
3934 for (
unsigned I = 0, N =
Record.size(); I != N; )
3935 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
3939 for (
unsigned I = 0, N =
Record.size(); I != N; )
3940 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
3944 if (
Record.size() % 3 != 0)
3945 return llvm::createStringError(std::errc::illegal_byte_sequence,
3946 "invalid weak identifiers record");
3950 WeakUndeclaredIdentifiers.clear();
3953 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
3954 WeakUndeclaredIdentifiers.push_back(
3955 getGlobalIdentifierID(F,
Record[I++]));
3956 WeakUndeclaredIdentifiers.push_back(
3957 getGlobalIdentifierID(F,
Record[I++]));
3958 WeakUndeclaredIdentifiers.push_back(
3959 ReadSourceLocation(F,
Record, I).getRawEncoding());
3966 unsigned LocalBaseSelectorID =
Record[1];
3972 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3977 std::make_pair(LocalBaseSelectorID,
3989 = ASTSelectorLookupTable::Create(
3992 ASTSelectorLookupTrait(*
this, F));
3993 TotalNumMethodPoolEntries +=
Record[1];
3998 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
3999 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4001 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
4010 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4011 ReadSourceLocation(F,
Record, Idx));
4017 SmallVector<SourceLocation, 64> SrcLocs;
4019 while (Idx <
Record.size())
4020 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
4021 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4028 unsigned Idx = 0, End =
Record.size() - 1;
4029 bool ReachedEOFWhileSkipping =
Record[Idx++];
4030 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4031 if (ReachedEOFWhileSkipping) {
4032 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4033 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4034 bool FoundNonSkipPortion =
Record[Idx++];
4035 bool FoundElse =
Record[Idx++];
4036 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4037 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4038 FoundElse, ElseLoc);
4040 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4042 auto Loc = ReadSourceLocation(F,
Record, Idx);
4043 bool WasSkipping =
Record[Idx++];
4044 bool FoundNonSkip =
Record[Idx++];
4045 bool FoundElse =
Record[Idx++];
4046 ConditionalStack.push_back(
4047 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4049 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4054 if (!
Record.empty() && Listener)
4072 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4073 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4074 return llvm::createStringError(std::errc::invalid_argument,
4075 "ran out of source locations");
4080 unsigned RangeStart =
4082 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4087 GlobalSLocOffsetMap.insert(
4089 - SLocSpaceSize,&F));
4100 ParseLineTable(F,
Record);
4104 for (
unsigned I = 0, N =
Record.size(); I != N; )
4105 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4109 if (
Record.size() % 3 != 0)
4110 return llvm::createStringError(std::errc::illegal_byte_sequence,
4111 "Invalid VTABLE_USES record");
4118 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4119 VTableUses.push_back(
4120 {ReadDeclID(F,
Record, Idx),
4121 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4128 if (
Record.size() % 2 != 0)
4129 return llvm::createStringError(
4130 std::errc::illegal_byte_sequence,
4131 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4136 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4137 PendingInstantiations.push_back(
4138 {ReadDeclID(F,
Record, I),
4139 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4146 return llvm::createStringError(std::errc::illegal_byte_sequence,
4147 "Invalid SEMA_DECL_REFS block");
4148 for (
unsigned I = 0, N =
Record.size(); I != N; )
4149 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4157 unsigned StartingID;
4158 if (!PP.getPreprocessingRecord())
4159 PP.createPreprocessingRecord();
4160 if (!PP.getPreprocessingRecord()->getExternalSource())
4161 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4163 = PP.getPreprocessingRecord()
4170 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4181 if (!PP.getPreprocessingRecord())
4182 PP.createPreprocessingRecord();
4183 if (!PP.getPreprocessingRecord()->getExternalSource())
4184 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4189 GlobalSkippedRangeMap.insert(
4195 if (
Record.size() % 2 != 0)
4196 return llvm::createStringError(
4197 std::errc::illegal_byte_sequence,
4198 "invalid DECL_UPDATE_OFFSETS block in AST file");
4199 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4200 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4201 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4205 if (Decl *D = GetExistingDecl(ID))
4206 PendingUpdateRecords.push_back(
4207 PendingUpdateRecord(ID, D,
false));
4212 if (
Record.size() % 5 != 0)
4213 return llvm::createStringError(
4214 std::errc::illegal_byte_sequence,
4215 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4217 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4218 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4221 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4224 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4227 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4230 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4233 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4235 DelayedNamespaceOffsetMap[
ID] = {
4236 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4238 assert(!GetExistingDecl(ID) &&
4239 "We shouldn't load the namespace in the front of delayed "
4240 "namespace lexical and visible block");
4246 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4247 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4248 auto &RelatedDecls = RelatedDeclsMap[
ID];
4249 unsigned NN =
Record[I++];
4250 RelatedDecls.reserve(NN);
4251 for (
unsigned II = 0; II < NN; II++)
4252 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4258 return llvm::createStringError(
4259 std::errc::illegal_byte_sequence,
4260 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4273 CUDASpecialDeclRefs.clear();
4274 for (
unsigned I = 0, N =
Record.size(); I != N; )
4275 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4285 HeaderFileInfoTrait(*
this, F));
4287 PP.getHeaderSearchInfo().SetExternalSource(
this);
4288 if (!PP.getHeaderSearchInfo().getExternalLookup())
4289 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4295 FPPragmaOptions.swap(
Record);
4299 for (
unsigned I = 0, N =
Record.size(); I != N; )
4300 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4304 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4305 auto Name = ReadString(
Record, I);
4306 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4307 OptInfo.Supported =
Record[I++] != 0;
4308 OptInfo.Enabled =
Record[I++] != 0;
4309 OptInfo.WithPragma =
Record[I++] != 0;
4310 OptInfo.Avail =
Record[I++];
4311 OptInfo.Core =
Record[I++];
4312 OptInfo.Opt =
Record[I++];
4317 for (
unsigned I = 0, N =
Record.size(); I != N; )
4318 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4322 for (
unsigned I = 0, N =
Record.size(); I != N; )
4323 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4327 if (
Record.size() % 2 != 0)
4328 return llvm::createStringError(std::errc::illegal_byte_sequence,
4329 "invalid undefined-but-used record");
4330 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4331 UndefinedButUsed.push_back(
4332 {ReadDeclID(F,
Record, I),
4333 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4338 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4339 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4341 DelayedDeleteExprs.push_back(Count);
4342 for (uint64_t
C = 0;
C < Count; ++
C) {
4343 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4344 bool IsArrayForm =
Record[I++] == 1;
4345 DelayedDeleteExprs.push_back(IsArrayForm);
4352 getContext().getLangOpts().BuildingPCHWithObjectFile)
4353 for (
unsigned I = 0, N =
Record.size(); I != N;)
4354 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4362 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4363 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4364 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4366 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4367 if (DeserializationListener)
4368 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4376 return llvm::createStringError(
4377 std::errc::illegal_byte_sequence,
4378 "duplicate MACRO_OFFSET record in AST file");
4390 LateParsedTemplates.emplace_back(
4391 std::piecewise_construct, std::forward_as_tuple(&F),
4397 return llvm::createStringError(std::errc::illegal_byte_sequence,
4398 "invalid pragma optimize record");
4399 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4404 return llvm::createStringError(std::errc::illegal_byte_sequence,
4405 "invalid pragma ms_struct record");
4406 PragmaMSStructState =
Record[0];
4411 return llvm::createStringError(
4412 std::errc::illegal_byte_sequence,
4413 "invalid pragma pointers to members record");
4414 PragmaMSPointersToMembersState =
Record[0];
4415 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4419 for (
unsigned I = 0, N =
Record.size(); I != N; )
4420 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4425 return llvm::createStringError(std::errc::illegal_byte_sequence,
4426 "invalid cuda pragma options record");
4427 ForceHostDeviceDepth =
Record[0];
4432 return llvm::createStringError(std::errc::illegal_byte_sequence,
4433 "invalid pragma pack record");
4434 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4435 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4436 unsigned NumStackEntries =
Record[2];
4439 PragmaAlignPackStack.clear();
4440 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4441 PragmaAlignPackStackEntry Entry;
4442 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4443 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4444 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4445 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4446 Entry.SlotLabel = PragmaAlignPackStrings.back();
4447 PragmaAlignPackStack.push_back(Entry);
4454 return llvm::createStringError(std::errc::illegal_byte_sequence,
4455 "invalid pragma float control record");
4457 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4458 unsigned NumStackEntries =
Record[2];
4461 FpPragmaStack.clear();
4462 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4463 FpPragmaStackEntry Entry;
4465 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4466 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4467 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4468 Entry.SlotLabel = FpPragmaStrings.back();
4469 FpPragmaStack.push_back(Entry);
4475 for (
unsigned I = 0, N =
Record.size(); I != N; )
4476 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4480 unsigned NumRecords =
Record.front();
4482 if (
Record.size() - 1 != NumRecords)
4483 return llvm::createStringError(std::errc::illegal_byte_sequence,
4484 "invalid rvv intrinsic pragma record");
4486 if (RISCVVecIntrinsicPragma.empty())
4487 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4490 for (
unsigned i = 0; i < NumRecords; ++i)
4491 RISCVVecIntrinsicPragma[i] |=
Record[i + 1];
4498void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4511 assert(ImportedModuleVector.empty());
4513 while (
Data < DataEnd) {
4517 using namespace llvm::support;
4519 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4520 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4521 StringRef Name = StringRef((
const char*)
Data, Len);
4525 ? ModuleMgr.lookupByModuleName(Name)
4526 : ModuleMgr.lookupByFileName(Name));
4528 std::string Msg =
"refers to unknown module, cannot find ";
4529 Msg.append(std::string(Name));
4534 ImportedModuleVector.push_back(OM);
4537 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4539 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4542 RemapBuilder &Remap) {
4543 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4545 Remap.insert(std::make_pair(Offset,
4546 static_cast<int>(BaseOffset - Offset)));
4557 unsigned ClientLoadCapabilities) {
4566 "MODULE_NAME should come before MODULE_MAP_FILE");
4567 if (PP.getPreprocessorOpts().ModulesCheckRelocated &&
4573 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4575 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4577 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
4580 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4581 if (
auto ASTFE = M ? M->
getASTFile() : std::nullopt) {
4584 << ASTFE->getName();
4588 Diag(diag::err_imported_module_not_found)
4595 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4596 Diag(diag::note_imported_by_pch_module_not_found)
4603 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4607 if (!StoredModMap || *StoredModMap != ModMap) {
4608 assert(ModMap &&
"found module is missing module map file");
4610 "top-level import should be verified");
4612 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4613 Diag(diag::err_imported_module_modmap_changed)
4620 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4622 std::string Filename = ReadPath(F,
Record, Idx);
4625 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4626 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4629 AdditionalStoredMaps.insert(*SF);
4634 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4635 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4638 if (!AdditionalStoredMaps.erase(ModMap)) {
4639 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4640 Diag(diag::err_module_different_modmap)
4649 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4650 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4651 Diag(diag::err_module_different_modmap)
4665 SemaObjC::GlobalMethodPool::iterator Known =
4671 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4672 : Known->second.second;
4676 if (List->getMethod() == Method) {
4684 if (List->getNext())
4685 List->setMethod(List->getNext()->getMethod());
4687 List->setMethod(Method);
4693 for (
Decl *D : Names) {
4697 if (wasHidden && SemaObj) {
4710 Stack.push_back(Mod);
4711 while (!Stack.empty()) {
4712 Mod = Stack.pop_back_val();
4714 if (NameVisibility <= Mod->NameVisibility) {
4730 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4731 if (Hidden != HiddenNamesMap.end()) {
4732 auto HiddenNames = std::move(*Hidden);
4733 HiddenNamesMap.erase(Hidden);
4735 assert(!HiddenNamesMap.contains(Mod) &&
4736 "making names visible added hidden names");
4743 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4745 if (Visited.insert(Exported).second)
4746 Stack.push_back(Exported);
4764 PendingMergedDefinitionsToDeduplicate.insert(Def);
4773 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4774 !PP.getLangOpts().Modules)
4778 TriedLoadingGlobalIndex =
true;
4779 StringRef SpecificModuleCachePath =
4781 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4783 if (llvm::Error Err = std::move(
Result.second)) {
4785 consumeError(std::move(Err));
4789 GlobalIndex.reset(
Result.first);
4790 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4795 return PP.getLangOpts().Modules && UseGlobalIndex &&
4807 consumeError(MaybeEntry.takeError());
4810 llvm::BitstreamEntry Entry = MaybeEntry.get();
4812 switch (Entry.Kind) {
4813 case llvm::BitstreamEntry::Error:
4814 case llvm::BitstreamEntry::EndBlock:
4817 case llvm::BitstreamEntry::Record:
4823 consumeError(Skipped.takeError());
4827 case llvm::BitstreamEntry::SubBlock:
4828 if (Entry.ID == BlockID) {
4829 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4831 consumeError(std::move(Err));
4838 if (llvm::Error Err = Cursor.SkipBlock()) {
4840 consumeError(std::move(Err));
4849 unsigned ClientLoadCapabilities,
4851 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
4855 CurrentDeserializingModuleKind,
Type);
4861 unsigned PreviousGeneration = 0;
4865 unsigned NumModules = ModuleMgr.size();
4870 ClientLoadCapabilities)) {
4871 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4875 GlobalIndex.reset();
4876 ModuleMgr.setGlobalIndex(
nullptr);
4880 if (NewLoadedModuleFile && !Loaded.empty())
4881 *NewLoadedModuleFile = Loaded.back().Mod;
4892 for (ImportedModule &M : Loaded) {
4894 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
4897 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4898 Error(std::move(Err));
4904 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
4910 if (llvm::Error Err = ReadExtensionBlock(F)) {
4911 Error(std::move(Err));
4924 for (ImportedModule &M : Loaded) {
4940 if (!PP.getLangOpts().CPlusPlus) {
4947 auto It = PP.getIdentifierTable().find(Key);
4948 if (It == PP.getIdentifierTable().end())
4957 II = &PP.getIdentifierTable().getOwn(Key);
4975 for (
auto &Id : PP.getIdentifierTable())
4976 Id.second->setOutOfDate(
true);
4979 for (
const auto &Sel : SelectorGeneration)
4980 SelectorOutOfDate[Sel.first] =
true;
4984 for (ImportedModule &M : Loaded) {
4987 ModuleMgr.moduleFileAccepted(&F);
5000 for (
unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
5001 UnresolvedModuleRef &
Unresolved = UnresolvedModuleRefs[I];
5006 case UnresolvedModuleRef::Conflict:
5009 Conflict.
Other = ResolvedMod;
5011 Unresolved.Mod->Conflicts.push_back(Conflict);
5015 case UnresolvedModuleRef::Import:
5020 case UnresolvedModuleRef::Affecting:
5022 Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
5025 case UnresolvedModuleRef::Export:
5032 UnresolvedModuleRefs.clear();
5044 if (DeserializationListener)
5045 DeserializationListener->ReaderInitialized(
this);
5047 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5062 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5063 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5064 ObjCClassesLoaded[I], PreviousGeneration);
5069 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5074 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5075 ImportedModule &M = Loaded[I];
5093 if (!Stream.canSkipToPos(4))
5094 return llvm::createStringError(
5095 std::errc::illegal_byte_sequence,
5096 "file too small to contain precompiled file magic");
5097 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5100 return llvm::createStringError(
5101 std::errc::illegal_byte_sequence,
5102 "file doesn't start with precompiled file magic");
5104 return Res.takeError();
5105 return llvm::Error::success();
5120 llvm_unreachable(
"unknown module kind");
5124ASTReader::ReadASTCore(StringRef
FileName,
5126 SourceLocation ImportLoc,
5128 SmallVectorImpl<ImportedModule> &Loaded,
5129 off_t ExpectedSize, time_t ExpectedModTime,
5130 ASTFileSignature ExpectedSignature,
5131 unsigned ClientLoadCapabilities) {
5133 std::string ErrorStr;
5135 = ModuleMgr.addModule(
FileName,
Type, ImportLoc, ImportedBy,
5136 getGeneration(), ExpectedSize, ExpectedModTime,
5140 switch (AddResult) {
5142 Diag(diag::remark_module_import)
5144 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5154 if (ClientLoadCapabilities & ARR_Missing)
5158 Diag(diag::err_ast_file_not_found)
5166 if (ClientLoadCapabilities & ARR_OutOfDate)
5170 Diag(diag::err_ast_file_out_of_date)
5176 assert(M &&
"Missing module file");
5178 bool ShouldFinalizePCM =
false;
5179 llvm::scope_exit FinalizeOrDropPCM([&]() {
5180 auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
5181 if (ShouldFinalizePCM)
5187 BitstreamCursor &Stream = F.Stream;
5188 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5189 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5193 Diag(diag::err_ast_file_invalid)
5199 bool HaveReadControlBlock =
false;
5201 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5203 Error(MaybeEntry.takeError());
5206 llvm::BitstreamEntry Entry = MaybeEntry.get();
5208 switch (Entry.Kind) {
5209 case llvm::BitstreamEntry::Error:
5210 case llvm::BitstreamEntry::Record:
5211 case llvm::BitstreamEntry::EndBlock:
5212 Error(
"invalid record at top-level of AST file");
5215 case llvm::BitstreamEntry::SubBlock:
5221 HaveReadControlBlock =
true;
5222 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5230 F.ModuleName.empty()) {
5232 if (
Result != OutOfDate ||
5233 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
5239 case Failure:
return Failure;
5240 case Missing:
return Missing;
5241 case OutOfDate:
return OutOfDate;
5243 case ConfigurationMismatch:
return ConfigurationMismatch;
5244 case HadErrors:
return HadErrors;
5249 if (!HaveReadControlBlock) {
5250 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
5251 Diag(diag::err_ast_file_version_too_old)
5257 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
5258 ShouldFinalizePCM =
true;
5262 if (llvm::Error Err = Stream.SkipBlock()) {
5263 Error(std::move(Err));
5270 llvm_unreachable(
"unexpected break; expected return");
5274ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5275 unsigned ClientLoadCapabilities) {
5276 const HeaderSearchOptions &HSOpts =
5277 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5278 bool AllowCompatibleConfigurationMismatch =
5280 bool DisableValidation = shouldDisableValidationForFile(F);
5282 ASTReadResult
Result = readUnhashedControlBlockImpl(
5284 AllowCompatibleConfigurationMismatch, Listener.get(),
5289 if (DisableValidation || WasImportedBy ||
5290 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5294 Error(
"malformed block record in AST file");
5317 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5319 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5328 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5329 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5330 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5332 BitstreamCursor Stream(StreamData);
5337 consumeError(std::move(Err));
5349 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5352 consumeError(MaybeEntry.takeError());
5355 llvm::BitstreamEntry Entry = MaybeEntry.get();
5357 switch (Entry.Kind) {
5358 case llvm::BitstreamEntry::Error:
5359 case llvm::BitstreamEntry::SubBlock:
5362 case llvm::BitstreamEntry::EndBlock:
5365 case llvm::BitstreamEntry::Record:
5373 Expected<unsigned> MaybeRecordType =
5374 Stream.readRecord(Entry.ID,
Record, &Blob);
5375 if (!MaybeRecordType) {
5384 "Dummy AST file signature not backpatched in ASTWriter.");
5391 "Dummy AST block hash not backpatched in ASTWriter.");
5395 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5396 if (Listener && ValidateDiagnosticOptions &&
5397 !AllowCompatibleConfigurationMismatch &&
5398 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5403 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5404 if (Listener && !AllowCompatibleConfigurationMismatch &&
5405 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5406 Result = ConfigurationMismatch;
5435 if (
Record.size() < 4)
return true;
5440 unsigned BlockNameLen =
Record[2];
5441 unsigned UserInfoLen =
Record[3];
5443 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5445 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5446 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5447 Blob.data() + BlockNameLen + UserInfoLen);
5451llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5452 BitstreamCursor &Stream = F.
Stream;
5456 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5458 return MaybeEntry.takeError();
5459 llvm::BitstreamEntry Entry = MaybeEntry.get();
5461 switch (Entry.Kind) {
5462 case llvm::BitstreamEntry::SubBlock:
5463 if (llvm::Error Err = Stream.SkipBlock())
5466 case llvm::BitstreamEntry::EndBlock:
5467 return llvm::Error::success();
5468 case llvm::BitstreamEntry::Error:
5469 return llvm::createStringError(std::errc::illegal_byte_sequence,
5470 "malformed block record in AST file");
5471 case llvm::BitstreamEntry::Record:
5477 Expected<unsigned> MaybeRecCode =
5478 Stream.readRecord(Entry.ID,
Record, &Blob);
5480 return MaybeRecCode.takeError();
5481 switch (MaybeRecCode.get()) {
5483 ModuleFileExtensionMetadata Metadata;
5485 return llvm::createStringError(
5486 std::errc::illegal_byte_sequence,
5487 "malformed EXTENSION_METADATA in AST file");
5490 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5491 if (Known == ModuleFileExtensions.end())
break;
5494 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5504 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5508 assert(ContextObj &&
"no context to initialize");
5512 if (DeserializationListener)
5513 DeserializationListener->DeclRead(
5515 Context.getTranslationUnitDecl());
5523 if (!Context.CFConstantStringTypeDecl)
5524 Context.setCFConstantStringType(
GetType(String));
5529 if (FileType.isNull()) {
5530 Error(
"FILE type is NULL");
5534 if (!Context.FILEDecl) {
5536 Context.setFILEDecl(
Typedef->getDecl());
5538 const TagType *Tag = FileType->getAs<TagType>();
5540 Error(
"Invalid FILE type in AST file");
5543 Context.setFILEDecl(Tag->getDecl());
5550 if (Jmp_bufType.
isNull()) {
5551 Error(
"jmp_buf type is NULL");
5555 if (!Context.jmp_bufDecl) {
5557 Context.setjmp_bufDecl(
Typedef->getDecl());
5559 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5561 Error(
"Invalid jmp_buf type in AST file");
5564 Context.setjmp_bufDecl(Tag->getDecl());
5571 if (Sigjmp_bufType.
isNull()) {
5572 Error(
"sigjmp_buf type is NULL");
5576 if (!Context.sigjmp_bufDecl) {
5578 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5580 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5581 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5582 Context.setsigjmp_bufDecl(Tag->getDecl());
5588 if (Context.ObjCIdRedefinitionType.isNull())
5589 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5592 if (
TypeID ObjCClassRedef =
5594 if (Context.ObjCClassRedefinitionType.isNull())
5595 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5598 if (
TypeID ObjCSelRedef =
5600 if (Context.ObjCSelRedefinitionType.isNull())
5601 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5606 if (Ucontext_tType.
isNull()) {
5607 Error(
"ucontext_t type is NULL");
5611 if (!Context.ucontext_tDecl) {
5613 Context.setucontext_tDecl(
Typedef->getDecl());
5615 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5616 assert(Tag &&
"Invalid ucontext_t type in AST file");
5617 Context.setucontext_tDecl(Tag->getDecl());
5626 if (!CUDASpecialDeclRefs.empty()) {
5627 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5628 Context.setcudaConfigureCallDecl(
5629 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5630 Context.setcudaGetParameterBufferDecl(
5631 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5632 Context.setcudaLaunchDeviceDecl(
5633 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5638 for (
auto &Import : PendingImportedModules) {
5642 if (Import.ImportLoc.isValid())
5643 PP.makeModuleVisible(Imported, Import.ImportLoc);
5650 PendingImportedModulesSema.append(PendingImportedModules);
5651 PendingImportedModules.clear();
5661 BitstreamCursor Stream(
PCH);
5664 consumeError(std::move(Err));
5676 Stream.advanceSkippingSubblocks();
5679 consumeError(MaybeEntry.takeError());
5682 llvm::BitstreamEntry Entry = MaybeEntry.get();
5684 if (Entry.Kind != llvm::BitstreamEntry::Record)
5692 consumeError(MaybeRecord.takeError());
5698 "Dummy AST file signature not backpatched in ASTWriter.");
5708 const std::string &ASTFileName,
FileManager &FileMgr,
5711 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5716 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5717 << ASTFileName << Buffer.getError().message();
5718 return std::string();
5722 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5726 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5727 return std::string();
5732 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5733 return std::string();
5740 Stream.advanceSkippingSubblocks();
5743 consumeError(MaybeEntry.takeError());
5744 return std::string();
5746 llvm::BitstreamEntry Entry = MaybeEntry.get();
5748 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5749 return std::string();
5751 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5752 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5753 return std::string();
5761 consumeError(MaybeRecord.takeError());
5762 return std::string();
5777 std::string ExistingSpecificModuleCachePath;
5779 bool StrictOptionMatches;
5782 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5787 StringRef ExistingSpecificModuleCachePath,
5789 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5790 ExistingTargetOpts(ExistingTargetOpts),
5791 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
5792 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
5795 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5796 StringRef ModuleFilename,
bool Complain,
5797 bool AllowCompatibleDifferences)
override {
5799 nullptr, AllowCompatibleDifferences);
5802 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5803 StringRef ModuleFilename,
bool Complain,
5804 bool AllowCompatibleDifferences)
override {
5806 nullptr, AllowCompatibleDifferences);
5809 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5810 StringRef ModuleFilename,
bool Complain,
5811 bool AllowCompatibleDifferences)
override {
5813 nullptr, AllowCompatibleDifferences);
5816 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5817 StringRef ASTFilename,
5818 StringRef SpecificModuleCachePath,
5819 bool Complain)
override {
5822 ExistingSpecificModuleCachePath, ASTFilename,
nullptr,
5823 ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
5826 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5827 StringRef ModuleFilename,
bool ReadMacros,
5829 std::string &SuggestedPredefines)
override {
5831 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5832 FileMgr, SuggestedPredefines, ExistingLangOpts,
5844 unsigned ClientLoadCapabilities) {
5846 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5847 llvm::MemoryBuffer *Buffer =
5857 Filename ==
"-" ? FileMgr.getSTDIN() : FileMgr.getFileRef(Filename);
5859 llvm::consumeError(Entry.takeError());
5862 auto BufferOrErr = FileMgr.getBufferForFile(*Entry);
5865 OwnedBuffer = std::move(*BufferOrErr);
5866 Buffer = OwnedBuffer.get();
5870 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
5871 BitstreamCursor Stream(Bytes);
5875 consumeError(std::move(Err));
5883 bool NeedsInputFiles = Listener.needsInputFileVisitation();
5884 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5885 bool NeedsImports = Listener.needsImportVisitation();
5886 BitstreamCursor InputFilesCursor;
5887 uint64_t InputFilesOffsetBase = 0;
5890 std::string ModuleDir;
5891 bool DoneWithControlBlock =
false;
5893 PathBuf.reserve(256);
5898 AdditionalPathBuf.reserve(256);
5899 while (!DoneWithControlBlock) {
5903 consumeError(MaybeEntry.takeError());
5906 llvm::BitstreamEntry Entry = MaybeEntry.get();
5908 switch (Entry.Kind) {
5909 case llvm::BitstreamEntry::SubBlock: {
5912 std::string IgnoredSuggestedPredefines;
5913 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
5915 Listener, IgnoredSuggestedPredefines) !=
Success)
5921 InputFilesCursor = Stream;
5922 if (llvm::Error Err = Stream.SkipBlock()) {
5924 consumeError(std::move(Err));
5927 if (NeedsInputFiles &&
5930 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
5934 if (llvm::Error Err = Stream.SkipBlock()) {
5936 consumeError(std::move(Err));
5945 case llvm::BitstreamEntry::EndBlock:
5946 DoneWithControlBlock =
true;
5949 case llvm::BitstreamEntry::Error:
5952 case llvm::BitstreamEntry::Record:
5956 if (DoneWithControlBlock)
break;
5961 Stream.readRecord(Entry.ID,
Record, &Blob);
5962 if (!MaybeRecCode) {
5970 if (Listener.ReadFullVersionInformation(Blob))
5974 Listener.ReadModuleName(Blob);
5977 ModuleDir = std::string(Blob);
5983 Listener.ReadModuleMapFile(*Path);
5987 if (!NeedsInputFiles)
5990 unsigned NumInputFiles =
Record[0];
5991 unsigned NumUserFiles =
Record[1];
5992 const llvm::support::unaligned_uint64_t *InputFileOffs =
5993 (
const llvm::support::unaligned_uint64_t *)Blob.data();
5994 for (
unsigned I = 0; I != NumInputFiles; ++I) {
5996 bool isSystemFile = I >= NumUserFiles;
5998 if (isSystemFile && !NeedsSystemInputFiles)
6001 BitstreamCursor &Cursor = InputFilesCursor;
6003 if (llvm::Error Err =
6004 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6006 consumeError(std::move(Err));
6012 consumeError(MaybeCode.takeError());
6014 unsigned Code = MaybeCode.get();
6018 bool shouldContinue =
false;
6020 Cursor.readRecord(Code,
Record, &Blob);
6021 if (!MaybeRecordType) {
6023 consumeError(MaybeRecordType.takeError());
6029 time_t StoredTime =
static_cast<time_t
>(
Record[2]);
6030 bool Overridden =
static_cast<bool>(
Record[3]);
6031 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6034 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6036 if (UnresolvedFilename.empty())
6037 Filename = *FilenameAsRequestedBuf;
6040 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6041 Filename = *FilenameBuf;
6043 shouldContinue = Listener.visitInputFileAsRequested(
6044 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6048 if (!shouldContinue)
6069 bool IsStandardCXXModule =
Record[Idx++];
6073 if (IsStandardCXXModule) {
6074 Listener.visitImport(ModuleName,
"");
6085 Listener.visitImport(ModuleName, *Filename);
6096 if (FindModuleFileExtensions) {
6097 BitstreamCursor SavedStream = Stream;
6099 bool DoneWithExtensionBlock =
false;
6100 while (!DoneWithExtensionBlock) {
6106 llvm::BitstreamEntry Entry = MaybeEntry.get();
6108 switch (Entry.Kind) {
6109 case llvm::BitstreamEntry::SubBlock:
6110 if (llvm::Error Err = Stream.SkipBlock()) {
6112 consumeError(std::move(Err));
6117 case llvm::BitstreamEntry::EndBlock:
6118 DoneWithExtensionBlock =
true;
6121 case llvm::BitstreamEntry::Error:
6124 case llvm::BitstreamEntry::Record:
6131 Stream.readRecord(Entry.ID,
Record, &Blob);
6132 if (!MaybeRecCode) {
6136 switch (MaybeRecCode.get()) {
6142 Listener.readModuleFileExtension(Metadata);
6148 Stream = std::move(SavedStream);
6152 if (readUnhashedControlBlockImpl(
6153 nullptr, Bytes, Filename, ClientLoadCapabilities,
6155 ValidateDiagnosticOptions) !=
Success)
6166 StringRef SpecificModuleCachePath,
bool RequireStrictOptionMatches) {
6167 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6168 SpecificModuleCachePath, FileMgr,
6169 RequireStrictOptionMatches);
6175llvm::Error ASTReader::ReadSubmoduleBlock(
ModuleFile &F,
6176 unsigned ClientLoadCapabilities) {
6181 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6186 auto CreateModule = !KnowsTopLevelModule
6191 Module *CurrentModule =
nullptr;
6195 F.
Stream.advanceSkippingSubblocks();
6197 return MaybeEntry.takeError();
6198 llvm::BitstreamEntry Entry = MaybeEntry.get();
6200 switch (Entry.Kind) {
6201 case llvm::BitstreamEntry::SubBlock:
6202 case llvm::BitstreamEntry::Error:
6203 return llvm::createStringError(std::errc::illegal_byte_sequence,
6204 "malformed block record in AST file");
6205 case llvm::BitstreamEntry::EndBlock:
6206 return llvm::Error::success();
6207 case llvm::BitstreamEntry::Record:
6217 return MaybeKind.takeError();
6218 unsigned Kind = MaybeKind.get();
6221 return llvm::createStringError(
6222 std::errc::illegal_byte_sequence,
6223 "submodule metadata record should be at beginning of block");
6238 return llvm::createStringError(std::errc::illegal_byte_sequence,
6239 "malformed module definition");
6241 StringRef Name = Blob;
6248 bool IsFramework =
Record[Idx++];
6249 bool IsExplicit =
Record[Idx++];
6250 bool IsSystem =
Record[Idx++];
6251 bool IsExternC =
Record[Idx++];
6252 bool InferSubmodules =
Record[Idx++];
6253 bool InferExplicitSubmodules =
Record[Idx++];
6254 bool InferExportWildcard =
Record[Idx++];
6255 bool ConfigMacrosExhaustive =
Record[Idx++];
6256 bool ModuleMapIsPrivate =
Record[Idx++];
6257 bool NamedModuleHasInit =
Record[Idx++];
6259 Module *ParentModule =
nullptr;
6261 ParentModule = getSubmodule(Parent);
6263 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6264 IsFramework, IsExplicit);
6267 if (GlobalIndex >= SubmodulesLoaded.size() ||
6268 SubmodulesLoaded[GlobalIndex])
6269 return llvm::createStringError(std::errc::invalid_argument,
6270 "too many submodules");
6272 if (!ParentModule) {
6275 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6277 assert(CurFile != F.
File &&
"ModuleManager did not de-duplicate");
6279 Diag(diag::err_module_file_conflict)
6283 auto CurModMapFile =
6286 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6287 Diag(diag::note_module_file_conflict)
6288 << CurModMapFile->getName() << ModMapFile->getName();
6290 return llvm::make_error<AlreadyReportedDiagnosticError>();
6309 if (InferredAllowedBy.
isValid())
6319 if (DeserializationListener)
6320 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6322 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6347 auto Filename = ResolveImportedPath(PathBuf, Blob, F);
6348 if (
auto Umbrella = PP.getFileManager().getOptionalFileRef(*Filename)) {
6376 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6383 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6385 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6397 unsigned LocalBaseSubmoduleID =
Record[1];
6401 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
6406 std::make_pair(LocalBaseSubmoduleID,
6415 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6427 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6439 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6456 PP.getTargetInfo());
6462 Module::LinkLibrary(std::string(Blob),
Record[0]));
6486 SmallVector<GlobalDeclID, 16>
Inits;
6487 for (
unsigned I = 0; I <
Record.size(); )
6489 ContextObj->addLazyModuleInitializers(CurrentModule,
Inits);
6509bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6510 StringRef ModuleFilename,
bool Complain,
6511 ASTReaderListener &Listener,
6512 bool AllowCompatibleDifferences) {
6513 LangOptions LangOpts;
6515#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6516 LangOpts.Name = Record[Idx++];
6517#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6518 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6519#include "clang/Basic/LangOptions.def"
6520#define SANITIZER(NAME, ID) \
6521 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6522#include "clang/Basic/Sanitizers.def"
6524 for (
unsigned N =
Record[Idx++]; N; --N)
6528 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6529 LangOpts.
ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6534 for (
unsigned N =
Record[Idx++]; N; --N) {
6536 ReadString(
Record, Idx));
6541 for (
unsigned N =
Record[Idx++]; N; --N) {
6548 AllowCompatibleDifferences);
6551bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6552 StringRef ModuleFilename,
bool Complain,
6553 ASTReaderListener &Listener,
6554 bool AllowCompatibleDifferences) {
6556 CodeGenOptions CGOpts;
6558#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6559 if constexpr (CK::Compatibility != CK::Benign) \
6560 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6561#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6562 if constexpr (CK::Compatibility != CK::Benign) \
6563 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6564#define DEBUGOPT(Name, Bits, Default, Compatibility)
6565#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6566#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6567#include "clang/Basic/CodeGenOptions.def"
6570 AllowCompatibleDifferences);
6573bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6574 StringRef ModuleFilename,
bool Complain,
6575 ASTReaderListener &Listener,
6576 bool AllowCompatibleDifferences) {
6578 TargetOptions TargetOpts;
6580 TargetOpts.
CPU = ReadString(
Record, Idx);
6582 TargetOpts.
ABI = ReadString(
Record, Idx);
6583 for (
unsigned N =
Record[Idx++]; N; --N) {
6586 for (
unsigned N =
Record[Idx++]; N; --N) {
6591 AllowCompatibleDifferences);
6594bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6595 StringRef ModuleFilename,
bool Complain,
6596 ASTReaderListener &Listener) {
6597 DiagnosticOptions DiagOpts;
6599#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6600#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6601 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6602#include "clang/Basic/DiagnosticOptions.def"
6604 for (
unsigned N =
Record[Idx++]; N; --N)
6606 for (
unsigned N =
Record[Idx++]; N; --N)
6612bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6613 ASTReaderListener &Listener) {
6614 FileSystemOptions FSOpts;
6620bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6621 StringRef ModuleFilename,
6623 ASTReaderListener &Listener) {
6624 HeaderSearchOptions HSOpts;
6639 std::string SpecificModuleCachePath = ReadString(
Record, Idx);
6642 SpecificModuleCachePath, Complain);
6645bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6646 ASTReaderListener &Listener) {
6647 HeaderSearchOptions HSOpts;
6651 for (
unsigned N =
Record[Idx++]; N; --N) {
6652 std::string Path = ReadString(
Record, Idx);
6655 bool IsFramework =
Record[Idx++];
6656 bool IgnoreSysRoot =
Record[Idx++];
6657 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6662 for (
unsigned N =
Record[Idx++]; N; --N) {
6663 std::string Prefix = ReadString(
Record, Idx);
6664 bool IsSystemHeader =
Record[Idx++];
6669 for (
unsigned N =
Record[Idx++]; N; --N) {
6670 std::string VFSOverlayFile = ReadString(
Record, Idx);
6677bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6678 StringRef ModuleFilename,
6680 ASTReaderListener &Listener,
6681 std::string &SuggestedPredefines) {
6682 PreprocessorOptions PPOpts;
6686 bool ReadMacros =
Record[Idx++];
6688 for (
unsigned N =
Record[Idx++]; N; --N) {
6690 bool IsUndef =
Record[Idx++];
6691 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6696 for (
unsigned N =
Record[Idx++]; N; --N) {
6701 for (
unsigned N =
Record[Idx++]; N; --N) {
6710 SuggestedPredefines.clear();
6712 Complain, SuggestedPredefines);
6715std::pair<ModuleFile *, unsigned>
6716ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6717 GlobalPreprocessedEntityMapType::iterator
6718 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6719 assert(I != GlobalPreprocessedEntityMap.end() &&
6720 "Corrupted global preprocessed entity map");
6723 return std::make_pair(M, LocalIndex);
6726llvm::iterator_range<PreprocessingRecord::iterator>
6727ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6728 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6732 return llvm::make_range(PreprocessingRecord::iterator(),
6733 PreprocessingRecord::iterator());
6736bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6737 unsigned int ClientLoadCapabilities) {
6738 return ClientLoadCapabilities & ARR_OutOfDate &&
6741 .getInMemoryModuleCache()
6742 .isPCMFinal(ModuleFileName);
6745llvm::iterator_range<ASTReader::ModuleDeclIterator>
6747 return llvm::make_range(
6754 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6755 assert(I != GlobalSkippedRangeMap.end() &&
6756 "Corrupted global skipped range map");
6759 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6763 assert(Range.isValid());
6769 unsigned ModuleFileIndex = ID >> 32;
6770 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
6771 assert(getModuleManager().size() > ModuleFileIndex - 1);
6772 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6774 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6779 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6781 unsigned LocalIndex = PPInfo.second;
6786 if (!PP.getPreprocessingRecord()) {
6787 Error(
"no preprocessing record");
6794 Error(std::move(Err));
6801 Error(MaybeEntry.takeError());
6804 llvm::BitstreamEntry Entry = MaybeEntry.get();
6806 if (Entry.Kind != llvm::BitstreamEntry::Record)
6817 if (!MaybeRecType) {
6818 Error(MaybeRecType.takeError());
6823 bool isBuiltin =
Record[0];
6831 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
6851 if (DeserializationListener)
6852 DeserializationListener->MacroDefinitionRead(PPID, MD);
6858 const char *FullFileNameStart = Blob.data() +
Record[0];
6859 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
6861 if (!FullFileName.empty())
6862 File = PP.getFileManager().getOptionalFileRef(FullFileName);
6869 StringRef(Blob.data(),
Record[0]),
6877 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
6886unsigned ASTReader::findNextPreprocessedEntity(
6887 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
6889 for (GlobalSLocOffsetMapType::const_iterator
6890 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6896 return getTotalNumPreprocessedEntities();
6901struct PPEntityComp {
6902 const ASTReader &Reader;
6905 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6907 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
6908 SourceLocation LHS = getLoc(L);
6909 SourceLocation RHS = getLoc(R);
6913 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
6914 SourceLocation LHS = getLoc(L);
6918 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
6919 SourceLocation RHS = getLoc(R);
6923 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
6930unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
6931 bool EndsAfter)
const {
6932 if (SourceMgr.isLocalSourceLocation(Loc))
6933 return getTotalNumPreprocessedEntities();
6935 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
6936 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6937 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
6938 "Corrupted global sloc offset map");
6940 if (SLocMapI->second->NumPreprocessedEntities == 0)
6941 return findNextPreprocessedEntity(SLocMapI);
6952 pp_iterator
First = pp_begin;
6956 PPI = std::upper_bound(pp_begin, pp_end, Loc,
6957 PPEntityComp(*
this, M));
6966 std::advance(PPI,
Half);
6967 if (SourceMgr.isBeforeInTranslationUnit(
6968 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
6971 Count = Count -
Half - 1;
6978 return findNextPreprocessedEntity(SLocMapI);
6985std::pair<unsigned, unsigned>
6987 if (Range.isInvalid())
6988 return std::make_pair(0,0);
6989 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
6991 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
6992 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
6993 return std::make_pair(BeginID, EndID);
7003 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7005 unsigned LocalIndex = PPInfo.second;
7012 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7021 class HeaderFileInfoVisitor {
7023 std::optional<HeaderFileInfo> HFI;
7026 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7035 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7036 if (Pos == Table->end())
7043 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7049 HeaderFileInfoVisitor Visitor(FE);
7050 ModuleMgr.visit(Visitor);
7051 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7058 using DiagState = DiagnosticsEngine::DiagState;
7069 auto ReadDiagState = [&](
const DiagState &BasedOn,
7070 bool IncludeNonPragmaStates) {
7071 unsigned BackrefID =
Record[Idx++];
7073 return DiagStates[BackrefID - 1];
7076 Diag.DiagStates.push_back(BasedOn);
7077 DiagState *NewState = &
Diag.DiagStates.back();
7078 DiagStates.push_back(NewState);
7079 unsigned Size =
Record[Idx++];
7080 assert(Idx + Size * 2 <=
Record.size() &&
7081 "Invalid data, not enough diag/map pairs");
7083 unsigned DiagID =
Record[Idx++];
7086 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7099 Mapping = NewMapping;
7105 DiagState *FirstState;
7110 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7111 DiagStates.push_back(FirstState);
7115 "Invalid data, unexpected backref in initial state");
7117 assert(Idx <
Record.size() &&
7118 "Invalid data, not enough state change pairs in initial state");
7123 unsigned Flags =
Record[Idx++];
7124 DiagState Initial(*
Diag.getDiagnosticIDs());
7125 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7126 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7127 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7128 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7129 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7131 FirstState = ReadDiagState(Initial,
true);
7139 .StateTransitions.push_back({FirstState, 0});
7144 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7148 unsigned NumLocations =
Record[Idx++];
7149 while (NumLocations--) {
7150 assert(Idx <
Record.size() &&
7151 "Invalid data, missing pragma diagnostic states");
7153 assert(FID.
isValid() &&
"invalid FileID for transition");
7154 unsigned Transitions =
Record[Idx++];
7160 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7161 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7162 for (
unsigned I = 0; I != Transitions; ++I) {
7163 unsigned Offset =
Record[Idx++];
7164 auto *State = ReadDiagState(*FirstState,
false);
7165 F.StateTransitions.push_back({State, Offset});
7170 assert(Idx <
Record.size() &&
7171 "Invalid data, missing final pragma diagnostic state");
7173 auto *CurState = ReadDiagState(*FirstState,
false);
7176 Diag.DiagStatesByLoc.CurDiagState = CurState;
7177 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7182 auto &
T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7184 T.push_back({CurState, 0});
7186 T[0].State = CurState;
7195ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7196 auto [M, Index] = translateTypeIDToIndex(ID);
7203#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7204 case TYPE_##CODE_ID: return Type::CLASS_ID;
7205#include "clang/Serialization/TypeBitCodes.def"
7207 return std::nullopt;
7217QualType ASTReader::readTypeRecord(
TypeID ID) {
7218 assert(ContextObj &&
"reading type with no AST context");
7219 ASTContext &Context = *ContextObj;
7220 RecordLocation Loc = TypeCursorForIndex(ID);
7221 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7225 SavedStreamPosition SavedPosition(DeclsCursor);
7227 ReadingKindTracker ReadingKind(Read_Type, *
this);
7230 Deserializing AType(
this);
7232 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7233 Error(std::move(Err));
7236 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7238 Error(RawCode.takeError());
7242 ASTRecordReader
Record(*
this, *Loc.F);
7243 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7245 Error(Code.takeError());
7249 QualType baseType =
Record.readQualType();
7250 Qualifiers quals =
Record.readQualifiers();
7256 Error(
"Unexpected code for type");
7260 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7261 return TypeReader.read(*maybeClass);
7269 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7270 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7273 return Reader.readTypeSourceInfo();
7277 return Reader.readNestedNameSpecifierLoc();
7281 return Reader.readAttr();
7290#define ABSTRACT_TYPELOC(CLASS, PARENT)
7291#define TYPELOC(CLASS, PARENT) \
7292 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7293#include "clang/AST/TypeLocNodes.def"
7302void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7306void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7316void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7320void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7324void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7328void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7332void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7336void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7340void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7344void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7348void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7352void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7360 if (Reader.readBool())
7367 VisitArrayTypeLoc(TL);
7371 VisitArrayTypeLoc(TL);
7374void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7375 VisitArrayTypeLoc(TL);
7378void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7379 DependentSizedArrayTypeLoc TL) {
7380 VisitArrayTypeLoc(TL);
7383void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7384 DependentAddressSpaceTypeLoc TL) {
7391void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7392 DependentSizedExtVectorTypeLoc TL) {
7396void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7400void TypeLocReader::VisitDependentVectorTypeLoc(
7401 DependentVectorTypeLoc TL) {
7405void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7409void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7416void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7417 DependentSizedMatrixTypeLoc TL) {
7430 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7436 VisitFunctionTypeLoc(TL);
7440 VisitFunctionTypeLoc(TL);
7443void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7444 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7445 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7446 SourceLocation NameLoc = readSourceLocation();
7447 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7450void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7451 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7452 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7453 SourceLocation NameLoc = readSourceLocation();
7454 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7457void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7458 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7459 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7460 SourceLocation NameLoc = readSourceLocation();
7461 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7464void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7470void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7477void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7482void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7486void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7500 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7505void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7507 if (Reader.readBool())
7509 if (Reader.readBool())
7513void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7527 VisitTagTypeLoc(TL);
7531 VisitTagTypeLoc(TL);
7534void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7536void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7540void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7544void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7548void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7549 HLSLAttributedResourceTypeLoc TL) {
7553void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7557void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7561void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7562 SubstTemplateTypeParmTypeLoc TL) {
7566void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7567 SubstTemplateTypeParmPackTypeLoc TL) {
7571void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7572 SubstBuiltinTemplatePackTypeLoc TL) {
7576void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7577 TemplateSpecializationTypeLoc TL) {
7578 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7579 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7580 SourceLocation TemplateKeywordLoc = readSourceLocation();
7581 SourceLocation NameLoc = readSourceLocation();
7582 SourceLocation LAngleLoc = readSourceLocation();
7583 SourceLocation RAngleLoc = readSourceLocation();
7584 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7585 LAngleLoc, RAngleLoc);
7586 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7587 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7588 Args[I] = Reader.readTemplateArgumentLocInfo(
7589 TL.
getTypePtr()->template_arguments()[I].getKind());
7592void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7597void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7603void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7607void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7612void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7621void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7633void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7637void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7643void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7647void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7651void TypeLocReader::VisitDependentBitIntTypeLoc(
7652 clang::DependentBitIntTypeLoc TL) {
7656void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7690std::pair<ModuleFile *, unsigned>
7693 "Predefined type shouldn't be in TypesLoaded");
7695 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7697 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7698 assert(OwningModuleFile &&
7699 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7701 return {OwningModuleFile,
7706 assert(ContextObj &&
"reading type with no AST context");
7717 llvm_unreachable(
"Invalid predefined type");
7733 T = Context.UnsignedCharTy;
7736 T = Context.UnsignedShortTy;
7739 T = Context.UnsignedIntTy;
7742 T = Context.UnsignedLongTy;
7745 T = Context.UnsignedLongLongTy;
7748 T = Context.UnsignedInt128Ty;
7751 T = Context.SignedCharTy;
7754 T = Context.WCharTy;
7757 T = Context.ShortTy;
7766 T = Context.LongLongTy;
7769 T = Context.Int128Ty;
7772 T = Context.BFloat16Ty;
7778 T = Context.FloatTy;
7781 T = Context.DoubleTy;
7784 T = Context.LongDoubleTy;
7787 T = Context.ShortAccumTy;
7790 T = Context.AccumTy;
7793 T = Context.LongAccumTy;
7796 T = Context.UnsignedShortAccumTy;
7799 T = Context.UnsignedAccumTy;
7802 T = Context.UnsignedLongAccumTy;
7805 T = Context.ShortFractTy;
7808 T = Context.FractTy;
7811 T = Context.LongFractTy;
7814 T = Context.UnsignedShortFractTy;
7817 T = Context.UnsignedFractTy;
7820 T = Context.UnsignedLongFractTy;
7823 T = Context.SatShortAccumTy;
7826 T = Context.SatAccumTy;
7829 T = Context.SatLongAccumTy;
7832 T = Context.SatUnsignedShortAccumTy;
7835 T = Context.SatUnsignedAccumTy;
7838 T = Context.SatUnsignedLongAccumTy;
7841 T = Context.SatShortFractTy;
7844 T = Context.SatFractTy;
7847 T = Context.SatLongFractTy;
7850 T = Context.SatUnsignedShortFractTy;
7853 T = Context.SatUnsignedFractTy;
7856 T = Context.SatUnsignedLongFractTy;
7859 T = Context.Float16Ty;
7862 T = Context.Float128Ty;
7865 T = Context.Ibm128Ty;
7868 T = Context.OverloadTy;
7871 T = Context.UnresolvedTemplateTy;
7874 T = Context.BoundMemberTy;
7877 T = Context.PseudoObjectTy;
7880 T = Context.DependentTy;
7883 T = Context.UnknownAnyTy;
7886 T = Context.NullPtrTy;
7889 T = Context.Char8Ty;
7892 T = Context.Char16Ty;
7895 T = Context.Char32Ty;
7898 T = Context.ObjCBuiltinIdTy;
7901 T = Context.ObjCBuiltinClassTy;
7904 T = Context.ObjCBuiltinSelTy;
7906#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7907 case PREDEF_TYPE_##Id##_ID: \
7908 T = Context.SingletonId; \
7910#include "clang/Basic/OpenCLImageTypes.def"
7911#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7912 case PREDEF_TYPE_##Id##_ID: \
7913 T = Context.Id##Ty; \
7915#include "clang/Basic/OpenCLExtensionTypes.def"
7917 T = Context.OCLSamplerTy;
7920 T = Context.OCLEventTy;
7923 T = Context.OCLClkEventTy;
7926 T = Context.OCLQueueTy;
7929 T = Context.OCLReserveIDTy;
7932 T = Context.getAutoDeductType();
7935 T = Context.getAutoRRefDeductType();
7938 T = Context.ARCUnbridgedCastTy;
7941 T = Context.BuiltinFnTy;
7944 T = Context.IncompleteMatrixIdxTy;
7947 T = Context.ArraySectionTy;
7950 T = Context.OMPArrayShapingTy;
7953 T = Context.OMPIteratorTy;
7955#define SVE_TYPE(Name, Id, SingletonId) \
7956 case PREDEF_TYPE_##Id##_ID: \
7957 T = Context.SingletonId; \
7959#include "clang/Basic/AArch64ACLETypes.def"
7960#define PPC_VECTOR_TYPE(Name, Id, Size) \
7961 case PREDEF_TYPE_##Id##_ID: \
7962 T = Context.Id##Ty; \
7964#include "clang/Basic/PPCTypes.def"
7965#define RVV_TYPE(Name, Id, SingletonId) \
7966 case PREDEF_TYPE_##Id##_ID: \
7967 T = Context.SingletonId; \
7969#include "clang/Basic/RISCVVTypes.def"
7970#define WASM_TYPE(Name, Id, SingletonId) \
7971 case PREDEF_TYPE_##Id##_ID: \
7972 T = Context.SingletonId; \
7974#include "clang/Basic/WebAssemblyReferenceTypes.def"
7975#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
7976 case PREDEF_TYPE_##Id##_ID: \
7977 T = Context.SingletonId; \
7979#include "clang/Basic/AMDGPUTypes.def"
7980#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
7981 case PREDEF_TYPE_##Id##_ID: \
7982 T = Context.SingletonId; \
7984#include "clang/Basic/HLSLIntangibleTypes.def"
7987 assert(!
T.isNull() &&
"Unknown predefined type");
7988 return T.withFastQualifiers(FastQuals);
7991 unsigned Index = translateTypeIDToIndex(ID).second;
7993 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
7994 if (TypesLoaded[Index].isNull()) {
7995 TypesLoaded[Index] = readTypeRecord(ID);
7996 if (TypesLoaded[Index].isNull())
7999 TypesLoaded[Index]->setFromAST();
8000 if (DeserializationListener)
8002 TypesLoaded[Index]);
8005 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8018 ReadModuleOffsetMap(F);
8021 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8023 if (ModuleFileIndex == 0)
8028 ModuleFileIndex = MF.
Index + 1;
8029 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8048 TemplateNameLoc, EllipsisLoc);
8059 llvm_unreachable(
"unexpected template argument loc");
8076 unsigned NumArgsAsWritten =
readInt();
8077 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8091 if (NumCurrentElementsDeserializing) {
8096 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8119 auto *II = Name.getAsIdentifierInfo();
8120 assert(II &&
"non-identifier name in C?");
8121 if (II->isOutOfDate())
8138 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8139 Template = CTSD->getSpecializedTemplate();
8140 Args = CTSD->getTemplateArgs().asArray();
8141 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8142 Template = VTSD->getSpecializedTemplate();
8143 Args = VTSD->getTemplateArgs().asArray();
8144 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8145 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8147 Args = FD->getTemplateSpecializationArgs()->asArray();
8152 Template->loadLazySpecializationsImpl(Args);
8157 RecordLocation Loc = getLocalBitOffset(Offset);
8160 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8161 Error(std::move(Err));
8164 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8169 Error(MaybeCode.takeError());
8172 unsigned Code = MaybeCode.get();
8176 if (!MaybeRecCode) {
8177 Error(MaybeRecCode.takeError());
8181 Error(
"malformed AST file: missing C++ ctor initializers");
8185 return Record.readCXXCtorInitializers();
8189 assert(ContextObj &&
"reading base specifiers with no AST context");
8192 RecordLocation Loc = getLocalBitOffset(Offset);
8195 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8196 Error(std::move(Err));
8199 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8204 Error(MaybeCode.takeError());
8207 unsigned Code = MaybeCode.get();
8211 if (!MaybeRecCode) {
8212 Error(MaybeCode.takeError());
8215 unsigned RecCode = MaybeRecCode.get();
8218 Error(
"malformed AST file: missing C++ base specifiers");
8222 unsigned NumBases =
Record.readInt();
8225 for (
unsigned I = 0; I != NumBases; ++I)
8226 Bases[I] =
Record.readCXXBaseSpecifier();
8239 ReadModuleOffsetMap(F);
8242 OwningModuleFileIndex == 0
8246 if (OwningModuleFileIndex == 0)
8249 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8258 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8259 return M.
Index == ModuleFileIndex - 1;
8267 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8268 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8288 DeclCursorForID(ID, Loc);
8293 assert(ContextObj &&
"reading predefined decl without AST context");
8295 Decl *NewLoaded =
nullptr;
8301 return Context.getTranslationUnitDecl();
8304 if (Context.ObjCIdDecl)
8305 return Context.ObjCIdDecl;
8306 NewLoaded = Context.getObjCIdDecl();
8310 if (Context.ObjCSelDecl)
8311 return Context.ObjCSelDecl;
8312 NewLoaded = Context.getObjCSelDecl();
8316 if (Context.ObjCClassDecl)
8317 return Context.ObjCClassDecl;
8318 NewLoaded = Context.getObjCClassDecl();
8322 if (Context.ObjCProtocolClassDecl)
8323 return Context.ObjCProtocolClassDecl;
8324 NewLoaded = Context.getObjCProtocolDecl();
8328 if (Context.Int128Decl)
8329 return Context.Int128Decl;
8330 NewLoaded = Context.getInt128Decl();
8334 if (Context.UInt128Decl)
8335 return Context.UInt128Decl;
8336 NewLoaded = Context.getUInt128Decl();
8340 if (Context.ObjCInstanceTypeDecl)
8341 return Context.ObjCInstanceTypeDecl;
8342 NewLoaded = Context.getObjCInstanceTypeDecl();
8346 if (Context.BuiltinVaListDecl)
8347 return Context.BuiltinVaListDecl;
8348 NewLoaded = Context.getBuiltinVaListDecl();
8352 if (Context.VaListTagDecl)
8353 return Context.VaListTagDecl;
8354 NewLoaded = Context.getVaListTagDecl();
8358 if (Context.BuiltinMSVaListDecl)
8359 return Context.BuiltinMSVaListDecl;
8360 NewLoaded = Context.getBuiltinMSVaListDecl();
8365 return Context.getMSGuidTagDecl();
8368 if (Context.ExternCContext)
8369 return Context.ExternCContext;
8370 NewLoaded = Context.getExternCContextDecl();
8374 if (Context.CFConstantStringTypeDecl)
8375 return Context.CFConstantStringTypeDecl;
8376 NewLoaded = Context.getCFConstantStringDecl();
8380 if (Context.CFConstantStringTagDecl)
8381 return Context.CFConstantStringTagDecl;
8382 NewLoaded = Context.getCFConstantStringTagDecl();
8386 return Context.getMSTypeInfoTagDecl();
8388#define BuiltinTemplate(BTName) \
8389 case PREDEF_DECL##BTName##_ID: \
8390 if (Context.Decl##BTName) \
8391 return Context.Decl##BTName; \
8392 NewLoaded = Context.get##BTName##Decl(); \
8394#include "clang/Basic/BuiltinTemplates.inc"
8397 llvm_unreachable(
"Invalid decl ID");
8401 assert(NewLoaded &&
"Failed to load predefined decl?");
8403 if (DeserializationListener)
8404 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8409unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8410 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8411 if (!OwningModuleFile) {
8420 assert(ContextObj &&
"reading decl with no AST context");
8429 Merged.push_back(ID);
8434 unsigned Index = translateGlobalDeclIDToIndex(ID);
8436 if (Index >= DeclsLoaded.size()) {
8437 assert(0 &&
"declaration ID out-of-range for AST file");
8438 Error(
"declaration ID out-of-range for AST file");
8442 return DeclsLoaded[Index];
8449 unsigned Index = translateGlobalDeclIDToIndex(ID);
8451 if (Index >= DeclsLoaded.size()) {
8452 assert(0 &&
"declaration ID out-of-range for AST file");
8453 Error(
"declaration ID out-of-range for AST file");
8457 if (!DeclsLoaded[Index]) {
8459 if (DeserializationListener)
8460 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8463 return DeclsLoaded[Index];
8472 ReadModuleOffsetMap(M);
8482 uint64_t OrignalModuleFileIndex = 0;
8485 OrignalModuleFileIndex = I + 1;
8489 if (!OrignalModuleFileIndex)
8497 if (Idx >=
Record.size()) {
8498 Error(
"Corrupted AST file");
8515 RecordLocation Loc = getLocalBitOffset(Offset);
8516 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8517 Error(std::move(Err));
8520 assert(NumCurrentElementsDeserializing == 0 &&
8521 "should not be called while already deserializing");
8523 return ReadStmtFromStream(*Loc.F);
8526bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8530 auto It = SpecLookups.find(D);
8531 if (It == SpecLookups.end())
8537 It->second.Table.findAll();
8541 SpecLookups.erase(It);
8543 bool NewSpecsFound =
false;
8544 Deserializing LookupResults(
this);
8545 for (
auto &Info : Infos) {
8546 if (GetExistingDecl(Info))
8548 NewSpecsFound =
true;
8552 return NewSpecsFound;
8559 bool NewSpecsFound =
8560 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8562 return NewSpecsFound;
8564 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8565 return NewSpecsFound;
8568bool ASTReader::LoadExternalSpecializationsImpl(
8569 SpecLookupTableTy &SpecLookups,
const Decl *D,
8574 if (
auto It = SpecLookups.find(D); It != SpecLookups.end())
8575 LookupTable = &It->getSecond();
8581 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8583 llvm::raw_string_ostream OS(Name);
8590 Deserializing LookupResults(
this);
8595 LookupTable->
Table.find(HashValue);
8597 bool NewSpecsFound =
false;
8598 for (
auto &Info : Infos) {
8599 if (GetExistingDecl(Info))
8601 NewSpecsFound =
true;
8605 return NewSpecsFound;
8612 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8613 PartialSpecializationsLookups, D, TemplateArgs);
8615 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8617 return NewDeclsFound;
8625 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8626 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8627 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8629 if (!IsKindWeWant(K))
8632 auto ID = (
DeclID) + LexicalDecls[I + 1];
8637 if (PredefsVisited[ID])
8640 PredefsVisited[ID] =
true;
8644 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8652 for (
const auto &Lexical : TULexicalDecls)
8653 Visit(Lexical.first, Lexical.second);
8655 auto I = LexicalDecls.find(DC);
8656 if (I != LexicalDecls.end())
8657 Visit(I->second.first, I->second.second);
8660 ++NumLexicalDeclContextsRead;
8665class UnalignedDeclIDComp {
8671 : Reader(Reader), Mod(M) {}
8680 SourceLocation RHS = getLocation(R);
8685 SourceLocation LHS = getLocation(L);
8699 unsigned Offset,
unsigned Length,
8703 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8704 if (I == FileDeclIDs.end())
8707 FileDeclsInfo &DInfo = I->second;
8708 if (DInfo.Decls.empty())
8712 BeginLoc =
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
8715 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8717 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8718 if (BeginIt != DInfo.Decls.begin())
8724 while (BeginIt != DInfo.Decls.begin() &&
8727 ->isTopLevelDeclInObjCContainer())
8731 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8732 if (EndIt != DInfo.Decls.end())
8745 "DeclContext has no visible decls in storage");
8752 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8774 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8775 ++NumVisibleDeclContextsRead;
8776 Find(It->second.Table, Name);
8779 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8780 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8781 ++NumModuleLocalVisibleDeclContexts;
8782 Find(It->second.Table, std::make_pair(Name, NamedModule));
8785 if (
auto *NamedModule =
8786 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8788 FindModuleLocalLookup(NamedModule);
8793 if (ContextObj && ContextObj->getCurrentNamedModule())
8794 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8796 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8797 ++NumTULocalVisibleDeclContexts;
8798 Find(It->second.Table, Name);
8811 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
8812 auto It = LookupTables.find(DC);
8813 if (It == LookupTables.end())
8835 findAll(Lookups, NumVisibleDeclContextsRead);
8836 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8837 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8839 for (
auto &[Name, DS] : Decls)
8842 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
8847 auto I = Lookups.find(Primary);
8848 return I == Lookups.end() ?
nullptr : &I->second;
8853 auto I = ModuleLocalLookups.find(Primary);
8854 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
8859 auto I = TULocalLookups.find(Primary);
8860 return I == TULocalLookups.end() ?
nullptr : &I->second;
8867 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
8868 auto I = LookupTable.find(D);
8869 return I == LookupTable.end() ?
nullptr : &I->second;
8874 return PartialSpecializationsLookups.contains(D) ||
8875 SpecializationsLookups.contains(D);
8884 assert(ImplD && Consumer);
8886 for (
auto *I : ImplD->
methods())
8892void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
8893 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
8896 Consumer->HandleInterestingDecl(DeclGroupRef(D));
8899void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
8900 Consumer->HandleVTable(RD);
8904 this->Consumer = Consumer;
8907 PassInterestingDeclsToConsumer();
8909 if (DeserializationListener)
8910 DeserializationListener->ReaderInitialized(
this);
8914 std::fprintf(
stderr,
"*** AST File Statistics:\n");
8916 unsigned NumTypesLoaded =
8917 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
8918 unsigned NumDeclsLoaded =
8919 DeclsLoaded.size() -
8920 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
8921 unsigned NumIdentifiersLoaded =
8922 IdentifiersLoaded.size() -
8924 unsigned NumMacrosLoaded =
8925 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
8926 unsigned NumSelectorsLoaded =
8927 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
8930 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
8931 NumSLocEntriesRead, TotalNumSLocEntries,
8932 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
8933 if (!TypesLoaded.empty())
8934 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
8935 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
8936 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
8937 if (!DeclsLoaded.empty())
8938 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
8939 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
8940 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
8941 if (!IdentifiersLoaded.empty())
8942 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
8943 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
8944 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
8945 if (!MacrosLoaded.empty())
8946 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
8947 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
8948 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
8949 if (!SelectorsLoaded.empty())
8950 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
8951 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
8952 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
8953 if (TotalNumStatements)
8954 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
8955 NumStatementsRead, TotalNumStatements,
8956 ((
float)NumStatementsRead/TotalNumStatements * 100));
8958 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
8959 NumMacrosRead, TotalNumMacros,
8960 ((
float)NumMacrosRead/TotalNumMacros * 100));
8961 if (TotalLexicalDeclContexts)
8962 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
8963 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
8964 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
8966 if (TotalVisibleDeclContexts)
8967 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
8968 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
8969 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
8971 if (TotalModuleLocalVisibleDeclContexts)
8973 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
8974 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
8975 ((
float)NumModuleLocalVisibleDeclContexts /
8976 TotalModuleLocalVisibleDeclContexts * 100));
8977 if (TotalTULocalVisibleDeclContexts)
8978 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
8979 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
8980 ((
float)NumTULocalVisibleDeclContexts /
8981 TotalTULocalVisibleDeclContexts * 100));
8982 if (TotalNumMethodPoolEntries)
8983 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
8984 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
8985 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
8987 if (NumMethodPoolLookups)
8988 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
8989 NumMethodPoolHits, NumMethodPoolLookups,
8990 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
8991 if (NumMethodPoolTableLookups)
8992 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
8993 NumMethodPoolTableHits, NumMethodPoolTableLookups,
8994 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
8996 if (NumIdentifierLookupHits)
8998 " %u / %u identifier table lookups succeeded (%f%%)\n",
8999 NumIdentifierLookupHits, NumIdentifierLookups,
9000 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9003 std::fprintf(
stderr,
"\n");
9004 GlobalIndex->printStats();
9007 std::fprintf(
stderr,
"\n");
9009 std::fprintf(
stderr,
"\n");
9012template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9013LLVM_DUMP_METHOD
static void
9016 InitialCapacity> &Map) {
9017 if (Map.begin() == Map.end())
9022 llvm::errs() << Name <<
":\n";
9023 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9025 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9030 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9032 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9036 GlobalPreprocessedEntityMap);
9038 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9047 if (llvm::MemoryBuffer *buf = I.Buffer) {
9048 size_t bytes = buf->getBufferSize();
9049 switch (buf->getBufferKind()) {
9050 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9053 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9074 if (!FPPragmaOptions.empty()) {
9075 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9078 SemaObj->CurFPFeatures =
9084 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9085 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9086 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9087 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9089 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9091 DeclsWithEffectsToVerify.clear();
9093 SemaObj->OpenCLFeatures = OpenCLExtensions;
9099 assert(SemaObj &&
"no Sema to update");
9103 if (!SemaDeclRefs.empty()) {
9104 assert(SemaDeclRefs.size() % 3 == 0);
9105 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9106 if (!SemaObj->StdNamespace)
9107 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9108 if (!SemaObj->StdBadAlloc)
9109 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9110 if (!SemaObj->StdAlignValT)
9111 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9113 SemaDeclRefs.clear();
9118 if(OptimizeOffPragmaLocation.isValid())
9119 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9120 if (PragmaMSStructState != -1)
9122 if (PointersToMembersPragmaLocation.isValid()) {
9123 SemaObj->ActOnPragmaMSPointersToMembers(
9125 PragmaMSPointersToMembersState,
9126 PointersToMembersPragmaLocation);
9128 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9129 if (!RISCVVecIntrinsicPragma.empty()) {
9130 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9131 "Wrong number of RISCVVecIntrinsicPragma");
9132 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9133 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9134 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9137 if (PragmaAlignPackCurrentValue) {
9141 bool DropFirst =
false;
9142 if (!PragmaAlignPackStack.empty() &&
9143 PragmaAlignPackStack.front().Location.isInvalid()) {
9144 assert(PragmaAlignPackStack.front().Value ==
9145 SemaObj->AlignPackStack.DefaultValue &&
9146 "Expected a default alignment value");
9147 SemaObj->AlignPackStack.Stack.emplace_back(
9148 PragmaAlignPackStack.front().SlotLabel,
9149 SemaObj->AlignPackStack.CurrentValue,
9150 SemaObj->AlignPackStack.CurrentPragmaLocation,
9151 PragmaAlignPackStack.front().PushLocation);
9154 for (
const auto &Entry :
9155 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9156 SemaObj->AlignPackStack.Stack.emplace_back(
9157 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9159 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9160 assert(*PragmaAlignPackCurrentValue ==
9161 SemaObj->AlignPackStack.DefaultValue &&
9162 "Expected a default align and pack value");
9165 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9166 SemaObj->AlignPackStack.CurrentPragmaLocation =
9167 PragmaAlignPackCurrentLocation;
9170 if (FpPragmaCurrentValue) {
9174 bool DropFirst =
false;
9175 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9176 assert(FpPragmaStack.front().Value ==
9177 SemaObj->FpPragmaStack.DefaultValue &&
9178 "Expected a default pragma float_control value");
9179 SemaObj->FpPragmaStack.Stack.emplace_back(
9180 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9181 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9182 FpPragmaStack.front().PushLocation);
9185 for (
const auto &Entry :
9187 SemaObj->FpPragmaStack.Stack.emplace_back(
9188 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9189 if (FpPragmaCurrentLocation.isInvalid()) {
9190 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9191 "Expected a default pragma float_control value");
9194 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9195 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9200 for (
auto &Import : PendingImportedModulesSema) {
9201 if (Import.ImportLoc.isInvalid())
9204 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9207 PendingImportedModulesSema.clear();
9214 IdentifierLookupVisitor Visitor(Name, 0,
9215 NumIdentifierLookups,
9216 NumIdentifierLookupHits);
9222 if (PP.getLangOpts().CPlusPlus) {
9223 for (
auto *F : ModuleMgr.pch_modules())
9232 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9237 ModuleMgr.visit(Visitor, HitsPtr);
9259 ASTIdentifierLookupTable::key_iterator Current;
9263 ASTIdentifierLookupTable::key_iterator End;
9270 bool SkipModules =
false);
9272 StringRef
Next()
override;
9279 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9283 while (Current == End) {
9295 Current = IdTable->key_begin();
9296 End = IdTable->key_end();
9301 StringRef
Result = *Current;
9310 std::unique_ptr<IdentifierIterator> Current;
9311 std::unique_ptr<IdentifierIterator> Queued;
9314 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9315 std::unique_ptr<IdentifierIterator> Second)
9316 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9318 StringRef
Next()
override {
9322 StringRef result = Current->Next();
9323 if (!result.empty())
9328 std::swap(Current, Queued);
9337 std::unique_ptr<IdentifierIterator> ReaderIter(
9339 std::unique_ptr<IdentifierIterator> ModulesIter(
9340 GlobalIndex->createIdentifierIterator());
9341 return new ChainedIdentifierIterator(std::move(ReaderIter),
9342 std::move(ModulesIter));
9354 unsigned PriorGeneration;
9355 unsigned InstanceBits = 0;
9356 unsigned FactoryBits = 0;
9357 bool InstanceHasMoreThanOneDecl =
false;
9358 bool FactoryHasMoreThanOneDecl =
false;
9364 unsigned PriorGeneration)
9365 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9375 ++Reader.NumMethodPoolTableLookups;
9378 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9379 if (Pos == PoolTable->end())
9382 ++Reader.NumMethodPoolTableHits;
9383 ++Reader.NumSelectorsRead;
9387 ++Reader.NumMethodPoolEntriesRead;
9389 if (Reader.DeserializationListener)
9390 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9395 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9396 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9397 InstanceBits =
Data.InstanceBits;
9398 FactoryBits =
Data.FactoryBits;
9399 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9400 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9406 return InstanceMethods;
9411 return FactoryMethods;
9418 return InstanceHasMoreThanOneDecl;
9436 unsigned &Generation = SelectorGeneration[Sel];
9437 unsigned PriorGeneration = Generation;
9439 SelectorOutOfDate[Sel] =
false;
9442 ++NumMethodPoolLookups;
9444 ModuleMgr.visit(Visitor);
9450 ++NumMethodPoolHits;
9471 if (SelectorOutOfDate[Sel])
9479 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9481 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9482 Namespaces.push_back(Namespace);
9487 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9488 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9489 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9492 Undefined.insert(std::make_pair(D, Loc));
9494 UndefinedButUsed.clear();
9500 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9503 uint64_t Count = DelayedDeleteExprs[Idx++];
9504 for (uint64_t
C = 0;
C < Count; ++
C) {
9507 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9508 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9515 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9516 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9518 TentativeDefs.push_back(Var);
9520 TentativeDefinitions.clear();
9525 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9527 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9531 UnusedFileScopedDecls.clear();
9536 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9538 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9542 DelegatingCtorDecls.clear();
9546 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9548 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9552 ExtVectorDecls.clear();
9557 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9560 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9564 UnusedLocalTypedefNameCandidates.clear();
9569 for (
auto I : DeclsToCheckForDeferredDiags) {
9570 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9574 DeclsToCheckForDeferredDiags.clear();
9579 if (ReferencedSelectorsData.empty())
9584 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9586 while (I < DataSize) {
9590 Sels.push_back(std::make_pair(Sel, SelLoc));
9592 ReferencedSelectorsData.clear();
9597 if (WeakUndeclaredIdentifiers.empty())
9600 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9608 WeakIDs.push_back(std::make_pair(WeakId, WI));
9610 WeakUndeclaredIdentifiers.clear();
9614 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9616 VTableUse &TableInfo = VTableUses[Idx++];
9617 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9620 VTables.push_back(VT);
9628 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9629 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9633 Pending.push_back(std::make_pair(D, Loc));
9635 PendingInstantiations.clear();
9639 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9641 for (
auto &LPT : LateParsedTemplates) {
9644 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9648 auto LT = std::make_unique<LateParsedTemplate>();
9649 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9653 assert(F &&
"No module");
9655 unsigned TokN = LateParsed[Idx++];
9656 LT->Toks.reserve(TokN);
9657 for (
unsigned T = 0;
T < TokN; ++
T)
9658 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9660 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9664 LateParsedTemplates.clear();
9676 if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9677 Iter != LambdaDeclarationsForMerging.end() &&
9678 Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
9687 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9696 assert(ID &&
"Non-zero identifier ID required");
9697 unsigned Index = translateIdentifierIDToIndex(ID).second;
9698 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9699 IdentifiersLoaded[Index] = II;
9700 if (DeserializationListener)
9701 DeserializationListener->IdentifierRead(ID, II);
9723 if (NumCurrentElementsDeserializing && !Decls) {
9724 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9728 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9741 Decls->push_back(D);
9748 pushExternalDeclIntoScope(D, II);
9752std::pair<ModuleFile *, unsigned>
9753ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9755 return {
nullptr, 0};
9757 unsigned ModuleFileIndex = ID >> 32;
9758 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9760 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9772 if (IdentifiersLoaded.empty()) {
9773 Error(
"no identifier table in AST file");
9777 auto [M, Index] = translateIdentifierIDToIndex(ID);
9778 if (!IdentifiersLoaded[Index]) {
9779 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9782 const unsigned char *
Data =
9788 auto &II = PP.getIdentifierTable().get(Key);
9789 IdentifiersLoaded[Index] = &II;
9792 if (DeserializationListener)
9793 DeserializationListener->IdentifierRead(ID, &II);
9796 return IdentifiersLoaded[Index];
9808 ReadModuleOffsetMap(M);
9810 unsigned ModuleFileIndex = LocalID >> 32;
9811 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9814 assert(MF &&
"malformed identifier ID encoding?");
9816 if (!ModuleFileIndex)
9822std::pair<ModuleFile *, unsigned>
9823ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
9825 return {
nullptr, 0};
9827 unsigned ModuleFileIndex = ID >> 32;
9828 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
9832 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
9841 if (MacrosLoaded.empty()) {
9842 Error(
"no macro table in AST file");
9846 auto [M, Index] = translateMacroIDToIndex(ID);
9847 if (!MacrosLoaded[Index]) {
9848 assert(M !=
nullptr &&
"Untranslated Macro ID?");
9854 if (DeserializationListener)
9855 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
9858 return MacrosLoaded[Index];
9866 ReadModuleOffsetMap(M);
9868 unsigned ModuleFileIndex = LocalID >> 32;
9869 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
9872 assert(MF &&
"malformed identifier ID encoding?");
9874 if (!ModuleFileIndex) {
9879 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
9888 ReadModuleOffsetMap(M);
9893 &&
"Invalid index into submodule index remap");
9895 return LocalID + I->second;
9900 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
9904 if (GlobalID > SubmodulesLoaded.size()) {
9905 Error(
"submodule ID out of range in AST file");
9920 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
9923 int IndexFromEnd =
static_cast<int>(ID >> 1);
9924 assert(IndexFromEnd &&
"got reference to unknown module file");
9941 auto I = llvm::find(PCHModules, M);
9942 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
9943 return std::distance(I, PCHModules.end()) << 1;
9952 const auto &PCHChain = ModuleMgr.pch_modules();
9953 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
9954 ModuleFile &MF = ModuleMgr.getPrimaryModule();
9958 llvm::sys::path::parent_path(MF.
FileName),
9961 return std::nullopt;
9965 auto I = DefinitionSource.find(FD);
9966 if (I == DefinitionSource.end())
9972 return ThisDeclarationWasADefinitionSet.contains(FD);
9983 if (ID > SelectorsLoaded.size()) {
9984 Error(
"selector ID out of range in AST file");
9988 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
9991 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
9995 SelectorsLoaded[ID - 1] =
9997 if (DeserializationListener)
9998 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10001 return SelectorsLoaded[ID - 1];
10019 ReadModuleOffsetMap(M);
10024 &&
"Invalid index into selector index remap");
10026 return LocalID + I->second;
10057 NameInfo.
setName(readDeclarationName());
10071 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10072 assert(Op.isValid());
10078 unsigned NumTPLists =
readInt();
10083 for (
unsigned i = 0; i != NumTPLists; ++i)
10094 unsigned NumParams =
readInt();
10096 Params.reserve(NumParams);
10097 while (NumParams--)
10100 bool HasRequiresClause =
readBool();
10101 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10104 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10105 return TemplateParams;
10110 bool Canonicalize) {
10111 unsigned NumTemplateArgs =
readInt();
10112 TemplArgs.reserve(NumTemplateArgs);
10113 while (NumTemplateArgs--)
10119 unsigned NumDecls =
readInt();
10121 while (NumDecls--) {
10133 bool inheritConstructors =
readBool();
10139 Result.setInheritConstructors(inheritConstructors);
10146 unsigned NumInitializers =
readInt();
10147 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10149 for (
unsigned i = 0; i != NumInitializers; ++i) {
10151 bool IsBaseVirtual =
false;
10182 BOMInit =
new (Context)
10184 RParenLoc, MemberOrEllipsisLoc);
10186 BOMInit =
new (Context)
10189 BOMInit =
new (Context)
10193 BOMInit =
new (Context)
10195 LParenLoc,
Init, RParenLoc);
10198 unsigned SourceOrder =
readInt();
10202 CtorInitializers[i] = BOMInit;
10205 return CtorInitializers;
10213 for (
unsigned I = 0; I != N; ++I) {
10214 auto Kind = readNestedNameSpecifierKind();
10219 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10228 Builder.Make(Context,
T->getTypeLoc(), ColonColonLoc);
10234 Builder.MakeGlobal(Context, ColonColonLoc);
10241 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10246 llvm_unreachable(
"unexpected null nested name specifier");
10261 const StringRef Blob) {
10262 unsigned Count =
Record[0];
10263 const char *Byte = Blob.data();
10264 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10265 for (
unsigned I = 0; I < Count; ++Byte)
10266 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10267 if (*Byte & (1 << Bit))
10274 return llvm::APFloat(Sem,
readAPInt());
10279 unsigned Len =
Record[Idx++];
10287 unsigned Len =
Record[Idx++];
10288 StringRef
Result = Blob.substr(0, Len);
10289 Blob = Blob.substr(Len);
10313 unsigned Major =
Record[Idx++];
10314 unsigned Minor =
Record[Idx++];
10315 unsigned Subminor =
Record[Idx++];
10317 return VersionTuple(Major);
10319 return VersionTuple(Major, Minor - 1);
10320 return VersionTuple(Major, Minor - 1, Subminor - 1);
10331 return Diag(CurrentImportLoc, DiagID);
10335 return Diags.Report(Loc, DiagID);
10339 llvm::function_ref<
void()> Fn) {
10342 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10346 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10352 return PP.getIdentifierTable();
10358 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10359 "Already have a SwitchCase with this ID");
10360 (*CurrSwitchCaseStmts)[ID] = SC;
10365 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10366 return (*CurrSwitchCaseStmts)[ID];
10370 CurrSwitchCaseStmts->clear();
10375 std::vector<RawComment *> Comments;
10382 BitstreamCursor &Cursor = I->first;
10389 Cursor.advanceSkippingSubblocks(
10390 BitstreamCursor::AF_DontPopBlockAtEnd);
10392 Error(MaybeEntry.takeError());
10395 llvm::BitstreamEntry Entry = MaybeEntry.get();
10397 switch (Entry.Kind) {
10398 case llvm::BitstreamEntry::SubBlock:
10399 case llvm::BitstreamEntry::Error:
10400 Error(
"malformed block record in AST file");
10402 case llvm::BitstreamEntry::EndBlock:
10404 case llvm::BitstreamEntry::Record:
10412 if (!MaybeComment) {
10413 Error(MaybeComment.takeError());
10422 bool IsTrailingComment =
Record[Idx++];
10423 bool IsAlmostTrailingComment =
Record[Idx++];
10424 Comments.push_back(
new (Context)
RawComment(
10425 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10435 if (Loc.first.isValid())
10436 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10449 assert(NumUserInputs <= NumInputs);
10450 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10451 for (
unsigned I = 0; I < N; ++I) {
10452 bool IsSystem = I >= NumUserInputs;
10454 Visitor(IFI, IsSystem);
10459 bool IncludeSystem,
bool Complain,
10461 bool isSystem)> Visitor) {
10464 assert(NumUserInputs <= NumInputs);
10465 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10466 for (
unsigned I = 0; I < N; ++I) {
10467 bool IsSystem = I >= NumUserInputs;
10468 InputFile IF = getInputFile(MF, I+1, Complain);
10469 Visitor(IF, IsSystem);
10477 for (
unsigned I = 0; I < NumInputs; ++I) {
10480 if (
auto FE = getInputFile(MF, I + 1).getFile())
10485void ASTReader::finishPendingActions() {
10486 while (!PendingIdentifierInfos.empty() ||
10487 !PendingDeducedFunctionTypes.empty() ||
10488 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10489 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10490 !PendingUpdateRecords.empty() ||
10491 !PendingObjCExtensionIvarRedeclarations.empty()) {
10494 using TopLevelDeclsMap =
10495 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10496 TopLevelDeclsMap TopLevelDecls;
10498 while (!PendingIdentifierInfos.empty()) {
10501 std::move(PendingIdentifierInfos.back().second);
10502 PendingIdentifierInfos.pop_back();
10509 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10510 auto *FD = PendingDeducedFunctionTypes[I].first;
10511 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10513 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10516 if (DT->isDeduced()) {
10517 PendingDeducedTypeUpdates.insert(
10518 {FD->getCanonicalDecl(), FD->getReturnType()});
10525 PendingUndeducedFunctionDecls.push_back(FD);
10529 PendingDeducedFunctionTypes.clear();
10533 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10534 auto *VD = PendingDeducedVarTypes[I].first;
10535 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10537 PendingDeducedVarTypes.clear();
10540 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10541 loadPendingDeclChain(PendingDeclChains[I].first,
10542 PendingDeclChains[I].second);
10543 PendingDeclChains.clear();
10546 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10547 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10548 IdentifierInfo *II = TLD->first;
10549 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10555 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10556 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10557 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10558 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10560 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10562 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10563 if (!Info.M->isModule())
10567 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10569 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10570 if (Info.M->isModule())
10574 PendingMacroIDs.clear();
10578 while (!PendingDeclContextInfos.empty()) {
10579 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10580 PendingDeclContextInfos.pop_front();
10583 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10587 while (!PendingUpdateRecords.empty()) {
10588 auto Update = PendingUpdateRecords.pop_back_val();
10589 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10590 loadDeclUpdateRecords(
Update);
10593 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10594 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10595 auto DuplicateIvars =
10596 PendingObjCExtensionIvarRedeclarations.back().second;
10598 StructuralEquivalenceContext Ctx(
10599 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10600 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10604 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10606 for (
auto IvarPair : DuplicateIvars) {
10607 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10609 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10615 ExtensionsPair.first->setInvalidDecl();
10616 ExtensionsPair.second->getClassInterface()
10618 ->setIvarList(
nullptr);
10620 for (
auto IvarPair : DuplicateIvars) {
10621 Diag(IvarPair.first->getLocation(),
10622 diag::err_duplicate_ivar_declaration)
10623 << IvarPair.first->getIdentifier();
10624 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10627 PendingObjCExtensionIvarRedeclarations.pop_back();
10633 assert(PendingFakeDefinitionData.empty() &&
10634 "faked up a class definition but never saw the real one");
10640 for (Decl *D : PendingDefinitions) {
10641 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10642 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10643 for (
auto *R = getMostRecentExistingDecl(RD); R;
10644 R = R->getPreviousDecl()) {
10647 "declaration thinks it's the definition but it isn't");
10655 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10660 for (
auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10666 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10667 for (
auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10674 for (
auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10677 PendingDefinitions.clear();
10679 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10680 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10681 if (
auto *VD = dyn_cast<VarDecl>(D))
10682 return VD->isThisDeclarationADefinition() ||
10683 VD->isThisDeclarationADemotedDefinition();
10685 if (
auto *TD = dyn_cast<TagDecl>(D))
10686 return TD->isThisDeclarationADefinition() ||
10687 TD->isThisDeclarationADemotedDefinition();
10689 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10690 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10692 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10693 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10700 return hasDefinitionImpl(D, hasDefinitionImpl);
10716 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10722 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10723 PBEnd = PendingBodies.end();
10724 PB != PBEnd; ++PB) {
10725 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10727 const FunctionDecl *Defn =
nullptr;
10728 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10729 FD->setLazyBody(PB->second);
10731 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10734 if (!FD->isLateTemplateParsed() &&
10735 !NonConstDefn->isLateTemplateParsed() &&
10740 FD->getODRHash() != NonConstDefn->getODRHash()) {
10742 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10743 }
else if (FD->getLexicalParent()->isFileContext() &&
10744 NonConstDefn->getLexicalParent()->isFileContext()) {
10748 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10759 PendingBodies.clear();
10762 for (
auto [RD, MD] : PendingAddedClassMembers) {
10763 RD->addedMember(MD);
10765 PendingAddedClassMembers.clear();
10768 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10770 PendingMergedDefinitionsToDeduplicate.clear();
10774 for (Decl *D : PendingIncompleteDeclChains)
10775 markIncompleteDeclChain(D);
10776 PendingIncompleteDeclChains.clear();
10778 assert(PendingIdentifierInfos.empty() &&
10779 "Should be empty at the end of finishPendingActions");
10780 assert(PendingDeducedFunctionTypes.empty() &&
10781 "Should be empty at the end of finishPendingActions");
10782 assert(PendingDeducedVarTypes.empty() &&
10783 "Should be empty at the end of finishPendingActions");
10784 assert(PendingDeclChains.empty() &&
10785 "Should be empty at the end of finishPendingActions");
10786 assert(PendingMacroIDs.empty() &&
10787 "Should be empty at the end of finishPendingActions");
10788 assert(PendingDeclContextInfos.empty() &&
10789 "Should be empty at the end of finishPendingActions");
10790 assert(PendingUpdateRecords.empty() &&
10791 "Should be empty at the end of finishPendingActions");
10792 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10793 "Should be empty at the end of finishPendingActions");
10794 assert(PendingFakeDefinitionData.empty() &&
10795 "Should be empty at the end of finishPendingActions");
10796 assert(PendingDefinitions.empty() &&
10797 "Should be empty at the end of finishPendingActions");
10798 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10799 "Should be empty at the end of finishPendingActions");
10800 assert(PendingBodies.empty() &&
10801 "Should be empty at the end of finishPendingActions");
10802 assert(PendingAddedClassMembers.empty() &&
10803 "Should be empty at the end of finishPendingActions");
10804 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10805 "Should be empty at the end of finishPendingActions");
10806 assert(PendingIncompleteDeclChains.empty() &&
10807 "Should be empty at the end of finishPendingActions");
10810void ASTReader::diagnoseOdrViolations() {
10811 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10812 PendingRecordOdrMergeFailures.empty() &&
10813 PendingFunctionOdrMergeFailures.empty() &&
10814 PendingEnumOdrMergeFailures.empty() &&
10815 PendingObjCInterfaceOdrMergeFailures.empty() &&
10816 PendingObjCProtocolOdrMergeFailures.empty())
10823 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10824 PendingOdrMergeFailures.clear();
10825 for (
auto &Merge : OdrMergeFailures) {
10826 Merge.first->buildLookup();
10827 Merge.first->decls_begin();
10828 Merge.first->bases_begin();
10829 Merge.first->vbases_begin();
10830 for (
auto &RecordPair : Merge.second) {
10831 auto *RD = RecordPair.first;
10839 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
10840 PendingRecordOdrMergeFailures.clear();
10841 for (
auto &Merge : RecordOdrMergeFailures) {
10842 Merge.first->decls_begin();
10843 for (
auto &D : Merge.second)
10848 auto ObjCInterfaceOdrMergeFailures =
10849 std::move(PendingObjCInterfaceOdrMergeFailures);
10850 PendingObjCInterfaceOdrMergeFailures.clear();
10851 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
10852 Merge.first->decls_begin();
10853 for (
auto &InterfacePair : Merge.second)
10854 InterfacePair.first->decls_begin();
10858 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
10859 PendingFunctionOdrMergeFailures.clear();
10860 for (
auto &Merge : FunctionOdrMergeFailures) {
10861 Merge.first->buildLookup();
10862 Merge.first->decls_begin();
10863 Merge.first->getBody();
10864 for (
auto &FD : Merge.second) {
10872 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
10873 PendingEnumOdrMergeFailures.clear();
10874 for (
auto &Merge : EnumOdrMergeFailures) {
10875 Merge.first->decls_begin();
10876 for (
auto &
Enum : Merge.second) {
10877 Enum->decls_begin();
10882 auto ObjCProtocolOdrMergeFailures =
10883 std::move(PendingObjCProtocolOdrMergeFailures);
10884 PendingObjCProtocolOdrMergeFailures.clear();
10885 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
10886 Merge.first->decls_begin();
10887 for (
auto &ProtocolPair : Merge.second)
10888 ProtocolPair.first->decls_begin();
10897 while (!PendingOdrMergeChecks.empty()) {
10898 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
10909 bool Found =
false;
10912 for (
auto *RI : D->
redecls()) {
10913 if (RI->getLexicalDeclContext() == CanonDef) {
10927 llvm::SmallVector<const NamedDecl*, 4> Candidates;
10928 for (
auto *CanonMember : CanonDef->
decls()) {
10929 if (CanonMember->getCanonicalDecl() == DCanon) {
10938 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
10940 Candidates.push_back(ND);
10953 std::string CanonDefModule =
10958 << CanonDef << CanonDefModule.empty() << CanonDefModule;
10960 if (Candidates.empty())
10962 diag::note_module_odr_violation_no_possible_decls) << D;
10964 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
10965 Diag(Candidates[I]->getLocation(),
10966 diag::note_module_odr_violation_possible_decl)
10970 DiagnosedOdrMergeFailures.insert(CanonDef);
10974 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
10975 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
10976 ObjCInterfaceOdrMergeFailures.empty() &&
10977 ObjCProtocolOdrMergeFailures.empty())
10980 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
10984 for (
auto &Merge : OdrMergeFailures) {
10987 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10990 bool Diagnosed =
false;
10991 CXXRecordDecl *FirstRecord = Merge.first;
10992 for (
auto &RecordPair : Merge.second) {
10993 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
10994 RecordPair.second)) {
11007 Diag(Merge.first->getLocation(),
11008 diag::err_module_odr_violation_different_instantiations)
11015 for (
auto &Merge : RecordOdrMergeFailures) {
11018 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11021 RecordDecl *FirstRecord = Merge.first;
11022 bool Diagnosed =
false;
11023 for (
auto *SecondRecord : Merge.second) {
11024 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11030 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11034 for (
auto &Merge : FunctionOdrMergeFailures) {
11035 FunctionDecl *FirstFunction = Merge.first;
11036 bool Diagnosed =
false;
11037 for (
auto &SecondFunction : Merge.second) {
11038 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11044 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11048 for (
auto &Merge : EnumOdrMergeFailures) {
11051 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11054 EnumDecl *FirstEnum = Merge.first;
11055 bool Diagnosed =
false;
11056 for (
auto &SecondEnum : Merge.second) {
11057 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11063 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11066 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11069 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11072 bool Diagnosed =
false;
11073 ObjCInterfaceDecl *FirstID = Merge.first;
11074 for (
auto &InterfacePair : Merge.second) {
11075 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11076 InterfacePair.second)) {
11082 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11085 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11088 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11091 ObjCProtocolDecl *FirstProtocol = Merge.first;
11092 bool Diagnosed =
false;
11093 for (
auto &ProtocolPair : Merge.second) {
11094 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11095 ProtocolPair.second)) {
11101 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11106 if (llvm::Timer *
T = ReadTimer.get();
11107 ++NumCurrentElementsDeserializing == 1 &&
T)
11108 ReadTimeRegion.emplace(
T);
11112 assert(NumCurrentElementsDeserializing &&
11113 "FinishedDeserializing not paired with StartedDeserializing");
11114 if (NumCurrentElementsDeserializing == 1) {
11117 finishPendingActions();
11119 --NumCurrentElementsDeserializing;
11121 if (NumCurrentElementsDeserializing == 0) {
11125 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11133 while (!PendingExceptionSpecUpdates.empty() ||
11134 !PendingDeducedTypeUpdates.empty() ||
11135 !PendingUndeducedFunctionDecls.empty()) {
11136 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11137 PendingExceptionSpecUpdates.clear();
11138 for (
auto Update : ESUpdates) {
11139 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11142 if (
auto *Listener =
getContext().getASTMutationListener())
11144 for (
auto *Redecl :
Update.second->redecls())
11148 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11149 PendingDeducedTypeUpdates.clear();
11150 for (
auto Update : DTUpdates) {
11151 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11158 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11159 PendingUndeducedFunctionDecls.clear();
11163 (void)UndeducedFD->getMostRecentDecl();
11166 ReadTimeRegion.reset();
11168 diagnoseOdrViolations();
11174 PassInterestingDeclsToConsumer();
11181 auto It = PendingFakeLookupResults.find(II);
11182 if (It != PendingFakeLookupResults.end()) {
11183 for (
auto *ND : It->second)
11188 It->second.clear();
11192 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11193 SemaObj->TUScope->AddDecl(D);
11194 }
else if (SemaObj->TUScope) {
11198 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11199 SemaObj->TUScope->AddDecl(D);
11207 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11208 StringRef isysroot,
11210 bool AllowASTWithCompilerErrors,
11211 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11212 bool ForceValidateUserInputs,
11213 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11214 std::unique_ptr<llvm::Timer> ReadTimer)
11219 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11220 StackHandler(Diags), PP(PP), ContextObj(Context),
11221 CodeGenOpts(CodeGenOpts),
11223 PP.getHeaderSearchInfo()),
11224 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11225 DisableValidationKind(DisableValidationKind),
11226 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11227 AllowConfigurationMismatch(AllowConfigurationMismatch),
11228 ValidateSystemInputs(ValidateSystemInputs),
11229 ForceValidateUserInputs(ForceValidateUserInputs),
11230 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11231 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11232 SourceMgr.setExternalSLocEntrySource(
this);
11234 PathBuf.reserve(256);
11236 for (
const auto &Ext : Extensions) {
11237 auto BlockName = Ext->getExtensionMetadata().BlockName;
11238 auto Known = ModuleFileExtensions.find(BlockName);
11239 if (Known != ModuleFileExtensions.end()) {
11240 Diags.Report(diag::warn_duplicate_module_file_extension)
11245 ModuleFileExtensions.insert({BlockName, Ext});
11250 if (OwnsDeserializationListener)
11251 delete DeserializationListener;
11255 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11259 unsigned AbbrevID) {
11262 return Cursor.readRecord(AbbrevID, Record);
11278 : Record(Record), Context(Record.getContext()) {}
11279#define GEN_CLANG_CLAUSE_CLASS
11280#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11281#include "llvm/Frontend/OpenMP/OMP.inc"
11295 switch (llvm::omp::Clause(Record.readInt())) {
11296 case llvm::omp::OMPC_if:
11299 case llvm::omp::OMPC_final:
11302 case llvm::omp::OMPC_num_threads:
11305 case llvm::omp::OMPC_safelen:
11308 case llvm::omp::OMPC_simdlen:
11311 case llvm::omp::OMPC_sizes: {
11312 unsigned NumSizes = Record.readInt();
11316 case llvm::omp::OMPC_permutation: {
11317 unsigned NumLoops = Record.readInt();
11321 case llvm::omp::OMPC_full:
11324 case llvm::omp::OMPC_partial:
11327 case llvm::omp::OMPC_looprange:
11330 case llvm::omp::OMPC_allocator:
11333 case llvm::omp::OMPC_collapse:
11336 case llvm::omp::OMPC_default:
11339 case llvm::omp::OMPC_proc_bind:
11340 C =
new (Context) OMPProcBindClause();
11342 case llvm::omp::OMPC_schedule:
11343 C =
new (Context) OMPScheduleClause();
11345 case llvm::omp::OMPC_ordered:
11346 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11348 case llvm::omp::OMPC_nowait:
11349 C =
new (Context) OMPNowaitClause();
11351 case llvm::omp::OMPC_untied:
11352 C =
new (Context) OMPUntiedClause();
11354 case llvm::omp::OMPC_mergeable:
11355 C =
new (Context) OMPMergeableClause();
11357 case llvm::omp::OMPC_threadset:
11360 case llvm::omp::OMPC_transparent:
11361 C =
new (Context) OMPTransparentClause();
11363 case llvm::omp::OMPC_read:
11364 C =
new (Context) OMPReadClause();
11366 case llvm::omp::OMPC_write:
11367 C =
new (Context) OMPWriteClause();
11369 case llvm::omp::OMPC_update:
11370 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11372 case llvm::omp::OMPC_capture:
11373 C =
new (Context) OMPCaptureClause();
11375 case llvm::omp::OMPC_compare:
11376 C =
new (Context) OMPCompareClause();
11378 case llvm::omp::OMPC_fail:
11379 C =
new (Context) OMPFailClause();
11381 case llvm::omp::OMPC_seq_cst:
11382 C =
new (Context) OMPSeqCstClause();
11384 case llvm::omp::OMPC_acq_rel:
11385 C =
new (Context) OMPAcqRelClause();
11387 case llvm::omp::OMPC_absent: {
11388 unsigned NumKinds = Record.readInt();
11389 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11392 case llvm::omp::OMPC_holds:
11393 C =
new (Context) OMPHoldsClause();
11395 case llvm::omp::OMPC_contains: {
11396 unsigned NumKinds = Record.readInt();
11397 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11400 case llvm::omp::OMPC_no_openmp:
11401 C =
new (Context) OMPNoOpenMPClause();
11403 case llvm::omp::OMPC_no_openmp_routines:
11404 C =
new (Context) OMPNoOpenMPRoutinesClause();
11406 case llvm::omp::OMPC_no_openmp_constructs:
11407 C =
new (Context) OMPNoOpenMPConstructsClause();
11409 case llvm::omp::OMPC_no_parallelism:
11410 C =
new (Context) OMPNoParallelismClause();
11412 case llvm::omp::OMPC_acquire:
11413 C =
new (Context) OMPAcquireClause();
11415 case llvm::omp::OMPC_release:
11416 C =
new (Context) OMPReleaseClause();
11418 case llvm::omp::OMPC_relaxed:
11419 C =
new (Context) OMPRelaxedClause();
11421 case llvm::omp::OMPC_weak:
11422 C =
new (Context) OMPWeakClause();
11424 case llvm::omp::OMPC_threads:
11427 case llvm::omp::OMPC_simd:
11430 case llvm::omp::OMPC_nogroup:
11433 case llvm::omp::OMPC_unified_address:
11434 C =
new (Context) OMPUnifiedAddressClause();
11436 case llvm::omp::OMPC_unified_shared_memory:
11437 C =
new (Context) OMPUnifiedSharedMemoryClause();
11439 case llvm::omp::OMPC_reverse_offload:
11440 C =
new (Context) OMPReverseOffloadClause();
11442 case llvm::omp::OMPC_dynamic_allocators:
11443 C =
new (Context) OMPDynamicAllocatorsClause();
11445 case llvm::omp::OMPC_atomic_default_mem_order:
11446 C =
new (Context) OMPAtomicDefaultMemOrderClause();
11448 case llvm::omp::OMPC_self_maps:
11449 C =
new (Context) OMPSelfMapsClause();
11451 case llvm::omp::OMPC_at:
11452 C =
new (Context) OMPAtClause();
11454 case llvm::omp::OMPC_severity:
11455 C =
new (Context) OMPSeverityClause();
11457 case llvm::omp::OMPC_message:
11458 C =
new (Context) OMPMessageClause();
11460 case llvm::omp::OMPC_private:
11461 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11463 case llvm::omp::OMPC_firstprivate:
11464 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11466 case llvm::omp::OMPC_lastprivate:
11467 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11469 case llvm::omp::OMPC_shared:
11470 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11472 case llvm::omp::OMPC_reduction: {
11473 unsigned N = Record.readInt();
11475 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11478 case llvm::omp::OMPC_task_reduction:
11479 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11481 case llvm::omp::OMPC_in_reduction:
11482 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11484 case llvm::omp::OMPC_linear:
11485 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11487 case llvm::omp::OMPC_aligned:
11490 case llvm::omp::OMPC_copyin:
11493 case llvm::omp::OMPC_copyprivate:
11496 case llvm::omp::OMPC_flush:
11499 case llvm::omp::OMPC_depobj:
11502 case llvm::omp::OMPC_depend: {
11503 unsigned NumVars = Record.readInt();
11504 unsigned NumLoops = Record.readInt();
11508 case llvm::omp::OMPC_device:
11511 case llvm::omp::OMPC_map: {
11513 Sizes.
NumVars = Record.readInt();
11520 case llvm::omp::OMPC_num_teams:
11523 case llvm::omp::OMPC_thread_limit:
11526 case llvm::omp::OMPC_priority:
11529 case llvm::omp::OMPC_grainsize:
11532 case llvm::omp::OMPC_num_tasks:
11535 case llvm::omp::OMPC_hint:
11538 case llvm::omp::OMPC_dist_schedule:
11541 case llvm::omp::OMPC_defaultmap:
11544 case llvm::omp::OMPC_to: {
11546 Sizes.
NumVars = Record.readInt();
11553 case llvm::omp::OMPC_from: {
11555 Sizes.
NumVars = Record.readInt();
11562 case llvm::omp::OMPC_use_device_ptr: {
11564 Sizes.
NumVars = Record.readInt();
11571 case llvm::omp::OMPC_use_device_addr: {
11573 Sizes.
NumVars = Record.readInt();
11580 case llvm::omp::OMPC_is_device_ptr: {
11582 Sizes.
NumVars = Record.readInt();
11589 case llvm::omp::OMPC_has_device_addr: {
11591 Sizes.
NumVars = Record.readInt();
11598 case llvm::omp::OMPC_allocate:
11601 case llvm::omp::OMPC_nontemporal:
11604 case llvm::omp::OMPC_inclusive:
11607 case llvm::omp::OMPC_exclusive:
11610 case llvm::omp::OMPC_order:
11613 case llvm::omp::OMPC_init:
11616 case llvm::omp::OMPC_use:
11619 case llvm::omp::OMPC_destroy:
11622 case llvm::omp::OMPC_novariants:
11625 case llvm::omp::OMPC_nocontext:
11628 case llvm::omp::OMPC_detach:
11631 case llvm::omp::OMPC_uses_allocators:
11634 case llvm::omp::OMPC_affinity:
11637 case llvm::omp::OMPC_filter:
11640 case llvm::omp::OMPC_bind:
11643 case llvm::omp::OMPC_align:
11646 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11649 case llvm::omp::OMPC_dyn_groupprivate:
11652 case llvm::omp::OMPC_doacross: {
11653 unsigned NumVars = Record.readInt();
11654 unsigned NumLoops = Record.readInt();
11658 case llvm::omp::OMPC_ompx_attribute:
11661 case llvm::omp::OMPC_ompx_bare:
11664#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11665 case llvm::omp::Enum: \
11667#include "llvm/Frontend/OpenMP/OMPKinds.def"
11671 assert(
C &&
"Unknown OMPClause type");
11674 C->setLocStart(Record.readSourceLocation());
11675 C->setLocEnd(Record.readSourceLocation());
11681 C->setPreInitStmt(Record.readSubStmt(),
11687 C->setPostUpdateExpr(Record.readSubExpr());
11690void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11693 C->setNameModifierLoc(
Record.readSourceLocation());
11694 C->setColonLoc(
Record.readSourceLocation());
11695 C->setCondition(
Record.readSubExpr());
11696 C->setLParenLoc(
Record.readSourceLocation());
11701 C->setCondition(
Record.readSubExpr());
11702 C->setLParenLoc(
Record.readSourceLocation());
11708 C->setNumThreads(Record.readSubExpr());
11709 C->setModifierLoc(Record.readSourceLocation());
11710 C->setLParenLoc(Record.readSourceLocation());
11714 C->setSafelen(Record.readSubExpr());
11715 C->setLParenLoc(Record.readSourceLocation());
11719 C->setSimdlen(Record.readSubExpr());
11720 C->setLParenLoc(Record.readSourceLocation());
11724 for (Expr *&E :
C->getSizesRefs())
11725 E = Record.readSubExpr();
11726 C->setLParenLoc(Record.readSourceLocation());
11730 for (Expr *&E :
C->getArgsRefs())
11731 E = Record.readSubExpr();
11732 C->setLParenLoc(Record.readSourceLocation());
11738 C->setFactor(Record.readSubExpr());
11739 C->setLParenLoc(Record.readSourceLocation());
11743 C->setFirst(Record.readSubExpr());
11744 C->setCount(Record.readSubExpr());
11745 C->setLParenLoc(Record.readSourceLocation());
11746 C->setFirstLoc(Record.readSourceLocation());
11747 C->setCountLoc(Record.readSourceLocation());
11751 C->setAllocator(Record.readExpr());
11752 C->setLParenLoc(Record.readSourceLocation());
11756 C->setNumForLoops(Record.readSubExpr());
11757 C->setLParenLoc(Record.readSourceLocation());
11761 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11762 C->setLParenLoc(Record.readSourceLocation());
11763 C->setDefaultKindKwLoc(Record.readSourceLocation());
11764 C->setDefaultVariableCategory(
11766 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11772 C->setLParenLoc(Record.readSourceLocation());
11773 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11774 C->setThreadsetKindLoc(ThreadsetKindLoc);
11777 C->setThreadsetKind(TKind);
11780void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *
C) {
11781 C->setLParenLoc(Record.readSourceLocation());
11782 C->setImpexTypeKind(Record.readSubExpr());
11785void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *
C) {
11786 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11787 C->setLParenLoc(Record.readSourceLocation());
11788 C->setProcBindKindKwLoc(Record.readSourceLocation());
11791void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *
C) {
11793 C->setScheduleKind(
11795 C->setFirstScheduleModifier(
11797 C->setSecondScheduleModifier(
11799 C->setChunkSize(Record.readSubExpr());
11800 C->setLParenLoc(Record.readSourceLocation());
11801 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11802 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11803 C->setScheduleKindLoc(Record.readSourceLocation());
11804 C->setCommaLoc(Record.readSourceLocation());
11807void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *
C) {
11808 C->setNumForLoops(Record.readSubExpr());
11809 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11810 C->setLoopNumIterations(I, Record.readSubExpr());
11811 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11812 C->setLoopCounter(I, Record.readSubExpr());
11813 C->setLParenLoc(Record.readSourceLocation());
11816void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *
C) {
11817 C->setEventHandler(Record.readSubExpr());
11818 C->setLParenLoc(Record.readSourceLocation());
11821void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *
C) {
11822 C->setCondition(Record.readSubExpr());
11823 C->setLParenLoc(Record.readSourceLocation());
11826void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
11828void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
11830void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
11832void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
11834void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *
C) {
11835 if (
C->isExtended()) {
11836 C->setLParenLoc(Record.readSourceLocation());
11837 C->setArgumentLoc(Record.readSourceLocation());
11842void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
11844void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
11848void OMPClauseReader::VisitOMPFailClause(OMPFailClause *
C) {
11849 C->setLParenLoc(Record.readSourceLocation());
11850 SourceLocation FailParameterLoc = Record.readSourceLocation();
11851 C->setFailParameterLoc(FailParameterLoc);
11853 C->setFailParameter(CKind);
11856void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *
C) {
11857 unsigned Count =
C->getDirectiveKinds().size();
11858 C->setLParenLoc(Record.readSourceLocation());
11859 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11860 DKVec.reserve(Count);
11861 for (
unsigned I = 0; I < Count; I++) {
11864 C->setDirectiveKinds(DKVec);
11867void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *
C) {
11868 C->setExpr(Record.readExpr());
11869 C->setLParenLoc(Record.readSourceLocation());
11872void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *
C) {
11873 unsigned Count =
C->getDirectiveKinds().size();
11874 C->setLParenLoc(Record.readSourceLocation());
11875 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11876 DKVec.reserve(Count);
11877 for (
unsigned I = 0; I < Count; I++) {
11880 C->setDirectiveKinds(DKVec);
11883void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
11885void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
11886 OMPNoOpenMPRoutinesClause *) {}
11888void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
11889 OMPNoOpenMPConstructsClause *) {}
11891void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
11893void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
11895void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
11897void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
11899void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
11901void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
11903void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
11905void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
11907void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
11909void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
11911void OMPClauseReader::VisitOMPInitClause(OMPInitClause *
C) {
11912 unsigned NumVars =
C->varlist_size();
11913 SmallVector<Expr *, 16> Vars;
11914 Vars.reserve(NumVars);
11915 for (
unsigned I = 0; I != NumVars; ++I)
11916 Vars.push_back(Record.readSubExpr());
11917 C->setVarRefs(Vars);
11918 C->setIsTarget(Record.readBool());
11919 C->setIsTargetSync(Record.readBool());
11920 C->setLParenLoc(Record.readSourceLocation());
11921 C->setVarLoc(Record.readSourceLocation());
11924void OMPClauseReader::VisitOMPUseClause(OMPUseClause *
C) {
11925 C->setInteropVar(Record.readSubExpr());
11926 C->setLParenLoc(Record.readSourceLocation());
11927 C->setVarLoc(Record.readSourceLocation());
11930void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *
C) {
11931 C->setInteropVar(Record.readSubExpr());
11932 C->setLParenLoc(Record.readSourceLocation());
11933 C->setVarLoc(Record.readSourceLocation());
11936void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
11938 C->setCondition(Record.readSubExpr());
11939 C->setLParenLoc(Record.readSourceLocation());
11942void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *
C) {
11944 C->setCondition(Record.readSubExpr());
11945 C->setLParenLoc(Record.readSourceLocation());
11948void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
11950void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
11951 OMPUnifiedSharedMemoryClause *) {}
11953void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
11956OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
11959void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
11960 OMPAtomicDefaultMemOrderClause *
C) {
11961 C->setAtomicDefaultMemOrderKind(
11963 C->setLParenLoc(Record.readSourceLocation());
11964 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
11967void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
11969void OMPClauseReader::VisitOMPAtClause(OMPAtClause *
C) {
11971 C->setLParenLoc(Record.readSourceLocation());
11972 C->setAtKindKwLoc(Record.readSourceLocation());
11975void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *
C) {
11977 C->setLParenLoc(Record.readSourceLocation());
11978 C->setSeverityKindKwLoc(Record.readSourceLocation());
11981void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *
C) {
11983 C->setMessageString(Record.readSubExpr());
11984 C->setLParenLoc(Record.readSourceLocation());
11987void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *
C) {
11988 C->setLParenLoc(Record.readSourceLocation());
11989 unsigned NumVars =
C->varlist_size();
11990 SmallVector<Expr *, 16> Vars;
11991 Vars.reserve(NumVars);
11992 for (
unsigned i = 0; i != NumVars; ++i)
11993 Vars.push_back(Record.readSubExpr());
11994 C->setVarRefs(Vars);
11996 for (
unsigned i = 0; i != NumVars; ++i)
11997 Vars.push_back(Record.readSubExpr());
11998 C->setPrivateCopies(Vars);
12001void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
12003 C->setLParenLoc(Record.readSourceLocation());
12004 unsigned NumVars =
C->varlist_size();
12005 SmallVector<Expr *, 16> Vars;
12006 Vars.reserve(NumVars);
12007 for (
unsigned i = 0; i != NumVars; ++i)
12008 Vars.push_back(Record.readSubExpr());
12009 C->setVarRefs(Vars);
12011 for (
unsigned i = 0; i != NumVars; ++i)
12012 Vars.push_back(Record.readSubExpr());
12013 C->setPrivateCopies(Vars);
12015 for (
unsigned i = 0; i != NumVars; ++i)
12016 Vars.push_back(Record.readSubExpr());
12020void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
12022 C->setLParenLoc(Record.readSourceLocation());
12024 C->setKindLoc(Record.readSourceLocation());
12025 C->setColonLoc(Record.readSourceLocation());
12026 unsigned NumVars =
C->varlist_size();
12027 SmallVector<Expr *, 16> Vars;
12028 Vars.reserve(NumVars);
12029 for (
unsigned i = 0; i != NumVars; ++i)
12030 Vars.push_back(Record.readSubExpr());
12031 C->setVarRefs(Vars);
12033 for (
unsigned i = 0; i != NumVars; ++i)
12034 Vars.push_back(Record.readSubExpr());
12035 C->setPrivateCopies(Vars);
12037 for (
unsigned i = 0; i != NumVars; ++i)
12038 Vars.push_back(Record.readSubExpr());
12039 C->setSourceExprs(Vars);
12041 for (
unsigned i = 0; i != NumVars; ++i)
12042 Vars.push_back(Record.readSubExpr());
12043 C->setDestinationExprs(Vars);
12045 for (
unsigned i = 0; i != NumVars; ++i)
12046 Vars.push_back(Record.readSubExpr());
12047 C->setAssignmentOps(Vars);
12050void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *
C) {
12051 C->setLParenLoc(Record.readSourceLocation());
12052 unsigned NumVars =
C->varlist_size();
12053 SmallVector<Expr *, 16> Vars;
12054 Vars.reserve(NumVars);
12055 for (
unsigned i = 0; i != NumVars; ++i)
12056 Vars.push_back(Record.readSubExpr());
12057 C->setVarRefs(Vars);
12060void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *
C) {
12062 C->setLParenLoc(Record.readSourceLocation());
12063 C->setModifierLoc(Record.readSourceLocation());
12064 C->setColonLoc(Record.readSourceLocation());
12065 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12066 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12067 C->setQualifierLoc(NNSL);
12068 C->setNameInfo(DNI);
12070 unsigned NumVars =
C->varlist_size();
12071 SmallVector<Expr *, 16> Vars;
12072 Vars.reserve(NumVars);
12073 for (
unsigned i = 0; i != NumVars; ++i)
12074 Vars.push_back(Record.readSubExpr());
12075 C->setVarRefs(Vars);
12077 for (
unsigned i = 0; i != NumVars; ++i)
12078 Vars.push_back(Record.readSubExpr());
12079 C->setPrivates(Vars);
12081 for (
unsigned i = 0; i != NumVars; ++i)
12082 Vars.push_back(Record.readSubExpr());
12083 C->setLHSExprs(Vars);
12085 for (
unsigned i = 0; i != NumVars; ++i)
12086 Vars.push_back(Record.readSubExpr());
12087 C->setRHSExprs(Vars);
12089 for (
unsigned i = 0; i != NumVars; ++i)
12090 Vars.push_back(Record.readSubExpr());
12091 C->setReductionOps(Vars);
12092 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12094 for (
unsigned i = 0; i != NumVars; ++i)
12095 Vars.push_back(Record.readSubExpr());
12096 C->setInscanCopyOps(Vars);
12098 for (
unsigned i = 0; i != NumVars; ++i)
12099 Vars.push_back(Record.readSubExpr());
12100 C->setInscanCopyArrayTemps(Vars);
12102 for (
unsigned i = 0; i != NumVars; ++i)
12103 Vars.push_back(Record.readSubExpr());
12104 C->setInscanCopyArrayElems(Vars);
12106 unsigned NumFlags = Record.readInt();
12107 SmallVector<bool, 16> Flags;
12108 Flags.reserve(NumFlags);
12109 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12110 Flags.push_back(Record.readInt());
12111 C->setPrivateVariableReductionFlags(Flags);
12114void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
12116 C->setLParenLoc(Record.readSourceLocation());
12117 C->setColonLoc(Record.readSourceLocation());
12118 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12119 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12120 C->setQualifierLoc(NNSL);
12121 C->setNameInfo(DNI);
12123 unsigned NumVars =
C->varlist_size();
12124 SmallVector<Expr *, 16> Vars;
12125 Vars.reserve(NumVars);
12126 for (
unsigned I = 0; I != NumVars; ++I)
12127 Vars.push_back(Record.readSubExpr());
12128 C->setVarRefs(Vars);
12130 for (
unsigned I = 0; I != NumVars; ++I)
12131 Vars.push_back(Record.readSubExpr());
12132 C->setPrivates(Vars);
12134 for (
unsigned I = 0; I != NumVars; ++I)
12135 Vars.push_back(Record.readSubExpr());
12136 C->setLHSExprs(Vars);
12138 for (
unsigned I = 0; I != NumVars; ++I)
12139 Vars.push_back(Record.readSubExpr());
12140 C->setRHSExprs(Vars);
12142 for (
unsigned I = 0; I != NumVars; ++I)
12143 Vars.push_back(Record.readSubExpr());
12144 C->setReductionOps(Vars);
12147void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *
C) {
12149 C->setLParenLoc(Record.readSourceLocation());
12150 C->setColonLoc(Record.readSourceLocation());
12151 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12152 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12153 C->setQualifierLoc(NNSL);
12154 C->setNameInfo(DNI);
12156 unsigned NumVars =
C->varlist_size();
12157 SmallVector<Expr *, 16> Vars;
12158 Vars.reserve(NumVars);
12159 for (
unsigned I = 0; I != NumVars; ++I)
12160 Vars.push_back(Record.readSubExpr());
12161 C->setVarRefs(Vars);
12163 for (
unsigned I = 0; I != NumVars; ++I)
12164 Vars.push_back(Record.readSubExpr());
12165 C->setPrivates(Vars);
12167 for (
unsigned I = 0; I != NumVars; ++I)
12168 Vars.push_back(Record.readSubExpr());
12169 C->setLHSExprs(Vars);
12171 for (
unsigned I = 0; I != NumVars; ++I)
12172 Vars.push_back(Record.readSubExpr());
12173 C->setRHSExprs(Vars);
12175 for (
unsigned I = 0; I != NumVars; ++I)
12176 Vars.push_back(Record.readSubExpr());
12177 C->setReductionOps(Vars);
12179 for (
unsigned I = 0; I != NumVars; ++I)
12180 Vars.push_back(Record.readSubExpr());
12181 C->setTaskgroupDescriptors(Vars);
12184void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *
C) {
12186 C->setLParenLoc(Record.readSourceLocation());
12187 C->setColonLoc(Record.readSourceLocation());
12189 C->setModifierLoc(Record.readSourceLocation());
12190 unsigned NumVars =
C->varlist_size();
12191 SmallVector<Expr *, 16> Vars;
12192 Vars.reserve(NumVars);
12193 for (
unsigned i = 0; i != NumVars; ++i)
12194 Vars.push_back(Record.readSubExpr());
12195 C->setVarRefs(Vars);
12197 for (
unsigned i = 0; i != NumVars; ++i)
12198 Vars.push_back(Record.readSubExpr());
12199 C->setPrivates(Vars);
12201 for (
unsigned i = 0; i != NumVars; ++i)
12202 Vars.push_back(Record.readSubExpr());
12205 for (
unsigned i = 0; i != NumVars; ++i)
12206 Vars.push_back(Record.readSubExpr());
12207 C->setUpdates(Vars);
12209 for (
unsigned i = 0; i != NumVars; ++i)
12210 Vars.push_back(Record.readSubExpr());
12211 C->setFinals(Vars);
12212 C->setStep(Record.readSubExpr());
12213 C->setCalcStep(Record.readSubExpr());
12215 for (
unsigned I = 0; I != NumVars + 1; ++I)
12216 Vars.push_back(Record.readSubExpr());
12217 C->setUsedExprs(Vars);
12220void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *
C) {
12221 C->setLParenLoc(Record.readSourceLocation());
12222 C->setColonLoc(Record.readSourceLocation());
12223 unsigned NumVars =
C->varlist_size();
12224 SmallVector<Expr *, 16> Vars;
12225 Vars.reserve(NumVars);
12226 for (
unsigned i = 0; i != NumVars; ++i)
12227 Vars.push_back(Record.readSubExpr());
12228 C->setVarRefs(Vars);
12229 C->setAlignment(Record.readSubExpr());
12232void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *
C) {
12233 C->setLParenLoc(Record.readSourceLocation());
12234 unsigned NumVars =
C->varlist_size();
12235 SmallVector<Expr *, 16> Exprs;
12236 Exprs.reserve(NumVars);
12237 for (
unsigned i = 0; i != NumVars; ++i)
12238 Exprs.push_back(Record.readSubExpr());
12239 C->setVarRefs(Exprs);
12241 for (
unsigned i = 0; i != NumVars; ++i)
12242 Exprs.push_back(Record.readSubExpr());
12243 C->setSourceExprs(Exprs);
12245 for (
unsigned i = 0; i != NumVars; ++i)
12246 Exprs.push_back(Record.readSubExpr());
12247 C->setDestinationExprs(Exprs);
12249 for (
unsigned i = 0; i != NumVars; ++i)
12250 Exprs.push_back(Record.readSubExpr());
12251 C->setAssignmentOps(Exprs);
12254void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
12255 C->setLParenLoc(Record.readSourceLocation());
12256 unsigned NumVars =
C->varlist_size();
12257 SmallVector<Expr *, 16> Exprs;
12258 Exprs.reserve(NumVars);
12259 for (
unsigned i = 0; i != NumVars; ++i)
12260 Exprs.push_back(Record.readSubExpr());
12261 C->setVarRefs(Exprs);
12263 for (
unsigned i = 0; i != NumVars; ++i)
12264 Exprs.push_back(Record.readSubExpr());
12265 C->setSourceExprs(Exprs);
12267 for (
unsigned i = 0; i != NumVars; ++i)
12268 Exprs.push_back(Record.readSubExpr());
12269 C->setDestinationExprs(Exprs);
12271 for (
unsigned i = 0; i != NumVars; ++i)
12272 Exprs.push_back(Record.readSubExpr());
12273 C->setAssignmentOps(Exprs);
12276void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *
C) {
12277 C->setLParenLoc(Record.readSourceLocation());
12278 unsigned NumVars =
C->varlist_size();
12279 SmallVector<Expr *, 16> Vars;
12280 Vars.reserve(NumVars);
12281 for (
unsigned i = 0; i != NumVars; ++i)
12282 Vars.push_back(Record.readSubExpr());
12283 C->setVarRefs(Vars);
12286void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *
C) {
12287 C->setDepobj(Record.readSubExpr());
12288 C->setLParenLoc(Record.readSourceLocation());
12291void OMPClauseReader::VisitOMPDependClause(OMPDependClause *
C) {
12292 C->setLParenLoc(Record.readSourceLocation());
12293 C->setModifier(Record.readSubExpr());
12294 C->setDependencyKind(
12296 C->setDependencyLoc(Record.readSourceLocation());
12297 C->setColonLoc(Record.readSourceLocation());
12298 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12299 unsigned NumVars =
C->varlist_size();
12300 SmallVector<Expr *, 16> Vars;
12301 Vars.reserve(NumVars);
12302 for (
unsigned I = 0; I != NumVars; ++I)
12303 Vars.push_back(Record.readSubExpr());
12304 C->setVarRefs(Vars);
12305 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12306 C->setLoopData(I, Record.readSubExpr());
12309void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *
C) {
12312 C->setDevice(Record.readSubExpr());
12313 C->setModifierLoc(Record.readSourceLocation());
12314 C->setLParenLoc(Record.readSourceLocation());
12317void OMPClauseReader::VisitOMPMapClause(OMPMapClause *
C) {
12318 C->setLParenLoc(Record.readSourceLocation());
12319 bool HasIteratorModifier =
false;
12321 C->setMapTypeModifier(
12323 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12324 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12325 HasIteratorModifier =
true;
12327 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12328 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12331 C->setMapLoc(Record.readSourceLocation());
12332 C->setColonLoc(Record.readSourceLocation());
12333 auto NumVars =
C->varlist_size();
12334 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12335 auto TotalLists =
C->getTotalComponentListNum();
12336 auto TotalComponents =
C->getTotalComponentsNum();
12338 SmallVector<Expr *, 16> Vars;
12339 Vars.reserve(NumVars);
12340 for (
unsigned i = 0; i != NumVars; ++i)
12341 Vars.push_back(Record.readExpr());
12342 C->setVarRefs(Vars);
12344 SmallVector<Expr *, 16> UDMappers;
12345 UDMappers.reserve(NumVars);
12346 for (
unsigned I = 0; I < NumVars; ++I)
12347 UDMappers.push_back(Record.readExpr());
12348 C->setUDMapperRefs(UDMappers);
12350 if (HasIteratorModifier)
12351 C->setIteratorModifier(Record.readExpr());
12353 SmallVector<ValueDecl *, 16> Decls;
12354 Decls.reserve(UniqueDecls);
12355 for (
unsigned i = 0; i < UniqueDecls; ++i)
12356 Decls.push_back(Record.readDeclAs<ValueDecl>());
12357 C->setUniqueDecls(Decls);
12359 SmallVector<unsigned, 16> ListsPerDecl;
12360 ListsPerDecl.reserve(UniqueDecls);
12361 for (
unsigned i = 0; i < UniqueDecls; ++i)
12362 ListsPerDecl.push_back(Record.readInt());
12363 C->setDeclNumLists(ListsPerDecl);
12365 SmallVector<unsigned, 32> ListSizes;
12366 ListSizes.reserve(TotalLists);
12367 for (
unsigned i = 0; i < TotalLists; ++i)
12368 ListSizes.push_back(Record.readInt());
12369 C->setComponentListSizes(ListSizes);
12371 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12372 Components.reserve(TotalComponents);
12373 for (
unsigned i = 0; i < TotalComponents; ++i) {
12374 Expr *AssociatedExprPr = Record.readExpr();
12375 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12376 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12379 C->setComponents(Components, ListSizes);
12385 C->setLParenLoc(Record.readSourceLocation());
12386 C->setColonLoc(Record.readSourceLocation());
12387 C->setAllocator(Record.readSubExpr());
12388 C->setAlignment(Record.readSubExpr());
12389 unsigned NumVars =
C->varlist_size();
12390 SmallVector<Expr *, 16> Vars;
12391 Vars.reserve(NumVars);
12392 for (
unsigned i = 0; i != NumVars; ++i)
12393 Vars.push_back(Record.readSubExpr());
12394 C->setVarRefs(Vars);
12397void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
12399 C->setLParenLoc(Record.readSourceLocation());
12400 unsigned NumVars =
C->varlist_size();
12401 SmallVector<Expr *, 16> Vars;
12402 Vars.reserve(NumVars);
12403 for (
unsigned I = 0; I != NumVars; ++I)
12404 Vars.push_back(Record.readSubExpr());
12405 C->setVarRefs(Vars);
12408void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
12410 C->setLParenLoc(Record.readSourceLocation());
12411 unsigned NumVars =
C->varlist_size();
12412 SmallVector<Expr *, 16> Vars;
12413 Vars.reserve(NumVars);
12414 for (
unsigned I = 0; I != NumVars; ++I)
12415 Vars.push_back(Record.readSubExpr());
12416 C->setVarRefs(Vars);
12419void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *
C) {
12421 C->setPriority(Record.readSubExpr());
12422 C->setLParenLoc(Record.readSourceLocation());
12425void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
12428 C->setGrainsize(Record.readSubExpr());
12429 C->setModifierLoc(Record.readSourceLocation());
12430 C->setLParenLoc(Record.readSourceLocation());
12433void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
12436 C->setNumTasks(Record.readSubExpr());
12437 C->setModifierLoc(Record.readSourceLocation());
12438 C->setLParenLoc(Record.readSourceLocation());
12441void OMPClauseReader::VisitOMPHintClause(OMPHintClause *
C) {
12442 C->setHint(Record.readSubExpr());
12443 C->setLParenLoc(Record.readSourceLocation());
12446void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
12448 C->setDistScheduleKind(
12450 C->setChunkSize(Record.readSubExpr());
12451 C->setLParenLoc(Record.readSourceLocation());
12452 C->setDistScheduleKindLoc(Record.readSourceLocation());
12453 C->setCommaLoc(Record.readSourceLocation());
12456void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
12457 C->setDefaultmapKind(
12459 C->setDefaultmapModifier(
12461 C->setLParenLoc(Record.readSourceLocation());
12462 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12463 C->setDefaultmapKindLoc(Record.readSourceLocation());
12466void OMPClauseReader::VisitOMPToClause(OMPToClause *
C) {
12467 C->setLParenLoc(Record.readSourceLocation());
12469 C->setMotionModifier(
12471 C->setMotionModifierLoc(I, Record.readSourceLocation());
12472 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12473 C->setIteratorModifier(Record.readExpr());
12475 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12476 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12477 C->setColonLoc(Record.readSourceLocation());
12478 auto NumVars =
C->varlist_size();
12479 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12480 auto TotalLists =
C->getTotalComponentListNum();
12481 auto TotalComponents =
C->getTotalComponentsNum();
12483 SmallVector<Expr *, 16> Vars;
12484 Vars.reserve(NumVars);
12485 for (
unsigned i = 0; i != NumVars; ++i)
12486 Vars.push_back(Record.readSubExpr());
12487 C->setVarRefs(Vars);
12489 SmallVector<Expr *, 16> UDMappers;
12490 UDMappers.reserve(NumVars);
12491 for (
unsigned I = 0; I < NumVars; ++I)
12492 UDMappers.push_back(Record.readSubExpr());
12493 C->setUDMapperRefs(UDMappers);
12495 SmallVector<ValueDecl *, 16> Decls;
12496 Decls.reserve(UniqueDecls);
12497 for (
unsigned i = 0; i < UniqueDecls; ++i)
12498 Decls.push_back(Record.readDeclAs<ValueDecl>());
12499 C->setUniqueDecls(Decls);
12501 SmallVector<unsigned, 16> ListsPerDecl;
12502 ListsPerDecl.reserve(UniqueDecls);
12503 for (
unsigned i = 0; i < UniqueDecls; ++i)
12504 ListsPerDecl.push_back(Record.readInt());
12505 C->setDeclNumLists(ListsPerDecl);
12507 SmallVector<unsigned, 32> ListSizes;
12508 ListSizes.reserve(TotalLists);
12509 for (
unsigned i = 0; i < TotalLists; ++i)
12510 ListSizes.push_back(Record.readInt());
12511 C->setComponentListSizes(ListSizes);
12513 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12514 Components.reserve(TotalComponents);
12515 for (
unsigned i = 0; i < TotalComponents; ++i) {
12516 Expr *AssociatedExprPr = Record.readSubExpr();
12517 bool IsNonContiguous = Record.readBool();
12518 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12519 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12521 C->setComponents(Components, ListSizes);
12524void OMPClauseReader::VisitOMPFromClause(OMPFromClause *
C) {
12525 C->setLParenLoc(Record.readSourceLocation());
12527 C->setMotionModifier(
12529 C->setMotionModifierLoc(I, Record.readSourceLocation());
12530 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12531 C->setIteratorModifier(Record.readExpr());
12533 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12534 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12535 C->setColonLoc(Record.readSourceLocation());
12536 auto NumVars =
C->varlist_size();
12537 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12538 auto TotalLists =
C->getTotalComponentListNum();
12539 auto TotalComponents =
C->getTotalComponentsNum();
12541 SmallVector<Expr *, 16> Vars;
12542 Vars.reserve(NumVars);
12543 for (
unsigned i = 0; i != NumVars; ++i)
12544 Vars.push_back(Record.readSubExpr());
12545 C->setVarRefs(Vars);
12547 SmallVector<Expr *, 16> UDMappers;
12548 UDMappers.reserve(NumVars);
12549 for (
unsigned I = 0; I < NumVars; ++I)
12550 UDMappers.push_back(Record.readSubExpr());
12551 C->setUDMapperRefs(UDMappers);
12553 SmallVector<ValueDecl *, 16> Decls;
12554 Decls.reserve(UniqueDecls);
12555 for (
unsigned i = 0; i < UniqueDecls; ++i)
12556 Decls.push_back(Record.readDeclAs<ValueDecl>());
12557 C->setUniqueDecls(Decls);
12559 SmallVector<unsigned, 16> ListsPerDecl;
12560 ListsPerDecl.reserve(UniqueDecls);
12561 for (
unsigned i = 0; i < UniqueDecls; ++i)
12562 ListsPerDecl.push_back(Record.readInt());
12563 C->setDeclNumLists(ListsPerDecl);
12565 SmallVector<unsigned, 32> ListSizes;
12566 ListSizes.reserve(TotalLists);
12567 for (
unsigned i = 0; i < TotalLists; ++i)
12568 ListSizes.push_back(Record.readInt());
12569 C->setComponentListSizes(ListSizes);
12571 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12572 Components.reserve(TotalComponents);
12573 for (
unsigned i = 0; i < TotalComponents; ++i) {
12574 Expr *AssociatedExprPr = Record.readSubExpr();
12575 bool IsNonContiguous = Record.readBool();
12576 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12577 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12579 C->setComponents(Components, ListSizes);
12582void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
12583 C->setLParenLoc(Record.readSourceLocation());
12585 C->setFallbackModifierLoc(Record.readSourceLocation());
12586 auto NumVars =
C->varlist_size();
12587 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12588 auto TotalLists =
C->getTotalComponentListNum();
12589 auto TotalComponents =
C->getTotalComponentsNum();
12591 SmallVector<Expr *, 16> Vars;
12592 Vars.reserve(NumVars);
12593 for (
unsigned i = 0; i != NumVars; ++i)
12594 Vars.push_back(Record.readSubExpr());
12595 C->setVarRefs(Vars);
12597 for (
unsigned i = 0; i != NumVars; ++i)
12598 Vars.push_back(Record.readSubExpr());
12599 C->setPrivateCopies(Vars);
12601 for (
unsigned i = 0; i != NumVars; ++i)
12602 Vars.push_back(Record.readSubExpr());
12605 SmallVector<ValueDecl *, 16> Decls;
12606 Decls.reserve(UniqueDecls);
12607 for (
unsigned i = 0; i < UniqueDecls; ++i)
12608 Decls.push_back(Record.readDeclAs<ValueDecl>());
12609 C->setUniqueDecls(Decls);
12611 SmallVector<unsigned, 16> ListsPerDecl;
12612 ListsPerDecl.reserve(UniqueDecls);
12613 for (
unsigned i = 0; i < UniqueDecls; ++i)
12614 ListsPerDecl.push_back(Record.readInt());
12615 C->setDeclNumLists(ListsPerDecl);
12617 SmallVector<unsigned, 32> ListSizes;
12618 ListSizes.reserve(TotalLists);
12619 for (
unsigned i = 0; i < TotalLists; ++i)
12620 ListSizes.push_back(Record.readInt());
12621 C->setComponentListSizes(ListSizes);
12623 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12624 Components.reserve(TotalComponents);
12625 for (
unsigned i = 0; i < TotalComponents; ++i) {
12626 auto *AssociatedExprPr = Record.readSubExpr();
12627 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12628 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12631 C->setComponents(Components, ListSizes);
12634void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
12635 C->setLParenLoc(Record.readSourceLocation());
12636 auto NumVars =
C->varlist_size();
12637 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12638 auto TotalLists =
C->getTotalComponentListNum();
12639 auto TotalComponents =
C->getTotalComponentsNum();
12641 SmallVector<Expr *, 16> Vars;
12642 Vars.reserve(NumVars);
12643 for (
unsigned i = 0; i != NumVars; ++i)
12644 Vars.push_back(Record.readSubExpr());
12645 C->setVarRefs(Vars);
12647 SmallVector<ValueDecl *, 16> Decls;
12648 Decls.reserve(UniqueDecls);
12649 for (
unsigned i = 0; i < UniqueDecls; ++i)
12650 Decls.push_back(Record.readDeclAs<ValueDecl>());
12651 C->setUniqueDecls(Decls);
12653 SmallVector<unsigned, 16> ListsPerDecl;
12654 ListsPerDecl.reserve(UniqueDecls);
12655 for (
unsigned i = 0; i < UniqueDecls; ++i)
12656 ListsPerDecl.push_back(Record.readInt());
12657 C->setDeclNumLists(ListsPerDecl);
12659 SmallVector<unsigned, 32> ListSizes;
12660 ListSizes.reserve(TotalLists);
12661 for (
unsigned i = 0; i < TotalLists; ++i)
12662 ListSizes.push_back(Record.readInt());
12663 C->setComponentListSizes(ListSizes);
12665 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12666 Components.reserve(TotalComponents);
12667 for (
unsigned i = 0; i < TotalComponents; ++i) {
12668 Expr *AssociatedExpr = Record.readSubExpr();
12669 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12670 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12673 C->setComponents(Components, ListSizes);
12676void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
12677 C->setLParenLoc(Record.readSourceLocation());
12678 auto NumVars =
C->varlist_size();
12679 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12680 auto TotalLists =
C->getTotalComponentListNum();
12681 auto TotalComponents =
C->getTotalComponentsNum();
12683 SmallVector<Expr *, 16> Vars;
12684 Vars.reserve(NumVars);
12685 for (
unsigned i = 0; i != NumVars; ++i)
12686 Vars.push_back(Record.readSubExpr());
12687 C->setVarRefs(Vars);
12690 SmallVector<ValueDecl *, 16> Decls;
12691 Decls.reserve(UniqueDecls);
12692 for (
unsigned i = 0; i < UniqueDecls; ++i)
12693 Decls.push_back(Record.readDeclAs<ValueDecl>());
12694 C->setUniqueDecls(Decls);
12696 SmallVector<unsigned, 16> ListsPerDecl;
12697 ListsPerDecl.reserve(UniqueDecls);
12698 for (
unsigned i = 0; i < UniqueDecls; ++i)
12699 ListsPerDecl.push_back(Record.readInt());
12700 C->setDeclNumLists(ListsPerDecl);
12702 SmallVector<unsigned, 32> ListSizes;
12703 ListSizes.reserve(TotalLists);
12704 for (
unsigned i = 0; i < TotalLists; ++i)
12705 ListSizes.push_back(Record.readInt());
12706 C->setComponentListSizes(ListSizes);
12708 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12709 Components.reserve(TotalComponents);
12710 for (
unsigned i = 0; i < TotalComponents; ++i) {
12711 Expr *AssociatedExpr = Record.readSubExpr();
12712 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12713 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12716 C->setComponents(Components, ListSizes);
12719void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
12720 C->setLParenLoc(Record.readSourceLocation());
12721 auto NumVars =
C->varlist_size();
12722 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12723 auto TotalLists =
C->getTotalComponentListNum();
12724 auto TotalComponents =
C->getTotalComponentsNum();
12726 SmallVector<Expr *, 16> Vars;
12727 Vars.reserve(NumVars);
12728 for (
unsigned I = 0; I != NumVars; ++I)
12729 Vars.push_back(Record.readSubExpr());
12730 C->setVarRefs(Vars);
12733 SmallVector<ValueDecl *, 16> Decls;
12734 Decls.reserve(UniqueDecls);
12735 for (
unsigned I = 0; I < UniqueDecls; ++I)
12736 Decls.push_back(Record.readDeclAs<ValueDecl>());
12737 C->setUniqueDecls(Decls);
12739 SmallVector<unsigned, 16> ListsPerDecl;
12740 ListsPerDecl.reserve(UniqueDecls);
12741 for (
unsigned I = 0; I < UniqueDecls; ++I)
12742 ListsPerDecl.push_back(Record.readInt());
12743 C->setDeclNumLists(ListsPerDecl);
12745 SmallVector<unsigned, 32> ListSizes;
12746 ListSizes.reserve(TotalLists);
12747 for (
unsigned i = 0; i < TotalLists; ++i)
12748 ListSizes.push_back(Record.readInt());
12749 C->setComponentListSizes(ListSizes);
12751 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12752 Components.reserve(TotalComponents);
12753 for (
unsigned I = 0; I < TotalComponents; ++I) {
12754 Expr *AssociatedExpr = Record.readSubExpr();
12755 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12756 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12759 C->setComponents(Components, ListSizes);
12762void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
12763 C->setLParenLoc(Record.readSourceLocation());
12764 unsigned NumVars =
C->varlist_size();
12765 SmallVector<Expr *, 16> Vars;
12766 Vars.reserve(NumVars);
12767 for (
unsigned i = 0; i != NumVars; ++i)
12768 Vars.push_back(Record.readSubExpr());
12769 C->setVarRefs(Vars);
12771 Vars.reserve(NumVars);
12772 for (
unsigned i = 0; i != NumVars; ++i)
12773 Vars.push_back(Record.readSubExpr());
12774 C->setPrivateRefs(Vars);
12777void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
12778 C->setLParenLoc(Record.readSourceLocation());
12779 unsigned NumVars =
C->varlist_size();
12780 SmallVector<Expr *, 16> Vars;
12781 Vars.reserve(NumVars);
12782 for (
unsigned i = 0; i != NumVars; ++i)
12783 Vars.push_back(Record.readSubExpr());
12784 C->setVarRefs(Vars);
12787void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
12788 C->setLParenLoc(Record.readSourceLocation());
12789 unsigned NumVars =
C->varlist_size();
12790 SmallVector<Expr *, 16> Vars;
12791 Vars.reserve(NumVars);
12792 for (
unsigned i = 0; i != NumVars; ++i)
12793 Vars.push_back(Record.readSubExpr());
12794 C->setVarRefs(Vars);
12797void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
12798 C->setLParenLoc(Record.readSourceLocation());
12799 unsigned NumOfAllocators =
C->getNumberOfAllocators();
12800 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
12801 Data.reserve(NumOfAllocators);
12802 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
12803 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
12806 D.
LParenLoc = Record.readSourceLocation();
12807 D.
RParenLoc = Record.readSourceLocation();
12809 C->setAllocatorsData(
Data);
12812void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *
C) {
12813 C->setLParenLoc(Record.readSourceLocation());
12814 C->setModifier(Record.readSubExpr());
12815 C->setColonLoc(Record.readSourceLocation());
12816 unsigned NumOfLocators =
C->varlist_size();
12817 SmallVector<Expr *, 4> Locators;
12818 Locators.reserve(NumOfLocators);
12819 for (
unsigned I = 0; I != NumOfLocators; ++I)
12820 Locators.push_back(Record.readSubExpr());
12821 C->setVarRefs(Locators);
12824void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *
C) {
12827 C->setLParenLoc(Record.readSourceLocation());
12828 C->setKindKwLoc(Record.readSourceLocation());
12829 C->setModifierKwLoc(Record.readSourceLocation());
12832void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *
C) {
12834 C->setThreadID(Record.readSubExpr());
12835 C->setLParenLoc(Record.readSourceLocation());
12838void OMPClauseReader::VisitOMPBindClause(OMPBindClause *
C) {
12840 C->setLParenLoc(Record.readSourceLocation());
12841 C->setBindKindLoc(Record.readSourceLocation());
12845 C->setAlignment(Record.readExpr());
12846 C->setLParenLoc(Record.readSourceLocation());
12849void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
12851 C->setSize(Record.readSubExpr());
12852 C->setLParenLoc(Record.readSourceLocation());
12855void OMPClauseReader::VisitOMPDynGroupprivateClause(
12856 OMPDynGroupprivateClause *
C) {
12858 C->setDynGroupprivateModifier(
12860 C->setDynGroupprivateFallbackModifier(
12862 C->setSize(Record.readSubExpr());
12863 C->setLParenLoc(Record.readSourceLocation());
12864 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
12865 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
12868void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
12869 C->setLParenLoc(Record.readSourceLocation());
12870 C->setDependenceType(
12872 C->setDependenceLoc(Record.readSourceLocation());
12873 C->setColonLoc(Record.readSourceLocation());
12874 unsigned NumVars =
C->varlist_size();
12875 SmallVector<Expr *, 16> Vars;
12876 Vars.reserve(NumVars);
12877 for (
unsigned I = 0; I != NumVars; ++I)
12878 Vars.push_back(Record.readSubExpr());
12879 C->setVarRefs(Vars);
12880 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12881 C->setLoopData(I, Record.readSubExpr());
12884void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
12886 Record.readAttributes(Attrs);
12887 C->setAttrs(Attrs);
12888 C->setLocStart(Record.readSourceLocation());
12889 C->setLParenLoc(Record.readSourceLocation());
12890 C->setLocEnd(Record.readSourceLocation());
12893void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *
C) {}
12903 Selector.ScoreOrCondition =
nullptr;
12905 Selector.ScoreOrCondition = readExprRef();
12917 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
12922 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
12924 Data->setClauses(Clauses);
12925 if (
Data->hasAssociatedStmt())
12927 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
12932 unsigned NumVars =
readInt();
12934 for (
unsigned I = 0; I < NumVars; ++I)
12940 unsigned NumExprs =
readInt();
12942 for (
unsigned I = 0; I < NumExprs; ++I)
12952 switch (ClauseKind) {
12967 bool isConditionExprClause =
readBool();
12968 if (isConditionExprClause) {
12973 unsigned NumVars =
readInt();
12975 for (
unsigned I = 0; I < NumVars; ++I)
12982 unsigned NumClauses =
readInt();
12984 for (
unsigned I = 0; I < NumClauses; ++I)
13018 for (
unsigned I = 0; I < VarList.size(); ++I) {
13021 RecipeList.push_back({Alloca});
13025 VarList, RecipeList, EndLoc);
13043 for (
unsigned I = 0; I < VarList.size(); ++I) {
13047 RecipeList.push_back({Recipe, RecipeTemp});
13051 VarList, RecipeList, EndLoc);
13102 LParenLoc, ModList, VarList, EndLoc);
13111 LParenLoc, ModList, VarList, EndLoc);
13120 LParenLoc, ModList, VarList, EndLoc);
13129 LParenLoc, ModList, VarList, EndLoc);
13135 AsyncExpr, EndLoc);
13143 DevNumExpr, QueuesLoc, QueueIdExprs,
13150 unsigned NumArchs =
readInt();
13152 for (
unsigned I = 0; I < NumArchs; ++I) {
13155 Archs.emplace_back(Loc, Ident);
13159 LParenLoc, Archs, EndLoc);
13167 for (
unsigned I = 0; I < VarList.size(); ++I) {
13171 3 *
sizeof(
int *));
13174 unsigned NumCombiners =
readInt();
13175 for (
unsigned I = 0; I < NumCombiners; ++I) {
13180 Combiners.push_back({LHS, RHS, Op});
13183 RecipeList.push_back({Recipe, Combiners});
13187 VarList, RecipeList, EndLoc);
13206 HasForce, LoopCount, EndLoc);
13210 unsigned NumClauses =
readInt();
13212 for (
unsigned I = 0; I < NumClauses; ++I)
13215 SizeExprs, EndLoc);
13219 unsigned NumExprs =
readInt();
13222 for (
unsigned I = 0; I < NumExprs; ++I) {
13228 GangKinds, Exprs, EndLoc);
13234 WorkerExpr, EndLoc);
13240 VectorExpr, EndLoc);
13252 LParenLoc, VarList, EndLoc);
13266 llvm_unreachable(
"Clause serialization not yet implemented");
13268 llvm_unreachable(
"Invalid Clause Kind");
13273 for (
unsigned I = 0; I < Clauses.size(); ++I)
13278 unsigned NumVars =
readInt();
13279 A->Clauses.resize(NumVars);
13286 llvm::FoldingSetNodeID ID;
13287 ID.AddString(PrimaryModuleName);
13288 return ID.computeStableHash();
13293 return std::nullopt;
13296 return std::nullopt;
13299 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.
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...
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.
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)
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).
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.
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.
const FunctionProtoType * T
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.
@ Type
The name was classified as a type.
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)