100#include "llvm/ADT/APFloat.h"
101#include "llvm/ADT/APInt.h"
102#include "llvm/ADT/ArrayRef.h"
103#include "llvm/ADT/DenseMap.h"
104#include "llvm/ADT/FoldingSet.h"
105#include "llvm/ADT/IntrusiveRefCntPtr.h"
106#include "llvm/ADT/STLExtras.h"
107#include "llvm/ADT/ScopeExit.h"
108#include "llvm/ADT/Sequence.h"
109#include "llvm/ADT/SmallPtrSet.h"
110#include "llvm/ADT/SmallVector.h"
111#include "llvm/ADT/StringExtras.h"
112#include "llvm/ADT/StringMap.h"
113#include "llvm/ADT/StringRef.h"
114#include "llvm/ADT/iterator_range.h"
115#include "llvm/Bitstream/BitstreamReader.h"
116#include "llvm/Support/Chrono.h"
117#include "llvm/Support/Compiler.h"
118#include "llvm/Support/Compression.h"
119#include "llvm/Support/DJB.h"
120#include "llvm/Support/Endian.h"
121#include "llvm/Support/Error.h"
122#include "llvm/Support/ErrorHandling.h"
123#include "llvm/Support/LEB128.h"
124#include "llvm/Support/MemoryBuffer.h"
125#include "llvm/Support/Path.h"
126#include "llvm/Support/SaveAndRestore.h"
127#include "llvm/Support/TimeProfiler.h"
128#include "llvm/Support/Timer.h"
129#include "llvm/Support/VersionTuple.h"
130#include "llvm/Support/VirtualFileSystem.h"
131#include "llvm/Support/raw_ostream.h"
132#include "llvm/TargetParser/Triple.h"
145#include <system_error>
150using namespace clang;
153using llvm::BitstreamCursor;
161 return First->ReadFullVersionInformation(FullVersion) ||
162 Second->ReadFullVersionInformation(FullVersion);
166 First->ReadModuleName(ModuleName);
167 Second->ReadModuleName(ModuleName);
171 First->ReadModuleMapFile(ModuleMapPath);
172 Second->ReadModuleMapFile(ModuleMapPath);
176 const LangOptions &LangOpts, StringRef ModuleFilename,
bool Complain,
177 bool AllowCompatibleDifferences) {
178 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
179 AllowCompatibleDifferences) ||
180 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
181 AllowCompatibleDifferences);
185 const CodeGenOptions &CGOpts, StringRef ModuleFilename,
bool Complain,
186 bool AllowCompatibleDifferences) {
187 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
188 AllowCompatibleDifferences) ||
189 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
190 AllowCompatibleDifferences);
194 const TargetOptions &TargetOpts, StringRef ModuleFilename,
bool Complain,
195 bool AllowCompatibleDifferences) {
196 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
197 AllowCompatibleDifferences) ||
198 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
199 AllowCompatibleDifferences);
204 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
205 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
211 return First->ReadFileSystemOptions(FSOpts, Complain) ||
212 Second->ReadFileSystemOptions(FSOpts, Complain);
217 StringRef ContextHash,
bool Complain) {
218 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
220 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
226 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
227 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
228 Complain, SuggestedPredefines) ||
229 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
230 Complain, SuggestedPredefines);
235 First->ReadCounter(M,
Value);
236 Second->ReadCounter(M,
Value);
240 return First->needsInputFileVisitation() ||
241 Second->needsInputFileVisitation();
245 return First->needsSystemInputFileVisitation() ||
246 Second->needsSystemInputFileVisitation();
251 bool DirectlyImported) {
252 First->visitModuleFile(Filename, Kind, DirectlyImported);
253 Second->visitModuleFile(Filename, Kind, DirectlyImported);
259 bool isExplicitModule) {
260 bool Continue =
false;
261 if (First->needsInputFileVisitation() &&
262 (!isSystem || First->needsSystemInputFileVisitation()))
263 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
265 if (Second->needsInputFileVisitation() &&
266 (!isSystem || Second->needsSystemInputFileVisitation()))
267 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
274 First->readModuleFileExtension(Metadata);
275 Second->readModuleFileExtension(Metadata);
286 bool CurrentValue, StringRef ModuleFilename) {
289 return Diags->
Report(diag::err_ast_file_langopt_mismatch)
290 << Description << SerializedValue << CurrentValue << ModuleFilename;
297 return Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
298 << Description << ModuleFilename;
311 StringRef ModuleFilename,
313 bool AllowCompatibleDifferences =
true) {
317#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
318 if constexpr (CK::Compatibility != CK::Benign) { \
319 if ((CK::Compatibility == CK::NotCompatible) || \
320 (CK::Compatibility == CK::Compatible && \
321 !AllowCompatibleDifferences)) { \
322 if (ExistingLangOpts.Name != LangOpts.Name) { \
324 return diagnoseLanguageOptionFlagMismatch( \
325 Diags, Description, LangOpts.Name, ExistingLangOpts.Name, \
327 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
333#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
334 if constexpr (CK::Compatibility != CK::Benign) { \
335 if ((CK::Compatibility == CK::NotCompatible) || \
336 (CK::Compatibility == CK::Compatible && \
337 !AllowCompatibleDifferences)) { \
338 if (ExistingLangOpts.Name != LangOpts.Name) { \
339 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
345#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
346 if constexpr (CK::Compatibility != CK::Benign) { \
347 if ((CK::Compatibility == CK::NotCompatible) || \
348 (CK::Compatibility == CK::Compatible && \
349 !AllowCompatibleDifferences)) { \
350 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
351 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
357#include "clang/Basic/LangOptions.def"
366 Diags,
"target Objective-C runtime", ModuleFilename);
379 if (!AllowCompatibleDifferences) {
383 ExistingSanitizers.
clear(ModularSanitizers);
384 ImportedSanitizers.
clear(ModularSanitizers);
385 if (ExistingSanitizers.
Mask != ImportedSanitizers.
Mask) {
386 const std::string Flag =
"-fsanitize=";
388#define SANITIZER(NAME, ID) \
390 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
391 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
392 if (InExistingModule != InImportedModule) \
393 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
394 << InExistingModule << ModuleFilename << (Flag + NAME); \
396#include "clang/Basic/Sanitizers.def"
407 StringRef ModuleFilename,
409 bool AllowCompatibleDifferences =
true) {
413#define CODEGENOPT(Name, Bits, Default, Compatibility) \
414 if constexpr (CK::Compatibility != CK::Benign) { \
415 if ((CK::Compatibility == CK::NotCompatible) || \
416 (CK::Compatibility == CK::Compatible && \
417 !AllowCompatibleDifferences)) { \
418 if (ExistingCGOpts.Name != CGOpts.Name) { \
421 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
422 << #Name << CGOpts.Name << ExistingCGOpts.Name \
425 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
426 << #Name << ModuleFilename; \
433#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
434 if constexpr (CK::Compatibility != CK::Benign) { \
435 if ((CK::Compatibility == CK::NotCompatible) || \
436 (CK::Compatibility == CK::Compatible && \
437 !AllowCompatibleDifferences)) { \
438 if (ExistingCGOpts.Name != CGOpts.Name) { \
440 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
441 << #Name << ModuleFilename; \
446#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
447 if constexpr (CK::Compatibility != CK::Benign) { \
448 if ((CK::Compatibility == CK::NotCompatible) || \
449 (CK::Compatibility == CK::Compatible && \
450 !AllowCompatibleDifferences)) { \
451 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
453 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
454 << #Name << ModuleFilename; \
459#define DEBUGOPT(Name, Bits, Default, Compatibility)
460#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
461#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
462#include "clang/Basic/CodeGenOptions.def"
467static std::vector<std::string>
469 llvm::erase_if(FeaturesAsWritten, [](
const std::string &S) {
470 return S.empty() || (S[0] !=
'+' && S[0] !=
'-');
472 llvm::stable_sort(FeaturesAsWritten,
473 [](
const std::string &A,
const std::string &B) {
474 return A.substr(1) < B.substr(1);
477 std::unique(FeaturesAsWritten.rbegin(), FeaturesAsWritten.rend(),
478 [](
const std::string &A,
const std::string &B) {
479 return A.substr(1) == B.substr(1);
483 FeaturesAsWritten.erase(FeaturesAsWritten.begin(), NewRend.base());
484 return FeaturesAsWritten;
495 StringRef ModuleFilename,
497 bool AllowCompatibleDifferences =
true) {
498#define CHECK_TARGET_OPT(Field, Name) \
499 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
501 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
502 << ModuleFilename << Name << TargetOpts.Field \
503 << ExistingTargetOpts.Field; \
514 if (!AllowCompatibleDifferences) {
519#undef CHECK_TARGET_OPT
524 std::vector<std::string> ExistingFeatures =
526 std::vector<std::string> ReadFeatures =
531 auto FeatureLess = [](StringRef A, StringRef B) {
532 return A.substr(1) < B.substr(1);
536 std::set_difference(ExistingFeatures.begin(), ExistingFeatures.end(),
537 ReadFeatures.begin(), ReadFeatures.end(),
538 std::back_inserter(UnmatchedExistingFeatures),
540 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
541 ExistingFeatures.begin(), ExistingFeatures.end(),
542 std::back_inserter(UnmatchedReadFeatures), FeatureLess);
546 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
550 for (StringRef
Feature : UnmatchedReadFeatures)
551 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
552 <<
false << ModuleFilename <<
Feature;
553 for (StringRef
Feature : UnmatchedExistingFeatures)
554 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
555 <<
true << ModuleFilename <<
Feature;
558 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
562 StringRef ModuleFilename,
bool Complain,
563 bool AllowCompatibleDifferences) {
564 const LangOptions &ExistingLangOpts = PP.getLangOpts();
566 Complain ? &Reader.Diags :
nullptr,
567 AllowCompatibleDifferences);
571 StringRef ModuleFilename,
bool Complain,
572 bool AllowCompatibleDifferences) {
575 Complain ? &Reader.Diags :
nullptr,
576 AllowCompatibleDifferences);
580 StringRef ModuleFilename,
bool Complain,
581 bool AllowCompatibleDifferences) {
582 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
584 Complain ? &Reader.Diags :
nullptr,
585 AllowCompatibleDifferences);
590using MacroDefinitionsMap =
591 llvm::StringMap<std::pair<StringRef,
bool >>;
600 bool empty()
const {
return Decls.empty(); }
602 bool insert(NamedDecl *ND) {
603 auto [_, Inserted] =
Found.insert(ND);
610using DeclsMap = llvm::DenseMap<DeclarationName, DeclsSet>;
616 StringRef ModuleFilename,
626 for (
auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
635 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
637 ->getWarningOptionForDiag(DiagID)
657 StringRef ModuleFilename,
bool IsSystem,
658 bool SystemHeaderWarningsInModule,
667 !SystemHeaderWarningsInModule) {
669 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
670 <<
"-Wsystem-headers" << ModuleFilename;
677 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
678 <<
"-Werror" << ModuleFilename;
685 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
686 <<
"-Weverything -Werror" << ModuleFilename;
693 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
694 <<
"-pedantic-errors" << ModuleFilename;
719 assert(!ModuleName.empty() &&
"diagnostic options read before module name");
723 assert(M &&
"missing module");
728 StringRef ModuleFilename,
732 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
736 PP.getFileManager().getVirtualFileSystem(),
740 assert(ModuleMgr.
size() >= 1 &&
"what ASTFile is this then");
746 Module *Importer = PP.getCurrentModule();
749 bool SystemHeaderWarningsInModule =
756 TopM->
IsSystem, SystemHeaderWarningsInModule,
764 MacroDefinitionsMap &Macros,
766 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
768 bool IsUndef = PPOpts.
Macros[I].second;
770 std::pair<StringRef, StringRef> MacroPair =
Macro.split(
'=');
771 StringRef MacroName = MacroPair.first;
772 StringRef MacroBody = MacroPair.second;
776 auto [It, Inserted] = Macros.try_emplace(MacroName);
777 if (MacroNames && Inserted)
778 MacroNames->push_back(MacroName);
780 It->second = std::make_pair(
"",
true);
785 if (MacroName.size() ==
Macro.size())
789 StringRef::size_type End = MacroBody.find_first_of(
"\n\r");
790 MacroBody = MacroBody.substr(0, End);
793 auto [It, Inserted] = Macros.try_emplace(MacroName);
794 if (MacroNames && Inserted)
795 MacroNames->push_back(MacroName);
796 It->second = std::make_pair(MacroBody,
false);
820 std::string &SuggestedPredefines,
const LangOptions &LangOpts,
824 MacroDefinitionsMap ASTFileMacros;
826 MacroDefinitionsMap ExistingMacros;
829 &ExistingMacroNames);
833 SuggestedPredefines +=
"# 1 \"<command line>\" 1\n";
835 for (
unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
837 StringRef MacroName = ExistingMacroNames[I];
838 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
841 llvm::StringMap<std::pair<StringRef,
bool >>
::iterator Known =
842 ASTFileMacros.find(MacroName);
848 Diags->
Report(diag::err_ast_file_macro_def_undef)
849 << MacroName <<
true << ModuleFilename;
857 if (Existing.second) {
858 SuggestedPredefines +=
"#undef ";
859 SuggestedPredefines += MacroName.str();
860 SuggestedPredefines +=
'\n';
862 SuggestedPredefines +=
"#define ";
863 SuggestedPredefines += MacroName.str();
864 SuggestedPredefines +=
' ';
865 SuggestedPredefines += Existing.first.str();
866 SuggestedPredefines +=
'\n';
873 if (Existing.second != Known->second.second) {
875 Diags->
Report(diag::err_ast_file_macro_def_undef)
876 << MacroName << Known->second.second << ModuleFilename;
883 if (Existing.second || Existing.first == Known->second.first) {
884 ASTFileMacros.erase(Known);
890 Diags->
Report(diag::err_ast_file_macro_def_conflict)
891 << MacroName << Known->second.first << Existing.first
898 SuggestedPredefines +=
"# 1 \"<built-in>\" 2\n";
903 for (
const auto &MacroName : ASTFileMacros.keys()) {
905 Diags->
Report(diag::err_ast_file_macro_def_undef)
906 << MacroName <<
false << ModuleFilename;
917 Diags->
Report(diag::err_ast_file_undef)
924 if (LangOpts.Modules &&
928 Diags->
Report(diag::err_ast_file_pp_detailed_record)
935 for (
unsigned I = 0, N = ExistingPPOpts.
MacroIncludes.size(); I != N; ++I) {
940 SuggestedPredefines +=
"#__include_macros \"";
941 SuggestedPredefines +=
File;
942 SuggestedPredefines +=
"\"\n##\n";
945 for (
unsigned I = 0, N = ExistingPPOpts.
Includes.size(); I != N; ++I) {
952 SuggestedPredefines +=
"#include \"";
953 SuggestedPredefines +=
File;
954 SuggestedPredefines +=
"\"\n";
964 SuggestedPredefines +=
"#include \"";
965 SuggestedPredefines +=
File;
966 SuggestedPredefines +=
"\"\n";
973 StringRef ModuleFilename,
974 bool ReadMacros,
bool Complain,
975 std::string &SuggestedPredefines) {
979 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
980 Complain ? &Reader.Diags :
nullptr, PP.getFileManager(),
981 SuggestedPredefines, PP.getLangOpts());
986 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
988 ModuleFilename, ReadMacros,
nullptr,
989 PP.getFileManager(), SuggestedPredefines,
998 StringRef ExistingSpecificModuleCachePath,
999 StringRef ASTFilename,
1007 std::string(ContextHash));
1010 SpecificModuleCachePath == ExistingSpecificModuleCachePath)
1012 auto EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
1013 SpecificModuleCachePath, ExistingSpecificModuleCachePath);
1014 if (EqualOrErr && *EqualOrErr)
1020 EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
1022 if (EqualOrErr && *EqualOrErr)
1023 Diags->
Report(clang::diag::warn_ast_file_config_mismatch) << ASTFilename;
1025 Diags->
Report(diag::err_ast_file_modulecache_mismatch)
1026 << SpecificModuleCachePath << ExistingSpecificModuleCachePath
1033 StringRef ASTFilename,
1034 StringRef ContextHash,
1036 const HeaderSearch &HeaderSearchInfo = PP.getHeaderSearchInfo();
1039 ASTFilename, Complain ? &Reader.Diags :
nullptr,
1040 PP.getLangOpts(), PP.getPreprocessorOpts(),
1045 PP.setCounterValue(
Value);
1053 unsigned Length = 0;
1054 const char *
Error =
nullptr;
1056 uint64_t Val = llvm::decodeULEB128(P, &Length,
nullptr, &
Error);
1058 llvm::report_fatal_error(
Error);
1064static std::pair<unsigned, unsigned>
1067 if ((
unsigned)KeyLen != KeyLen)
1068 llvm::report_fatal_error(
"key too large");
1071 if ((
unsigned)DataLen != DataLen)
1072 llvm::report_fatal_error(
"data too large");
1074 return std::make_pair(KeyLen, DataLen);
1078 bool TakeOwnership) {
1079 DeserializationListener = Listener;
1080 OwnsDeserializationListener = TakeOwnership;
1091 Reader.ReadModuleOffsetMap(MF);
1093 unsigned ModuleFileIndex =
ID.getModuleFileIndex();
1094 unsigned LocalDeclID =
ID.getLocalDeclIndex();
1100 assert(OwningModuleFile);
1104 if (!ModuleFileIndex)
1107 assert(LocalDeclID < LocalNumDecls);
1115 unsigned ModuleFileIndex,
unsigned LocalDeclID) {
1120std::pair<unsigned, unsigned>
1127 using namespace llvm::support;
1130 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1132 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1139 Args.push_back(FirstII);
1140 for (
unsigned I = 1; I != N; ++I)
1141 Args.push_back(Reader.getLocalIdentifier(
1142 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1150 using namespace llvm::support;
1154 Result.ID = Reader.getGlobalSelectorID(
1155 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1156 unsigned FullInstanceBits =
1157 endian::readNext<uint16_t, llvm::endianness::little>(d);
1158 unsigned FullFactoryBits =
1159 endian::readNext<uint16_t, llvm::endianness::little>(d);
1160 Result.InstanceBits = FullInstanceBits & 0x3;
1161 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1162 Result.FactoryBits = FullFactoryBits & 0x3;
1163 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1164 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1165 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1168 for (
unsigned I = 0; I != NumInstanceMethods; ++I) {
1172 endian::readNext<DeclID, llvm::endianness::little>(d))))
1177 for (
unsigned I = 0; I != NumFactoryMethods; ++I) {
1181 endian::readNext<DeclID, llvm::endianness::little>(d))))
1189 return llvm::djbHash(a);
1192std::pair<unsigned, unsigned>
1199 assert(n >= 2 && d[n-1] ==
'\0');
1200 return StringRef((
const char*) d, n-1);
1206 bool IsInteresting =
1217 bool Value = Bits & 0x1;
1223 using namespace llvm::support;
1226 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1227 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1240 const unsigned char* d,
1242 using namespace llvm::support;
1245 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1246 bool IsInteresting = RawID & 0x01;
1256 II = &Reader.getIdentifierTable().getOwn(k);
1259 bool IsModule = Reader.getPreprocessor().getCurrentModule() !=
nullptr;
1261 Reader.markIdentifierUpToDate(II);
1263 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1264 if (!IsInteresting) {
1267 Reader.SetIdentifierInfo(ID, II);
1271 unsigned ObjCOrBuiltinID =
1272 endian::readNext<uint16_t, llvm::endianness::little>(d);
1273 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1274 bool CPlusPlusOperatorKeyword =
readBit(Bits);
1275 bool HasRevertedTokenIDToIdentifier =
readBit(Bits);
1276 bool Poisoned =
readBit(Bits);
1277 bool ExtensionToken =
readBit(Bits);
1278 bool HasMacroDefinition =
readBit(Bits);
1280 assert(Bits == 0 &&
"Extra bits in the identifier?");
1281 DataLen -=
sizeof(uint16_t) * 2;
1285 if (HasRevertedTokenIDToIdentifier && II->
getTokenID() != tok::identifier)
1290 "Incorrect extension token flag");
1291 (void)ExtensionToken;
1295 "Incorrect C++ operator keyword flag");
1296 (void)CPlusPlusOperatorKeyword;
1300 if (HasMacroDefinition) {
1301 uint32_t MacroDirectivesOffset =
1302 endian::readNext<uint32_t, llvm::endianness::little>(d);
1305 if (MacroDirectivesOffset)
1306 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1308 hasMacroDefinitionInDependencies =
true;
1311 Reader.SetIdentifierInfo(ID, II);
1317 for (; DataLen > 0; DataLen -=
sizeof(
DeclID))
1318 DeclIDs.push_back(Reader.getGlobalDeclID(
1321 endian::readNext<DeclID, llvm::endianness::little>(d))));
1322 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1329 : Kind(Name.getNameKind()) {
1359 llvm::FoldingSetNodeID ID;
1360 ID.AddInteger(Kind);
1383 return ID.computeStableHash();
1388 using namespace llvm::support;
1390 uint32_t ModuleFileID =
1391 endian::readNext<uint32_t, llvm::endianness::little>(d);
1392 return Reader.getLocalModuleFile(
F, ModuleFileID);
1395std::pair<unsigned, unsigned>
1402 using namespace llvm::support;
1411 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1418 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1442 using namespace llvm::support;
1444 for (
unsigned NumDecls = DataLen /
sizeof(
DeclID); NumDecls; --NumDecls) {
1446 Reader,
F, endian::readNext<DeclID, llvm::endianness::little>(d));
1452 const unsigned char *d,
1460 llvm::FoldingSetNodeID ID;
1461 ID.AddInteger(Key.first.getHash());
1462 ID.AddInteger(Key.second);
1463 return ID.computeStableHash();
1474 return {Name, *ModuleHash};
1480 unsigned PrimaryModuleHash =
1481 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1482 return {Name, PrimaryModuleHash};
1486 const unsigned char *d,
1494 using namespace llvm::support;
1496 uint32_t ModuleFileID =
1497 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1498 return Reader.getLocalModuleFile(F, ModuleFileID);
1503 using namespace llvm::support;
1504 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1507std::pair<unsigned, unsigned>
1513 const unsigned char *d,
1516 using namespace llvm::support;
1518 for (
unsigned NumDecls =
1520 NumDecls; --NumDecls) {
1523 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1524 Val.
insert(Reader.getGlobalDeclID(F, LocalID));
1528bool ASTReader::ReadLexicalDeclContextStorage(
ModuleFile &M,
1529 BitstreamCursor &Cursor,
1532 assert(Offset != 0);
1535 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1536 Error(std::move(Err));
1544 Error(MaybeCode.takeError());
1547 unsigned Code = MaybeCode.get();
1550 if (!MaybeRecCode) {
1551 Error(MaybeRecCode.takeError());
1554 unsigned RecCode = MaybeRecCode.get();
1556 Error(
"Expected lexical block");
1561 "expected a TU_UPDATE_LEXICAL record for TU");
1566 auto &Lex = LexicalDecls[DC];
1568 Lex = std::make_pair(
1571 Blob.size() /
sizeof(
DeclID)));
1577bool ASTReader::ReadVisibleDeclContextStorage(
1578 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1579 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1580 assert(Offset != 0);
1582 SavedStreamPosition SavedPosition(Cursor);
1583 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1584 Error(std::move(Err));
1590 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1592 Error(MaybeCode.takeError());
1595 unsigned Code = MaybeCode.get();
1597 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1598 if (!MaybeRecCode) {
1599 Error(MaybeRecCode.takeError());
1602 unsigned RecCode = MaybeRecCode.get();
1603 switch (VisibleKind) {
1604 case VisibleDeclContextStorageKind::GenerallyVisible:
1606 Error(
"Expected visible lookup table block");
1610 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1612 Error(
"Expected module local visible lookup table block");
1616 case VisibleDeclContextStorageKind::TULocalVisible:
1618 Error(
"Expected TU local lookup table block");
1626 auto *
Data = (
const unsigned char*)Blob.data();
1627 switch (VisibleKind) {
1628 case VisibleDeclContextStorageKind::GenerallyVisible:
1629 PendingVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1631 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1632 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1634 case VisibleDeclContextStorageKind::TULocalVisible:
1636 TULocalUpdates[
ID].push_back(UpdateData{&M,
Data});
1642void ASTReader::AddSpecializations(
const Decl *D,
const unsigned char *
Data,
1646 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1647 SpecLookups[D].Table.add(&M,
Data,
1651bool ASTReader::ReadSpecializations(
ModuleFile &M, BitstreamCursor &Cursor,
1652 uint64_t Offset, Decl *D,
bool IsPartial) {
1653 assert(Offset != 0);
1655 SavedStreamPosition SavedPosition(Cursor);
1656 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1657 Error(std::move(Err));
1663 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1665 Error(MaybeCode.takeError());
1668 unsigned Code = MaybeCode.get();
1670 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1671 if (!MaybeRecCode) {
1672 Error(MaybeRecCode.takeError());
1675 unsigned RecCode = MaybeRecCode.get();
1678 Error(
"Expected decl specs block");
1682 auto *
Data = (
const unsigned char *)Blob.data();
1683 AddSpecializations(D,
Data, M, IsPartial);
1687void ASTReader::Error(StringRef Msg)
const {
1688 Error(diag::err_fe_ast_file_malformed, Msg);
1689 if (PP.getLangOpts().Modules &&
1690 !PP.getHeaderSearchInfo().getSpecificModuleCachePath().empty()) {
1691 Diag(diag::note_module_cache_path)
1692 << PP.getHeaderSearchInfo().getSpecificModuleCachePath();
1696void ASTReader::Error(
unsigned DiagID, StringRef Arg1, StringRef Arg2,
1697 StringRef Arg3)
const {
1698 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1702struct AlreadyReportedDiagnosticError
1703 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1706 void log(raw_ostream &OS)
const override {
1707 llvm_unreachable(
"reporting an already-reported diagnostic error");
1710 std::error_code convertToErrorCode()
const override {
1711 return llvm::inconvertibleErrorCode();
1715char AlreadyReportedDiagnosticError::ID = 0;
1718void ASTReader::Error(llvm::Error &&Err)
const {
1720 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1721 [&](llvm::ErrorInfoBase &E) {
return Error(E.message()); });
1731 LineTableInfo &LineTable = SourceMgr.getLineTable();
1734 std::map<int, int> FileIDs;
1736 for (
unsigned I = 0;
Record[Idx]; ++I) {
1738 auto Filename = ReadPath(F,
Record, Idx);
1744 std::vector<LineEntry> Entries;
1745 while (Idx <
Record.size()) {
1746 FileID FID = ReadFileID(F,
Record, Idx);
1749 unsigned NumEntries =
Record[Idx++];
1750 assert(NumEntries &&
"no line entries for file ID");
1752 Entries.reserve(NumEntries);
1753 for (
unsigned I = 0; I != NumEntries; ++I) {
1754 unsigned FileOffset =
Record[Idx++];
1755 unsigned LineNo =
Record[Idx++];
1756 int FilenameID = FileIDs[
Record[Idx++]];
1759 unsigned IncludeOffset =
Record[Idx++];
1761 FileKind, IncludeOffset));
1768llvm::Error ASTReader::ReadSourceManagerBlock(
ModuleFile &F) {
1769 using namespace SrcMgr;
1777 SLocEntryCursor = F.
Stream;
1780 if (llvm::Error Err = F.
Stream.SkipBlock())
1790 Expected<llvm::BitstreamEntry> MaybeE =
1791 SLocEntryCursor.advanceSkippingSubblocks();
1793 return MaybeE.takeError();
1794 llvm::BitstreamEntry E = MaybeE.get();
1797 case llvm::BitstreamEntry::SubBlock:
1798 case llvm::BitstreamEntry::Error:
1799 return llvm::createStringError(std::errc::illegal_byte_sequence,
1800 "malformed block record in AST file");
1801 case llvm::BitstreamEntry::EndBlock:
1802 return llvm::Error::success();
1803 case llvm::BitstreamEntry::Record:
1811 Expected<unsigned> MaybeRecord =
1812 SLocEntryCursor.readRecord(E.ID,
Record, &Blob);
1814 return MaybeRecord.takeError();
1815 switch (MaybeRecord.get()) {
1823 return llvm::Error::success();
1828llvm::Expected<SourceLocation::UIntTy>
1834 return std::move(Err);
1838 return MaybeEntry.takeError();
1840 llvm::BitstreamEntry Entry = MaybeEntry.get();
1841 if (Entry.Kind != llvm::BitstreamEntry::Record)
1842 return llvm::createStringError(
1843 std::errc::illegal_byte_sequence,
1844 "incorrectly-formatted source location entry in AST file");
1850 return MaybeSLOC.takeError();
1852 switch (MaybeSLOC.get()) {
1854 return llvm::createStringError(
1855 std::errc::illegal_byte_sequence,
1856 "incorrectly-formatted source location entry in AST file");
1866 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1867 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1868 "Corrupted global sloc offset map");
1873 auto It = llvm::upper_bound(
1876 int ID = F->SLocEntryBaseID + LocalIndex;
1877 std::size_t Index = -ID - 2;
1878 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1879 assert(!SourceMgr.SLocEntryLoaded[Index]);
1880 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1881 if (!MaybeEntryOffset) {
1882 Error(MaybeEntryOffset.takeError());
1886 SourceMgr.LoadedSLocEntryTable[Index] =
1887 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1888 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1890 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1901std::pair<SourceLocation::UIntTy, SourceLocationEncoding::Chain>
1908std::pair<SourceLocation::UIntTy, SourceLocationEncoding::Chain>
1923 Error(
"source location entry ID out-of-range for AST file");
1929 auto ReadBuffer = [
this](
1930 BitstreamCursor &SLocEntryCursor,
1931 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1936 Error(MaybeCode.takeError());
1939 unsigned Code = MaybeCode.get();
1942 SLocEntryCursor.readRecord(Code,
Record, &Blob);
1943 if (!MaybeRecCode) {
1944 Error(MaybeRecCode.takeError());
1947 unsigned RecCode = MaybeRecCode.get();
1951 if (llvm::Error E = llvm::compression::decompress(
1952 llvm::arrayRefFromStringRef(Blob), Decompressed,
Record[0])) {
1953 Error(
"could not decompress embedded file contents: " +
1954 llvm::toString(std::move(E)));
1957 return llvm::MemoryBuffer::getMemBufferCopy(
1958 llvm::toStringRef(Decompressed), Name);
1960 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name,
true);
1962 Error(
"AST record has invalid code");
1967 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1971 Error(std::move(Err));
1978 ++NumSLocEntriesRead;
1981 Error(MaybeEntry.takeError());
1984 llvm::BitstreamEntry Entry = MaybeEntry.get();
1986 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1987 Error(
"incorrectly-formatted source location entry in AST file");
1994 SLocEntryCursor.readRecord(Entry.ID,
Record, &Blob);
1996 Error(MaybeSLOC.takeError());
1999 switch (MaybeSLOC.get()) {
2001 Error(
"incorrectly-formatted source location entry in AST file");
2007 unsigned InputID =
Record[4];
2008 InputFile IF = getInputFile(*F, InputID);
2021 IncludeLoc = getImportLocation(F);
2025 FileID FID = SourceMgr.createFileID(*
File, IncludeLoc, FileCharacter, ID,
2028 FileInfo.NumCreatedFIDs =
Record[5];
2032 unsigned NumFileDecls =
Record[7];
2033 if (NumFileDecls && ContextObj) {
2035 assert(F->
FileSortedDecls &&
"FILE_SORTED_DECLS not encountered yet ?");
2041 SourceMgr.getOrCreateContentCache(*
File, isSystem(FileCharacter));
2045 auto Buffer = ReadBuffer(SLocEntryCursor,
File->getName());
2048 SourceMgr.overrideFileContents(*
File, std::move(Buffer));
2055 const char *Name = Blob.data();
2056 unsigned Offset =
Record[0];
2061 IncludeLoc = getImportLocation(F);
2064 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2067 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2068 BaseOffset + Offset, IncludeLoc);
2070 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2071 FileInfo.setHasLineDirectives();
2083 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2085 BaseOffset + EntryOffset);
2098 Error(
"source location entry ID out-of-range for AST file");
2103 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2121 assert(SourceMgr.getMainFileID().isValid() &&
"missing main file");
2122 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2132 uint64_t *StartOfBlockOffset) {
2133 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2136 if (StartOfBlockOffset)
2137 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2140 uint64_t Offset = Cursor.GetCurrentBitNo();
2143 return MaybeCode.takeError();
2144 unsigned Code = MaybeCode.get();
2147 if (Code != llvm::bitc::DEFINE_ABBREV) {
2148 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2150 return llvm::Error::success();
2152 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2165 if (
Tok.isAnnotation()) {
2167 switch (
Tok.getKind()) {
2168 case tok::annot_pragma_loop_hint: {
2172 unsigned NumTokens =
Record[Idx++];
2174 Toks.reserve(NumTokens);
2175 for (
unsigned I = 0; I < NumTokens; ++I)
2177 Info->Toks =
llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2178 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2181 case tok::annot_pragma_pack: {
2186 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2188 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2192 case tok::annot_pragma_openmp:
2193 case tok::annot_pragma_openmp_end:
2194 case tok::annot_pragma_unused:
2195 case tok::annot_pragma_openacc:
2196 case tok::annot_pragma_openacc_end:
2197 case tok::annot_repl_input_end:
2200 llvm_unreachable(
"missing deserialization code for annotation token");
2205 Tok.setIdentifierInfo(II);
2217 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2219 consumeError(std::move(Err));
2231 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2233 Stream.advanceSkippingSubblocks(Flags);
2235 Error(MaybeEntry.takeError());
2238 llvm::BitstreamEntry Entry = MaybeEntry.get();
2240 switch (Entry.Kind) {
2241 case llvm::BitstreamEntry::SubBlock:
2242 case llvm::BitstreamEntry::Error:
2243 Error(
"malformed block record in AST file");
2245 case llvm::BitstreamEntry::EndBlock:
2247 case llvm::BitstreamEntry::Record:
2258 Error(MaybeRecType.takeError());
2274 unsigned NextIndex = 1;
2276 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2281 PP.getPreprocessorAllocator());
2284 bool isC99VarArgs =
Record[NextIndex++];
2285 bool isGNUVarArgs =
Record[NextIndex++];
2286 bool hasCommaPasting =
Record[NextIndex++];
2287 MacroParams.clear();
2288 unsigned NumArgs =
Record[NextIndex++];
2289 for (
unsigned i = 0; i != NumArgs; ++i)
2304 if (NextIndex + 1 ==
Record.size() && PP.getPreprocessingRecord() &&
2309 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2311 PreprocessingRecord::PPEntityID PPID =
2312 PPRec.getPPEntityID(Index,
true);
2314 PPRec.getPreprocessedEntity(PPID));
2316 PPRec.RegisterMacroDefinition(
Macro, PPDef);
2327 if (MacroTokens.empty()) {
2328 Error(
"unexpected number of macro tokens for a macro in AST file");
2334 MacroTokens = MacroTokens.drop_front();
2345 ReadModuleOffsetMap(M);
2347 unsigned ModuleFileIndex = LocalID >> 32;
2348 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2351 assert(MF &&
"malformed identifier ID encoding?");
2353 if (!ModuleFileIndex) {
2362HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
2365 return FileMgr.getOptionalFileRef(Key.Filename);
2369 return FileMgr.getOptionalFileRef(*Resolved);
2373 uint8_t buf[
sizeof(ikey.
Size) +
sizeof(ikey.
ModTime)];
2376 return llvm::xxh3_64bits(buf);
2397 return FEA && FEA == FEB;
2400std::pair<unsigned, unsigned>
2407 using namespace llvm::support;
2410 ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2412 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2421 using namespace llvm::support;
2423 const unsigned char *End = d + DataLen;
2425 unsigned Flags = *d++;
2428 bool Included = (Flags >> 6) & 0x01;
2430 if ((FE = getFile(key)))
2433 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2436 HFI.
isImport |= (Flags >> 5) & 0x01;
2438 HFI.
DirInfo = (Flags >> 1) & 0x07;
2440 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2442 assert((End - d) % 4 == 0 &&
2443 "Wrong data length in HeaderFileInfo deserialization");
2445 uint32_t LocalSMID =
2446 endian::readNext<uint32_t, llvm::endianness::little>(d);
2452 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2453 Module *Mod = Reader.getSubmodule(GlobalSMID);
2455 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2457 if (FE || (FE = getFile(key))) {
2460 ModMap.
addHeader(Mod, H, HeaderRole,
true);
2472 uint32_t MacroDirectivesOffset) {
2473 assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
2474 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2481 for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
2482 BitstreamCursor &MacroCursor = I.MacroCursor;
2485 if (MacroCursor.getBitcodeBytes().empty())
2488 BitstreamCursor Cursor = MacroCursor;
2489 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2490 Error(std::move(Err));
2498 Error(MaybeE.takeError());
2501 llvm::BitstreamEntry E = MaybeE.get();
2504 case llvm::BitstreamEntry::SubBlock:
2505 case llvm::BitstreamEntry::Error:
2506 Error(
"malformed block record in AST file");
2508 case llvm::BitstreamEntry::EndBlock:
2511 case llvm::BitstreamEntry::Record: {
2515 Error(MaybeRecord.takeError());
2518 switch (MaybeRecord.get()) {
2545 class IdentifierLookupVisitor {
2548 unsigned PriorGeneration;
2549 unsigned &NumIdentifierLookups;
2550 unsigned &NumIdentifierLookupHits;
2554 IdentifierLookupVisitor(StringRef Name,
unsigned PriorGeneration,
2555 unsigned &NumIdentifierLookups,
2556 unsigned &NumIdentifierLookupHits)
2558 PriorGeneration(PriorGeneration),
2559 NumIdentifierLookups(NumIdentifierLookups),
2560 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2574 ++NumIdentifierLookups;
2575 ASTIdentifierLookupTable::iterator Pos =
2576 IdTable->find_hashed(Name, NameHash, &Trait);
2577 if (Pos == IdTable->end())
2583 ++NumIdentifierLookupHits;
2585 if (Trait.hasMoreInformationInDependencies()) {
2594 IdentifierInfo *getIdentifierInfo()
const {
return Found; }
2603 unsigned PriorGeneration = 0;
2605 PriorGeneration = IdentifierGeneration[&II];
2612 if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
2617 IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
2618 NumIdentifierLookups,
2619 NumIdentifierLookupHits);
2620 ModuleMgr.visit(Visitor, HitsPtr);
2637 uint64_t ModuleFileIndex =
Record[Idx++] << 32;
2638 uint64_t LocalIndex =
Record[Idx++];
2643 const PendingMacroInfo &PMInfo) {
2648 if (llvm::Error Err =
2650 Error(std::move(Err));
2654 struct ModuleMacroRecord {
2667 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2669 Error(MaybeEntry.takeError());
2672 llvm::BitstreamEntry Entry = MaybeEntry.get();
2674 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2675 Error(
"malformed block record in AST file");
2682 Error(MaybePP.takeError());
2690 ModuleMacros.push_back(ModuleMacroRecord());
2691 auto &Info = ModuleMacros.back();
2695 for (
int I = Idx, N =
Record.size(); I != N; ++I)
2701 Error(
"malformed block record in AST file");
2712 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2714 for (
auto &MMR : ModuleMacros) {
2716 for (
unsigned ModID : MMR.Overrides) {
2718 auto *
Macro = PP.getModuleMacro(Mod, II);
2719 assert(
Macro &&
"missing definition for overridden macro");
2720 Overrides.push_back(
Macro);
2723 bool Inserted =
false;
2725 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2736 unsigned Idx = 0, N =
Record.size();
2744 MD = PP.AllocateDefMacroDirective(MI, Loc);
2748 MD = PP.AllocateUndefMacroDirective(Loc);
2751 bool isPublic =
Record[Idx++];
2752 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2764 PP.setLoadedMacroDirective(II, Earliest, Latest);
2767bool ASTReader::shouldDisableValidationForFile(
2790static std::pair<StringRef, StringRef>
2792 const StringRef InputBlob) {
2794 return {InputBlob.substr(0, AsRequestedLength),
2795 InputBlob.substr(AsRequestedLength)};
2809 SavedStreamPosition SavedPosition(Cursor);
2813 consumeError(std::move(Err));
2816 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
2819 consumeError(MaybeCode.takeError());
2821 unsigned Code = MaybeCode.get();
2825 if (Expected<unsigned> Maybe =
Cursor.readRecord(Code,
Record, &Blob))
2827 "invalid record type for input file");
2830 consumeError(
Maybe.takeError());
2833 assert(
Record[0] == ID &&
"Bogus stored ID or offset");
2835 R.StoredSize =
static_cast<off_t
>(
Record[1]);
2836 R.StoredTime =
static_cast<time_t
>(
Record[2]);
2837 R.Overridden =
static_cast<bool>(
Record[3]);
2838 R.Transient =
static_cast<bool>(
Record[4]);
2839 R.TopLevel =
static_cast<bool>(
Record[5]);
2840 R.ModuleMap =
static_cast<bool>(
Record[6]);
2841 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2843 R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2844 R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2845 ? UnresolvedFilenameAsRequested
2846 : UnresolvedFilename;
2848 Expected<llvm::BitstreamEntry> MaybeEntry =
Cursor.advance();
2850 consumeError(MaybeEntry.takeError());
2851 llvm::BitstreamEntry Entry = MaybeEntry.get();
2852 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2853 "expected record type for input file hash");
2856 if (Expected<unsigned> Maybe =
Cursor.readRecord(Entry.ID,
Record))
2858 "invalid record type for input file hash");
2861 consumeError(
Maybe.takeError());
2886 SavedStreamPosition SavedPosition(Cursor);
2890 consumeError(std::move(Err));
2905 const HeaderSearchOptions &HSOpts =
2906 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2919 if ((Overridden || Transient || SkipChecks) && !
File)
2924 std::string ErrorStr =
"could not find file '";
2925 ErrorStr += *Filename;
2926 ErrorStr +=
"' referenced by AST file '";
2940 SourceManager &SM = getSourceManager();
2942 if ((!Overridden && !Transient) && !SkipChecks &&
2945 Error(diag::err_fe_pch_file_overridden, *Filename);
2956 auto HasInputContentChanged = [&](
Change OriginalChange) {
2957 assert(ValidateASTInputFilesContent &&
2958 "We should only check the content of the inputs with "
2959 "ValidateASTInputFilesContent enabled.");
2961 if (StoredContentHash == 0)
2962 return OriginalChange;
2965 if (!MemBuffOrError) {
2967 return OriginalChange;
2968 std::string ErrorStr =
"could not get buffer for file '";
2969 ErrorStr +=
File->getName();
2972 return OriginalChange;
2975 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2976 if (StoredContentHash ==
static_cast<uint64_t>(ContentHash))
2981 auto HasInputFileChanged = [&]() {
2982 if (StoredSize !=
File->getSize())
2984 if (!shouldDisableValidationForFile(F) && StoredTime &&
2985 StoredTime !=
File->getModificationTime()) {
2987 File->getModificationTime()};
2991 if (ValidateASTInputFilesContent)
2992 return HasInputContentChanged(MTimeChange);
2999 bool IsOutOfDate =
false;
3006 FileChange = HasInputContentChanged(FileChange);
3012 if (!StoredTime && ValidateASTInputFilesContent &&
3014 FileChange = HasInputContentChanged(FileChange);
3020 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
3021 while (!ImportStack.back()->ImportedBy.empty())
3022 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
3025 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
3026 Diag(diag::err_fe_ast_file_modified)
3028 << TopLevelASTFileName;
3029 Diag(diag::note_fe_ast_file_modified)
3030 << FileChange.Kind << (FileChange.Old && FileChange.New)
3031 << llvm::itostr(FileChange.Old.value_or(0))
3032 << llvm::itostr(FileChange.New.value_or(0));
3033 if (getModuleManager()
3035 .getInMemoryModuleCache()
3040 if (ImportStack.size() > 1) {
3041 Diag(diag::note_ast_file_required_by)
3042 << *Filename << ImportStack[0]->FileName;
3043 for (
unsigned I = 1; I < ImportStack.size(); ++I)
3044 Diag(diag::note_ast_file_required_by)
3045 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3049 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3050 Diag(diag::note_ast_file_input_files_validation_status)
3066ASTReader::TemporarilyOwnedStringRef
3072ASTReader::TemporarilyOwnedStringRef
3075 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
3077 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3078 Path ==
"<built-in>" || Path ==
"<command line>")
3083 return {Prefix, Buf};
3086 llvm::sys::path::append(Buf, Prefix, Path);
3087 StringRef ResolvedPath{Buf.data(), Buf.size()};
3088 return {ResolvedPath, Buf};
3101 return ResolvedPath->str();
3116 llvm_unreachable(
"unknown ASTReadResult");
3120 BitstreamCursor &Stream, StringRef Filename,
3121 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3122 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3125 consumeError(std::move(Err));
3133 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3136 consumeError(MaybeEntry.takeError());
3139 llvm::BitstreamEntry Entry = MaybeEntry.get();
3141 switch (Entry.Kind) {
3142 case llvm::BitstreamEntry::Error:
3143 case llvm::BitstreamEntry::SubBlock:
3146 case llvm::BitstreamEntry::EndBlock:
3149 case llvm::BitstreamEntry::Record:
3156 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3157 if (!MaybeRecordType) {
3159 consumeError(MaybeRecordType.takeError());
3164 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3165 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3166 AllowCompatibleConfigurationMismatch))
3167 Result = ConfigurationMismatch;
3172 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3173 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3174 AllowCompatibleConfigurationMismatch))
3175 Result = ConfigurationMismatch;
3180 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3181 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3182 AllowCompatibleConfigurationMismatch))
3183 Result = ConfigurationMismatch;
3188 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3189 if (!AllowCompatibleConfigurationMismatch &&
3190 ParseFileSystemOptions(
Record, Complain, Listener))
3191 Result = ConfigurationMismatch;
3196 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3197 if (!AllowCompatibleConfigurationMismatch &&
3198 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3199 Result = ConfigurationMismatch;
3204 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3205 if (!AllowCompatibleConfigurationMismatch &&
3206 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3207 SuggestedPredefines))
3208 Result = ConfigurationMismatch;
3215static std::pair<bool, bool>
3218 const bool EnablesBSValidation =
3220 const bool WasValidated =
3221 EnablesBSValidation &&
3223 return {EnablesBSValidation, WasValidated};
3226ASTReader::RelocationResult
3227ASTReader::getModuleForRelocationChecks(
ModuleFile &F,
bool DirectoryCheck) {
3229 const bool IgnoreError =
3230 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3233 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3234 return {std::nullopt, IgnoreError};
3238 if (!DirectoryCheck &&
3239 (!IsImplicitModule || ModuleMgr.begin()->Kind ==
MK_MainFile))
3240 return {std::nullopt, IgnoreError};
3242 const HeaderSearchOptions &HSOpts =
3243 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3248 auto [EnablesBSValidation, WasValidated] =
3250 const bool SkipModuleLookup =
3251 !PP.getPreprocessorOpts().ModulesForceRedundantLookup &&
3253 (EnablesBSValidation &&
3256 if (SkipModuleLookup)
3257 return {std::nullopt, IgnoreError};
3264 Module *M = PP.getHeaderSearchInfo().lookupModule(
3269 return {M, IgnoreError};
3274 SmallVectorImpl<ImportedModule> &Loaded,
3276 unsigned ClientLoadCapabilities) {
3277 BitstreamCursor &Stream = F.
Stream;
3280 Error(std::move(Err));
3290 bool HasReadUnhashedControlBlock =
false;
3291 auto readUnhashedControlBlockOnce = [&]() {
3292 if (!HasReadUnhashedControlBlock) {
3293 HasReadUnhashedControlBlock =
true;
3294 if (ASTReadResult
Result =
3295 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3301 bool DisableValidation = shouldDisableValidationForFile(F);
3305 unsigned NumInputs = 0;
3306 unsigned NumUserInputs = 0;
3307 StringRef BaseDirectoryAsWritten;
3309 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3311 Error(MaybeEntry.takeError());
3314 llvm::BitstreamEntry Entry = MaybeEntry.get();
3316 switch (Entry.Kind) {
3317 case llvm::BitstreamEntry::Error:
3318 Error(
"malformed block record in AST file");
3320 case llvm::BitstreamEntry::EndBlock: {
3323 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3327 const HeaderSearchOptions &HSOpts =
3328 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3336 !canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities);
3342 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3348 N = ForceValidateUserInputs ? NumUserInputs : 0;
3350 ForceValidateUserInputs
3356 Diag(diag::remark_module_validation)
3359 for (
unsigned I = 0; I < N; ++I) {
3360 InputFile IF = getInputFile(F, I+1, Complain);
3369 isDirectoryDependencyOutOfDate(F, Complain))
3381 for (
unsigned I = 0; I < N; ++I) {
3382 bool IsSystem = I >= NumUserInputs;
3384 auto FilenameAsRequested = ResolveImportedPath(
3387 *FilenameAsRequested, IsSystem, FI.
Overridden,
3395 case llvm::BitstreamEntry::SubBlock:
3399 if (llvm::Error Err = Stream.SkipBlock()) {
3400 Error(std::move(Err));
3404 Error(
"malformed block record in AST file");
3414 if (Listener && !ImportedBy) {
3420 bool AllowCompatibleConfigurationMismatch =
3424 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3425 AllowCompatibleConfigurationMismatch, *Listener,
3426 SuggestedPredefines);
3428 Error(
"malformed block record in AST file");
3432 if (DisableValidation ||
3433 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3441 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3442 Error(std::move(Err));
3448 if (llvm::Error Err = Stream.SkipBlock()) {
3449 Error(std::move(Err));
3455 case llvm::BitstreamEntry::Record:
3463 Expected<unsigned> MaybeRecordType =
3464 Stream.readRecord(Entry.ID,
Record, &Blob);
3465 if (!MaybeRecordType) {
3466 Error(MaybeRecordType.takeError());
3472 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3474 : diag::err_ast_file_version_too_new)
3479 bool hasErrors =
Record[7];
3480 if (hasErrors && !DisableValidation) {
3483 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3484 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3487 if (!AllowASTWithCompilerErrors) {
3488 Diag(diag::err_ast_file_with_compiler_errors)
3494 Diags.ErrorOccurred =
true;
3495 Diags.UncompilableErrorOccurred =
true;
3496 Diags.UnrecoverableErrorOccurred =
true;
3509 StringRef ASTBranch = Blob;
3510 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3511 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3512 Diag(diag::err_ast_file_different_branch)
3524 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3534 auto [ImportLoc, ImportModuleFileIndex] =
3535 ReadUntranslatedSourceLocation(
Record[Idx++]);
3537 assert(ImportModuleFileIndex == 0);
3539 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3541 bool IsImportingStdCXXModule =
Record[Idx++];
3543 off_t StoredSize = 0;
3544 time_t StoredModTime = 0;
3545 unsigned FileNameKind = 0;
3546 ASTFileSignature StoredSignature;
3547 ModuleFileName ImportedFile;
3548 std::string StoredFile;
3549 bool IgnoreImportedByNote =
false;
3558 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3559 ImportedName, !IsImportingStdCXXModule);
3561 if (IsImportingStdCXXModule && ImportedFile.
empty()) {
3562 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3566 if (!IsImportingStdCXXModule) {
3567 StoredSize = (off_t)
Record[Idx++];
3568 StoredModTime = (time_t)
Record[Idx++];
3569 FileNameKind = (unsigned)
Record[Idx++];
3573 SignatureBytes.end());
3576 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3577 if (ImportedFile.
empty()) {
3579 }
else if (!getDiags().isIgnored(
3580 diag::warn_module_file_mapping_mismatch,
3581 CurrentImportLoc)) {
3582 auto ImportedFileRef =
3583 PP.getFileManager().getOptionalFileRef(ImportedFile);
3584 auto StoredFileRef =
3585 PP.getFileManager().getOptionalFileRef(StoredFile);
3586 if ((ImportedFileRef && StoredFileRef) &&
3587 (*ImportedFileRef != *StoredFileRef)) {
3588 Diag(diag::warn_module_file_mapping_mismatch)
3589 << ImportedFile << StoredFile;
3590 Diag(diag::note_module_file_imported_by)
3592 IgnoreImportedByNote =
true;
3599 unsigned Capabilities = ClientLoadCapabilities;
3600 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3601 Capabilities &= ~ARR_Missing;
3604 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3605 Loaded, StoredSize, StoredModTime,
3606 StoredSignature, Capabilities);
3611 if (IsImportingStdCXXModule) {
3612 if (
const auto *Imported =
3613 getModuleManager().lookupByFileName(ImportedFile);
3614 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3615 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3621 bool recompilingFinalized =
Result == OutOfDate &&
3622 (Capabilities & ARR_OutOfDate) &&
3625 .getInMemoryModuleCache()
3627 if (!IgnoreImportedByNote &&
3629 Diag(diag::note_module_file_imported_by)
3636 case OutOfDate:
return OutOfDate;
3638 case ConfigurationMismatch:
return ConfigurationMismatch;
3639 case HadErrors:
return HadErrors;
3658 Diag(diag::remark_module_import)
3660 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3666 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3674 BaseDirectoryAsWritten = Blob;
3676 "MODULE_DIRECTORY found before MODULE_NAME");
3679 auto [MaybeM, IgnoreError] =
3680 getModuleForRelocationChecks(F,
true);
3681 if (!MaybeM.has_value())
3684 Module *M = MaybeM.value();
3696 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3697 if (BuildDir && (*BuildDir == M->
Directory)) {
3701 Diag(diag::remark_module_relocated)
3704 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3705 Diag(diag::err_imported_module_relocated)
3711 if (ASTReadResult
Result =
3712 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3717 ReadDirectoryDependencies(
Record, F);
3722 NumUserInputs =
Record[1];
3724 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3733llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3734 unsigned ClientLoadCapabilities) {
3735 BitstreamCursor &Stream = F.
Stream;
3737 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3744 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3746 return MaybeEntry.takeError();
3747 llvm::BitstreamEntry Entry = MaybeEntry.get();
3749 switch (Entry.Kind) {
3750 case llvm::BitstreamEntry::Error:
3751 return llvm::createStringError(
3752 std::errc::illegal_byte_sequence,
3753 "error at end of module block in AST file");
3754 case llvm::BitstreamEntry::EndBlock:
3760 if (ASTContext *Ctx = ContextObj) {
3761 DeclContext *DC = Ctx->getTranslationUnitDecl();
3766 return llvm::Error::success();
3767 case llvm::BitstreamEntry::SubBlock:
3775 if (llvm::Error Err = Stream.SkipBlock())
3777 if (llvm::Error Err = ReadBlockAbbrevs(
3784 if (!PP.getExternalSource())
3785 PP.setExternalSource(
this);
3787 if (llvm::Error Err = Stream.SkipBlock())
3789 if (llvm::Error Err =
3798 if (llvm::Error Err = Stream.SkipBlock()) {
3807 if (!PP.getPreprocessingRecord())
3808 PP.createPreprocessingRecord();
3809 if (!PP.getPreprocessingRecord()->getExternalSource())
3810 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3814 if (llvm::Error Err = ReadSourceManagerBlock(F))
3820 if (llvm::Error Err = Stream.SkipBlock())
3822 if (llvm::Error Err =
3829 BitstreamCursor
C = Stream;
3831 if (llvm::Error Err = Stream.SkipBlock())
3835 CommentsCursors.push_back(std::make_pair(
C, &F));
3840 if (llvm::Error Err = Stream.SkipBlock())
3846 case llvm::BitstreamEntry::Record:
3854 Expected<unsigned> MaybeRecordType =
3855 Stream.readRecord(Entry.ID,
Record, &Blob);
3856 if (!MaybeRecordType)
3857 return MaybeRecordType.takeError();
3862 switch (RecordType) {
3884 switch (RecordType) {
3894 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3898 GlobalSubmoduleMap.insert(
3899 std::make_pair(getTotalNumSubmodules() + 1, &F));
3910 auto ReadSubmodule = [&](
unsigned LocalID) ->
Module * {
3911 return getSubmodule(getGlobalSubmoduleID(F, LocalID));
3914 if (PP.getHeaderSearchInfo().getModuleMap().findModule(F.
ModuleName)) {
3920 ReadSubmodule(LocalID);
3934 return llvm::createStringError(
3935 std::errc::illegal_byte_sequence,
3936 "duplicate TYPE_OFFSET record in AST file");
3949 return llvm::createStringError(
3950 std::errc::illegal_byte_sequence,
3951 "duplicate DECL_OFFSET record in AST file");
3963 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3964 LexicalContents Contents(
3966 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3967 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3974 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3975 auto *
Data = (
const unsigned char*)Blob.data();
3976 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3979 if (Decl *D = GetExistingDecl(ID))
3980 PendingUpdateRecords.push_back(
3981 PendingUpdateRecord(ID, D,
false));
3987 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3988 auto *
Data = (
const unsigned char *)Blob.data();
3989 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3992 if (Decl *D = GetExistingDecl(ID))
3993 PendingUpdateRecords.push_back(
3994 PendingUpdateRecord(ID, D,
false));
4002 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
4003 auto *
Data = (
const unsigned char *)Blob.data();
4004 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
4007 if (Decl *D = GetExistingDecl(ID))
4008 PendingUpdateRecords.push_back(
4009 PendingUpdateRecord(ID, D,
false));
4015 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
4016 auto *
Data = (
const unsigned char *)Blob.data();
4017 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
4020 if (Decl *D = GetExistingDecl(ID))
4021 PendingUpdateRecords.push_back(
4022 PendingUpdateRecord(ID, D,
false));
4028 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
4029 auto *
Data = (
const unsigned char *)Blob.data();
4030 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
4033 if (Decl *D = GetExistingDecl(ID))
4034 PendingUpdateRecords.push_back(
4035 PendingUpdateRecord(ID, D,
false));
4041 reinterpret_cast<const unsigned char *
>(Blob.data());
4047 ASTIdentifierLookupTrait(*
this, F));
4049 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
4055 return llvm::createStringError(
4056 std::errc::illegal_byte_sequence,
4057 "duplicate IDENTIFIER_OFFSET record in AST file");
4063 IdentifiersLoaded.resize(IdentifiersLoaded.size()
4075 for (
unsigned I = 0, N =
Record.size(); I != N; )
4076 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
4083 getContext().getLangOpts().BuildingPCHWithObjectFile)
4084 for (
unsigned I = 0, N =
Record.size(); I != N; )
4085 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
4089 if (SpecialTypes.empty()) {
4090 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
4091 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
4098 if (SpecialTypes.size() !=
Record.size())
4099 return llvm::createStringError(std::errc::illegal_byte_sequence,
4100 "invalid special-types record");
4102 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4104 if (!SpecialTypes[I])
4105 SpecialTypes[I] =
ID;
4112 TotalNumStatements +=
Record[0];
4113 TotalNumMacros +=
Record[1];
4114 TotalLexicalDeclContexts +=
Record[2];
4115 TotalVisibleDeclContexts +=
Record[3];
4116 TotalModuleLocalVisibleDeclContexts +=
Record[4];
4117 TotalTULocalVisibleDeclContexts +=
Record[5];
4121 for (
unsigned I = 0, N =
Record.size(); I != N; )
4122 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
4126 for (
unsigned I = 0, N =
Record.size(); I != N; )
4127 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
4131 if (
Record.size() % 3 != 0)
4132 return llvm::createStringError(std::errc::illegal_byte_sequence,
4133 "invalid weak identifiers record");
4137 WeakUndeclaredIdentifiers.clear();
4140 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4141 WeakUndeclaredIdentifiers.push_back(
4142 getGlobalIdentifierID(F,
Record[I++]));
4143 WeakUndeclaredIdentifiers.push_back(
4144 getGlobalIdentifierID(F,
Record[I++]));
4145 WeakUndeclaredIdentifiers.push_back(
4146 ReadSourceLocation(F,
Record, I).getRawEncoding());
4151 if (
Record.size() % 3 != 0)
4152 return llvm::createStringError(std::errc::illegal_byte_sequence,
4153 "invalid extname identifiers record");
4157 ExtnameUndeclaredIdentifiers.clear();
4161 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4162 ExtnameUndeclaredIdentifiers.push_back(
4163 getGlobalIdentifierID(F,
Record[I++]));
4164 ExtnameUndeclaredIdentifiers.push_back(
4165 getGlobalIdentifierID(F,
Record[I++]));
4166 ExtnameUndeclaredIdentifiers.push_back(
4167 ReadSourceLocation(F,
Record, I).getRawEncoding());
4174 unsigned LocalBaseSelectorID =
Record[1];
4180 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4185 std::make_pair(LocalBaseSelectorID,
4197 = ASTSelectorLookupTable::Create(
4200 ASTSelectorLookupTrait(*
this, F));
4201 TotalNumMethodPoolEntries +=
Record[1];
4206 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
4207 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4209 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
4218 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4219 ReadSourceLocation(F,
Record, Idx));
4225 SmallVector<SourceLocation, 64> SrcLocs;
4227 while (Idx <
Record.size())
4228 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
4229 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4236 unsigned Idx = 0, End =
Record.size() - 1;
4237 bool ReachedEOFWhileSkipping =
Record[Idx++];
4238 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4239 if (ReachedEOFWhileSkipping) {
4240 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4241 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4242 bool FoundNonSkipPortion =
Record[Idx++];
4243 bool FoundElse =
Record[Idx++];
4244 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4245 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4246 FoundElse, ElseLoc);
4248 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4250 auto Loc = ReadSourceLocation(F,
Record, Idx);
4251 bool WasSkipping =
Record[Idx++];
4252 bool FoundNonSkip =
Record[Idx++];
4253 bool FoundElse =
Record[Idx++];
4254 ConditionalStack.push_back(
4255 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4257 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4262 if (!
Record.empty() && Listener)
4280 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4281 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4282 return llvm::createStringError(std::errc::invalid_argument,
4283 "ran out of source locations");
4288 unsigned RangeStart =
4290 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4295 GlobalSLocOffsetMap.insert(
4297 - SLocSpaceSize,&F));
4308 ParseLineTable(F,
Record);
4312 for (
unsigned I = 0, N =
Record.size(); I != N; )
4313 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4317 if (
Record.size() % 3 != 0)
4318 return llvm::createStringError(std::errc::illegal_byte_sequence,
4319 "Invalid VTABLE_USES record");
4326 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4327 VTableUses.push_back(
4328 {ReadDeclID(F,
Record, Idx),
4329 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4336 if (
Record.size() % 2 != 0)
4337 return llvm::createStringError(
4338 std::errc::illegal_byte_sequence,
4339 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4344 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4345 PendingInstantiations.push_back(
4346 {ReadDeclID(F,
Record, I),
4347 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4354 return llvm::createStringError(std::errc::illegal_byte_sequence,
4355 "Invalid SEMA_DECL_REFS block");
4356 for (
unsigned I = 0, N =
Record.size(); I != N; )
4357 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4365 unsigned StartingID;
4366 if (!PP.getPreprocessingRecord())
4367 PP.createPreprocessingRecord();
4368 if (!PP.getPreprocessingRecord()->getExternalSource())
4369 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4371 = PP.getPreprocessingRecord()
4378 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4389 if (!PP.getPreprocessingRecord())
4390 PP.createPreprocessingRecord();
4391 if (!PP.getPreprocessingRecord()->getExternalSource())
4392 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4397 GlobalSkippedRangeMap.insert(
4403 if (
Record.size() % 2 != 0)
4404 return llvm::createStringError(
4405 std::errc::illegal_byte_sequence,
4406 "invalid DECL_UPDATE_OFFSETS block in AST file");
4407 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4408 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4409 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4413 if (Decl *D = GetExistingDecl(ID))
4414 PendingUpdateRecords.push_back(
4415 PendingUpdateRecord(ID, D,
false));
4420 if (
Record.size() % 5 != 0)
4421 return llvm::createStringError(
4422 std::errc::illegal_byte_sequence,
4423 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4425 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4426 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4429 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4432 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4435 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4438 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4441 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4443 DelayedNamespaceOffsetMap[
ID] = {
4444 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4446 assert(!GetExistingDecl(ID) &&
4447 "We shouldn't load the namespace in the front of delayed "
4448 "namespace lexical and visible block");
4454 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4455 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4456 auto &RelatedDecls = RelatedDeclsMap[
ID];
4457 unsigned NN =
Record[I++];
4458 RelatedDecls.reserve(NN);
4459 for (
unsigned II = 0; II < NN; II++)
4460 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4466 return llvm::createStringError(
4467 std::errc::illegal_byte_sequence,
4468 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4481 CUDASpecialDeclRefs.clear();
4482 for (
unsigned I = 0, N =
Record.size(); I != N; )
4483 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4493 HeaderFileInfoTrait(*
this, F));
4495 PP.getHeaderSearchInfo().SetExternalSource(
this);
4496 if (!PP.getHeaderSearchInfo().getExternalLookup())
4497 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4503 FPPragmaOptions.swap(
Record);
4507 for (
unsigned I = 0, N =
Record.size(); I != N; )
4508 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4512 for (
unsigned I = 0, N =
Record.size(); I != N; )
4513 OpenMPRequiresDecls.push_back(ReadDeclID(F,
Record, I));
4517 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4518 auto Name = ReadString(
Record, I);
4519 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4520 OptInfo.Supported =
Record[I++] != 0;
4521 OptInfo.Enabled =
Record[I++] != 0;
4522 OptInfo.WithPragma =
Record[I++] != 0;
4523 OptInfo.Avail =
Record[I++];
4524 OptInfo.Core =
Record[I++];
4525 OptInfo.Opt =
Record[I++];
4530 for (
unsigned I = 0, N =
Record.size(); I != N; )
4531 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4535 for (
unsigned I = 0, N =
Record.size(); I != N; )
4536 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4540 if (
Record.size() % 2 != 0)
4541 return llvm::createStringError(std::errc::illegal_byte_sequence,
4542 "invalid undefined-but-used record");
4543 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4544 UndefinedButUsed.push_back(
4545 {ReadDeclID(F,
Record, I),
4546 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4551 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4552 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4554 DelayedDeleteExprs.push_back(Count);
4555 for (uint64_t
C = 0;
C < Count; ++
C) {
4556 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4557 bool IsArrayForm =
Record[I++] == 1;
4558 DelayedDeleteExprs.push_back(IsArrayForm);
4565 getContext().getLangOpts().BuildingPCHWithObjectFile)
4566 for (
unsigned I = 0, N =
Record.size(); I != N;)
4567 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4575 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4576 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4577 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4579 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4580 if (DeserializationListener)
4581 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4589 return llvm::createStringError(
4590 std::errc::illegal_byte_sequence,
4591 "duplicate MACRO_OFFSET record in AST file");
4603 LateParsedTemplates.emplace_back(
4604 std::piecewise_construct, std::forward_as_tuple(&F),
4610 return llvm::createStringError(std::errc::illegal_byte_sequence,
4611 "invalid pragma optimize record");
4612 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4617 return llvm::createStringError(std::errc::illegal_byte_sequence,
4618 "invalid pragma ms_struct record");
4619 PragmaMSStructState =
Record[0];
4624 return llvm::createStringError(
4625 std::errc::illegal_byte_sequence,
4626 "invalid pragma pointers to members record");
4627 PragmaMSPointersToMembersState =
Record[0];
4628 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4632 for (
unsigned I = 0, N =
Record.size(); I != N; )
4633 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4638 return llvm::createStringError(std::errc::illegal_byte_sequence,
4639 "invalid cuda pragma options record");
4640 ForceHostDeviceDepth =
Record[0];
4645 return llvm::createStringError(std::errc::illegal_byte_sequence,
4646 "invalid pragma pack record");
4647 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4648 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4649 unsigned NumStackEntries =
Record[2];
4652 PragmaAlignPackStack.clear();
4653 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4654 PragmaAlignPackStackEntry Entry;
4655 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4656 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4657 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4658 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4659 Entry.SlotLabel = PragmaAlignPackStrings.back();
4660 PragmaAlignPackStack.push_back(Entry);
4667 return llvm::createStringError(std::errc::illegal_byte_sequence,
4668 "invalid pragma float control record");
4670 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4671 unsigned NumStackEntries =
Record[2];
4674 FpPragmaStack.clear();
4675 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4676 FpPragmaStackEntry Entry;
4678 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4679 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4680 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4681 Entry.SlotLabel = FpPragmaStrings.back();
4682 FpPragmaStack.push_back(Entry);
4688 for (
unsigned I = 0, N =
Record.size(); I != N; )
4689 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4693 unsigned NumRecords =
Record.front();
4695 if (
Record.size() - 1 != NumRecords)
4696 return llvm::createStringError(std::errc::illegal_byte_sequence,
4697 "invalid rvv intrinsic pragma record");
4699 if (RISCVVecIntrinsicPragma.empty())
4700 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4703 for (
unsigned i = 0; i < NumRecords; ++i)
4704 RISCVVecIntrinsicPragma[i] |=
Record[i + 1];
4711void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4724 assert(ImportedModuleVector.empty());
4726 while (
Data < DataEnd) {
4730 using namespace llvm::support;
4732 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4733 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4734 StringRef Name = StringRef((
const char*)
Data, Len);
4739 ? ModuleMgr.lookupByModuleName(Name)
4744 std::string Msg =
"refers to unknown module, cannot find ";
4745 Msg.append(std::string(Name));
4750 ImportedModuleVector.push_back(OM);
4753 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4755 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4758 RemapBuilder &Remap) {
4759 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4761 Remap.insert(std::make_pair(Offset,
4762 static_cast<int>(BaseOffset - Offset)));
4773 unsigned ClientLoadCapabilities) {
4782 "MODULE_NAME should come before MODULE_MAP_FILE");
4783 auto [MaybeM, IgnoreError] =
4784 getModuleForRelocationChecks(F,
false);
4785 if (MaybeM.has_value()) {
4788 Module *M = MaybeM.value();
4789 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4791 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4792 if (!IgnoreError && !ModMap) {
4794 Diag(diag::remark_module_relocated)
4797 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4800 Diag(diag::err_module_file_conflict)
4805 Diag(diag::err_imported_module_not_found)
4812 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4813 Diag(diag::note_imported_by_pch_module_not_found)
4820 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4824 if (!StoredModMap || *StoredModMap != ModMap) {
4825 assert(ModMap &&
"found module is missing module map file");
4827 "top-level import should be verified");
4829 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4830 Diag(diag::err_imported_module_modmap_changed)
4837 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4839 std::string Filename = ReadPath(F,
Record, Idx);
4842 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4843 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4846 AdditionalStoredMaps.insert(*SF);
4851 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4852 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4855 if (!AdditionalStoredMaps.erase(ModMap)) {
4856 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4857 Diag(diag::err_module_different_modmap)
4866 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4867 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4868 Diag(diag::err_module_different_modmap)
4879void ASTReader::ReadDirectoryDependencies(
const RecordData &
Record,
4882 unsigned N =
Record[Idx++];
4884 for (
unsigned I = 0; I != N; ++I)
4888bool ASTReader::isDirectoryDependencyOutOfDate(
ModuleFile &F,
bool Complain) {
4889 llvm::vfs::FileSystem &FS = PP.getFileManager().getVirtualFileSystem();
4894 auto IsNewer = [&](StringRef Dir) {
4895 llvm::ErrorOr<llvm::vfs::Status> Status = FS.status(Dir);
4896 return Status && Status->isDirectory() &&
4897 llvm::sys::toTimeT(Status->getLastModificationTime()) > F.
ModTime;
4900 ModuleCache &ModCache = getModuleManager().getModuleCache();
4901 const HeaderSearchOptions &HSOpts =
4902 PP.getHeaderSearchInfo().getHeaderSearchOpts();
4904 if (std::optional<bool> Invalidated =
4908 if (!*Invalidated ||
4911 Diag(diag::remark_module_path_invalidated) << F.
ModuleName << Dir;
4917 std::optional<std::string>
Changed;
4922 for (llvm::vfs::recursive_directory_iterator I(FS, Dir, EC), E;
4923 I != E && !EC; I.increment(EC)) {
4924 if (I->type() == llvm::sys::fs::file_type::directory_file &&
4925 IsNewer(I->path())) {
4944 SemaObjC::GlobalMethodPool::iterator Known =
4950 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4951 : Known->second.second;
4955 if (List->getMethod() == Method) {
4963 if (List->getNext())
4964 List->setMethod(List->getNext()->getMethod());
4966 List->setMethod(Method);
4972 for (
Decl *D : Names) {
4976 if (wasHidden && SemaObj) {
4989 Stack.push_back(Mod);
4990 while (!Stack.empty()) {
4991 Mod = Stack.pop_back_val();
4993 if (NameVisibility <= Mod->NameVisibility) {
5009 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
5010 if (Hidden != HiddenNamesMap.end()) {
5011 auto HiddenNames = std::move(*Hidden);
5012 HiddenNamesMap.erase(Hidden);
5014 assert(!HiddenNamesMap.contains(Mod) &&
5015 "making names visible added hidden names");
5022 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
5024 if (Visited.insert(Exported).second)
5025 Stack.push_back(Exported);
5043 PendingMergedDefinitionsToDeduplicate.insert(Def);
5052 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
5053 !PP.getLangOpts().Modules)
5057 TriedLoadingGlobalIndex =
true;
5058 StringRef SpecificModuleCachePath =
5060 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
5062 if (llvm::Error Err = std::move(
Result.second)) {
5064 consumeError(std::move(Err));
5068 GlobalIndex.reset(
Result.first);
5069 ModuleMgr.setGlobalIndex(GlobalIndex.get());
5074 return PP.getLangOpts().Modules && UseGlobalIndex &&
5086 consumeError(MaybeEntry.takeError());
5089 llvm::BitstreamEntry Entry = MaybeEntry.get();
5091 switch (Entry.Kind) {
5092 case llvm::BitstreamEntry::Error:
5093 case llvm::BitstreamEntry::EndBlock:
5096 case llvm::BitstreamEntry::Record:
5102 consumeError(Skipped.takeError());
5106 case llvm::BitstreamEntry::SubBlock:
5107 if (Entry.ID == BlockID) {
5108 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
5110 consumeError(std::move(Err));
5117 if (llvm::Error Err = Cursor.SkipBlock()) {
5119 consumeError(std::move(Err));
5129 unsigned ClientLoadCapabilities,
5131 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
5135 CurrentDeserializingModuleKind,
Type);
5141 unsigned PreviousGeneration = 0;
5145 unsigned NumModules = ModuleMgr.size();
5150 ClientLoadCapabilities)) {
5151 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
5155 GlobalIndex.reset();
5156 ModuleMgr.setGlobalIndex(
nullptr);
5160 if (NewLoadedModuleFile && !Loaded.empty())
5161 *NewLoadedModuleFile = Loaded.back().Mod;
5174 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
5177 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
5178 Error(std::move(Err));
5184 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
5190 if (llvm::Error Err = ReadExtensionBlock(F)) {
5191 Error(std::move(Err));
5220 if (!PP.getLangOpts().CPlusPlus) {
5227 auto It = PP.getIdentifierTable().find(Key);
5228 if (It == PP.getIdentifierTable().end())
5237 II = &PP.getIdentifierTable().getOwn(Key);
5255 for (
auto &Id : PP.getIdentifierTable())
5256 Id.second->setOutOfDate(
true);
5259 for (
const auto &Sel : SelectorGeneration)
5260 SelectorOutOfDate[Sel.first] =
true;
5267 ModuleMgr.moduleFileAccepted(&F);
5289 if (DeserializationListener)
5290 DeserializationListener->ReaderInitialized(
this);
5292 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5307 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5308 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5309 ObjCClassesLoaded[I], PreviousGeneration);
5314 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5319 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5338 if (!Stream.canSkipToPos(4))
5339 return llvm::createStringError(
5340 std::errc::illegal_byte_sequence,
5341 "file too small to contain precompiled file magic");
5342 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5345 return llvm::createStringError(
5346 std::errc::illegal_byte_sequence,
5347 "file doesn't start with precompiled file magic");
5349 return Res.takeError();
5350 return llvm::Error::success();
5365 llvm_unreachable(
"unknown module kind");
5371 off_t ExpectedSize, time_t ExpectedModTime,
5373 auto Result = ModuleMgr.addModule(
5378 switch (
Result.getKind()) {
5380 Diag(diag::remark_module_import)
5382 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5397 Diag(diag::err_ast_file_not_found)
5399 if (!
Result.getBufferError().empty())
5400 Diag(diag::note_ast_file_buffer_failed) <<
Result.getBufferError();
5410 Diag(diag::err_ast_file_out_of_date)
5412 for (
const auto &
C :
Result.getChanges()) {
5413 Diag(diag::note_fe_ast_file_modified)
5414 <<
C.Kind << (
C.Old &&
C.New) << llvm::itostr(
C.Old.value_or(0))
5415 << llvm::itostr(
C.New.value_or(0));
5417 Diag(diag::note_ast_file_input_files_validation_status)
5418 <<
Result.getValidationStatus();
5419 if (!
Result.getSignatureError().empty())
5420 Diag(diag::note_ast_file_signature_failed) <<
Result.getSignatureError();
5424 llvm_unreachable(
"Unexpected value from adding module.");
5427 assert(M &&
"Missing module file");
5429 bool ShouldFinalizePCM =
false;
5430 llvm::scope_exit FinalizeOrDropPCM([&]() {
5432 if (ShouldFinalizePCM)
5438 BitstreamCursor &Stream = F.
Stream;
5439 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5440 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5444 Diag(diag::err_ast_file_invalid)
5450 bool HaveReadControlBlock =
false;
5454 Error(MaybeEntry.takeError());
5457 llvm::BitstreamEntry Entry = MaybeEntry.get();
5459 switch (Entry.Kind) {
5460 case llvm::BitstreamEntry::Error:
5461 case llvm::BitstreamEntry::Record:
5462 case llvm::BitstreamEntry::EndBlock:
5463 Error(
"invalid record at top-level of AST file");
5466 case llvm::BitstreamEntry::SubBlock:
5472 HaveReadControlBlock =
true;
5473 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5481 F.ModuleName.empty()) {
5500 if (!HaveReadControlBlock) {
5502 Diag(diag::err_ast_file_version_too_old)
5509 ShouldFinalizePCM =
true;
5513 if (llvm::Error Err = Stream.SkipBlock()) {
5514 Error(std::move(Err));
5521 llvm_unreachable(
"unexpected break; expected return");
5525ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5526 unsigned ClientLoadCapabilities) {
5528 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5529 bool AllowCompatibleConfigurationMismatch =
5531 bool DisableValidation = shouldDisableValidationForFile(F);
5533 ASTReadResult
Result = readUnhashedControlBlockImpl(
5535 AllowCompatibleConfigurationMismatch, Listener.get(),
5540 if (DisableValidation || WasImportedBy ||
5541 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5545 Error(
"malformed block record in AST file");
5568 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5570 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5579 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5580 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5581 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5583 BitstreamCursor Stream(StreamData);
5588 consumeError(std::move(Err));
5600 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5603 consumeError(MaybeEntry.takeError());
5606 llvm::BitstreamEntry Entry = MaybeEntry.get();
5608 switch (Entry.Kind) {
5609 case llvm::BitstreamEntry::Error:
5610 case llvm::BitstreamEntry::SubBlock:
5613 case llvm::BitstreamEntry::EndBlock:
5616 case llvm::BitstreamEntry::Record:
5624 Expected<unsigned> MaybeRecordType =
5625 Stream.readRecord(Entry.ID,
Record, &Blob);
5626 if (!MaybeRecordType) {
5635 "Dummy AST file signature not backpatched in ASTWriter.");
5642 "Dummy AST block hash not backpatched in ASTWriter.");
5646 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5647 if (Listener && ValidateDiagnosticOptions &&
5648 !AllowCompatibleConfigurationMismatch &&
5649 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5654 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5655 if (Listener && !AllowCompatibleConfigurationMismatch &&
5656 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5657 Result = ConfigurationMismatch;
5686 if (
Record.size() < 4)
return true;
5691 unsigned BlockNameLen =
Record[2];
5692 unsigned UserInfoLen =
Record[3];
5694 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5696 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5697 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5698 Blob.data() + BlockNameLen + UserInfoLen);
5702llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5703 BitstreamCursor &Stream = F.
Stream;
5707 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5709 return MaybeEntry.takeError();
5710 llvm::BitstreamEntry Entry = MaybeEntry.get();
5712 switch (Entry.Kind) {
5713 case llvm::BitstreamEntry::SubBlock:
5714 if (llvm::Error Err = Stream.SkipBlock())
5717 case llvm::BitstreamEntry::EndBlock:
5718 return llvm::Error::success();
5719 case llvm::BitstreamEntry::Error:
5720 return llvm::createStringError(std::errc::illegal_byte_sequence,
5721 "malformed block record in AST file");
5722 case llvm::BitstreamEntry::Record:
5728 Expected<unsigned> MaybeRecCode =
5729 Stream.readRecord(Entry.ID,
Record, &Blob);
5731 return MaybeRecCode.takeError();
5732 switch (MaybeRecCode.get()) {
5734 ModuleFileExtensionMetadata Metadata;
5736 return llvm::createStringError(
5737 std::errc::illegal_byte_sequence,
5738 "malformed EXTENSION_METADATA in AST file");
5741 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5742 if (Known == ModuleFileExtensions.end())
break;
5745 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5755 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5759 assert(ContextObj &&
"no context to initialize");
5763 if (DeserializationListener)
5764 DeserializationListener->DeclRead(
5766 Context.getTranslationUnitDecl());
5774 if (!Context.CFConstantStringTypeDecl)
5775 Context.setCFConstantStringType(
GetType(String));
5780 if (FileType.isNull()) {
5781 Error(
"FILE type is NULL");
5785 if (!Context.FILEDecl) {
5787 Context.setFILEDecl(
Typedef->getDecl());
5789 const TagType *Tag = FileType->getAs<TagType>();
5791 Error(
"Invalid FILE type in AST file");
5794 Context.setFILEDecl(Tag->getDecl());
5801 if (Jmp_bufType.
isNull()) {
5802 Error(
"jmp_buf type is NULL");
5806 if (!Context.jmp_bufDecl) {
5808 Context.setjmp_bufDecl(
Typedef->getDecl());
5810 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5812 Error(
"Invalid jmp_buf type in AST file");
5815 Context.setjmp_bufDecl(Tag->getDecl());
5822 if (Sigjmp_bufType.
isNull()) {
5823 Error(
"sigjmp_buf type is NULL");
5827 if (!Context.sigjmp_bufDecl) {
5829 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5831 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5832 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5833 Context.setsigjmp_bufDecl(Tag->getDecl());
5839 if (Context.ObjCIdRedefinitionType.isNull())
5840 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5843 if (
TypeID ObjCClassRedef =
5845 if (Context.ObjCClassRedefinitionType.isNull())
5846 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5849 if (
TypeID ObjCSelRedef =
5851 if (Context.ObjCSelRedefinitionType.isNull())
5852 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5857 if (Ucontext_tType.
isNull()) {
5858 Error(
"ucontext_t type is NULL");
5862 if (!Context.ucontext_tDecl) {
5864 Context.setucontext_tDecl(
Typedef->getDecl());
5866 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5867 assert(Tag &&
"Invalid ucontext_t type in AST file");
5868 Context.setucontext_tDecl(Tag->getDecl());
5877 if (!CUDASpecialDeclRefs.empty()) {
5878 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5879 Context.setcudaConfigureCallDecl(
5880 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5881 Context.setcudaGetParameterBufferDecl(
5882 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5883 Context.setcudaLaunchDeviceDecl(
5884 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5889 for (
auto &Import : PendingImportedModules) {
5893 if (Import.ImportLoc.isValid())
5894 PP.makeModuleVisible(Imported, Import.ImportLoc);
5901 PendingImportedModulesSema.append(PendingImportedModules);
5902 PendingImportedModules.clear();
5912 BitstreamCursor Stream(
PCH);
5915 consumeError(std::move(Err));
5927 Stream.advanceSkippingSubblocks();
5930 consumeError(MaybeEntry.takeError());
5933 llvm::BitstreamEntry Entry = MaybeEntry.get();
5935 if (Entry.Kind != llvm::BitstreamEntry::Record)
5943 consumeError(MaybeRecord.takeError());
5949 "Dummy AST file signature not backpatched in ASTWriter.");
5959 const std::string &ASTFileName,
FileManager &FileMgr,
5962 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5967 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5968 << ASTFileName << Buffer.getError().message();
5969 return std::string();
5973 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5977 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5978 return std::string();
5983 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5984 return std::string();
5991 Stream.advanceSkippingSubblocks();
5994 consumeError(MaybeEntry.takeError());
5995 return std::string();
5997 llvm::BitstreamEntry Entry = MaybeEntry.get();
5999 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
6000 return std::string();
6002 if (Entry.Kind != llvm::BitstreamEntry::Record) {
6003 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
6004 return std::string();
6012 consumeError(MaybeRecord.takeError());
6013 return std::string();
6028 std::string ExistingSpecificModuleCachePath;
6030 bool StrictOptionMatches;
6033 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
6038 StringRef ExistingSpecificModuleCachePath,
6040 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
6041 ExistingTargetOpts(ExistingTargetOpts),
6042 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
6043 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
6046 bool ReadLanguageOptions(
const LangOptions &LangOpts,
6047 StringRef ModuleFilename,
bool Complain,
6048 bool AllowCompatibleDifferences)
override {
6050 nullptr, AllowCompatibleDifferences);
6053 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
6054 StringRef ModuleFilename,
bool Complain,
6055 bool AllowCompatibleDifferences)
override {
6057 nullptr, AllowCompatibleDifferences);
6060 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
6061 StringRef ModuleFilename,
bool Complain,
6062 bool AllowCompatibleDifferences)
override {
6064 nullptr, AllowCompatibleDifferences);
6067 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
6068 StringRef ASTFilename, StringRef ContextHash,
6069 bool Complain)
override {
6071 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
6072 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
6075 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
6076 StringRef ModuleFilename,
bool ReadMacros,
6078 std::string &SuggestedPredefines)
override {
6080 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
6081 FileMgr, SuggestedPredefines, ExistingLangOpts,
6093 unsigned ClientLoadCapabilities) {
6097 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
6098 llvm::MemoryBuffer *Buffer =
6107 auto Entry = Filename ==
"-" ? FileMgr.getSTDIN()
6108 : FileMgr.getFileRef(Filename,
6113 llvm::consumeError(Entry.takeError());
6117 FileMgr.getBufferForFile(*Entry,
6124 OwnedBuffer = std::move(*BufferOrErr);
6125 Buffer = OwnedBuffer.get();
6129 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
6130 BitstreamCursor Stream(Bytes);
6134 consumeError(std::move(Err));
6142 bool NeedsInputFiles = Listener.needsInputFileVisitation();
6143 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
6144 bool NeedsImports = Listener.needsImportVisitation();
6145 BitstreamCursor InputFilesCursor;
6146 uint64_t InputFilesOffsetBase = 0;
6149 std::string ModuleDir;
6150 bool DoneWithControlBlock =
false;
6152 PathBuf.reserve(256);
6157 AdditionalPathBuf.reserve(256);
6158 while (!DoneWithControlBlock) {
6162 consumeError(MaybeEntry.takeError());
6165 llvm::BitstreamEntry Entry = MaybeEntry.get();
6167 switch (Entry.Kind) {
6168 case llvm::BitstreamEntry::SubBlock: {
6171 std::string IgnoredSuggestedPredefines;
6172 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6174 Listener, IgnoredSuggestedPredefines) !=
Success)
6180 InputFilesCursor = Stream;
6181 if (llvm::Error Err = Stream.SkipBlock()) {
6183 consumeError(std::move(Err));
6186 if (NeedsInputFiles &&
6189 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6193 if (llvm::Error Err = Stream.SkipBlock()) {
6195 consumeError(std::move(Err));
6204 case llvm::BitstreamEntry::EndBlock:
6205 DoneWithControlBlock =
true;
6208 case llvm::BitstreamEntry::Error:
6211 case llvm::BitstreamEntry::Record:
6215 if (DoneWithControlBlock)
break;
6220 Stream.readRecord(Entry.ID,
Record, &Blob);
6221 if (!MaybeRecCode) {
6229 if (Listener.ReadFullVersionInformation(Blob))
6233 Listener.ReadModuleName(Blob);
6236 ModuleDir = std::string(Blob);
6242 Listener.ReadModuleMapFile(*Path);
6246 if (!NeedsInputFiles)
6249 unsigned NumInputFiles =
Record[0];
6250 unsigned NumUserFiles =
Record[1];
6251 const llvm::support::unaligned_uint64_t *InputFileOffs =
6252 (
const llvm::support::unaligned_uint64_t *)Blob.data();
6253 for (
unsigned I = 0; I != NumInputFiles; ++I) {
6255 bool isSystemFile = I >= NumUserFiles;
6257 if (isSystemFile && !NeedsSystemInputFiles)
6260 BitstreamCursor &Cursor = InputFilesCursor;
6262 if (llvm::Error Err =
6263 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6265 consumeError(std::move(Err));
6271 consumeError(MaybeCode.takeError());
6273 unsigned Code = MaybeCode.get();
6277 bool shouldContinue =
false;
6279 Cursor.readRecord(Code,
Record, &Blob);
6280 if (!MaybeRecordType) {
6282 consumeError(MaybeRecordType.takeError());
6288 time_t StoredTime =
static_cast<time_t
>(
Record[2]);
6289 bool Overridden =
static_cast<bool>(
Record[3]);
6290 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6293 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6295 if (UnresolvedFilename.empty())
6296 Filename = *FilenameAsRequestedBuf;
6299 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6300 Filename = *FilenameBuf;
6302 shouldContinue = Listener.visitInputFileAsRequested(
6303 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6307 if (!shouldContinue)
6328 bool IsStandardCXXModule =
Record[Idx++];
6332 if (IsStandardCXXModule) {
6333 Listener.visitImport(ModuleName,
"");
6344 Listener.visitImport(ModuleName, *Filename);
6355 if (FindModuleFileExtensions) {
6356 BitstreamCursor SavedStream = Stream;
6358 bool DoneWithExtensionBlock =
false;
6359 while (!DoneWithExtensionBlock) {
6365 llvm::BitstreamEntry Entry = MaybeEntry.get();
6367 switch (Entry.Kind) {
6368 case llvm::BitstreamEntry::SubBlock:
6369 if (llvm::Error Err = Stream.SkipBlock()) {
6371 consumeError(std::move(Err));
6376 case llvm::BitstreamEntry::EndBlock:
6377 DoneWithExtensionBlock =
true;
6380 case llvm::BitstreamEntry::Error:
6383 case llvm::BitstreamEntry::Record:
6390 Stream.readRecord(Entry.ID,
Record, &Blob);
6391 if (!MaybeRecCode) {
6395 switch (MaybeRecCode.get()) {
6401 Listener.readModuleFileExtension(Metadata);
6407 Stream = std::move(SavedStream);
6411 if (readUnhashedControlBlockImpl(
6412 nullptr, Bytes, Filename, ClientLoadCapabilities,
6414 ValidateDiagnosticOptions) !=
Success)
6425 StringRef SpecificModuleCachePath,
bool RequireStrictOptionMatches) {
6426 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6427 SpecificModuleCachePath, FileMgr,
6428 RequireStrictOptionMatches);
6436 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
6441 if (GlobalIndex >= SubmodulesLoaded.size()) {
6442 Error(
"submodule ID out of range in AST file");
6446 if (SubmodulesLoaded[GlobalIndex])
6447 return SubmodulesLoaded[GlobalIndex];
6450 assert(It != GlobalSubmoduleMap.end());
6453 [[maybe_unused]]
unsigned LocalID =
6460 Error(std::move(Err));
6464 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6469 auto CreateModule = !KnowsTopLevelModule
6473 Module *CurrentModule =
nullptr;
6478 Error(MaybeEntry.takeError());
6481 llvm::BitstreamEntry Entry = MaybeEntry.get();
6483 switch (Entry.Kind) {
6484 case llvm::BitstreamEntry::SubBlock:
6485 case llvm::BitstreamEntry::Error:
6486 case llvm::BitstreamEntry::EndBlock: {
6487 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6488 "malformed block record in AST file"));
6491 case llvm::BitstreamEntry::Record:
6501 Error(MaybeKind.takeError());
6508 if (!CurrentModule) {
6509 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6510 "malformed module definition"));
6513 return CurrentModule;
6516 if (
Record.size() < 13) {
6517 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6518 "malformed module definition"));
6522 StringRef Name = Blob;
6524 [[maybe_unused]]
unsigned ReadLocalID =
Record[Idx++];
6525 assert(LocalID == ReadLocalID);
6531 bool IsFramework =
Record[Idx++];
6532 bool IsExplicit =
Record[Idx++];
6533 bool IsSystem =
Record[Idx++];
6534 bool IsExternC =
Record[Idx++];
6535 bool InferSubmodules =
Record[Idx++];
6536 bool InferExplicitSubmodules =
Record[Idx++];
6537 bool InferExportWildcard =
Record[Idx++];
6538 bool ConfigMacrosExhaustive =
Record[Idx++];
6539 bool ModuleMapIsPrivate =
Record[Idx++];
6540 bool NamedModuleHasInit =
Record[Idx++];
6542 Module *ParentModule =
nullptr;
6549 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6550 IsFramework, IsExplicit);
6552 if (!ParentModule) {
6556 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6558 assert(*CurFileKey != F.
FileKey &&
6559 "ModuleManager did not de-duplicate");
6561 Diag(diag::err_module_file_conflict)
6565 auto CurModMapFile =
6567 auto ModMapFile = FileMgr.getOptionalFileRef(F.
ModuleMapPath);
6568 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6569 Diag(diag::note_module_file_conflict)
6570 << CurModMapFile->getName() << ModMapFile->getName();
6581 CurrentModule->
Kind = Kind;
6591 if (InferredAllowedBy.
isValid())
6603 if (
auto Dir = FileMgr.getOptionalDirectoryRef(F.
BaseDirectory))
6605 }
else if (ParentModule && ParentModule->
Directory) {
6610 if (DeserializationListener)
6611 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6613 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6637 CurrentModule, Blob.str(), RelativePathName)) {
6673 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6683 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6690 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6698 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6700 bool IsWildcard =
Record[Idx + 1];
6703 if (ExportedMod || IsWildcard)
6704 CurrentModule->
Exports.push_back({ExportedMod, IsWildcard});
6714 PP.getTargetInfo());
6731 Conflict.
Message = Blob.str();
6732 CurrentModule->
Conflicts.push_back(Conflict);
6742 for (
unsigned I = 0; I <
Record.size(); )
6744 ContextObj->addLazyModuleInitializers(CurrentModule,
Inits);
6771bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6772 StringRef ModuleFilename,
bool Complain,
6774 bool AllowCompatibleDifferences) {
6778#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6779 LangOpts.Name = Record[Idx++];
6780#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6781 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6782#include "clang/Basic/LangOptions.def"
6783#define SANITIZER(NAME, ID) \
6784 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6785#include "clang/Basic/Sanitizers.def"
6787 for (
unsigned N =
Record[Idx++]; N; --N)
6791 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6797 for (
unsigned N =
Record[Idx++]; N; --N) {
6799 ReadString(
Record, Idx));
6804 for (
unsigned N =
Record[Idx++]; N; --N) {
6811 AllowCompatibleDifferences);
6814bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6815 StringRef ModuleFilename,
bool Complain,
6816 ASTReaderListener &Listener,
6817 bool AllowCompatibleDifferences) {
6819 CodeGenOptions CGOpts;
6821#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6822 if constexpr (CK::Compatibility != CK::Benign) \
6823 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6824#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6825 if constexpr (CK::Compatibility != CK::Benign) \
6826 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6827#define DEBUGOPT(Name, Bits, Default, Compatibility)
6828#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6829#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6830#include "clang/Basic/CodeGenOptions.def"
6833 AllowCompatibleDifferences);
6836bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6837 StringRef ModuleFilename,
bool Complain,
6838 ASTReaderListener &Listener,
6839 bool AllowCompatibleDifferences) {
6841 TargetOptions TargetOpts;
6843 TargetOpts.
CPU = ReadString(
Record, Idx);
6845 TargetOpts.
ABI = ReadString(
Record, Idx);
6846 for (
unsigned N =
Record[Idx++]; N; --N) {
6849 for (
unsigned N =
Record[Idx++]; N; --N) {
6854 AllowCompatibleDifferences);
6857bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6858 StringRef ModuleFilename,
bool Complain,
6859 ASTReaderListener &Listener) {
6860 DiagnosticOptions DiagOpts;
6862#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6863#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6864 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6865#include "clang/Basic/DiagnosticOptions.def"
6867 for (
unsigned N =
Record[Idx++]; N; --N)
6869 for (
unsigned N =
Record[Idx++]; N; --N)
6875bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6876 ASTReaderListener &Listener) {
6877 FileSystemOptions FSOpts;
6883bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6884 StringRef ModuleFilename,
6886 ASTReaderListener &Listener) {
6887 HeaderSearchOptions HSOpts;
6902 std::string ContextHash = ReadString(
Record, Idx);
6908bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6909 ASTReaderListener &Listener) {
6910 HeaderSearchOptions HSOpts;
6914 for (
unsigned N =
Record[Idx++]; N; --N) {
6915 std::string Path = ReadString(
Record, Idx);
6918 bool IsFramework =
Record[Idx++];
6919 bool IgnoreSysRoot =
Record[Idx++];
6920 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6925 for (
unsigned N =
Record[Idx++]; N; --N) {
6926 std::string Prefix = ReadString(
Record, Idx);
6927 bool IsSystemHeader =
Record[Idx++];
6932 for (
unsigned N =
Record[Idx++]; N; --N) {
6933 std::string VFSOverlayFile = ReadString(
Record, Idx);
6940bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6941 StringRef ModuleFilename,
6943 ASTReaderListener &Listener,
6944 std::string &SuggestedPredefines) {
6945 PreprocessorOptions PPOpts;
6949 bool ReadMacros =
Record[Idx++];
6951 for (
unsigned N =
Record[Idx++]; N; --N) {
6953 bool IsUndef =
Record[Idx++];
6954 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6959 for (
unsigned N =
Record[Idx++]; N; --N) {
6964 for (
unsigned N =
Record[Idx++]; N; --N) {
6973 SuggestedPredefines.clear();
6975 Complain, SuggestedPredefines);
6978std::pair<ModuleFile *, unsigned>
6979ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6980 GlobalPreprocessedEntityMapType::iterator
6981 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6982 assert(I != GlobalPreprocessedEntityMap.end() &&
6983 "Corrupted global preprocessed entity map");
6986 return std::make_pair(M, LocalIndex);
6989llvm::iterator_range<PreprocessingRecord::iterator>
6990ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6991 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6995 return llvm::make_range(PreprocessingRecord::iterator(),
6996 PreprocessingRecord::iterator());
6999bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
7000 unsigned int ClientLoadCapabilities) {
7001 return ClientLoadCapabilities & ARR_OutOfDate &&
7004 .getInMemoryModuleCache()
7005 .isPCMFinal(ModuleFileName);
7008llvm::iterator_range<ASTReader::ModuleDeclIterator>
7010 return llvm::make_range(
7017 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
7018 assert(I != GlobalSkippedRangeMap.end() &&
7019 "Corrupted global skipped range map");
7022 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
7026 assert(Range.isValid());
7032 unsigned ModuleFileIndex = ID >> 32;
7033 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
7034 assert(getModuleManager().size() > ModuleFileIndex - 1);
7035 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
7037 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
7042 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7044 unsigned LocalIndex = PPInfo.second;
7049 if (!PP.getPreprocessingRecord()) {
7050 Error(
"no preprocessing record");
7057 Error(std::move(Err));
7064 Error(MaybeEntry.takeError());
7067 llvm::BitstreamEntry Entry = MaybeEntry.get();
7069 if (Entry.Kind != llvm::BitstreamEntry::Record)
7080 if (!MaybeRecType) {
7081 Error(MaybeRecType.takeError());
7086 bool isBuiltin =
Record[0];
7094 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
7114 if (DeserializationListener)
7115 DeserializationListener->MacroDefinitionRead(PPID, MD);
7121 const char *FullFileNameStart = Blob.data() +
Record[0];
7122 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
7124 if (!FullFileName.empty())
7125 File = PP.getFileManager().getOptionalFileRef(FullFileName);
7132 StringRef(Blob.data(),
Record[0]),
7140 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
7149unsigned ASTReader::findNextPreprocessedEntity(
7150 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
7152 for (GlobalSLocOffsetMapType::const_iterator
7153 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7159 return getTotalNumPreprocessedEntities();
7164struct PPEntityComp {
7165 const ASTReader &Reader;
7168 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7170 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
7171 SourceLocation LHS = getLoc(L);
7172 SourceLocation RHS = getLoc(R);
7176 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
7177 SourceLocation LHS = getLoc(L);
7181 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
7182 SourceLocation RHS = getLoc(R);
7186 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
7193unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7194 bool EndsAfter)
const {
7195 if (SourceMgr.isLocalSourceLocation(Loc))
7196 return getTotalNumPreprocessedEntities();
7198 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7199 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7200 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7201 "Corrupted global sloc offset map");
7203 if (SLocMapI->second->NumPreprocessedEntities == 0)
7204 return findNextPreprocessedEntity(SLocMapI);
7215 pp_iterator
First = pp_begin;
7219 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7220 PPEntityComp(*
this, M));
7229 std::advance(PPI,
Half);
7230 if (SourceMgr.isBeforeInTranslationUnit(
7231 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7234 Count = Count -
Half - 1;
7241 return findNextPreprocessedEntity(SLocMapI);
7248std::pair<unsigned, unsigned>
7250 if (Range.isInvalid())
7251 return std::make_pair(0,0);
7252 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7254 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
7255 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
7256 return std::make_pair(BeginID, EndID);
7266 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7268 unsigned LocalIndex = PPInfo.second;
7275 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7284 class HeaderFileInfoVisitor {
7286 std::optional<HeaderFileInfo> HFI;
7289 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7298 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7299 if (Pos == Table->end())
7306 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7312 HeaderFileInfoVisitor Visitor(FE);
7313 ModuleMgr.visit(Visitor);
7314 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7321 using DiagState = DiagnosticsEngine::DiagState;
7332 auto ReadDiagState = [&](
const DiagState &BasedOn,
7333 bool IncludeNonPragmaStates) {
7334 unsigned BackrefID =
Record[Idx++];
7336 return DiagStates[BackrefID - 1];
7339 Diag.DiagStates.push_back(BasedOn);
7340 DiagState *NewState = &
Diag.DiagStates.back();
7341 DiagStates.push_back(NewState);
7342 unsigned Size =
Record[Idx++];
7343 assert(Idx + Size * 2 <=
Record.size() &&
7344 "Invalid data, not enough diag/map pairs");
7346 unsigned DiagID =
Record[Idx++];
7349 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7362 Mapping = NewMapping;
7368 DiagState *FirstState;
7373 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7374 DiagStates.push_back(FirstState);
7378 "Invalid data, unexpected backref in initial state");
7380 assert(Idx <
Record.size() &&
7381 "Invalid data, not enough state change pairs in initial state");
7386 unsigned Flags =
Record[Idx++];
7387 DiagState Initial(*
Diag.getDiagnosticIDs());
7388 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7389 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7390 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7391 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7392 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7394 FirstState = ReadDiagState(Initial,
true);
7402 .StateTransitions.push_back({FirstState, 0});
7407 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7411 unsigned NumLocations =
Record[Idx++];
7412 while (NumLocations--) {
7413 assert(Idx <
Record.size() &&
7414 "Invalid data, missing pragma diagnostic states");
7416 assert(FID.
isValid() &&
"invalid FileID for transition");
7417 unsigned Transitions =
Record[Idx++];
7423 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7424 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7425 for (
unsigned I = 0; I != Transitions; ++I) {
7426 unsigned Offset =
Record[Idx++];
7427 auto *State = ReadDiagState(*FirstState,
false);
7428 F.StateTransitions.push_back({State, Offset});
7433 assert(Idx <
Record.size() &&
7434 "Invalid data, missing final pragma diagnostic state");
7436 auto *CurState = ReadDiagState(*FirstState,
false);
7439 Diag.DiagStatesByLoc.CurDiagState = CurState;
7440 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7445 auto &
T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7447 T.push_back({CurState, 0});
7449 T[0].State = CurState;
7455 assert(Idx <
Record.size() &&
7456 "Invalid data, missing diagnostic push stack");
7457 unsigned NumPushes =
Record[Idx++];
7458 for (
unsigned I = 0; I != NumPushes; ++I) {
7459 auto *State = ReadDiagState(*FirstState,
false);
7461 Diag.DiagStateOnPushStack.push_back(State);
7470ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7471 auto [M, Index] = translateTypeIDToIndex(ID);
7478#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7479 case TYPE_##CODE_ID: return Type::CLASS_ID;
7480#include "clang/Serialization/TypeBitCodes.def"
7482 return std::nullopt;
7492QualType ASTReader::readTypeRecord(
TypeID ID) {
7493 assert(ContextObj &&
"reading type with no AST context");
7494 ASTContext &Context = *ContextObj;
7495 RecordLocation Loc = TypeCursorForIndex(ID);
7496 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7500 SavedStreamPosition SavedPosition(DeclsCursor);
7502 ReadingKindTracker ReadingKind(Read_Type, *
this);
7505 Deserializing AType(
this);
7507 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7508 Error(std::move(Err));
7511 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7513 Error(RawCode.takeError());
7517 ASTRecordReader
Record(*
this, *Loc.F);
7518 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7520 Error(Code.takeError());
7524 QualType baseType =
Record.readQualType();
7525 Qualifiers quals =
Record.readQualifiers();
7531 Error(
"Unexpected code for type");
7535 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7536 return TypeReader.read(*maybeClass);
7544 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7545 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7548 return Reader.readTypeSourceInfo();
7552 return Reader.readNestedNameSpecifierLoc();
7556 return Reader.readAttr();
7565#define ABSTRACT_TYPELOC(CLASS, PARENT)
7566#define TYPELOC(CLASS, PARENT) \
7567 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7568#include "clang/AST/TypeLocNodes.def"
7577void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7581void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7591void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7595void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7599void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7603void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7607void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7611void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7615void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7619void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7623void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7627void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7635 if (Reader.readBool())
7642 VisitArrayTypeLoc(TL);
7646 VisitArrayTypeLoc(TL);
7649void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7650 VisitArrayTypeLoc(TL);
7653void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7654 DependentSizedArrayTypeLoc TL) {
7655 VisitArrayTypeLoc(TL);
7658void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7659 DependentAddressSpaceTypeLoc TL) {
7666void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7667 DependentSizedExtVectorTypeLoc TL) {
7671void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7675void TypeLocReader::VisitDependentVectorTypeLoc(
7676 DependentVectorTypeLoc TL) {
7680void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7684void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7691void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7692 DependentSizedMatrixTypeLoc TL) {
7705 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7711 VisitFunctionTypeLoc(TL);
7715 VisitFunctionTypeLoc(TL);
7718void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7719 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7720 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7721 SourceLocation NameLoc = readSourceLocation();
7722 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7725void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7726 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7727 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7728 SourceLocation NameLoc = readSourceLocation();
7729 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7732void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7733 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7734 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7735 SourceLocation NameLoc = readSourceLocation();
7736 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7739void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7745void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7752void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7757void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7761void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7773 auto NamedConcept = readTemplateName();
7775 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7780void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7782 if (Reader.readBool())
7784 if (Reader.readBool())
7788void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7802 VisitTagTypeLoc(TL);
7806 VisitTagTypeLoc(TL);
7809void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7811void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7815void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7819void TypeLocReader::VisitLateParsedAttrTypeLoc(LateParsedAttrTypeLoc TL) {
7821 "should be replaced with a concrete type before serialization");
7824void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7828void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7832void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7833 HLSLAttributedResourceTypeLoc TL) {
7837void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7841void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7845void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7846 SubstTemplateTypeParmTypeLoc TL) {
7850void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7851 SubstTemplateTypeParmPackTypeLoc TL) {
7855void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7856 SubstBuiltinTemplatePackTypeLoc TL) {
7860void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7861 TemplateSpecializationTypeLoc TL) {
7862 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7863 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7864 SourceLocation TemplateKeywordLoc = readSourceLocation();
7865 SourceLocation NameLoc = readSourceLocation();
7866 SourceLocation LAngleLoc = readSourceLocation();
7867 SourceLocation RAngleLoc = readSourceLocation();
7868 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7869 LAngleLoc, RAngleLoc);
7870 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7871 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7872 Args[I] = Reader.readTemplateArgumentLocInfo(
7873 TL.
getTypePtr()->template_arguments()[I].getKind());
7876void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7881void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7887void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7891void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7896void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7905void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7917void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7921void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7927void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7931void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7935void TypeLocReader::VisitDependentBitIntTypeLoc(
7936 clang::DependentBitIntTypeLoc TL) {
7940void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7974std::pair<ModuleFile *, unsigned>
7977 "Predefined type shouldn't be in TypesLoaded");
7979 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7981 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7982 assert(OwningModuleFile &&
7983 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7985 return {OwningModuleFile,
7990 assert(ContextObj &&
"reading type with no AST context");
8001 llvm_unreachable(
"Invalid predefined type");
8017 T = Context.UnsignedCharTy;
8020 T = Context.UnsignedShortTy;
8023 T = Context.UnsignedIntTy;
8026 T = Context.UnsignedLongTy;
8029 T = Context.UnsignedLongLongTy;
8032 T = Context.UnsignedInt128Ty;
8035 T = Context.SignedCharTy;
8038 T = Context.WCharTy;
8041 T = Context.ShortTy;
8050 T = Context.LongLongTy;
8053 T = Context.Int128Ty;
8056 T = Context.BFloat16Ty;
8062 T = Context.FloatTy;
8065 T = Context.DoubleTy;
8068 T = Context.LongDoubleTy;
8071 T = Context.ShortAccumTy;
8074 T = Context.AccumTy;
8077 T = Context.LongAccumTy;
8080 T = Context.UnsignedShortAccumTy;
8083 T = Context.UnsignedAccumTy;
8086 T = Context.UnsignedLongAccumTy;
8089 T = Context.ShortFractTy;
8092 T = Context.FractTy;
8095 T = Context.LongFractTy;
8098 T = Context.UnsignedShortFractTy;
8101 T = Context.UnsignedFractTy;
8104 T = Context.UnsignedLongFractTy;
8107 T = Context.SatShortAccumTy;
8110 T = Context.SatAccumTy;
8113 T = Context.SatLongAccumTy;
8116 T = Context.SatUnsignedShortAccumTy;
8119 T = Context.SatUnsignedAccumTy;
8122 T = Context.SatUnsignedLongAccumTy;
8125 T = Context.SatShortFractTy;
8128 T = Context.SatFractTy;
8131 T = Context.SatLongFractTy;
8134 T = Context.SatUnsignedShortFractTy;
8137 T = Context.SatUnsignedFractTy;
8140 T = Context.SatUnsignedLongFractTy;
8143 T = Context.Float16Ty;
8146 T = Context.Float128Ty;
8149 T = Context.Ibm128Ty;
8152 T = Context.OverloadTy;
8155 T = Context.UnresolvedTemplateTy;
8158 T = Context.BoundMemberTy;
8161 T = Context.PseudoObjectTy;
8164 T = Context.DependentTy;
8167 T = Context.UnknownAnyTy;
8170 T = Context.NullPtrTy;
8173 T = Context.MetaInfoTy;
8176 T = Context.Char8Ty;
8179 T = Context.Char16Ty;
8182 T = Context.Char32Ty;
8185 T = Context.ObjCBuiltinIdTy;
8188 T = Context.ObjCBuiltinClassTy;
8191 T = Context.ObjCBuiltinSelTy;
8193#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8194 case PREDEF_TYPE_##Id##_ID: \
8195 T = Context.SingletonId; \
8197#include "clang/Basic/OpenCLImageTypes.def"
8198#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8199 case PREDEF_TYPE_##Id##_ID: \
8200 T = Context.Id##Ty; \
8202#include "clang/Basic/OpenCLExtensionTypes.def"
8204 T = Context.OCLSamplerTy;
8207 T = Context.OCLEventTy;
8210 T = Context.OCLClkEventTy;
8213 T = Context.OCLQueueTy;
8216 T = Context.OCLReserveIDTy;
8219 T = Context.getAutoDeductType();
8222 T = Context.getAutoRRefDeductType();
8225 T = Context.ARCUnbridgedCastTy;
8228 T = Context.BuiltinFnTy;
8231 T = Context.IncompleteMatrixIdxTy;
8234 T = Context.ArraySectionTy;
8237 T = Context.OMPArrayShapingTy;
8240 T = Context.OMPIteratorTy;
8242#define SVE_TYPE(Name, Id, SingletonId) \
8243 case PREDEF_TYPE_##Id##_ID: \
8244 T = Context.SingletonId; \
8246#include "clang/Basic/AArch64ACLETypes.def"
8247#define PPC_VECTOR_TYPE(Name, Id, Size) \
8248 case PREDEF_TYPE_##Id##_ID: \
8249 T = Context.Id##Ty; \
8251#include "clang/Basic/PPCTypes.def"
8252#define RVV_TYPE(Name, Id, SingletonId) \
8253 case PREDEF_TYPE_##Id##_ID: \
8254 T = Context.SingletonId; \
8256#include "clang/Basic/RISCVVTypes.def"
8257#define WASM_TYPE(Name, Id, SingletonId) \
8258 case PREDEF_TYPE_##Id##_ID: \
8259 T = Context.SingletonId; \
8261#include "clang/Basic/WebAssemblyReferenceTypes.def"
8262#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8263 case PREDEF_TYPE_##Id##_ID: \
8264 T = Context.SingletonId; \
8266#include "clang/Basic/AMDGPUTypes.def"
8267#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8268 case PREDEF_TYPE_##Id##_ID: \
8269 T = Context.SingletonId; \
8271#include "clang/Basic/HLSLIntangibleTypes.def"
8272#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
8273 case PREDEF_TYPE_##Id##_ID: \
8274 T = Context.SingletonId; \
8276#include "clang/Basic/HLSLPackedTypes.def"
8277#define SPIRV_TYPE(Name, Id, SingletonId) \
8278 case PREDEF_TYPE_##Id##_ID: \
8279 T = Context.SingletonId; \
8281#include "clang/Basic/SPIRVTypes.def"
8284 assert(!
T.isNull() &&
"Unknown predefined type");
8285 return T.withFastQualifiers(FastQuals);
8288 unsigned Index = translateTypeIDToIndex(ID).second;
8290 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
8291 if (TypesLoaded[Index].isNull()) {
8292 TypesLoaded[Index] = readTypeRecord(ID);
8293 if (TypesLoaded[Index].isNull())
8296 TypesLoaded[Index]->setFromAST();
8297 if (DeserializationListener)
8299 TypesLoaded[Index]);
8302 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8315 ReadModuleOffsetMap(F);
8318 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8320 if (ModuleFileIndex == 0)
8325 ModuleFileIndex = MF.
Index + 1;
8326 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8345 TemplateNameLoc, EllipsisLoc);
8356 llvm_unreachable(
"unexpected template argument loc");
8373 unsigned NumArgsAsWritten =
readInt();
8374 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8388 if (NumCurrentElementsDeserializing) {
8393 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8416 auto *II = Name.getAsIdentifierInfo();
8417 assert(II &&
"non-identifier name in C?");
8418 if (II->isOutOfDate())
8435 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8436 Template = CTSD->getSpecializedTemplate();
8437 Args = CTSD->getTemplateArgs().asArray();
8438 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8439 Template = VTSD->getSpecializedTemplate();
8440 Args = VTSD->getTemplateArgs().asArray();
8441 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8442 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8444 Args = FD->getTemplateSpecializationArgs()->asArray();
8449 Template->loadLazySpecializationsImpl(Args);
8454 RecordLocation Loc = getLocalBitOffset(Offset);
8457 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8458 Error(std::move(Err));
8461 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8466 Error(MaybeCode.takeError());
8469 unsigned Code = MaybeCode.get();
8473 if (!MaybeRecCode) {
8474 Error(MaybeRecCode.takeError());
8478 Error(
"malformed AST file: missing C++ ctor initializers");
8482 return Record.readCXXCtorInitializers();
8486 assert(ContextObj &&
"reading base specifiers with no AST context");
8489 RecordLocation Loc = getLocalBitOffset(Offset);
8492 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8493 Error(std::move(Err));
8496 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8501 Error(MaybeCode.takeError());
8504 unsigned Code = MaybeCode.get();
8508 if (!MaybeRecCode) {
8509 Error(MaybeCode.takeError());
8512 unsigned RecCode = MaybeRecCode.get();
8515 Error(
"malformed AST file: missing C++ base specifiers");
8519 unsigned NumBases =
Record.readInt();
8522 for (
unsigned I = 0; I != NumBases; ++I)
8523 Bases[I] =
Record.readCXXBaseSpecifier();
8536 ReadModuleOffsetMap(F);
8539 OwningModuleFileIndex == 0
8543 if (OwningModuleFileIndex == 0)
8546 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8555 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8556 return M.
Index == ModuleFileIndex - 1;
8564 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8565 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8585 DeclCursorForID(ID, Loc);
8590 assert(ContextObj &&
"reading predefined decl without AST context");
8592 Decl *NewLoaded =
nullptr;
8598 return Context.getTranslationUnitDecl();
8601 if (Context.ObjCIdDecl)
8602 return Context.ObjCIdDecl;
8603 NewLoaded = Context.getObjCIdDecl();
8607 if (Context.ObjCSelDecl)
8608 return Context.ObjCSelDecl;
8609 NewLoaded = Context.getObjCSelDecl();
8613 if (Context.ObjCClassDecl)
8614 return Context.ObjCClassDecl;
8615 NewLoaded = Context.getObjCClassDecl();
8619 if (Context.ObjCProtocolClassDecl)
8620 return Context.ObjCProtocolClassDecl;
8621 NewLoaded = Context.getObjCProtocolDecl();
8625 if (Context.Int128Decl)
8626 return Context.Int128Decl;
8627 NewLoaded = Context.getInt128Decl();
8631 if (Context.UInt128Decl)
8632 return Context.UInt128Decl;
8633 NewLoaded = Context.getUInt128Decl();
8637 if (Context.ObjCInstanceTypeDecl)
8638 return Context.ObjCInstanceTypeDecl;
8639 NewLoaded = Context.getObjCInstanceTypeDecl();
8643 if (Context.BuiltinVaListDecl)
8644 return Context.BuiltinVaListDecl;
8645 NewLoaded = Context.getBuiltinVaListDecl();
8649 if (Context.VaListTagDecl)
8650 return Context.VaListTagDecl;
8651 NewLoaded = Context.getVaListTagDecl();
8655 if (Context.BuiltinMSVaListDecl)
8656 return Context.BuiltinMSVaListDecl;
8657 NewLoaded = Context.getBuiltinMSVaListDecl();
8661 if (Context.BuiltinZOSVaListDecl)
8662 return Context.BuiltinZOSVaListDecl;
8663 NewLoaded = Context.getBuiltinZOSVaListDecl();
8668 return Context.getMSGuidTagDecl();
8671 if (Context.ExternCContext)
8672 return Context.ExternCContext;
8673 NewLoaded = Context.getExternCContextDecl();
8677 if (Context.CFConstantStringTypeDecl)
8678 return Context.CFConstantStringTypeDecl;
8679 NewLoaded = Context.getCFConstantStringDecl();
8683 if (Context.CFConstantStringTagDecl)
8684 return Context.CFConstantStringTagDecl;
8685 NewLoaded = Context.getCFConstantStringTagDecl();
8689 return Context.getMSTypeInfoTagDecl();
8691#define BuiltinTemplate(BTName) \
8692 case PREDEF_DECL##BTName##_ID: \
8693 if (Context.Decl##BTName) \
8694 return Context.Decl##BTName; \
8695 NewLoaded = Context.get##BTName##Decl(); \
8697#include "clang/Basic/BuiltinTemplates.inc"
8700 llvm_unreachable(
"Invalid decl ID");
8704 assert(NewLoaded &&
"Failed to load predefined decl?");
8706 if (DeserializationListener)
8707 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8712unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8713 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8714 if (!OwningModuleFile) {
8723 assert(ContextObj &&
"reading decl with no AST context");
8732 Merged.push_back(ID);
8737 unsigned Index = translateGlobalDeclIDToIndex(ID);
8739 if (Index >= DeclsLoaded.size()) {
8740 assert(0 &&
"declaration ID out-of-range for AST file");
8741 Error(
"declaration ID out-of-range for AST file");
8745 return DeclsLoaded[Index];
8752 unsigned Index = translateGlobalDeclIDToIndex(ID);
8754 if (Index >= DeclsLoaded.size()) {
8755 assert(0 &&
"declaration ID out-of-range for AST file");
8756 Error(
"declaration ID out-of-range for AST file");
8760 if (!DeclsLoaded[Index]) {
8762 if (DeserializationListener)
8763 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8766 return DeclsLoaded[Index];
8775 ReadModuleOffsetMap(M);
8785 uint64_t OrignalModuleFileIndex = 0;
8788 OrignalModuleFileIndex = I + 1;
8792 if (!OrignalModuleFileIndex)
8800 if (Idx >=
Record.size()) {
8801 Error(
"Corrupted AST file");
8818 RecordLocation Loc = getLocalBitOffset(Offset);
8819 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8820 Error(std::move(Err));
8823 assert(NumCurrentElementsDeserializing == 0 &&
8824 "should not be called while already deserializing");
8826 return ReadStmtFromStream(*Loc.F);
8829bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8833 auto It = SpecLookups.find(D);
8834 if (It == SpecLookups.end())
8840 It->second.Table.findAll();
8844 SpecLookups.erase(It);
8846 bool NewSpecsFound =
false;
8847 Deserializing LookupResults(
this);
8848 for (
auto &Info : Infos) {
8849 if (GetExistingDecl(Info))
8851 NewSpecsFound =
true;
8855 return NewSpecsFound;
8862 bool NewSpecsFound =
8863 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8865 return NewSpecsFound;
8867 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8868 return NewSpecsFound;
8871bool ASTReader::LoadExternalSpecializationsImpl(
8872 SpecLookupTableTy &SpecLookups,
const Decl *D,
8876 auto It = SpecLookups.find(D);
8877 if (It == SpecLookups.end())
8880 Deserializing LookupResults(
this);
8884 It->second.Table.find(HashValue);
8886 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8888 llvm::raw_string_ostream OS(Name);
8895 bool NewSpecsFound =
false;
8896 for (
auto &Info : Infos) {
8897 if (GetExistingDecl(Info))
8899 NewSpecsFound =
true;
8903 return NewSpecsFound;
8910 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8911 PartialSpecializationsLookups, D, TemplateArgs);
8913 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8915 return NewDeclsFound;
8923 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8924 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8925 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8927 if (!IsKindWeWant(K))
8930 auto ID = (
DeclID) + LexicalDecls[I + 1];
8935 if (PredefsVisited[ID])
8938 PredefsVisited[ID] =
true;
8942 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8950 for (
const auto &Lexical : TULexicalDecls)
8951 Visit(Lexical.first, Lexical.second);
8953 auto I = LexicalDecls.find(DC);
8954 if (I != LexicalDecls.end())
8955 Visit(I->second.first, I->second.second);
8958 ++NumLexicalDeclContextsRead;
8963class UnalignedDeclIDComp {
8969 : Reader(Reader), Mod(M) {}
8978 SourceLocation RHS = getLocation(R);
8983 SourceLocation LHS = getLocation(L);
8997 unsigned Offset,
unsigned Length,
9001 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
9002 if (I == FileDeclIDs.end())
9005 FileDeclsInfo &DInfo = I->second;
9006 if (DInfo.Decls.empty())
9013 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
9015 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
9016 if (BeginIt != DInfo.Decls.begin())
9022 while (BeginIt != DInfo.Decls.begin() &&
9025 ->isTopLevelDeclInObjCContainer())
9029 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
9030 if (EndIt != DInfo.Decls.end())
9043 "DeclContext has no visible decls in storage");
9050 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
9072 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
9073 ++NumVisibleDeclContextsRead;
9074 Find(It->second.Table, Name);
9077 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
9078 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
9079 ++NumModuleLocalVisibleDeclContexts;
9080 Find(It->second.Table, std::make_pair(Name, NamedModule));
9083 if (
auto *NamedModule =
9084 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
9086 FindModuleLocalLookup(NamedModule);
9091 if (ContextObj && ContextObj->getCurrentNamedModule())
9092 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
9094 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
9095 ++NumTULocalVisibleDeclContexts;
9096 Find(It->second.Table, Name);
9109 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
9110 auto It = LookupTables.find(DC);
9111 if (It == LookupTables.end())
9133 findAll(Lookups, NumVisibleDeclContextsRead);
9134 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
9135 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
9137 for (
auto &[Name, DS] : Decls)
9140 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
9145 auto I = Lookups.find(Primary);
9146 return I == Lookups.end() ?
nullptr : &I->second;
9151 auto I = ModuleLocalLookups.find(Primary);
9152 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
9157 auto I = TULocalLookups.find(Primary);
9158 return I == TULocalLookups.end() ?
nullptr : &I->second;
9165 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
9166 auto I = LookupTable.find(D);
9167 return I == LookupTable.end() ?
nullptr : &I->second;
9172 return PartialSpecializationsLookups.contains(D) ||
9173 SpecializationsLookups.contains(D);
9182 assert(ImplD && Consumer);
9184 for (
auto *I : ImplD->
methods())
9190void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9191 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9194 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9197void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9198 Consumer->HandleVTable(RD);
9202 this->Consumer = Consumer;
9205 PassInterestingDeclsToConsumer();
9207 if (DeserializationListener)
9208 DeserializationListener->ReaderInitialized(
this);
9212 std::fprintf(
stderr,
"*** AST File Statistics:\n");
9214 unsigned NumTypesLoaded =
9215 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
9216 unsigned NumDeclsLoaded =
9217 DeclsLoaded.size() -
9218 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
9219 unsigned NumIdentifiersLoaded =
9220 IdentifiersLoaded.size() -
9222 unsigned NumMacrosLoaded =
9223 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
9224 unsigned NumSelectorsLoaded =
9225 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
9228 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
9229 NumSLocEntriesRead, TotalNumSLocEntries,
9230 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9231 if (!TypesLoaded.empty())
9232 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
9233 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
9234 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
9235 if (!DeclsLoaded.empty())
9236 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
9237 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
9238 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9239 if (!IdentifiersLoaded.empty())
9240 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
9241 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
9242 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9243 if (!MacrosLoaded.empty())
9244 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9245 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
9246 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9247 if (!SelectorsLoaded.empty())
9248 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
9249 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
9250 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9251 if (TotalNumStatements)
9252 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
9253 NumStatementsRead, TotalNumStatements,
9254 ((
float)NumStatementsRead/TotalNumStatements * 100));
9256 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9257 NumMacrosRead, TotalNumMacros,
9258 ((
float)NumMacrosRead/TotalNumMacros * 100));
9259 if (TotalLexicalDeclContexts)
9260 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
9261 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9262 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9264 if (TotalVisibleDeclContexts)
9265 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
9266 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9267 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9269 if (TotalModuleLocalVisibleDeclContexts)
9271 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
9272 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9273 ((
float)NumModuleLocalVisibleDeclContexts /
9274 TotalModuleLocalVisibleDeclContexts * 100));
9275 if (TotalTULocalVisibleDeclContexts)
9276 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
9277 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9278 ((
float)NumTULocalVisibleDeclContexts /
9279 TotalTULocalVisibleDeclContexts * 100));
9280 if (TotalNumMethodPoolEntries)
9281 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
9282 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9283 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9285 if (NumMethodPoolLookups)
9286 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
9287 NumMethodPoolHits, NumMethodPoolLookups,
9288 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9289 if (NumMethodPoolTableLookups)
9290 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
9291 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9292 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9294 if (NumIdentifierLookupHits)
9296 " %u / %u identifier table lookups succeeded (%f%%)\n",
9297 NumIdentifierLookupHits, NumIdentifierLookups,
9298 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9301 std::fprintf(
stderr,
"\n");
9302 GlobalIndex->printStats();
9305 std::fprintf(
stderr,
"\n");
9307 std::fprintf(
stderr,
"\n");
9310template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9311LLVM_DUMP_METHOD
static void
9314 InitialCapacity> &Map) {
9315 if (Map.begin() == Map.end())
9320 llvm::errs() << Name <<
":\n";
9321 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9323 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9328 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9330 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9334 GlobalPreprocessedEntityMap);
9336 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9345 if (llvm::MemoryBuffer *buf = I.Buffer) {
9346 size_t bytes = buf->getBufferSize();
9347 switch (buf->getBufferKind()) {
9348 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9351 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9372 if (!FPPragmaOptions.empty()) {
9373 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9376 SemaObj->CurFPFeatures =
9382 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9383 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9384 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9385 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9387 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9389 DeclsWithEffectsToVerify.clear();
9391 SemaObj->OpenCLFeatures = OpenCLExtensions;
9397 assert(SemaObj &&
"no Sema to update");
9403 OpenMPRequiresDecls.clear();
9407 if (!SemaDeclRefs.empty()) {
9408 assert(SemaDeclRefs.size() % 3 == 0);
9409 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9410 if (!SemaObj->StdNamespace)
9411 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9412 if (!SemaObj->StdBadAlloc)
9413 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9414 if (!SemaObj->StdAlignValT)
9415 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9417 SemaDeclRefs.clear();
9422 if(OptimizeOffPragmaLocation.isValid())
9423 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9424 if (PragmaMSStructState != -1)
9426 if (PointersToMembersPragmaLocation.isValid()) {
9427 SemaObj->ActOnPragmaMSPointersToMembers(
9429 PragmaMSPointersToMembersState,
9430 PointersToMembersPragmaLocation);
9432 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9433 if (!RISCVVecIntrinsicPragma.empty()) {
9434 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9435 "Wrong number of RISCVVecIntrinsicPragma");
9436 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9437 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9438 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9441 if (PragmaAlignPackCurrentValue) {
9445 bool DropFirst =
false;
9446 if (!PragmaAlignPackStack.empty() &&
9447 PragmaAlignPackStack.front().Location.isInvalid()) {
9448 assert(PragmaAlignPackStack.front().Value ==
9449 SemaObj->AlignPackStack.DefaultValue &&
9450 "Expected a default alignment value");
9451 SemaObj->AlignPackStack.Stack.emplace_back(
9452 PragmaAlignPackStack.front().SlotLabel,
9453 SemaObj->AlignPackStack.CurrentValue,
9454 SemaObj->AlignPackStack.CurrentPragmaLocation,
9455 PragmaAlignPackStack.front().PushLocation);
9458 for (
const auto &Entry :
9459 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9460 SemaObj->AlignPackStack.Stack.emplace_back(
9461 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9463 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9464 assert(*PragmaAlignPackCurrentValue ==
9465 SemaObj->AlignPackStack.DefaultValue &&
9466 "Expected a default align and pack value");
9469 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9470 SemaObj->AlignPackStack.CurrentPragmaLocation =
9471 PragmaAlignPackCurrentLocation;
9474 if (FpPragmaCurrentValue) {
9478 bool DropFirst =
false;
9479 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9480 assert(FpPragmaStack.front().Value ==
9481 SemaObj->FpPragmaStack.DefaultValue &&
9482 "Expected a default pragma float_control value");
9483 SemaObj->FpPragmaStack.Stack.emplace_back(
9484 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9485 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9486 FpPragmaStack.front().PushLocation);
9489 for (
const auto &Entry :
9491 SemaObj->FpPragmaStack.Stack.emplace_back(
9492 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9493 if (FpPragmaCurrentLocation.isInvalid()) {
9494 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9495 "Expected a default pragma float_control value");
9498 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9499 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9504 for (
auto &Import : PendingImportedModulesSema) {
9505 if (Import.ImportLoc.isInvalid())
9508 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9511 PendingImportedModulesSema.clear();
9518 IdentifierLookupVisitor Visitor(Name, 0,
9519 NumIdentifierLookups,
9520 NumIdentifierLookupHits);
9526 if (PP.getLangOpts().CPlusPlus) {
9527 for (
auto *F : ModuleMgr.pch_modules())
9536 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9541 ModuleMgr.visit(Visitor, HitsPtr);
9563 ASTIdentifierLookupTable::key_iterator Current;
9567 ASTIdentifierLookupTable::key_iterator End;
9574 bool SkipModules =
false);
9576 StringRef
Next()
override;
9583 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9587 while (Current == End) {
9599 Current = IdTable->key_begin();
9600 End = IdTable->key_end();
9605 StringRef
Result = *Current;
9614 std::unique_ptr<IdentifierIterator> Current;
9615 std::unique_ptr<IdentifierIterator> Queued;
9618 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9619 std::unique_ptr<IdentifierIterator> Second)
9620 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9622 StringRef
Next()
override {
9626 StringRef result = Current->Next();
9627 if (!result.empty())
9632 std::swap(Current, Queued);
9641 std::unique_ptr<IdentifierIterator> ReaderIter(
9643 std::unique_ptr<IdentifierIterator> ModulesIter(
9644 GlobalIndex->createIdentifierIterator());
9645 return new ChainedIdentifierIterator(std::move(ReaderIter),
9646 std::move(ModulesIter));
9658 unsigned PriorGeneration;
9659 unsigned InstanceBits = 0;
9660 unsigned FactoryBits = 0;
9661 bool InstanceHasMoreThanOneDecl =
false;
9662 bool FactoryHasMoreThanOneDecl =
false;
9668 unsigned PriorGeneration)
9669 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9679 ++Reader.NumMethodPoolTableLookups;
9682 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9683 if (Pos == PoolTable->end())
9686 ++Reader.NumMethodPoolTableHits;
9687 ++Reader.NumSelectorsRead;
9691 ++Reader.NumMethodPoolEntriesRead;
9693 if (Reader.DeserializationListener)
9694 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9699 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9700 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9701 InstanceBits =
Data.InstanceBits;
9702 FactoryBits =
Data.FactoryBits;
9703 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9704 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9710 return InstanceMethods;
9715 return FactoryMethods;
9722 return InstanceHasMoreThanOneDecl;
9740 unsigned &Generation = SelectorGeneration[Sel];
9741 unsigned PriorGeneration = Generation;
9743 SelectorOutOfDate[Sel] =
false;
9746 ++NumMethodPoolLookups;
9748 ModuleMgr.visit(Visitor);
9754 ++NumMethodPoolHits;
9775 if (SelectorOutOfDate[Sel])
9783 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9785 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9786 Namespaces.push_back(Namespace);
9791 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9792 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9793 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9796 Undefined.insert(std::make_pair(D, Loc));
9798 UndefinedButUsed.clear();
9804 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9807 uint64_t Count = DelayedDeleteExprs[Idx++];
9808 for (uint64_t
C = 0;
C < Count; ++
C) {
9811 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9812 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9819 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9820 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9822 TentativeDefs.push_back(Var);
9824 TentativeDefinitions.clear();
9829 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9831 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9835 UnusedFileScopedDecls.clear();
9840 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9842 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9846 DelegatingCtorDecls.clear();
9850 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9852 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9856 ExtVectorDecls.clear();
9860 llvm::SmallPtrSetImpl<const TypedefNameDecl *> &Decls) {
9861 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9864 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9868 UnusedLocalTypedefNameCandidates.clear();
9873 for (
auto I : DeclsToCheckForDeferredDiags) {
9874 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9878 DeclsToCheckForDeferredDiags.clear();
9883 if (ReferencedSelectorsData.empty())
9888 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9890 while (I < DataSize) {
9894 Sels.push_back(std::make_pair(Sel, SelLoc));
9896 ReferencedSelectorsData.clear();
9901 if (WeakUndeclaredIdentifiers.empty())
9904 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9912 WeakIDs.push_back(std::make_pair(WeakId, WI));
9914 WeakUndeclaredIdentifiers.clear();
9918 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9919 if (ExtnameUndeclaredIdentifiers.empty())
9922 for (
unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9929 AsmLabelAttr *
Attr = AsmLabelAttr::CreateImplicit(
9933 ExtnameIDs.push_back(std::make_pair(NameId,
Attr));
9935 ExtnameUndeclaredIdentifiers.clear();
9939 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9941 VTableUse &TableInfo = VTableUses[Idx++];
9942 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9945 VTables.push_back(VT);
9953 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9954 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9958 Pending.push_back(std::make_pair(D, Loc));
9960 PendingInstantiations.clear();
9964 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9966 for (
auto &LPT : LateParsedTemplates) {
9969 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9973 auto LT = std::make_unique<LateParsedTemplate>();
9974 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9978 assert(F &&
"No module");
9980 unsigned TokN = LateParsed[Idx++];
9981 LT->Toks.reserve(TokN);
9982 for (
unsigned T = 0;
T < TokN; ++
T)
9983 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9985 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9989 LateParsedTemplates.clear();
9998 assert(ID &&
"Non-zero identifier ID required");
9999 unsigned Index = translateIdentifierIDToIndex(ID).second;
10000 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
10001 IdentifiersLoaded[Index] = II;
10002 if (DeserializationListener)
10003 DeserializationListener->IdentifierRead(ID, II);
10025 if (NumCurrentElementsDeserializing && !Decls) {
10026 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
10030 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
10043 Decls->push_back(D);
10050 pushExternalDeclIntoScope(D, II);
10054std::pair<ModuleFile *, unsigned>
10055ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
10057 return {
nullptr, 0};
10059 unsigned ModuleFileIndex = ID >> 32;
10060 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
10062 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
10074 if (IdentifiersLoaded.empty()) {
10075 Error(
"no identifier table in AST file");
10079 auto [M, Index] = translateIdentifierIDToIndex(ID);
10080 if (!IdentifiersLoaded[Index]) {
10081 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
10084 const unsigned char *
Data =
10089 auto Key = Trait.
ReadKey(
Data, KeyDataLen.first);
10090 auto &II = PP.getIdentifierTable().get(Key);
10091 IdentifiersLoaded[Index] = &II;
10094 if (DeserializationListener)
10095 DeserializationListener->IdentifierRead(ID, &II);
10098 return IdentifiersLoaded[Index];
10110 ReadModuleOffsetMap(M);
10112 unsigned ModuleFileIndex = LocalID >> 32;
10113 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
10116 assert(MF &&
"malformed identifier ID encoding?");
10118 if (!ModuleFileIndex)
10124std::pair<ModuleFile *, unsigned>
10125ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
10127 return {
nullptr, 0};
10129 unsigned ModuleFileIndex = ID >> 32;
10130 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
10134 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
10143 if (MacrosLoaded.empty()) {
10144 Error(
"no macro table in AST file");
10148 auto [M, Index] = translateMacroIDToIndex(ID);
10149 if (!MacrosLoaded[Index]) {
10150 assert(M !=
nullptr &&
"Untranslated Macro ID?");
10156 if (DeserializationListener)
10157 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10160 return MacrosLoaded[Index];
10168 ReadModuleOffsetMap(M);
10170 unsigned ModuleFileIndex = LocalID >> 32;
10171 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10174 assert(MF &&
"malformed identifier ID encoding?");
10176 if (!ModuleFileIndex) {
10181 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
10190 ReadModuleOffsetMap(M);
10195 &&
"Invalid index into submodule index remap");
10197 return LocalID + I->second;
10208 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
10211 int IndexFromEnd =
static_cast<int>(ID >> 1);
10212 assert(IndexFromEnd &&
"got reference to unknown module file");
10229 auto I = llvm::find(PCHModules, M);
10230 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
10231 return std::distance(I, PCHModules.end()) << 1;
10240 const auto &PCHChain = ModuleMgr.pch_modules();
10241 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10242 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10246 llvm::sys::path::parent_path(MF.
FileName),
10249 return std::nullopt;
10253 auto I = DefinitionSource.find(FD);
10254 if (I == DefinitionSource.end())
10260 return ThisDeclarationWasADefinitionSet.contains(FD);
10271 if (ID > SelectorsLoaded.size()) {
10272 Error(
"selector ID out of range in AST file");
10276 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
10279 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
10283 SelectorsLoaded[ID - 1] =
10285 if (DeserializationListener)
10286 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10289 return SelectorsLoaded[ID - 1];
10307 ReadModuleOffsetMap(M);
10312 &&
"Invalid index into selector index remap");
10314 return LocalID + I->second;
10345 NameInfo.
setName(readDeclarationName());
10359 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10360 assert(Op.isValid());
10366 unsigned NumTPLists =
readInt();
10371 for (
unsigned i = 0; i != NumTPLists; ++i)
10382 unsigned NumParams =
readInt();
10384 Params.reserve(NumParams);
10385 while (NumParams--)
10388 bool HasRequiresClause =
readBool();
10389 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10392 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10393 return TemplateParams;
10398 bool Canonicalize) {
10399 unsigned NumTemplateArgs =
readInt();
10400 TemplArgs.reserve(NumTemplateArgs);
10401 while (NumTemplateArgs--)
10407 unsigned NumDecls =
readInt();
10409 while (NumDecls--) {
10421 bool inheritConstructors =
readBool();
10427 Result.setInheritConstructors(inheritConstructors);
10434 unsigned NumInitializers =
readInt();
10435 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10437 for (
unsigned i = 0; i != NumInitializers; ++i) {
10439 bool IsBaseVirtual =
false;
10470 BOMInit =
new (Context)
10472 RParenLoc, MemberOrEllipsisLoc);
10474 BOMInit =
new (Context)
10477 BOMInit =
new (Context)
10481 BOMInit =
new (Context)
10483 LParenLoc,
Init, RParenLoc);
10486 unsigned SourceOrder =
readInt();
10490 CtorInitializers[i] = BOMInit;
10493 return CtorInitializers;
10501 for (
unsigned I = 0; I != N; ++I) {
10502 auto Kind = readNestedNameSpecifierKind();
10507 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10516 Builder.Make(Context,
T->getTypeLoc(), ColonColonLoc);
10522 Builder.MakeGlobal(Context, ColonColonLoc);
10529 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10534 llvm_unreachable(
"unexpected null nested name specifier");
10549 const StringRef Blob) {
10550 unsigned Count =
Record[0];
10551 const char *Byte = Blob.data();
10552 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10553 for (
unsigned I = 0; I < Count; ++Byte)
10554 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10555 if (*Byte & (1 << Bit))
10562 return llvm::APFloat(Sem,
readAPInt());
10567 unsigned Len =
Record[Idx++];
10575 unsigned Len =
Record[Idx++];
10576 StringRef
Result = Blob.substr(0, Len);
10577 Blob = Blob.substr(Len);
10601 unsigned Major =
Record[Idx++];
10602 unsigned Minor =
Record[Idx++];
10603 unsigned Subminor =
Record[Idx++];
10605 return VersionTuple(Major);
10607 return VersionTuple(Major, Minor - 1);
10608 return VersionTuple(Major, Minor - 1, Subminor - 1);
10619 return Diag(CurrentImportLoc, DiagID);
10623 return Diags.Report(Loc, DiagID);
10627 llvm::function_ref<
void()> Fn) {
10630 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10634 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10640 return PP.getIdentifierTable();
10646 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10647 "Already have a SwitchCase with this ID");
10648 (*CurrSwitchCaseStmts)[ID] = SC;
10653 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10654 return (*CurrSwitchCaseStmts)[ID];
10658 CurrSwitchCaseStmts->clear();
10663 std::vector<RawComment *> Comments;
10670 BitstreamCursor &Cursor = I->first;
10677 Cursor.advanceSkippingSubblocks(
10678 BitstreamCursor::AF_DontPopBlockAtEnd);
10680 Error(MaybeEntry.takeError());
10683 llvm::BitstreamEntry Entry = MaybeEntry.get();
10685 switch (Entry.Kind) {
10686 case llvm::BitstreamEntry::SubBlock:
10687 case llvm::BitstreamEntry::Error:
10688 Error(
"malformed block record in AST file");
10690 case llvm::BitstreamEntry::EndBlock:
10692 case llvm::BitstreamEntry::Record:
10700 if (!MaybeComment) {
10701 Error(MaybeComment.takeError());
10710 bool IsTrailingComment =
Record[Idx++];
10711 bool IsAlmostTrailingComment =
Record[Idx++];
10712 Comments.push_back(
new (Context)
RawComment(
10713 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10723 if (Loc.first.isValid())
10724 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10737 assert(NumUserInputs <= NumInputs);
10738 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10739 for (
unsigned I = 0; I < N; ++I) {
10740 bool IsSystem = I >= NumUserInputs;
10742 Visitor(IFI, IsSystem);
10747 bool IncludeSystem,
bool Complain,
10749 bool isSystem)> Visitor) {
10752 assert(NumUserInputs <= NumInputs);
10753 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10754 for (
unsigned I = 0; I < N; ++I) {
10755 bool IsSystem = I >= NumUserInputs;
10756 InputFile IF = getInputFile(MF, I+1, Complain);
10757 Visitor(IF, IsSystem);
10765 for (
unsigned I = 0; I < NumInputs; ++I) {
10768 if (
auto FE = getInputFile(MF, I + 1).getFile())
10773void ASTReader::finishPendingActions() {
10774 while (!PendingIdentifierInfos.empty() ||
10775 !PendingDeducedFunctionTypes.empty() ||
10776 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10777 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10778 !PendingUpdateRecords.empty() ||
10779 !PendingObjCExtensionIvarRedeclarations.empty()) {
10782 using TopLevelDeclsMap =
10783 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10784 TopLevelDeclsMap TopLevelDecls;
10786 while (!PendingIdentifierInfos.empty()) {
10789 std::move(PendingIdentifierInfos.back().second);
10790 PendingIdentifierInfos.pop_back();
10797 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10798 auto *FD = PendingDeducedFunctionTypes[I].first;
10799 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10801 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10804 if (DT->isDeduced()) {
10805 PendingDeducedTypeUpdates.insert(
10806 {FD->getCanonicalDecl(), FD->getReturnType()});
10813 PendingUndeducedFunctionDecls.push_back(FD);
10817 PendingDeducedFunctionTypes.clear();
10821 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10822 auto *VD = PendingDeducedVarTypes[I].first;
10823 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10825 PendingDeducedVarTypes.clear();
10828 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10829 loadPendingDeclChain(PendingDeclChains[I].first,
10830 PendingDeclChains[I].second);
10831 PendingDeclChains.clear();
10834 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10835 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10836 IdentifierInfo *II = TLD->first;
10837 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10843 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10844 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10845 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10846 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10848 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10850 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10851 if (!Info.M->isModule())
10855 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10857 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10858 if (Info.M->isModule())
10862 PendingMacroIDs.clear();
10866 while (!PendingDeclContextInfos.empty()) {
10867 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10868 PendingDeclContextInfos.pop_front();
10871 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10875 while (!PendingUpdateRecords.empty()) {
10876 auto Update = PendingUpdateRecords.pop_back_val();
10877 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10878 loadDeclUpdateRecords(
Update);
10881 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10882 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10883 auto DuplicateIvars =
10884 PendingObjCExtensionIvarRedeclarations.back().second;
10886 StructuralEquivalenceContext Ctx(
10887 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10888 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10892 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10894 for (
auto IvarPair : DuplicateIvars) {
10895 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10897 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10903 ExtensionsPair.first->setInvalidDecl();
10904 ExtensionsPair.second->getClassInterface()
10906 ->setIvarList(
nullptr);
10908 for (
auto IvarPair : DuplicateIvars) {
10909 Diag(IvarPair.first->getLocation(),
10910 diag::err_duplicate_ivar_declaration)
10911 << IvarPair.first->getIdentifier();
10912 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10915 PendingObjCExtensionIvarRedeclarations.pop_back();
10921 assert(PendingFakeDefinitionData.empty() &&
10922 "faked up a class definition but never saw the real one");
10928 for (Decl *D : PendingDefinitions) {
10929 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10930 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10931 for (
auto *R = getMostRecentExistingDecl(RD);
R;
10932 R =
R->getPreviousDecl()) {
10935 "declaration thinks it's the definition but it isn't");
10943 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10948 for (
auto *R = getMostRecentExistingDecl(ID);
R;
R =
R->getPreviousDecl())
10954 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10955 for (
auto *R = getMostRecentExistingDecl(PD);
R;
R =
R->getPreviousDecl())
10962 for (
auto *R = getMostRecentExistingDecl(RTD);
R;
R =
R->getPreviousDecl())
10965 PendingDefinitions.clear();
10967 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10968 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10969 if (
auto *VD = dyn_cast<VarDecl>(D))
10970 return VD->isThisDeclarationADefinition() ||
10971 VD->isThisDeclarationADemotedDefinition();
10973 if (
auto *TD = dyn_cast<TagDecl>(D))
10974 return TD->isThisDeclarationADefinition() ||
10975 TD->isThisDeclarationADemotedDefinition();
10977 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10978 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10980 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10981 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10988 return hasDefinitionImpl(D, hasDefinitionImpl);
11004 PendingWarningForDuplicatedDefsInModuleUnits.clear();
11010 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
11011 PBEnd = PendingBodies.end();
11012 PB != PBEnd; ++PB) {
11013 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
11015 const FunctionDecl *Defn =
nullptr;
11016 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
11017 FD->setLazyBody(PB->second);
11019 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
11022 if (!FD->isLateTemplateParsed() &&
11023 !NonConstDefn->isLateTemplateParsed() &&
11028 FD->getODRHash() != NonConstDefn->getODRHash()) {
11030 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
11031 }
else if (FD->getLexicalParent()->isFileContext() &&
11032 NonConstDefn->getLexicalParent()->isFileContext()) {
11036 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
11047 PendingBodies.clear();
11050 for (
auto [RD, MD] : PendingAddedClassMembers) {
11051 RD->addedMember(MD);
11053 PendingAddedClassMembers.clear();
11056 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
11058 PendingMergedDefinitionsToDeduplicate.clear();
11062 for (Decl *D : PendingIncompleteDeclChains)
11063 markIncompleteDeclChain(D);
11064 PendingIncompleteDeclChains.clear();
11066 assert(PendingIdentifierInfos.empty() &&
11067 "Should be empty at the end of finishPendingActions");
11068 assert(PendingDeducedFunctionTypes.empty() &&
11069 "Should be empty at the end of finishPendingActions");
11070 assert(PendingDeducedVarTypes.empty() &&
11071 "Should be empty at the end of finishPendingActions");
11072 assert(PendingDeclChains.empty() &&
11073 "Should be empty at the end of finishPendingActions");
11074 assert(PendingMacroIDs.empty() &&
11075 "Should be empty at the end of finishPendingActions");
11076 assert(PendingDeclContextInfos.empty() &&
11077 "Should be empty at the end of finishPendingActions");
11078 assert(PendingUpdateRecords.empty() &&
11079 "Should be empty at the end of finishPendingActions");
11080 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
11081 "Should be empty at the end of finishPendingActions");
11082 assert(PendingFakeDefinitionData.empty() &&
11083 "Should be empty at the end of finishPendingActions");
11084 assert(PendingDefinitions.empty() &&
11085 "Should be empty at the end of finishPendingActions");
11086 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
11087 "Should be empty at the end of finishPendingActions");
11088 assert(PendingBodies.empty() &&
11089 "Should be empty at the end of finishPendingActions");
11090 assert(PendingAddedClassMembers.empty() &&
11091 "Should be empty at the end of finishPendingActions");
11092 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
11093 "Should be empty at the end of finishPendingActions");
11094 assert(PendingIncompleteDeclChains.empty() &&
11095 "Should be empty at the end of finishPendingActions");
11098void ASTReader::diagnoseOdrViolations() {
11099 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
11100 PendingRecordOdrMergeFailures.empty() &&
11101 PendingFunctionOdrMergeFailures.empty() &&
11102 PendingEnumOdrMergeFailures.empty() &&
11103 PendingObjCInterfaceOdrMergeFailures.empty() &&
11104 PendingObjCProtocolOdrMergeFailures.empty())
11111 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
11112 PendingOdrMergeFailures.clear();
11113 for (
auto &Merge : OdrMergeFailures) {
11114 Merge.first->buildLookup();
11115 Merge.first->decls_begin();
11116 Merge.first->bases_begin();
11117 Merge.first->vbases_begin();
11118 for (
auto &RecordPair : Merge.second) {
11119 auto *RD = RecordPair.first;
11127 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
11128 PendingRecordOdrMergeFailures.clear();
11129 for (
auto &Merge : RecordOdrMergeFailures) {
11130 Merge.first->decls_begin();
11131 for (
auto &D : Merge.second)
11136 auto ObjCInterfaceOdrMergeFailures =
11137 std::move(PendingObjCInterfaceOdrMergeFailures);
11138 PendingObjCInterfaceOdrMergeFailures.clear();
11139 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11140 Merge.first->decls_begin();
11141 for (
auto &InterfacePair : Merge.second)
11142 InterfacePair.first->decls_begin();
11146 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11147 PendingFunctionOdrMergeFailures.clear();
11148 for (
auto &Merge : FunctionOdrMergeFailures) {
11149 Merge.first->buildLookup();
11150 Merge.first->decls_begin();
11151 Merge.first->getBody();
11152 for (
auto &FD : Merge.second) {
11160 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11161 PendingEnumOdrMergeFailures.clear();
11162 for (
auto &Merge : EnumOdrMergeFailures) {
11163 Merge.first->decls_begin();
11164 for (
auto &
Enum : Merge.second) {
11165 Enum->decls_begin();
11170 auto ObjCProtocolOdrMergeFailures =
11171 std::move(PendingObjCProtocolOdrMergeFailures);
11172 PendingObjCProtocolOdrMergeFailures.clear();
11173 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11174 Merge.first->decls_begin();
11175 for (
auto &ProtocolPair : Merge.second)
11176 ProtocolPair.first->decls_begin();
11185 while (!PendingOdrMergeChecks.empty()) {
11186 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11197 bool Found =
false;
11200 for (
auto *RI : D->
redecls()) {
11201 if (RI->getLexicalDeclContext() == CanonDef) {
11215 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11216 for (
auto *CanonMember : CanonDef->
decls()) {
11217 if (CanonMember->getCanonicalDecl() == DCanon) {
11226 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
11228 Candidates.push_back(ND);
11241 std::string CanonDefModule =
11246 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11248 if (Candidates.empty())
11250 diag::note_module_odr_violation_no_possible_decls) << D;
11252 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
11253 Diag(Candidates[I]->getLocation(),
11254 diag::note_module_odr_violation_possible_decl)
11258 DiagnosedOdrMergeFailures.insert(CanonDef);
11262 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11263 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11264 ObjCInterfaceOdrMergeFailures.empty() &&
11265 ObjCProtocolOdrMergeFailures.empty())
11268 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
11272 for (
auto &Merge : OdrMergeFailures) {
11275 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11278 bool Diagnosed =
false;
11279 CXXRecordDecl *FirstRecord = Merge.first;
11280 for (
auto &RecordPair : Merge.second) {
11281 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11282 RecordPair.second)) {
11295 Diag(Merge.first->getLocation(),
11296 diag::err_module_odr_violation_different_instantiations)
11303 for (
auto &Merge : RecordOdrMergeFailures) {
11306 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11309 RecordDecl *FirstRecord = Merge.first;
11310 bool Diagnosed =
false;
11311 for (
auto *SecondRecord : Merge.second) {
11312 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11318 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11322 for (
auto &Merge : FunctionOdrMergeFailures) {
11323 FunctionDecl *FirstFunction = Merge.first;
11324 bool Diagnosed =
false;
11325 for (
auto &SecondFunction : Merge.second) {
11326 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11332 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11336 for (
auto &Merge : EnumOdrMergeFailures) {
11339 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11342 EnumDecl *FirstEnum = Merge.first;
11343 bool Diagnosed =
false;
11344 for (
auto &SecondEnum : Merge.second) {
11345 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11351 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11354 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11357 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11360 bool Diagnosed =
false;
11361 ObjCInterfaceDecl *FirstID = Merge.first;
11362 for (
auto &InterfacePair : Merge.second) {
11363 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11364 InterfacePair.second)) {
11370 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11373 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11376 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11379 ObjCProtocolDecl *FirstProtocol = Merge.first;
11380 bool Diagnosed =
false;
11381 for (
auto &ProtocolPair : Merge.second) {
11382 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11383 ProtocolPair.second)) {
11389 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11394 if (llvm::Timer *
T = ReadTimer.get();
11395 ++NumCurrentElementsDeserializing == 1 &&
T)
11396 ReadTimeRegion.emplace(
T);
11400 assert(NumCurrentElementsDeserializing &&
11401 "FinishedDeserializing not paired with StartedDeserializing");
11402 if (NumCurrentElementsDeserializing == 1) {
11405 finishPendingActions();
11407 --NumCurrentElementsDeserializing;
11409 if (NumCurrentElementsDeserializing == 0) {
11413 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11421 while (!PendingExceptionSpecUpdates.empty() ||
11422 !PendingDeducedTypeUpdates.empty() ||
11423 !PendingUndeducedFunctionDecls.empty()) {
11424 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11425 PendingExceptionSpecUpdates.clear();
11426 for (
auto Update : ESUpdates) {
11427 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11430 if (
auto *Listener =
getContext().getASTMutationListener())
11432 for (
auto *Redecl :
Update.second->redecls())
11436 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11437 PendingDeducedTypeUpdates.clear();
11438 for (
auto Update : DTUpdates) {
11439 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11446 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11447 PendingUndeducedFunctionDecls.clear();
11451 (void)UndeducedFD->getMostRecentDecl();
11454 ReadTimeRegion.reset();
11456 diagnoseOdrViolations();
11462 PassInterestingDeclsToConsumer();
11469 auto It = PendingFakeLookupResults.find(II);
11470 if (It != PendingFakeLookupResults.end()) {
11471 for (
auto *ND : It->second)
11476 It->second.clear();
11480 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11481 SemaObj->TUScope->AddDecl(D);
11482 }
else if (SemaObj->TUScope) {
11486 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11487 SemaObj->TUScope->AddDecl(D);
11495 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11496 StringRef isysroot,
11498 bool AllowASTWithCompilerErrors,
11499 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11500 bool ForceValidateUserInputs,
11501 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11502 std::unique_ptr<llvm::Timer> ReadTimer)
11507 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11508 StackHandler(Diags), PP(PP), ContextObj(Context),
11509 CodeGenOpts(CodeGenOpts),
11511 PP.getHeaderSearchInfo()),
11512 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11513 DisableValidationKind(DisableValidationKind),
11514 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11515 AllowConfigurationMismatch(AllowConfigurationMismatch),
11516 ValidateSystemInputs(ValidateSystemInputs),
11517 ForceValidateUserInputs(ForceValidateUserInputs),
11518 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11519 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11520 SourceMgr.setExternalSLocEntrySource(
this);
11522 PathBuf.reserve(256);
11524 for (
const auto &Ext : Extensions) {
11525 auto BlockName = Ext->getExtensionMetadata().BlockName;
11526 auto Known = ModuleFileExtensions.find(BlockName);
11527 if (Known != ModuleFileExtensions.end()) {
11528 Diags.Report(diag::warn_duplicate_module_file_extension)
11533 ModuleFileExtensions.insert({BlockName, Ext});
11538 if (OwnsDeserializationListener)
11539 delete DeserializationListener;
11543 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11547 unsigned AbbrevID) {
11550 return Cursor.readRecord(AbbrevID, Record);
11566 : Record(Record), Context(Record.getContext()) {}
11567#define GEN_CLANG_CLAUSE_CLASS
11568#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11569#include "llvm/Frontend/OpenMP/OMP.inc"
11583 switch (llvm::omp::Clause(Record.readInt())) {
11584 case llvm::omp::OMPC_if:
11587 case llvm::omp::OMPC_final:
11590 case llvm::omp::OMPC_num_threads:
11593 case llvm::omp::OMPC_safelen:
11596 case llvm::omp::OMPC_simdlen:
11599 case llvm::omp::OMPC_sizes: {
11600 unsigned NumSizes = Record.readInt();
11604 case llvm::omp::OMPC_counts: {
11605 unsigned NumCounts = Record.readInt();
11609 case llvm::omp::OMPC_permutation: {
11610 unsigned NumLoops = Record.readInt();
11614 case llvm::omp::OMPC_full:
11617 case llvm::omp::OMPC_partial:
11620 case llvm::omp::OMPC_depth:
11623 case llvm::omp::OMPC_looprange:
11626 case llvm::omp::OMPC_allocator:
11629 case llvm::omp::OMPC_collapse:
11632 case llvm::omp::OMPC_default:
11635 case llvm::omp::OMPC_proc_bind:
11636 C =
new (Context) OMPProcBindClause();
11638 case llvm::omp::OMPC_schedule:
11639 C =
new (Context) OMPScheduleClause();
11641 case llvm::omp::OMPC_ordered:
11642 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11644 case llvm::omp::OMPC_nowait:
11645 C =
new (Context) OMPNowaitClause();
11647 case llvm::omp::OMPC_untied:
11648 C =
new (Context) OMPUntiedClause();
11650 case llvm::omp::OMPC_mergeable:
11651 C =
new (Context) OMPMergeableClause();
11653 case llvm::omp::OMPC_threadset:
11656 case llvm::omp::OMPC_transparent:
11657 C =
new (Context) OMPTransparentClause();
11659 case llvm::omp::OMPC_read:
11660 C =
new (Context) OMPReadClause();
11662 case llvm::omp::OMPC_write:
11663 C =
new (Context) OMPWriteClause();
11665 case llvm::omp::OMPC_update:
11666 C =
new (Context) OMPUpdateClause();
11668 case llvm::omp::OMPC_update_depend_objects:
11669 C = OMPUpdateDependObjectsClause::CreateEmpty(Context);
11671 case llvm::omp::OMPC_capture:
11672 C =
new (Context) OMPCaptureClause();
11674 case llvm::omp::OMPC_compare:
11675 C =
new (Context) OMPCompareClause();
11677 case llvm::omp::OMPC_fail:
11678 C =
new (Context) OMPFailClause();
11680 case llvm::omp::OMPC_seq_cst:
11681 C =
new (Context) OMPSeqCstClause();
11683 case llvm::omp::OMPC_acq_rel:
11684 C =
new (Context) OMPAcqRelClause();
11686 case llvm::omp::OMPC_absent: {
11687 unsigned NumKinds = Record.readInt();
11688 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11691 case llvm::omp::OMPC_holds:
11692 C =
new (Context) OMPHoldsClause();
11694 case llvm::omp::OMPC_contains: {
11695 unsigned NumKinds = Record.readInt();
11696 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11699 case llvm::omp::OMPC_no_openmp:
11700 C =
new (Context) OMPNoOpenMPClause();
11702 case llvm::omp::OMPC_no_openmp_routines:
11703 C =
new (Context) OMPNoOpenMPRoutinesClause();
11705 case llvm::omp::OMPC_no_openmp_constructs:
11706 C =
new (Context) OMPNoOpenMPConstructsClause();
11708 case llvm::omp::OMPC_no_parallelism:
11709 C =
new (Context) OMPNoParallelismClause();
11711 case llvm::omp::OMPC_acquire:
11712 C =
new (Context) OMPAcquireClause();
11714 case llvm::omp::OMPC_release:
11715 C =
new (Context) OMPReleaseClause();
11717 case llvm::omp::OMPC_relaxed:
11718 C =
new (Context) OMPRelaxedClause();
11720 case llvm::omp::OMPC_weak:
11721 C =
new (Context) OMPWeakClause();
11723 case llvm::omp::OMPC_threads:
11726 case llvm::omp::OMPC_simd:
11729 case llvm::omp::OMPC_nogroup:
11732 case llvm::omp::OMPC_unified_address:
11733 C =
new (Context) OMPUnifiedAddressClause();
11735 case llvm::omp::OMPC_unified_shared_memory:
11736 C =
new (Context) OMPUnifiedSharedMemoryClause();
11738 case llvm::omp::OMPC_reverse_offload:
11739 C =
new (Context) OMPReverseOffloadClause();
11741 case llvm::omp::OMPC_dynamic_allocators:
11742 C =
new (Context) OMPDynamicAllocatorsClause();
11744 case llvm::omp::OMPC_atomic_default_mem_order:
11745 C =
new (Context) OMPAtomicDefaultMemOrderClause();
11747 case llvm::omp::OMPC_self_maps:
11748 C =
new (Context) OMPSelfMapsClause();
11750 case llvm::omp::OMPC_at:
11751 C =
new (Context) OMPAtClause();
11753 case llvm::omp::OMPC_severity:
11754 C =
new (Context) OMPSeverityClause();
11756 case llvm::omp::OMPC_message:
11757 C =
new (Context) OMPMessageClause();
11759 case llvm::omp::OMPC_private:
11760 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11762 case llvm::omp::OMPC_firstprivate:
11763 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11765 case llvm::omp::OMPC_lastprivate:
11766 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11768 case llvm::omp::OMPC_shared:
11769 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11771 case llvm::omp::OMPC_reduction: {
11772 unsigned N = Record.readInt();
11774 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11777 case llvm::omp::OMPC_task_reduction:
11778 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11780 case llvm::omp::OMPC_in_reduction:
11781 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11783 case llvm::omp::OMPC_linear:
11784 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11786 case llvm::omp::OMPC_aligned:
11789 case llvm::omp::OMPC_copyin:
11792 case llvm::omp::OMPC_copyprivate:
11795 case llvm::omp::OMPC_flush:
11798 case llvm::omp::OMPC_depobj:
11801 case llvm::omp::OMPC_depend: {
11802 unsigned NumVars = Record.readInt();
11803 unsigned NumLoops = Record.readInt();
11807 case llvm::omp::OMPC_device:
11810 case llvm::omp::OMPC_map: {
11812 Sizes.
NumVars = Record.readInt();
11819 case llvm::omp::OMPC_num_teams:
11822 case llvm::omp::OMPC_thread_limit:
11825 case llvm::omp::OMPC_priority:
11828 case llvm::omp::OMPC_grainsize:
11831 case llvm::omp::OMPC_num_tasks:
11834 case llvm::omp::OMPC_hint:
11837 case llvm::omp::OMPC_dist_schedule:
11840 case llvm::omp::OMPC_defaultmap:
11843 case llvm::omp::OMPC_to: {
11845 Sizes.
NumVars = Record.readInt();
11852 case llvm::omp::OMPC_from: {
11854 Sizes.
NumVars = Record.readInt();
11861 case llvm::omp::OMPC_use_device_ptr: {
11863 Sizes.
NumVars = Record.readInt();
11870 case llvm::omp::OMPC_use_device_addr: {
11872 Sizes.
NumVars = Record.readInt();
11879 case llvm::omp::OMPC_is_device_ptr: {
11881 Sizes.
NumVars = Record.readInt();
11888 case llvm::omp::OMPC_has_device_addr: {
11890 Sizes.
NumVars = Record.readInt();
11897 case llvm::omp::OMPC_allocate:
11900 case llvm::omp::OMPC_nontemporal:
11903 case llvm::omp::OMPC_inclusive:
11906 case llvm::omp::OMPC_exclusive:
11909 case llvm::omp::OMPC_order:
11912 case llvm::omp::OMPC_init: {
11913 unsigned VarListSize = Record.readInt();
11914 unsigned NumAttrs = Record.readInt();
11919 case llvm::omp::OMPC_use:
11922 case llvm::omp::OMPC_destroy:
11925 case llvm::omp::OMPC_novariants:
11928 case llvm::omp::OMPC_nocontext:
11931 case llvm::omp::OMPC_detach:
11934 case llvm::omp::OMPC_uses_allocators:
11937 case llvm::omp::OMPC_affinity:
11940 case llvm::omp::OMPC_filter:
11943 case llvm::omp::OMPC_bind:
11946 case llvm::omp::OMPC_align:
11949 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11952 case llvm::omp::OMPC_dyn_groupprivate:
11955 case llvm::omp::OMPC_doacross: {
11956 unsigned NumVars = Record.readInt();
11957 unsigned NumLoops = Record.readInt();
11961 case llvm::omp::OMPC_ompx_attribute:
11964 case llvm::omp::OMPC_ompx_bare:
11967#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11968 case llvm::omp::Enum: \
11970#include "llvm/Frontend/OpenMP/OMPKinds.def"
11974 assert(
C &&
"Unknown OMPClause type");
11977 C->setLocStart(Record.readSourceLocation());
11978 C->setLocEnd(Record.readSourceLocation());
11984 C->setPreInitStmt(Record.readSubStmt(),
11990 C->setPostUpdateExpr(Record.readSubExpr());
11993void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11996 C->setNameModifierLoc(
Record.readSourceLocation());
11997 C->setColonLoc(
Record.readSourceLocation());
11998 C->setCondition(
Record.readSubExpr());
11999 C->setLParenLoc(
Record.readSourceLocation());
12004 C->setCondition(
Record.readSubExpr());
12005 C->setLParenLoc(
Record.readSourceLocation());
12009 C->setPrescriptivenessModifier(
12011 C->setPrescriptivenessModifierLoc(Record.readSourceLocation());
12013 C->setDimsModifierLoc(Record.readSourceLocation());
12014 C->setDimsModifierExpr(Record.readSubExpr());
12016 C->setLParenLoc(Record.readSourceLocation());
12017 unsigned NumVars =
C->varlist_size();
12018 SmallVector<Expr *, 16> Vars;
12019 Vars.reserve(NumVars);
12020 for (
unsigned I = 0; I != NumVars; ++I)
12021 Vars.push_back(Record.readSubExpr());
12022 C->setVarRefs(Vars);
12026 C->setSafelen(Record.readSubExpr());
12027 C->setLParenLoc(Record.readSourceLocation());
12031 C->setSimdlen(Record.readSubExpr());
12032 C->setLParenLoc(Record.readSourceLocation());
12036 for (Expr *&E :
C->getSizesRefs())
12037 E = Record.readSubExpr();
12038 C->setLParenLoc(Record.readSourceLocation());
12042 bool HasFill = Record.readBool();
12044 C->setOmpFillIndex(Record.readInt());
12045 C->setOmpFillLoc(Record.readSourceLocation());
12046 for (Expr *&E :
C->getCountsRefs())
12047 E = Record.readSubExpr();
12048 C->setLParenLoc(Record.readSourceLocation());
12052 for (Expr *&E :
C->getArgsRefs())
12053 E = Record.readSubExpr();
12054 C->setLParenLoc(Record.readSourceLocation());
12060 C->setFactor(Record.readSubExpr());
12061 C->setLParenLoc(Record.readSourceLocation());
12065 C->setDepth(Record.readSubExpr());
12066 C->setLParenLoc(Record.readSourceLocation());
12070 C->setFirst(Record.readSubExpr());
12071 C->setCount(Record.readSubExpr());
12072 C->setLParenLoc(Record.readSourceLocation());
12073 C->setFirstLoc(Record.readSourceLocation());
12074 C->setCountLoc(Record.readSourceLocation());
12078 C->setAllocator(Record.readExpr());
12079 C->setLParenLoc(Record.readSourceLocation());
12083 C->setNumForLoops(Record.readSubExpr());
12084 C->setLParenLoc(Record.readSourceLocation());
12088 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
12089 C->setLParenLoc(Record.readSourceLocation());
12090 C->setDefaultKindKwLoc(Record.readSourceLocation());
12091 C->setDefaultVariableCategory(
12093 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
12099 C->setLParenLoc(Record.readSourceLocation());
12100 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
12101 C->setThreadsetKindLoc(ThreadsetKindLoc);
12104 C->setThreadsetKind(TKind);
12107void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *
C) {
12108 C->setLParenLoc(Record.readSourceLocation());
12109 C->setImpexTypeKind(Record.readSubExpr());
12112void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *
C) {
12113 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
12114 C->setLParenLoc(Record.readSourceLocation());
12115 C->setProcBindKindKwLoc(Record.readSourceLocation());
12118void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *
C) {
12120 C->setScheduleKind(
12122 C->setFirstScheduleModifier(
12124 C->setSecondScheduleModifier(
12126 C->setChunkSize(Record.readSubExpr());
12127 C->setLParenLoc(Record.readSourceLocation());
12128 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
12129 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
12130 C->setScheduleKindLoc(Record.readSourceLocation());
12131 C->setCommaLoc(Record.readSourceLocation());
12134void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *
C) {
12135 C->setNumForLoops(Record.readSubExpr());
12136 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
12137 C->setLoopNumIterations(I, Record.readSubExpr());
12138 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
12139 C->setLoopCounter(I, Record.readSubExpr());
12140 C->setLParenLoc(Record.readSourceLocation());
12143void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *
C) {
12144 C->setEventHandler(Record.readSubExpr());
12145 C->setLParenLoc(Record.readSourceLocation());
12148void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *
C) {
12149 C->setCondition(Record.readSubExpr());
12150 C->setLParenLoc(Record.readSourceLocation());
12153void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12155void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12157void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12159void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12161void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {}
12163void OMPClauseReader::VisitOMPUpdateDependObjectsClause(
12164 OMPUpdateDependObjectsClause *
C) {
12165 C->setLParenLoc(Record.readSourceLocation());
12166 C->setArgumentLoc(Record.readSourceLocation());
12170void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12172void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12176void OMPClauseReader::VisitOMPFailClause(OMPFailClause *
C) {
12177 C->setLParenLoc(Record.readSourceLocation());
12178 SourceLocation FailParameterLoc = Record.readSourceLocation();
12179 C->setFailParameterLoc(FailParameterLoc);
12181 C->setFailParameter(CKind);
12184void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *
C) {
12185 unsigned Count =
C->getDirectiveKinds().size();
12186 C->setLParenLoc(Record.readSourceLocation());
12187 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12188 DKVec.reserve(Count);
12189 for (
unsigned I = 0; I < Count; I++) {
12192 C->setDirectiveKinds(DKVec);
12195void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *
C) {
12196 C->setExpr(Record.readExpr());
12197 C->setLParenLoc(Record.readSourceLocation());
12200void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *
C) {
12201 unsigned Count =
C->getDirectiveKinds().size();
12202 C->setLParenLoc(Record.readSourceLocation());
12203 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12204 DKVec.reserve(Count);
12205 for (
unsigned I = 0; I < Count; I++) {
12208 C->setDirectiveKinds(DKVec);
12211void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12213void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12214 OMPNoOpenMPRoutinesClause *) {}
12216void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12217 OMPNoOpenMPConstructsClause *) {}
12219void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12221void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12223void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12225void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12227void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12229void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12231void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12233void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12235void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12237void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12239void OMPClauseReader::VisitOMPInitClause(OMPInitClause *
C) {
12240 unsigned NumVars =
C->varlist_size();
12241 SmallVector<Expr *, 16> Vars;
12242 Vars.reserve(NumVars);
12243 for (
unsigned I = 0; I != NumVars; ++I)
12244 Vars.push_back(Record.readSubExpr());
12245 C->setVarRefs(Vars);
12246 C->setIsTarget(Record.readBool());
12247 C->setIsTargetSync(Record.readBool());
12248 C->setHasPreferAttrs(Record.readBool());
12250 unsigned NumPrefs =
C->varlist_size() - 1;
12251 SmallVector<unsigned, 4> Counts;
12252 SmallVector<Expr *, 8> Attrs;
12253 Counts.reserve(NumPrefs);
12254 for (
unsigned I = 0; I < NumPrefs; ++I) {
12255 unsigned NA = Record.readInt();
12256 Counts.push_back(NA);
12257 for (
unsigned J = 0; J < NA; ++J)
12258 Attrs.push_back(Record.readSubExpr());
12260 C->setAttrs(Counts, Attrs);
12262 C->setLParenLoc(Record.readSourceLocation());
12263 C->setVarLoc(Record.readSourceLocation());
12266void OMPClauseReader::VisitOMPUseClause(OMPUseClause *
C) {
12267 C->setInteropVar(Record.readSubExpr());
12268 C->setLParenLoc(Record.readSourceLocation());
12269 C->setVarLoc(Record.readSourceLocation());
12272void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *
C) {
12273 C->setInteropVar(Record.readSubExpr());
12274 C->setLParenLoc(Record.readSourceLocation());
12275 C->setVarLoc(Record.readSourceLocation());
12278void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
12280 C->setCondition(Record.readSubExpr());
12281 C->setLParenLoc(Record.readSourceLocation());
12284void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *
C) {
12286 C->setCondition(Record.readSubExpr());
12287 C->setLParenLoc(Record.readSourceLocation());
12290void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12292void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12293 OMPUnifiedSharedMemoryClause *) {}
12295void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12298OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12301void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12302 OMPAtomicDefaultMemOrderClause *
C) {
12303 C->setAtomicDefaultMemOrderKind(
12305 C->setLParenLoc(Record.readSourceLocation());
12306 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12309void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12311void OMPClauseReader::VisitOMPAtClause(OMPAtClause *
C) {
12313 C->setLParenLoc(Record.readSourceLocation());
12314 C->setAtKindKwLoc(Record.readSourceLocation());
12317void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *
C) {
12319 C->setLParenLoc(Record.readSourceLocation());
12320 C->setSeverityKindKwLoc(Record.readSourceLocation());
12323void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *
C) {
12325 C->setMessageString(Record.readSubExpr());
12326 C->setLParenLoc(Record.readSourceLocation());
12329void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *
C) {
12330 C->setLParenLoc(Record.readSourceLocation());
12331 unsigned NumVars =
C->varlist_size();
12332 SmallVector<Expr *, 16> Vars;
12333 Vars.reserve(NumVars);
12334 for (
unsigned i = 0; i != NumVars; ++i)
12335 Vars.push_back(Record.readSubExpr());
12336 C->setVarRefs(Vars);
12338 for (
unsigned i = 0; i != NumVars; ++i)
12339 Vars.push_back(Record.readSubExpr());
12340 C->setPrivateCopies(Vars);
12343void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
12345 C->setLParenLoc(Record.readSourceLocation());
12346 unsigned NumVars =
C->varlist_size();
12347 SmallVector<Expr *, 16> Vars;
12348 Vars.reserve(NumVars);
12349 for (
unsigned i = 0; i != NumVars; ++i)
12350 Vars.push_back(Record.readSubExpr());
12351 C->setVarRefs(Vars);
12353 for (
unsigned i = 0; i != NumVars; ++i)
12354 Vars.push_back(Record.readSubExpr());
12355 C->setPrivateCopies(Vars);
12357 for (
unsigned i = 0; i != NumVars; ++i)
12358 Vars.push_back(Record.readSubExpr());
12362void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
12364 C->setLParenLoc(Record.readSourceLocation());
12366 C->setKindLoc(Record.readSourceLocation());
12367 C->setColonLoc(Record.readSourceLocation());
12368 unsigned NumVars =
C->varlist_size();
12369 SmallVector<Expr *, 16> Vars;
12370 Vars.reserve(NumVars);
12371 for (
unsigned i = 0; i != NumVars; ++i)
12372 Vars.push_back(Record.readSubExpr());
12373 C->setVarRefs(Vars);
12375 for (
unsigned i = 0; i != NumVars; ++i)
12376 Vars.push_back(Record.readSubExpr());
12377 C->setPrivateCopies(Vars);
12379 for (
unsigned i = 0; i != NumVars; ++i)
12380 Vars.push_back(Record.readSubExpr());
12381 C->setSourceExprs(Vars);
12383 for (
unsigned i = 0; i != NumVars; ++i)
12384 Vars.push_back(Record.readSubExpr());
12385 C->setDestinationExprs(Vars);
12387 for (
unsigned i = 0; i != NumVars; ++i)
12388 Vars.push_back(Record.readSubExpr());
12389 C->setAssignmentOps(Vars);
12392void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *
C) {
12393 C->setLParenLoc(Record.readSourceLocation());
12394 unsigned NumVars =
C->varlist_size();
12395 SmallVector<Expr *, 16> Vars;
12396 Vars.reserve(NumVars);
12397 for (
unsigned i = 0; i != NumVars; ++i)
12398 Vars.push_back(Record.readSubExpr());
12399 C->setVarRefs(Vars);
12402void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *
C) {
12404 C->setLParenLoc(Record.readSourceLocation());
12405 C->setModifierLoc(Record.readSourceLocation());
12406 C->setColonLoc(Record.readSourceLocation());
12407 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12408 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12409 C->setQualifierLoc(NNSL);
12410 C->setNameInfo(DNI);
12412 unsigned NumVars =
C->varlist_size();
12413 SmallVector<Expr *, 16> Vars;
12414 Vars.reserve(NumVars);
12415 for (
unsigned i = 0; i != NumVars; ++i)
12416 Vars.push_back(Record.readSubExpr());
12417 C->setVarRefs(Vars);
12419 for (
unsigned i = 0; i != NumVars; ++i)
12420 Vars.push_back(Record.readSubExpr());
12421 C->setPrivates(Vars);
12423 for (
unsigned i = 0; i != NumVars; ++i)
12424 Vars.push_back(Record.readSubExpr());
12425 C->setLHSExprs(Vars);
12427 for (
unsigned i = 0; i != NumVars; ++i)
12428 Vars.push_back(Record.readSubExpr());
12429 C->setRHSExprs(Vars);
12431 for (
unsigned i = 0; i != NumVars; ++i)
12432 Vars.push_back(Record.readSubExpr());
12433 C->setReductionOps(Vars);
12434 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12436 for (
unsigned i = 0; i != NumVars; ++i)
12437 Vars.push_back(Record.readSubExpr());
12438 C->setInscanCopyOps(Vars);
12440 for (
unsigned i = 0; i != NumVars; ++i)
12441 Vars.push_back(Record.readSubExpr());
12442 C->setInscanCopyArrayTemps(Vars);
12444 for (
unsigned i = 0; i != NumVars; ++i)
12445 Vars.push_back(Record.readSubExpr());
12446 C->setInscanCopyArrayElems(Vars);
12448 unsigned NumFlags = Record.readInt();
12449 SmallVector<bool, 16> Flags;
12450 Flags.reserve(NumFlags);
12451 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12452 Flags.push_back(Record.readInt());
12453 C->setPrivateVariableReductionFlags(Flags);
12456void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
12458 C->setLParenLoc(Record.readSourceLocation());
12459 C->setColonLoc(Record.readSourceLocation());
12460 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12461 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12462 C->setQualifierLoc(NNSL);
12463 C->setNameInfo(DNI);
12465 unsigned NumVars =
C->varlist_size();
12466 SmallVector<Expr *, 16> Vars;
12467 Vars.reserve(NumVars);
12468 for (
unsigned I = 0; I != NumVars; ++I)
12469 Vars.push_back(Record.readSubExpr());
12470 C->setVarRefs(Vars);
12472 for (
unsigned I = 0; I != NumVars; ++I)
12473 Vars.push_back(Record.readSubExpr());
12474 C->setPrivates(Vars);
12476 for (
unsigned I = 0; I != NumVars; ++I)
12477 Vars.push_back(Record.readSubExpr());
12478 C->setLHSExprs(Vars);
12480 for (
unsigned I = 0; I != NumVars; ++I)
12481 Vars.push_back(Record.readSubExpr());
12482 C->setRHSExprs(Vars);
12484 for (
unsigned I = 0; I != NumVars; ++I)
12485 Vars.push_back(Record.readSubExpr());
12486 C->setReductionOps(Vars);
12489void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *
C) {
12491 C->setLParenLoc(Record.readSourceLocation());
12492 C->setColonLoc(Record.readSourceLocation());
12493 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12494 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12495 C->setQualifierLoc(NNSL);
12496 C->setNameInfo(DNI);
12498 unsigned NumVars =
C->varlist_size();
12499 SmallVector<Expr *, 16> Vars;
12500 Vars.reserve(NumVars);
12501 for (
unsigned I = 0; I != NumVars; ++I)
12502 Vars.push_back(Record.readSubExpr());
12503 C->setVarRefs(Vars);
12505 for (
unsigned I = 0; I != NumVars; ++I)
12506 Vars.push_back(Record.readSubExpr());
12507 C->setPrivates(Vars);
12509 for (
unsigned I = 0; I != NumVars; ++I)
12510 Vars.push_back(Record.readSubExpr());
12511 C->setLHSExprs(Vars);
12513 for (
unsigned I = 0; I != NumVars; ++I)
12514 Vars.push_back(Record.readSubExpr());
12515 C->setRHSExprs(Vars);
12517 for (
unsigned I = 0; I != NumVars; ++I)
12518 Vars.push_back(Record.readSubExpr());
12519 C->setReductionOps(Vars);
12521 for (
unsigned I = 0; I != NumVars; ++I)
12522 Vars.push_back(Record.readSubExpr());
12523 C->setTaskgroupDescriptors(Vars);
12526void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *
C) {
12528 C->setLParenLoc(Record.readSourceLocation());
12529 C->setColonLoc(Record.readSourceLocation());
12531 C->setModifierLoc(Record.readSourceLocation());
12532 unsigned NumVars =
C->varlist_size();
12533 SmallVector<Expr *, 16> Vars;
12534 Vars.reserve(NumVars);
12535 for (
unsigned i = 0; i != NumVars; ++i)
12536 Vars.push_back(Record.readSubExpr());
12537 C->setVarRefs(Vars);
12539 for (
unsigned i = 0; i != NumVars; ++i)
12540 Vars.push_back(Record.readSubExpr());
12541 C->setPrivates(Vars);
12543 for (
unsigned i = 0; i != NumVars; ++i)
12544 Vars.push_back(Record.readSubExpr());
12547 for (
unsigned i = 0; i != NumVars; ++i)
12548 Vars.push_back(Record.readSubExpr());
12549 C->setUpdates(Vars);
12551 for (
unsigned i = 0; i != NumVars; ++i)
12552 Vars.push_back(Record.readSubExpr());
12553 C->setFinals(Vars);
12554 C->setStep(Record.readSubExpr());
12555 C->setCalcStep(Record.readSubExpr());
12557 for (
unsigned I = 0; I != NumVars + 1; ++I)
12558 Vars.push_back(Record.readSubExpr());
12559 C->setUsedExprs(Vars);
12562void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *
C) {
12563 C->setLParenLoc(Record.readSourceLocation());
12564 C->setColonLoc(Record.readSourceLocation());
12565 unsigned NumVars =
C->varlist_size();
12566 SmallVector<Expr *, 16> Vars;
12567 Vars.reserve(NumVars);
12568 for (
unsigned i = 0; i != NumVars; ++i)
12569 Vars.push_back(Record.readSubExpr());
12570 C->setVarRefs(Vars);
12571 C->setAlignment(Record.readSubExpr());
12574void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *
C) {
12575 C->setLParenLoc(Record.readSourceLocation());
12576 unsigned NumVars =
C->varlist_size();
12577 SmallVector<Expr *, 16> Exprs;
12578 Exprs.reserve(NumVars);
12579 for (
unsigned i = 0; i != NumVars; ++i)
12580 Exprs.push_back(Record.readSubExpr());
12581 C->setVarRefs(Exprs);
12583 for (
unsigned i = 0; i != NumVars; ++i)
12584 Exprs.push_back(Record.readSubExpr());
12585 C->setSourceExprs(Exprs);
12587 for (
unsigned i = 0; i != NumVars; ++i)
12588 Exprs.push_back(Record.readSubExpr());
12589 C->setDestinationExprs(Exprs);
12591 for (
unsigned i = 0; i != NumVars; ++i)
12592 Exprs.push_back(Record.readSubExpr());
12593 C->setAssignmentOps(Exprs);
12596void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
12597 C->setLParenLoc(Record.readSourceLocation());
12598 unsigned NumVars =
C->varlist_size();
12599 SmallVector<Expr *, 16> Exprs;
12600 Exprs.reserve(NumVars);
12601 for (
unsigned i = 0; i != NumVars; ++i)
12602 Exprs.push_back(Record.readSubExpr());
12603 C->setVarRefs(Exprs);
12605 for (
unsigned i = 0; i != NumVars; ++i)
12606 Exprs.push_back(Record.readSubExpr());
12607 C->setSourceExprs(Exprs);
12609 for (
unsigned i = 0; i != NumVars; ++i)
12610 Exprs.push_back(Record.readSubExpr());
12611 C->setDestinationExprs(Exprs);
12613 for (
unsigned i = 0; i != NumVars; ++i)
12614 Exprs.push_back(Record.readSubExpr());
12615 C->setAssignmentOps(Exprs);
12618void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *
C) {
12619 C->setLParenLoc(Record.readSourceLocation());
12620 unsigned NumVars =
C->varlist_size();
12621 SmallVector<Expr *, 16> Vars;
12622 Vars.reserve(NumVars);
12623 for (
unsigned i = 0; i != NumVars; ++i)
12624 Vars.push_back(Record.readSubExpr());
12625 C->setVarRefs(Vars);
12628void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *
C) {
12629 C->setDepobj(Record.readSubExpr());
12630 C->setLParenLoc(Record.readSourceLocation());
12633void OMPClauseReader::VisitOMPDependClause(OMPDependClause *
C) {
12634 C->setLParenLoc(Record.readSourceLocation());
12635 C->setModifier(Record.readSubExpr());
12636 C->setDependencyKind(
12638 C->setDependencyLoc(Record.readSourceLocation());
12639 C->setColonLoc(Record.readSourceLocation());
12640 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12641 unsigned NumVars =
C->varlist_size();
12642 SmallVector<Expr *, 16> Vars;
12643 Vars.reserve(NumVars);
12644 for (
unsigned I = 0; I != NumVars; ++I)
12645 Vars.push_back(Record.readSubExpr());
12646 C->setVarRefs(Vars);
12647 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12648 C->setLoopData(I, Record.readSubExpr());
12651void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *
C) {
12654 C->setDevice(Record.readSubExpr());
12655 C->setModifierLoc(Record.readSourceLocation());
12656 C->setLParenLoc(Record.readSourceLocation());
12659void OMPClauseReader::VisitOMPMapClause(OMPMapClause *
C) {
12660 C->setLParenLoc(Record.readSourceLocation());
12661 bool HasIteratorModifier =
false;
12663 C->setMapTypeModifier(
12665 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12666 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12667 HasIteratorModifier =
true;
12669 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12670 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12673 C->setMapLoc(Record.readSourceLocation());
12674 C->setColonLoc(Record.readSourceLocation());
12675 auto NumVars =
C->varlist_size();
12676 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12677 auto TotalLists =
C->getTotalComponentListNum();
12678 auto TotalComponents =
C->getTotalComponentsNum();
12680 SmallVector<Expr *, 16> Vars;
12681 Vars.reserve(NumVars);
12682 for (
unsigned i = 0; i != NumVars; ++i)
12683 Vars.push_back(Record.readExpr());
12684 C->setVarRefs(Vars);
12686 SmallVector<Expr *, 16> UDMappers;
12687 UDMappers.reserve(NumVars);
12688 for (
unsigned I = 0; I < NumVars; ++I)
12689 UDMappers.push_back(Record.readExpr());
12690 C->setUDMapperRefs(UDMappers);
12692 if (HasIteratorModifier)
12693 C->setIteratorModifier(Record.readExpr());
12695 SmallVector<ValueDecl *, 16> Decls;
12696 Decls.reserve(UniqueDecls);
12697 for (
unsigned i = 0; i < UniqueDecls; ++i)
12698 Decls.push_back(Record.readDeclAs<ValueDecl>());
12699 C->setUniqueDecls(Decls);
12701 SmallVector<unsigned, 16> ListsPerDecl;
12702 ListsPerDecl.reserve(UniqueDecls);
12703 for (
unsigned i = 0; i < UniqueDecls; ++i)
12704 ListsPerDecl.push_back(Record.readInt());
12705 C->setDeclNumLists(ListsPerDecl);
12707 SmallVector<unsigned, 32> ListSizes;
12708 ListSizes.reserve(TotalLists);
12709 for (
unsigned i = 0; i < TotalLists; ++i)
12710 ListSizes.push_back(Record.readInt());
12711 C->setComponentListSizes(ListSizes);
12713 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12714 Components.reserve(TotalComponents);
12715 for (
unsigned i = 0; i < TotalComponents; ++i) {
12716 Expr *AssociatedExprPr = Record.readExpr();
12717 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12718 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12721 C->setComponents(Components, ListSizes);
12727 C->setLParenLoc(Record.readSourceLocation());
12728 C->setColonLoc(Record.readSourceLocation());
12729 C->setAllocator(Record.readSubExpr());
12730 C->setAlignment(Record.readSubExpr());
12731 unsigned NumVars =
C->varlist_size();
12732 SmallVector<Expr *, 16> Vars;
12733 Vars.reserve(NumVars);
12734 for (
unsigned i = 0; i != NumVars; ++i)
12735 Vars.push_back(Record.readSubExpr());
12736 C->setVarRefs(Vars);
12739void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
12741 C->setModifierLoc(Record.readSourceLocation());
12742 C->setModifierExpr(Record.readSubExpr());
12744 C->setLParenLoc(Record.readSourceLocation());
12745 unsigned NumVars =
C->varlist_size();
12746 SmallVector<Expr *, 16> Vars;
12747 Vars.reserve(NumVars);
12748 for (
unsigned I = 0; I != NumVars; ++I)
12749 Vars.push_back(Record.readSubExpr());
12750 C->setVarRefs(Vars);
12753void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
12755 C->setModifierLoc(Record.readSourceLocation());
12756 C->setModifierExpr(Record.readSubExpr());
12758 C->setLParenLoc(Record.readSourceLocation());
12759 unsigned NumVars =
C->varlist_size();
12760 SmallVector<Expr *, 16> Vars;
12761 Vars.reserve(NumVars);
12762 for (
unsigned I = 0; I != NumVars; ++I)
12763 Vars.push_back(Record.readSubExpr());
12764 C->setVarRefs(Vars);
12767void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *
C) {
12769 C->setPriority(Record.readSubExpr());
12770 C->setLParenLoc(Record.readSourceLocation());
12773void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
12776 C->setGrainsize(Record.readSubExpr());
12777 C->setModifierLoc(Record.readSourceLocation());
12778 C->setLParenLoc(Record.readSourceLocation());
12781void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
12784 C->setNumTasks(Record.readSubExpr());
12785 C->setModifierLoc(Record.readSourceLocation());
12786 C->setLParenLoc(Record.readSourceLocation());
12789void OMPClauseReader::VisitOMPHintClause(OMPHintClause *
C) {
12790 C->setHint(Record.readSubExpr());
12791 C->setLParenLoc(Record.readSourceLocation());
12794void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
12796 C->setDistScheduleKind(
12798 C->setChunkSize(Record.readSubExpr());
12799 C->setLParenLoc(Record.readSourceLocation());
12800 C->setDistScheduleKindLoc(Record.readSourceLocation());
12801 C->setCommaLoc(Record.readSourceLocation());
12804void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
12805 C->setDefaultmapKind(
12807 C->setDefaultmapModifier(
12809 C->setLParenLoc(Record.readSourceLocation());
12810 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12811 C->setDefaultmapKindLoc(Record.readSourceLocation());
12814void OMPClauseReader::VisitOMPToClause(OMPToClause *
C) {
12815 C->setLParenLoc(Record.readSourceLocation());
12817 C->setMotionModifier(
12819 C->setMotionModifierLoc(I, Record.readSourceLocation());
12820 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12821 C->setIteratorModifier(Record.readExpr());
12823 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12824 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12825 C->setColonLoc(Record.readSourceLocation());
12826 auto NumVars =
C->varlist_size();
12827 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12828 auto TotalLists =
C->getTotalComponentListNum();
12829 auto TotalComponents =
C->getTotalComponentsNum();
12831 SmallVector<Expr *, 16> Vars;
12832 Vars.reserve(NumVars);
12833 for (
unsigned i = 0; i != NumVars; ++i)
12834 Vars.push_back(Record.readSubExpr());
12835 C->setVarRefs(Vars);
12837 SmallVector<Expr *, 16> UDMappers;
12838 UDMappers.reserve(NumVars);
12839 for (
unsigned I = 0; I < NumVars; ++I)
12840 UDMappers.push_back(Record.readSubExpr());
12841 C->setUDMapperRefs(UDMappers);
12843 SmallVector<ValueDecl *, 16> Decls;
12844 Decls.reserve(UniqueDecls);
12845 for (
unsigned i = 0; i < UniqueDecls; ++i)
12846 Decls.push_back(Record.readDeclAs<ValueDecl>());
12847 C->setUniqueDecls(Decls);
12849 SmallVector<unsigned, 16> ListsPerDecl;
12850 ListsPerDecl.reserve(UniqueDecls);
12851 for (
unsigned i = 0; i < UniqueDecls; ++i)
12852 ListsPerDecl.push_back(Record.readInt());
12853 C->setDeclNumLists(ListsPerDecl);
12855 SmallVector<unsigned, 32> ListSizes;
12856 ListSizes.reserve(TotalLists);
12857 for (
unsigned i = 0; i < TotalLists; ++i)
12858 ListSizes.push_back(Record.readInt());
12859 C->setComponentListSizes(ListSizes);
12861 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12862 Components.reserve(TotalComponents);
12863 for (
unsigned i = 0; i < TotalComponents; ++i) {
12864 Expr *AssociatedExprPr = Record.readSubExpr();
12865 bool IsNonContiguous = Record.readBool();
12866 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12867 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12869 C->setComponents(Components, ListSizes);
12872void OMPClauseReader::VisitOMPFromClause(OMPFromClause *
C) {
12873 C->setLParenLoc(Record.readSourceLocation());
12875 C->setMotionModifier(
12877 C->setMotionModifierLoc(I, Record.readSourceLocation());
12878 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12879 C->setIteratorModifier(Record.readExpr());
12881 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12882 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12883 C->setColonLoc(Record.readSourceLocation());
12884 auto NumVars =
C->varlist_size();
12885 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12886 auto TotalLists =
C->getTotalComponentListNum();
12887 auto TotalComponents =
C->getTotalComponentsNum();
12889 SmallVector<Expr *, 16> Vars;
12890 Vars.reserve(NumVars);
12891 for (
unsigned i = 0; i != NumVars; ++i)
12892 Vars.push_back(Record.readSubExpr());
12893 C->setVarRefs(Vars);
12895 SmallVector<Expr *, 16> UDMappers;
12896 UDMappers.reserve(NumVars);
12897 for (
unsigned I = 0; I < NumVars; ++I)
12898 UDMappers.push_back(Record.readSubExpr());
12899 C->setUDMapperRefs(UDMappers);
12901 SmallVector<ValueDecl *, 16> Decls;
12902 Decls.reserve(UniqueDecls);
12903 for (
unsigned i = 0; i < UniqueDecls; ++i)
12904 Decls.push_back(Record.readDeclAs<ValueDecl>());
12905 C->setUniqueDecls(Decls);
12907 SmallVector<unsigned, 16> ListsPerDecl;
12908 ListsPerDecl.reserve(UniqueDecls);
12909 for (
unsigned i = 0; i < UniqueDecls; ++i)
12910 ListsPerDecl.push_back(Record.readInt());
12911 C->setDeclNumLists(ListsPerDecl);
12913 SmallVector<unsigned, 32> ListSizes;
12914 ListSizes.reserve(TotalLists);
12915 for (
unsigned i = 0; i < TotalLists; ++i)
12916 ListSizes.push_back(Record.readInt());
12917 C->setComponentListSizes(ListSizes);
12919 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12920 Components.reserve(TotalComponents);
12921 for (
unsigned i = 0; i < TotalComponents; ++i) {
12922 Expr *AssociatedExprPr = Record.readSubExpr();
12923 bool IsNonContiguous = Record.readBool();
12924 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12925 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12927 C->setComponents(Components, ListSizes);
12930void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
12931 C->setLParenLoc(Record.readSourceLocation());
12933 C->setFallbackModifierLoc(Record.readSourceLocation());
12934 auto NumVars =
C->varlist_size();
12935 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12936 auto TotalLists =
C->getTotalComponentListNum();
12937 auto TotalComponents =
C->getTotalComponentsNum();
12939 SmallVector<Expr *, 16> Vars;
12940 Vars.reserve(NumVars);
12941 for (
unsigned i = 0; i != NumVars; ++i)
12942 Vars.push_back(Record.readSubExpr());
12943 C->setVarRefs(Vars);
12945 for (
unsigned i = 0; i != NumVars; ++i)
12946 Vars.push_back(Record.readSubExpr());
12947 C->setPrivateCopies(Vars);
12949 for (
unsigned i = 0; i != NumVars; ++i)
12950 Vars.push_back(Record.readSubExpr());
12953 SmallVector<ValueDecl *, 16> Decls;
12954 Decls.reserve(UniqueDecls);
12955 for (
unsigned i = 0; i < UniqueDecls; ++i)
12956 Decls.push_back(Record.readDeclAs<ValueDecl>());
12957 C->setUniqueDecls(Decls);
12959 SmallVector<unsigned, 16> ListsPerDecl;
12960 ListsPerDecl.reserve(UniqueDecls);
12961 for (
unsigned i = 0; i < UniqueDecls; ++i)
12962 ListsPerDecl.push_back(Record.readInt());
12963 C->setDeclNumLists(ListsPerDecl);
12965 SmallVector<unsigned, 32> ListSizes;
12966 ListSizes.reserve(TotalLists);
12967 for (
unsigned i = 0; i < TotalLists; ++i)
12968 ListSizes.push_back(Record.readInt());
12969 C->setComponentListSizes(ListSizes);
12971 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12972 Components.reserve(TotalComponents);
12973 for (
unsigned i = 0; i < TotalComponents; ++i) {
12974 auto *AssociatedExprPr = Record.readSubExpr();
12975 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12976 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12979 C->setComponents(Components, ListSizes);
12982void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
12983 C->setLParenLoc(Record.readSourceLocation());
12984 auto NumVars =
C->varlist_size();
12985 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12986 auto TotalLists =
C->getTotalComponentListNum();
12987 auto TotalComponents =
C->getTotalComponentsNum();
12989 SmallVector<Expr *, 16> Vars;
12990 Vars.reserve(NumVars);
12991 for (
unsigned i = 0; i != NumVars; ++i)
12992 Vars.push_back(Record.readSubExpr());
12993 C->setVarRefs(Vars);
12995 SmallVector<ValueDecl *, 16> Decls;
12996 Decls.reserve(UniqueDecls);
12997 for (
unsigned i = 0; i < UniqueDecls; ++i)
12998 Decls.push_back(Record.readDeclAs<ValueDecl>());
12999 C->setUniqueDecls(Decls);
13001 SmallVector<unsigned, 16> ListsPerDecl;
13002 ListsPerDecl.reserve(UniqueDecls);
13003 for (
unsigned i = 0; i < UniqueDecls; ++i)
13004 ListsPerDecl.push_back(Record.readInt());
13005 C->setDeclNumLists(ListsPerDecl);
13007 SmallVector<unsigned, 32> ListSizes;
13008 ListSizes.reserve(TotalLists);
13009 for (
unsigned i = 0; i < TotalLists; ++i)
13010 ListSizes.push_back(Record.readInt());
13011 C->setComponentListSizes(ListSizes);
13013 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13014 Components.reserve(TotalComponents);
13015 for (
unsigned i = 0; i < TotalComponents; ++i) {
13016 Expr *AssociatedExpr = Record.readSubExpr();
13017 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13018 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13021 C->setComponents(Components, ListSizes);
13024void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
13025 C->setLParenLoc(Record.readSourceLocation());
13026 auto NumVars =
C->varlist_size();
13027 auto UniqueDecls =
C->getUniqueDeclarationsNum();
13028 auto TotalLists =
C->getTotalComponentListNum();
13029 auto TotalComponents =
C->getTotalComponentsNum();
13031 SmallVector<Expr *, 16> Vars;
13032 Vars.reserve(NumVars);
13033 for (
unsigned i = 0; i != NumVars; ++i)
13034 Vars.push_back(Record.readSubExpr());
13035 C->setVarRefs(Vars);
13038 SmallVector<ValueDecl *, 16> Decls;
13039 Decls.reserve(UniqueDecls);
13040 for (
unsigned i = 0; i < UniqueDecls; ++i)
13041 Decls.push_back(Record.readDeclAs<ValueDecl>());
13042 C->setUniqueDecls(Decls);
13044 SmallVector<unsigned, 16> ListsPerDecl;
13045 ListsPerDecl.reserve(UniqueDecls);
13046 for (
unsigned i = 0; i < UniqueDecls; ++i)
13047 ListsPerDecl.push_back(Record.readInt());
13048 C->setDeclNumLists(ListsPerDecl);
13050 SmallVector<unsigned, 32> ListSizes;
13051 ListSizes.reserve(TotalLists);
13052 for (
unsigned i = 0; i < TotalLists; ++i)
13053 ListSizes.push_back(Record.readInt());
13054 C->setComponentListSizes(ListSizes);
13056 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13057 Components.reserve(TotalComponents);
13058 for (
unsigned i = 0; i < TotalComponents; ++i) {
13059 Expr *AssociatedExpr = Record.readSubExpr();
13060 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13061 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13064 C->setComponents(Components, ListSizes);
13067void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
13068 C->setLParenLoc(Record.readSourceLocation());
13069 auto NumVars =
C->varlist_size();
13070 auto UniqueDecls =
C->getUniqueDeclarationsNum();
13071 auto TotalLists =
C->getTotalComponentListNum();
13072 auto TotalComponents =
C->getTotalComponentsNum();
13074 SmallVector<Expr *, 16> Vars;
13075 Vars.reserve(NumVars);
13076 for (
unsigned I = 0; I != NumVars; ++I)
13077 Vars.push_back(Record.readSubExpr());
13078 C->setVarRefs(Vars);
13081 SmallVector<ValueDecl *, 16> Decls;
13082 Decls.reserve(UniqueDecls);
13083 for (
unsigned I = 0; I < UniqueDecls; ++I)
13084 Decls.push_back(Record.readDeclAs<ValueDecl>());
13085 C->setUniqueDecls(Decls);
13087 SmallVector<unsigned, 16> ListsPerDecl;
13088 ListsPerDecl.reserve(UniqueDecls);
13089 for (
unsigned I = 0; I < UniqueDecls; ++I)
13090 ListsPerDecl.push_back(Record.readInt());
13091 C->setDeclNumLists(ListsPerDecl);
13093 SmallVector<unsigned, 32> ListSizes;
13094 ListSizes.reserve(TotalLists);
13095 for (
unsigned i = 0; i < TotalLists; ++i)
13096 ListSizes.push_back(Record.readInt());
13097 C->setComponentListSizes(ListSizes);
13099 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13100 Components.reserve(TotalComponents);
13101 for (
unsigned I = 0; I < TotalComponents; ++I) {
13102 Expr *AssociatedExpr = Record.readSubExpr();
13103 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13104 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13107 C->setComponents(Components, ListSizes);
13110void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
13111 C->setLParenLoc(Record.readSourceLocation());
13112 unsigned NumVars =
C->varlist_size();
13113 SmallVector<Expr *, 16> Vars;
13114 Vars.reserve(NumVars);
13115 for (
unsigned i = 0; i != NumVars; ++i)
13116 Vars.push_back(Record.readSubExpr());
13117 C->setVarRefs(Vars);
13119 Vars.reserve(NumVars);
13120 for (
unsigned i = 0; i != NumVars; ++i)
13121 Vars.push_back(Record.readSubExpr());
13122 C->setPrivateRefs(Vars);
13125void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
13126 C->setLParenLoc(Record.readSourceLocation());
13127 unsigned NumVars =
C->varlist_size();
13128 SmallVector<Expr *, 16> Vars;
13129 Vars.reserve(NumVars);
13130 for (
unsigned i = 0; i != NumVars; ++i)
13131 Vars.push_back(Record.readSubExpr());
13132 C->setVarRefs(Vars);
13135void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
13136 C->setLParenLoc(Record.readSourceLocation());
13137 unsigned NumVars =
C->varlist_size();
13138 SmallVector<Expr *, 16> Vars;
13139 Vars.reserve(NumVars);
13140 for (
unsigned i = 0; i != NumVars; ++i)
13141 Vars.push_back(Record.readSubExpr());
13142 C->setVarRefs(Vars);
13145void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
13146 C->setLParenLoc(Record.readSourceLocation());
13147 unsigned NumOfAllocators =
C->getNumberOfAllocators();
13148 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
13149 Data.reserve(NumOfAllocators);
13150 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
13151 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
13154 D.
LParenLoc = Record.readSourceLocation();
13155 D.
RParenLoc = Record.readSourceLocation();
13157 C->setAllocatorsData(
Data);
13160void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *
C) {
13161 C->setLParenLoc(Record.readSourceLocation());
13162 C->setModifier(Record.readSubExpr());
13163 C->setColonLoc(Record.readSourceLocation());
13164 unsigned NumOfLocators =
C->varlist_size();
13165 SmallVector<Expr *, 4> Locators;
13166 Locators.reserve(NumOfLocators);
13167 for (
unsigned I = 0; I != NumOfLocators; ++I)
13168 Locators.push_back(Record.readSubExpr());
13169 C->setVarRefs(Locators);
13172void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *
C) {
13175 C->setLParenLoc(Record.readSourceLocation());
13176 C->setKindKwLoc(Record.readSourceLocation());
13177 C->setModifierKwLoc(Record.readSourceLocation());
13180void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *
C) {
13182 C->setThreadID(Record.readSubExpr());
13183 C->setLParenLoc(Record.readSourceLocation());
13186void OMPClauseReader::VisitOMPBindClause(OMPBindClause *
C) {
13188 C->setLParenLoc(Record.readSourceLocation());
13189 C->setBindKindLoc(Record.readSourceLocation());
13193 C->setAlignment(Record.readExpr());
13194 C->setLParenLoc(Record.readSourceLocation());
13197void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
13199 C->setSize(Record.readSubExpr());
13200 C->setLParenLoc(Record.readSourceLocation());
13203void OMPClauseReader::VisitOMPDynGroupprivateClause(
13204 OMPDynGroupprivateClause *
C) {
13206 C->setDynGroupprivateModifier(
13208 C->setDynGroupprivateFallbackModifier(
13210 C->setSize(Record.readSubExpr());
13211 C->setLParenLoc(Record.readSourceLocation());
13212 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13213 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13216void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
13217 C->setLParenLoc(Record.readSourceLocation());
13218 C->setDependenceType(
13220 C->setDependenceLoc(Record.readSourceLocation());
13221 C->setColonLoc(Record.readSourceLocation());
13222 unsigned NumVars =
C->varlist_size();
13223 SmallVector<Expr *, 16> Vars;
13224 Vars.reserve(NumVars);
13225 for (
unsigned I = 0; I != NumVars; ++I)
13226 Vars.push_back(Record.readSubExpr());
13227 C->setVarRefs(Vars);
13228 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
13229 C->setLoopData(I, Record.readSubExpr());
13232void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
13234 Record.readAttributes(Attrs);
13235 C->setAttrs(Attrs);
13236 C->setLocStart(Record.readSourceLocation());
13237 C->setLParenLoc(Record.readSourceLocation());
13238 C->setLocEnd(Record.readSourceLocation());
13241void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *
C) {}
13251 Selector.ScoreOrCondition =
nullptr;
13253 Selector.ScoreOrCondition = readExprRef();
13265 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13270 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
13272 Data->setClauses(Clauses);
13273 if (
Data->hasAssociatedStmt())
13275 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
13280 unsigned NumVars =
readInt();
13282 for (
unsigned I = 0; I < NumVars; ++I)
13288 unsigned NumExprs =
readInt();
13290 for (
unsigned I = 0; I < NumExprs; ++I)
13300 switch (ClauseKind) {
13315 bool isConditionExprClause =
readBool();
13316 if (isConditionExprClause) {
13321 unsigned NumVars =
readInt();
13323 for (
unsigned I = 0; I < NumVars; ++I)
13330 unsigned NumClauses =
readInt();
13332 for (
unsigned I = 0; I < NumClauses; ++I)
13366 for (
unsigned I = 0; I < VarList.size(); ++I) {
13369 RecipeList.push_back({Alloca});
13373 VarList, RecipeList, EndLoc);
13391 for (
unsigned I = 0; I < VarList.size(); ++I) {
13395 RecipeList.push_back({Recipe, RecipeTemp});
13399 VarList, RecipeList, EndLoc);
13450 LParenLoc, ModList, VarList, EndLoc);
13459 LParenLoc, ModList, VarList, EndLoc);
13468 LParenLoc, ModList, VarList, EndLoc);
13477 LParenLoc, ModList, VarList, EndLoc);
13483 AsyncExpr, EndLoc);
13491 DevNumExpr, QueuesLoc, QueueIdExprs,
13498 unsigned NumArchs =
readInt();
13500 for (
unsigned I = 0; I < NumArchs; ++I) {
13503 Archs.emplace_back(Loc, Ident);
13507 LParenLoc, Archs, EndLoc);
13515 for (
unsigned I = 0; I < VarList.size(); ++I) {
13519 3 *
sizeof(
int *));
13522 unsigned NumCombiners =
readInt();
13523 for (
unsigned I = 0; I < NumCombiners; ++I) {
13528 Combiners.push_back({LHS, RHS, Op});
13531 RecipeList.push_back({Recipe, Combiners});
13535 VarList, RecipeList, EndLoc);
13554 HasForce, LoopCount, EndLoc);
13558 unsigned NumClauses =
readInt();
13560 for (
unsigned I = 0; I < NumClauses; ++I)
13563 SizeExprs, EndLoc);
13567 unsigned NumExprs =
readInt();
13570 for (
unsigned I = 0; I < NumExprs; ++I) {
13576 GangKinds, Exprs, EndLoc);
13582 WorkerExpr, EndLoc);
13588 VectorExpr, EndLoc);
13600 LParenLoc, VarList, EndLoc);
13614 llvm_unreachable(
"Clause serialization not yet implemented");
13616 llvm_unreachable(
"Invalid Clause Kind");
13621 for (
unsigned I = 0; I < Clauses.size(); ++I)
13626 unsigned NumVars =
readInt();
13627 A->Clauses.resize(NumVars);
13634 llvm::FoldingSetNodeID ID;
13635 ID.AddString(PrimaryModuleName);
13636 return ID.computeStableHash();
13641 return std::nullopt;
13644 return std::nullopt;
13647 return std::nullopt;
Defines the clang::ASTContext interface.
static unsigned moduleKindForDiagnostic(ModuleKind Kind)
static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, ASTConsumer *Consumer)
Under non-PCH compilation the consumer receives the objc methods before receiving the implementation,...
static bool checkCodegenOptions(const CodeGenOptions &CGOpts, const CodeGenOptions &ExistingCGOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream)
Whether Stream doesn't start with the AST file magic number 'CPCH'.
static std::vector< std::string > accumulateFeaturesAsWritten(std::vector< std::string > FeaturesAsWritten)
static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionValueMismatch(DiagnosticsEngine *Diags, StringRef Description, StringRef ModuleFilename)
static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags)
static std::pair< bool, bool > wasValidatedInBuildSession(const ModuleFile &MF, const HeaderSearchOptions &HSOpts)
Returns {build-session validation applies, MF was validated this session}.
static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID)
static void collectMacroDefinitions(const PreprocessorOptions &PPOpts, MacroDefinitionsMap &Macros, SmallVectorImpl< StringRef > *MacroNames=nullptr)
Collect the macro definitions provided by the given preprocessor options.
static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II, bool IsModule)
static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method)
Move the given method to the back of the global list of methods.
static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps)
static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)
Whether the given identifier is "interesting".
static bool parseModuleFileExtensionMetadata(const SmallVectorImpl< uint64_t > &Record, StringRef Blob, ModuleFileExtensionMetadata &Metadata)
Parse a record and blob containing module file extension metadata.
static Module * getTopImportImplicitModule(ModuleManager &ModuleMgr, Preprocessor &PP)
Return the top import module if it is implicit, nullptr otherwise.
static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename, bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr, std::string &SuggestedPredefines, const LangOptions &LangOpts, OptionValidation Validation=OptionValidateContradictions)
Check the preprocessor options deserialized from the control block against the preprocessor options i...
static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionFlagMismatch(DiagnosticsEngine *Diags, StringRef Description, bool SerializedValue, bool CurrentValue, StringRef ModuleFilename)
static void addMethodsToPool(Sema &S, ArrayRef< ObjCMethodDecl * > Methods, ObjCMethodList &List)
Add the given set of methods to the method list.
static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool IsSystem, bool SystemHeaderWarningsInModule, bool Complain)
static bool isPredefinedType(serialization::TypeID ID)
static bool readBit(unsigned &Bits)
static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool Complain)
static std::optional< Type::TypeClass > getTypeClassForCode(TypeCode code)
static std::pair< unsigned, unsigned > readULEBKeyDataLength(const unsigned char *&P)
Read ULEB-encoded key length and data length.
static unsigned getStableHashForModuleName(StringRef PrimaryModuleName)
static LLVM_DUMP_METHOD void dumpModuleIDMap(StringRef Name, const ContinuousRangeMap< Key, ModuleFile *, InitialCapacity > &Map)
@ OptionValidateStrictMatches
@ OptionValidateContradictions
static bool checkTargetOptions(const TargetOptions &TargetOpts, const TargetOptions &ExistingTargetOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of target options against an existing set of target options.
static bool checkLanguageOptions(const LangOptions &LangOpts, const LangOptions &ExistingLangOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of language options against an existing set of language options.
static std::pair< StringRef, StringRef > getUnresolvedInputFilenames(const ASTReader::RecordData &Record, const StringRef InputBlob)
#define CHECK_TARGET_OPT(Field, Name)
static ASTFileSignature readASTFileSignature(StringRef PCH)
Reads and return the signature record from PCH's control block, or else returns 0.
static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID)
Given a cursor at the start of an AST file, scan ahead and drop the cursor into the start of the give...
static unsigned getIndexForTypeID(serialization::TypeID ID)
static uint64_t readULEB(const unsigned char *&P)
static bool checkModuleCachePath(FileManager &FileMgr, StringRef ContextHash, StringRef ExistingSpecificModuleCachePath, StringRef ASTFilename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, const HeaderSearchOptions &ASTFileHSOpts)
Check that the specified and the existing module cache paths are equivalent.
Defines the clang::ASTSourceDescriptor class, which abstracts clang modules and precompiled header fi...
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines the Diagnostic-related interfaces.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the Diagnostic IDs-related interfaces.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::FileManager interface and associated types.
Defines the clang::FileSystemOptions interface.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
Defines some OpenACC-specific enums and functions.
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
Defines an enumeration for C++ overloaded operators.
Defines the clang::Preprocessor interface.
Defines the clang::SanitizerKind enum.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to RISC-V.
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.
This represents 'bind' clause in the 'pragma omp ...' directives.
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.
This represents implicit clause 'depobj' for the 'pragma omp depobj' directive. This clause does not ...
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 NumPrefs, unsigned NumAttrs)
Creates an empty clause sized for NumPrefs pref-specs and NumAttrs total attr() exprs across them.
static OMPIsDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPMapClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars original expressions, NumUniqueDeclarations declar...
This represents 'nocontext' clause in the 'pragma omp ...' directive.
This represents 'nogroup' clause in the 'pragma omp ...' directive.
static OMPNontemporalClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'novariants' clause in the 'pragma omp ...' directive.
This represents 'num_tasks' clause in the 'pragma omp ...' directive.
static OMPNumTeamsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'order' clause in the 'pragma omp ...' directive.
This represents 'priority' clause in the 'pragma omp ...' directive.
This represents 'simd' clause in the 'pragma omp ...' directive.
static OMPThreadLimitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'threads' clause in the 'pragma omp ...' directive.
static OMPToClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
This represents the 'use' clause in 'pragma omp ...' directives.
static OMPUseDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPUseDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPUsesAllocatorsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N allocators.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the 'pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the 'pragma omp target ...' directive.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
virtual void HandleInterestingDecl(DeclGroupRef D)
HandleInterestingDecl - Handle the specified interesting declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
const clang::PrintingPolicy & getPrintingPolicy() const
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
ASTIdentifierIterator(const ASTReader &Reader, bool SkipModules=false)
StringRef Next() override
Retrieve the next string in the identifier table and advances the iterator for the following string.
Abstract interface for callback invocations by the ASTReader.
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain)
Receives the header search options.
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
virtual void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported)
This is called for each AST file loaded.
virtual ~ASTReaderListener()
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
virtual void ReadModuleName(StringRef ModuleName)
virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value)
Receives COUNTER value.
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the codegen options.
Reads an AST files chain containing the contents of a translation unit.
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const
Retrieve the global submodule ID given a module and its local ID number.
ExtKind hasExternalDefinitions(const Decl *D) override
IdentifierTable & getIdentifierTable()
Retrieve the identifier table associated with the preprocessor.
ModuleManager & getModuleManager()
Retrieve the module manager.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallPtrSetImpl< const TypedefNameDecl * > &Decls) override
Read the set of potentially unused typedefs known to the source.
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx)
void ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector< Decl *, 4 > &Decls) override
Read the set of decls to be checked for deferred diags.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
@ ARR_VersionMismatch
The client can handle an AST file that cannot load because it was built with a different version of C...
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &Exprs) override
void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls) override
Get the decls that are contained in a file in the Offset/Length range.
std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record, unsigned &Idx, StringRef &Blob)
SourceRange ReadSkippedRange(unsigned Index) override
Read a preallocated skipped range from the external source.
serialization::TypeID getGlobalTypeID(ModuleFile &F, serialization::LocalTypeID LocalID) const
Map a local type ID within a given AST file into a global type ID.
void dump()
Dump information about the AST reader to standard error.
MacroInfo * ReadMacroRecord(ModuleFile &F, uint64_t Offset)
Reads the macro record located at the given offset.
SmallVector< std::pair< llvm::BitstreamCursor, serialization::ModuleFile * >, 8 > CommentsCursors
Cursors for comments blocks.
Selector getLocalSelector(ModuleFile &M, unsigned LocalID)
Retrieve a selector from the given module with its local ID number.
void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Decls) override
Read all of the declarations lexically stored in a declaration context.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
std::optional< ASTSourceDescriptor > getSourceDescriptor(unsigned ID) override
Return a descriptor for the corresponding module.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ReadExtnameUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, AsmLabelAttr * > > &ExtnameIDs) override
Read the set of pragma redefine_extname'd, undeclared identifiers known to the external Sema source.
void ClearSwitchCaseIDs()
void SetGloballyVisibleDecls(IdentifierInfo *II, const SmallVectorImpl< GlobalDeclID > &DeclIDs, SmallVectorImpl< Decl * > *Decls=nullptr)
Set the globally-visible declarations associated with the given identifier.
serialization::ModuleKind ModuleKind
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility, SourceLocation ImportLoc)
Make the entities in the given module and any of its (non-explicit) submodules visible to name lookup...
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a source range.
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
ASTReadResult ReadASTCore(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, ModuleFile *ImportedBy, SmallVectorImpl< ImportedModule > &Loaded, off_t ExpectedSize, time_t ExpectedModTime, ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities)
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
static std::string ResolveImportedPathAndAllocate(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx, StringRef &Blob)
CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
Read the contents of a CXXCtorInitializer array.
void visitInputFileInfos(serialization::ModuleFile &MF, bool IncludeSystem, llvm::function_ref< void(const serialization::InputFileInfo &IFI, bool IsSystem)> Visitor)
Visit all the input file infos of the given module file.
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo)
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs) override
Read the set of tentative definitions known to the external Sema source.
Decl * GetExternalDecl(GlobalDeclID ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
serialization::MacroID ReadMacroID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a macro ID from the given position in a record in the given module.
GlobalDeclID ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a declaration ID from the given position in a record in the given module.
llvm::Expected< SourceLocation::UIntTy > readSLocOffset(ModuleFile *F, unsigned Index)
Try to read the offset of the SLocEntry at the given index in the given module file.
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
friend class PCHValidator
friend class serialization::ReadMethodPoolVisitor
void CompleteRedeclChain(const Decl *D) override
If any redeclarations of D have been imported since it was last checked, this digs out those redeclar...
SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile, SourceLocation Loc) const
Translate a source location from another module file's source location space into ours.
static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID, uint64_t *StartOfBlockOffset=nullptr)
ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the specified cursor.
void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II)
std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range) override
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
IdentifierInfo * get(StringRef Name) override
Retrieve the IdentifierInfo for the named identifier.
IdentifierInfo * getLocalIdentifier(ModuleFile &M, uint64_t LocalID)
void visitInputFiles(serialization::ModuleFile &MF, bool IncludeSystem, bool Complain, llvm::function_ref< void(const serialization::InputFile &IF, bool isSystem)> Visitor)
Visit all the input files of the given module file.
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
llvm::iterator_range< ModuleDeclIterator > getModuleFileLevelDecls(ModuleFile &Mod)
Stmt * GetExternalDeclStmt(uint64_t Offset) override
Resolve the offset of a statement into a statement.
Selector GetExternalSelector(serialization::SelectorID ID) override
Resolve a selector ID into a selector.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
MacroInfo * getMacro(serialization::MacroID ID)
Retrieve the macro with the given ID.
void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined) override
Load the set of used but not defined functions or variables with internal linkage,...
void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls) override
Read the set of delegating constructors known to the external Sema source.
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
void addPendingMacro(IdentifierInfo *II, ModuleFile *M, uint32_t MacroDirectivesOffset)
Add a macro to deserialize its macro directive history.
static std::pair< SourceLocation::UIntTy, SourceLocationEncoding::Chain > ReadSourceLocationOffset(const RecordDataImpl &Record, unsigned Idx, SourceLocation::UIntTy InitialDelta)
Read a source location offset from Record at Idx, returning it together with a chain anchored at that...
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.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
Module * getSubmodule(uint32_t GlobalID) override
Retrieve the submodule that corresponds to a global submodule ID.
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
SmallVector< GlobalDeclID, 16 > PreloadedDeclIDs
std::pair< SourceLocation, StringRef > getModuleImportLoc(int ID) override
Retrieve the module import location and module name for the given source manager entry ID.
void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls) override
Read the set of unused file-scope declarations known to the external Sema source.
void ReadReferencedSelectors(SmallVectorImpl< std::pair< Selector, SourceLocation > > &Sels) override
Read the set of referenced selectors known to the external Sema source.
Selector DecodeSelector(serialization::SelectorID Idx)
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
friend class serialization::reader::ASTIdentifierLookupTrait
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
Decl * getKeyDeclaration(Decl *D)
Returns the first key declaration for the given declaration.
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC) override
Finds all the visible declarations with a given name.
static std::pair< SourceLocation::UIntTy, SourceLocationEncoding::Chain > ReadEntryOffset(const RecordDataImpl &Record)
Read an SLocEntry record's first field, returning it together with a chain anchored at that entry.
IdentifierInfo * DecodeIdentifierInfo(serialization::IdentifierID ID)
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
@ Success
The control block was read successfully.
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
@ Failure
The AST file itself appears corrupted.
@ VersionMismatch
The AST file was written by a different version of Clang.
@ HadErrors
The AST file has errors.
@ Missing
The AST file was missing.
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx)
Reads a token out of a record.
SwitchCase * getSwitchCaseWithID(unsigned ID)
Retrieve the switch-case statement with the given ID.
serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID)
FileID TranslateFileID(ModuleFile &F, FileID FID) const
Translate a FileID from another module file's FileID space into ours.
void ReadLateParsedTemplates(llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > &LPTMap) override
Read the set of late parsed template functions for this source.
IdentifierIterator * getIdentifiers() override
Retrieve an iterator into the set of all identifiers in all loaded AST files.
void ReadUsedVTables(SmallVectorImpl< ExternalVTableUse > &VTables) override
Read the set of used vtables known to the external Sema source.
bool isGlobalIndexUnavailable() const
Determine whether we tried to load the global index, but failed, e.g., because it is out-of-date or d...
uint32_t GetNumExternalSelectors() override
Returns the number of selectors known to the external AST source.
static TemporarilyOwnedStringRef ResolveImportedPath(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
void updateOutOfDateSelector(Selector Sel) override
Load the contents of the global method pool for a given selector if necessary.
Decl * GetExistingDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration.
static llvm::BitVector ReadBitVector(const RecordData &Record, const StringRef Blob)
ModuleFile * getLocalModuleFile(ModuleFile &M, unsigned ID) const
Retrieve the module file with a given local ID within the specified ModuleFile.
ASTReader(Preprocessor &PP, ModuleCache &ModCache, ASTContext *Context, const PCHContainerReader &PCHContainerRdr, const CodeGenOptions &CodeGenOpts, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, StringRef isysroot="", DisableValidationForModuleKind DisableValidationKind=DisableValidationForModuleKind::None, bool AllowASTWithCompilerErrors=false, bool AllowConfigurationMismatch=false, bool ValidateSystemInputs=false, bool ForceValidateUserInputs=true, bool ValidateASTInputFilesContent=false, bool UseGlobalIndex=true, std::unique_ptr< llvm::Timer > ReadTimer={})
Load the AST file and validate its contents against the given Preprocessor.
void LoadSelector(Selector Sel)
Load a selector from disk, registering its ID if it exists.
void ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag)
void makeNamesVisible(const HiddenNames &Names, Module *Owner)
Make the names within this set of hidden names visible.
void UpdateSema()
Update the state of Sema after loading some additional modules.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Decl * GetLocalDecl(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override
Get the index ID for the loaded SourceLocation offset.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
void ReadPendingInstantiations(SmallVectorImpl< std::pair< ValueDecl *, SourceLocation > > &Pending) override
Read the set of pending instantiations known to the external Sema source.
Preprocessor & getPreprocessor() const
Retrieve the preprocessor.
serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)
Get the loaded specializations lookup tables for D, if any.
CXXTemporary * ReadCXXTemporary(ModuleFile &F, const RecordData &Record, unsigned &Idx)
void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces) override
Load the set of namespaces that are known to the external source, which will be used during typo corr...
void PrintStats() override
Print some statistics about AST usage.
static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts, const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, bool RequireStrictOptionMatches=false)
Determine whether the given AST file is acceptable to load into a translation unit with the given lan...
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
serialization::SelectorID getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const
Retrieve the global selector ID that corresponds to this the local selector ID in a given module.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
SmallVector< uint64_t, 64 > RecordData
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
serialization::MacroID getGlobalMacroID(ModuleFile &M, serialization::MacroID LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
FileManager & getFileManager() const
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
ASTReadResult ReadAST(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::ModuleFile ModuleFile
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, serialization::PreprocessedEntityID LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
void setKWLoc(SourceLocation Loc)
Attr - This represents one attribute.
void setAttr(const Attr *A)
void setConceptReference(ConceptReference *CR)
void setRParenLoc(SourceLocation Loc)
void setCaretLoc(SourceLocation Loc)
void setWrittenTypeSpec(TypeSpecifierType written)
bool needsExtraLocalData() const
void setModeAttr(bool written)
void setBuiltinLoc(SourceLocation Loc)
void setWrittenWidthSpec(TypeSpecifierWidth written)
void setWrittenSignSpec(TypeSpecifierSign written)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
void setSourceOrder(int Pos)
Set the source order of this initializer.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
base_class_iterator bases_begin()
base_class_iterator vbases_begin()
Represents a C++ temporary.
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule) override
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported) override
This is called for each AST file loaded.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A reference to a concept and its template args, as it appears in the code.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateName NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
A map from continuous integer ranges to some value, with a very specialized interface.
void insertOrReplace(const value_type &Val)
typename Representation::iterator iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool hasExternalVisibleStorage() const
Whether this DeclContext has external storage containing additional declarations that are visible in ...
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void setMustBuildLookupTable()
Mark that there are external lexical declarations that we need to include in our lookup table (and th...
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
bool isDeclInLexicalTraversal(const Decl *D) const
Determine whether the given declaration is stored in the list of declarations lexically within this c...
decl_iterator decls_begin() const
unsigned getModuleFileIndex() const
DeclID getRawValue() const
unsigned getLocalDeclIndex() const
uint64_t DeclID
An ID number that refers to a declaration in an AST file.
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Kind
Lists the kind of concrete classes of Decl.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
SourceLocation getLocation() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
GlobalDeclID getGlobalID() const
Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
static DeclarationNameLoc makeCXXLiteralOperatorNameLoc(SourceLocation Loc)
Construct location information for a literal C++ operator.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NameKind
The kind of the name stored in this DeclarationName.
@ CXXConversionFunctionName
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
void setRParenLoc(SourceLocation Loc)
void setDecltypeLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setTemplateNameLoc(SourceLocation Loc)
void setAttrNameLoc(SourceLocation loc)
void setAttrOperandParensRange(SourceRange range)
void setAttrExprOperand(Expr *e)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
A little helper class used to produce diagnostics.
bool wasUpgradedFromWarning() const
Whether this mapping attempted to map the diagnostic to a warning, but was overruled because the diag...
bool isErrorOrFatal() const
void setSeverity(diag::Severity Value)
static DiagnosticMapping deserialize(unsigned Bits)
Deserialize a mapping.
void setUpgradedFromWarning(bool Value)
Options for controlling the compiler diagnostics engine.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > SystemHeaderWarningsModules
The list of -Wsystem-headers-in-module=... options used to override whether -Wsystem-headers is enabl...
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
bool getEnableAllWarnings() const
Level
The level of the diagnostic, after it has been through mapping.
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
bool getSuppressSystemWarnings() const
bool getWarningsAsErrors() const
diag::Severity getExtensionHandlingBehavior() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
StringRef getName() const
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
This represents one expression.
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl * > Decls)
uint32_t incrementGeneration(ASTContext &C)
Increment the current generation.
uint32_t getGeneration() const
Get the current generation of this AST source.
Represents difference between two FPOptions values.
static FPOptionsOverride getFromOpaqueInt(storage_type I)
FPOptions applyOverrides(FPOptions Base)
static FPOptions getFromOpaqueInt(storage_type Value)
Represents a member of a struct/union/class.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
time_t getModificationTime() const
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
FileEntryRef getVirtualFileRef(StringRef Filename, off_t Size, time_t ModificationTime)
Retrieve a file entry for a "virtual" file that acts as if there were a file with the given name on d...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true, bool IsText=true)
Get a FileEntryRef if it exists, without doing anything on error.
Keeps track of options that affect how file operations are performed.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
Wrapper for source info for functions.
unsigned getNumParams() const
void setLocalRangeBegin(SourceLocation L)
void setLParenLoc(SourceLocation Loc)
void setParam(unsigned i, ParmVarDecl *VD)
void setRParenLoc(SourceLocation Loc)
void setLocalRangeEnd(SourceLocation L)
void setExceptionSpecRange(SourceRange R)
llvm::SmallPtrSet< ModuleFile *, 4 > HitSet
A set of module files in which we found a result.
static std::pair< GlobalModuleIndex *, llvm::Error > readIndex(llvm::StringRef Path)
Read a global index file for the given directory.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isCPlusPlusOperatorKeyword() const
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
bool isPoisoned() const
Return true if this token has been poisoned.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
tok::NotableIdentifierKind getNotableIdentifierID() const
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
void setObjCOrBuiltinID(unsigned ID)
void revertTokenIDToIdentifier()
Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2 compatibility.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
void * getFETokenInfo() const
Get and set FETokenInfo.
StringRef getName() const
Return the actual identifier string.
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
An iterator that walks over all of the known identifiers in the lookup table.
IdentifierIterator()=default
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
Implements an efficient mapping from strings to IdentifierInfo nodes.
llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename, off_t &Size, time_t &ModTime) const
Get a pointer to the PCM if it exists and set Size and ModTime to its on-disk size and modification t...
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
Represents a field injected from an anonymous union/struct into the parent scope.
Wrapper for source info for injected class names of class templates.
void setAmpLoc(SourceLocation Loc)
PragmaMSPointersToMembersKind
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
LangStandard::Kind LangStd
The used language standard.
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 std::optional< bool > isDirectoryInvalidated(StringRef Directory)
Whether the build system reported that Directory changed before the build session started,...
virtual InMemoryModuleCache & getInMemoryModuleCache()=0
Returns this process's view of the module cache.
Deduplication key for a loaded module file in ModuleManager.
Identifies a module file to be loaded.
bool empty() const
Checks whether the module file name is empty.
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
static ModuleFileName makeInMemory(StringRef Name)
Creates a file name for an in-memory module.
StringRef str() const
Returns the plain module file name.
static ModuleFileName makeFromRaw(StringRef Name, unsigned RawKind)
Creates a file name from the raw kind value.
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella header of the given module to the given header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false, SourceLocation Loc=SourceLocation())
Adds this header to the given module.
OptionalFileEntryRef findUmbrellaHeaderForModule(Module *M, std::string NameAsWritten, SmallVectorImpl< char > &RelativePathName)
Find the FileEntry for an umbrella header in a module as if it was written in the module map as a hea...
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella directory of the given module to the given directory.
llvm::DenseSet< FileEntryRef > AdditionalModMapsSet
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
ModuleHeaderRole
Flags describing the role of a module header.
Reference to a module that consists of either an existing/materialized Module object,...
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
void addRequirement(StringRef Feature, bool RequiredState, const LangOptions &LangOpts, const TargetInfo &Target)
Add the given feature requirement to the list of features required by this module.
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
NameVisibilityKind
Describes the visibility of the various names within a particular module.
@ Hidden
All of the names in this module are hidden.
@ AllVisible
All of the names in this module are visible.
const ModuleFileKey * getASTFileKey() const
The serialized AST file key for this module, if one was created.
SourceLocation DefinitionLoc
The location of the module definition.
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
ModuleKind Kind
The kind of this module.
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
bool isUnimportable() const
Determine whether this module has been declared unimportable.
void setASTFileNameAndKey(ModuleFileName NewName, ModuleFileKey NewKey)
Set the serialized module file for the top-level module of this module.
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
std::string Name
The name of this module.
const ModuleFileName * getASTFileName() const
The serialized AST file name for this module, if one was created.
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
OptionalDirectoryEntryRef Directory
The build directory of this module.
llvm::SmallVector< ModuleRef, 2 > AffectingClangModules
The set of top-level modules that affected the compilation of this module, but were not imported.
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
ASTFileSignature Signature
The module signature.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
unsigned IsAvailable
Whether this module is available in the current translation unit.
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
void addSubmodule(StringRef Name, Module *Submodule)
Add a child submodule.
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
std::vector< Conflict > Conflicts
The list of conflicts.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Represent a C++ namespace.
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
static std::string getOwningModuleNameForDiagnostic(const Decl *D)
Get the best name we know for the module that owns the given declaration, or an empty string if the d...
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'allocate' in the 'pragma omp ...' directives.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'allocator' clause in the 'pragma omp ...' directive.
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C)
OMPClauseReader(ASTRecordReader &Record)
void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C)
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This is a basic class for representing single OpenMP clause.
This represents 'collapse' clause in the 'pragma omp ...' directive.
This represents the 'counts' clause in the 'pragma omp split' directive.
static OMPCountsClause * CreateEmpty(const ASTContext &C, unsigned NumCounts)
Build an empty 'counts' AST node for deserialization.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents the 'depth' clause on the 'pragma omp flatten' (and 'pragma omp fuse') loop-transform...
This represents 'final' clause in the 'pragma omp ...' directive.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
This represents 'if' clause in the 'pragma omp ...' directive.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
static OMPNumThreadsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N expressions.
Representation of the 'partial' clause of the 'pragma omp unroll' directive.
This class represents the 'permutation' clause in the 'pragma omp interchange' directive.
static OMPPermutationClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty 'permutation' AST node for deserialization.
This represents 'safelen' clause in the 'pragma omp ...' directive.
This represents 'simdlen' clause in the 'pragma omp ...' directive.
This represents the 'sizes' clause in the 'pragma omp tile' directive.
static OMPSizesClause * CreateEmpty(const ASTContext &C, unsigned NumSizes)
Build an empty 'sizes' AST node for deserialization.
This represents 'threadset' clause in the 'pragma omp task ...' directive.
method_range methods() const
void setNameLoc(SourceLocation Loc)
void setNameEndLoc(SourceLocation Loc)
ObjCMethodDecl - Represents an instance or class method declaration.
bool hasBody() const override
Determine whether this method has a body.
void setLazyBody(uint64_t Offset)
void setStarLoc(SourceLocation Loc)
void setTypeArgsRAngleLoc(SourceLocation Loc)
unsigned getNumTypeArgs() const
unsigned getNumProtocols() const
void setTypeArgsLAngleLoc(SourceLocation Loc)
void setTypeArgTInfo(unsigned i, TypeSourceInfo *TInfo)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
void setHasBaseTypeAsWritten(bool HasBaseType)
void setProtocolLoc(unsigned i, SourceLocation Loc)
The basic abstraction for the target Objective-C runtime.
Kind
The basic Objective-C runtimes that we know about.
unsigned getNumProtocols() const
void setProtocolLoc(unsigned i, SourceLocation Loc)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
static OpenACCAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCAttachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCAutoClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
This is the base type for all OpenACC Clauses.
static OpenACCCollapseClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, bool HasForce, Expr *LoopCount, SourceLocation EndLoc)
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDefaultAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDefaultClause * Create(const ASTContext &C, OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static OpenACCDeleteClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDetachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceNumClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCFinalizeClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCFirstPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCFirstPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCGangClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< OpenACCGangKind > GangKinds, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCHostClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCIfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCIfPresentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCIndependentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoCreateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCNumGangsClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCNumWorkersClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCReductionClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCReductionOperator Operator, ArrayRef< Expr * > VarList, ArrayRef< OpenACCReductionRecipeWithStorage > Recipes, SourceLocation EndLoc)
static OpenACCSelfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCTileClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > SizeExprs, SourceLocation EndLoc)
static OpenACCUseDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCVectorLengthClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWaitClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef< Expr * > QueueIdExprs, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
void setAttrLoc(SourceLocation loc)
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void setEllipsisLoc(SourceLocation Loc)
void setEllipsisLoc(SourceLocation Loc)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
Represents a parameter to a function.
void setKWLoc(SourceLocation Loc)
void setStarLoc(SourceLocation Loc)
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
std::string PCHThroughHeader
If non-empty, the filename used in an include directive in the primary source file (or command-line p...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool AllowPCHWithDifferentModulesCachePath
When true, a PCH with modules cache path different to the current compilation will not be rejected.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
HeaderSearch & getHeaderSearchInfo() const
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
@ FastWidth
The width of the "fast" qualifier mask.
@ FastMask
The fast qualifier mask.
void setAmpAmpLoc(SourceLocation Loc)
Wrapper for source info for record types.
Declaration of a redeclarable template.
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.
A delta encoder for a run of source locations.
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.
bool isFileOverridden(const FileEntry *File) const
Returns true if the file contents have been overridden.
SourceLocation getFileLoc(SourceLocation Loc) const
Given Loc, if it is a macro location return the expansion location or the spelling location,...
OptionalFileEntryRef bypassFileContentsOverride(FileEntryRef File)
Bypass the overridden contents of a file.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
One instance of this struct is kept for every file loaded or used.
OptionalFileEntryRef ContentsEntry
References the file which the contents were actually loaded from.
std::optional< llvm::MemoryBufferRef > getBufferIfLoaded() const
Return the buffer, only if it has been loaded.
unsigned BufferOverridden
Indicates whether the buffer itself was provided to override the actual file contents.
OptionalFileEntryRef OrigEntry
Reference to the file entry representing this ContentCache.
Information about a FileID, basically just the logical file that it represents and include stack info...
void setHasLineDirectives()
Set the flag that indicates that this FileID has line table entries associated with it.
Stmt - This represents one statement.
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string ABI
If given, the name of the target ABI to use.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
A convenient class for passing around template argument information.
Location wrapper for a TemplateArgument.
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
ArgKind
The kind of template argument we're storing.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
unsigned getNumArgs() const
MutableArrayRef< TemplateArgumentLocInfo > getArgLocInfos()
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, SourceLocation NameLoc, SourceLocation LAngleLoc, SourceLocation RAngleLoc)
Token - This structure provides full information about a lexed token.
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
TypeLocReader(ASTRecordReader &Reader)
void VisitArrayTypeLoc(ArrayTypeLoc)
void VisitFunctionTypeLoc(FunctionTypeLoc)
void VisitTagTypeLoc(TagTypeLoc TL)
RetTy Visit(TypeLoc TyLoc)
Base wrapper for a particular "section" of type source info.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
void setUnmodifiedTInfo(TypeSourceInfo *TI) const
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
void setLParenLoc(SourceLocation Loc)
void setTypeofLoc(SourceLocation Loc)
void setRParenLoc(SourceLocation Loc)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
void setNameLoc(SourceLocation Loc)
Captures information about a #pragma weak directive.
@ Missing
The module file is missing.
@ OutOfDate
The module file is out-of-date.
@ NewlyLoaded
The module file was just loaded in response to this call.
@ None
State at construction.
@ AlreadyLoaded
The module file had already been loaded.
Source location and bit offset of a declaration.
A key used when looking up entities by DeclarationName.
unsigned getHash() const
Compute a fingerprint of this key for use in on-disk hash table.
DeclarationNameKey()=default
Information about a module that has been loaded by the ASTReader.
const PPEntityOffset * PreprocessedEntityOffsets
void * IdentifierLookupTable
A pointer to an on-disk hash table of opaque type IdentifierHashTable.
void * SelectorLookupTable
A pointer to an on-disk hash table of opaque type ASTSelectorLookupTable.
std::vector< std::unique_ptr< ModuleFileExtensionReader > > ExtensionReaders
The list of extension readers that are attached to this module file.
SourceLocation DirectImportLoc
The source location where the module was explicitly or implicitly imported in the local translation u...
StringRef Data
The serialized bitstream data for this file.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
uint64_t SubmodulesOffsetBase
Absolute offset of the start of the submodules block.
int SLocEntryBaseID
The base ID in the source manager's view of this module.
std::vector< std::string > DirectoryDependencies
Directories this module file depends on the listing of.
ModuleFileKey FileKey
The key ModuleManager used for the module file.
serialization::IdentifierID BaseIdentifierID
Base identifier ID for identifiers local to this module.
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
const llvm::support::unaligned_uint64_t * SubmoduleOffsets
Relative offsets for all submodule entries in the AST file.
const unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
llvm::BitstreamCursor SubmodulesCursor
The cursor to the start of the submodules block.
uint64_t SLocEntryOffsetsBase
Base file offset for the offsets in SLocEntryOffsets.
llvm::BitstreamCursor InputFilesCursor
The cursor to the start of the input-files block.
std::vector< InputFile > InputFilesLoaded
The input files that have been loaded from this AST file.
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
llvm::SetVector< ModuleFile * > ImportedBy
List of modules which depend on this module.
const char * HeaderFileInfoTableData
Actual data for the on-disk hash table of header file information.
SourceLocation ImportLoc
The source location where this module was first imported.
const serialization::unaligned_decl_id_t * FileSortedDecls
Array of file-level DeclIDs sorted by file.
const uint32_t * SLocEntryOffsets
Offsets for all of the source location entries in the AST file.
llvm::BitstreamCursor MacroCursor
The cursor to the start of the preprocessor block, which stores all of the macro definitions.
FileID OriginalSourceFileID
The file ID for the original source file that was used to build this AST file.
time_t ModTime
Modification of the module file.
std::string ActualOriginalSourceFileName
The actual original source file name that was used to build this AST file.
uint64_t PreprocessorDetailStartOffset
The offset of the start of the preprocessor detail cursor.
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
unsigned LocalNumSubmodules
The number of submodules in this module.
SourceLocation FirstLoc
The first source location in this module.
unsigned LocalTopLevelSubmoduleID
Local submodule ID of the top-level module.
ASTFileSignature ASTBlockHash
The signature of the AST block of the module file, this can be used to unique module files based on A...
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
std::string OriginalSourceFileName
The original source file name that was used to build the primary AST file, which may have been modifi...
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
bool HasTimestamps
Whether timestamps are included in this module file.
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
unsigned NumPreprocessedEntities
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
unsigned NumFileSortedDecls
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
unsigned Index
The index of this module in the list of modules.
unsigned NumUserInputFiles
llvm::BitstreamCursor Stream
The main bitstream cursor for the main block.
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
uint64_t SizeInBits
The size of this file, in bits.
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
bool StandardCXXModule
Whether this module file is a standard C++ module.
unsigned LocalNumTypes
The number of types in this AST file.
StringRef ModuleOffsetMap
The module offset map data for this file.
const PPSkippedRange * PreprocessedSkippedRangeOffsets
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
bool isDirectlyImported() const
Determine whether this module was directly imported at any point during translation.
std::string ModuleMapPath
unsigned LocalBaseSubmoduleID
Base submodule ID for submodules local to this module within its own address space.
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
unsigned LocalNumMacros
The number of macros in this AST file.
unsigned NumPreprocessedSkippedRanges
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
InputFilesValidation InputFilesValidationStatus
Captures the high-level result of validating input files.
unsigned Generation
The generation of which this module file is a part.
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
ModuleFileName FileName
The file name of the module file.
ContinuousRangeMap< uint32_t, int, 2 > SubmoduleRemap
Remapping table for submodule IDs in this module.
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
unsigned LocalNumSelectors
The number of selectors new to this file.
ModuleKind Kind
The type of this module.
std::string ModuleName
The name of the module.
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
std::string BaseDirectory
The base directory of the module.
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Manages the set of modules loaded by an AST reader.
llvm::iterator_range< SmallVectorImpl< ModuleFile * >::const_iterator > pch_modules() const
A range covering the PCH and preamble module files loaded.
ModuleReverseIterator rbegin()
Reverse iterator to traverse all loaded modules.
unsigned size() const
Number of modules loaded.
Source range/offset of a preprocessed entity.
uint32_t getOffset() const
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
Source range of a skipped preprocessor region.
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
unsigned getFactoryBits() const
ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, unsigned PriorGeneration)
ArrayRef< ObjCMethodDecl * > getInstanceMethods() const
Retrieve the instance methods found by this visitor.
ArrayRef< ObjCMethodDecl * > getFactoryMethods() const
Retrieve the instance methods found by this visitor.
bool instanceHasMoreThanOneDecl() const
bool operator()(ModuleFile &M)
bool factoryHasMoreThanOneDecl() const
unsigned getInstanceBits() const
static TypeIdx fromTypeID(TypeID ID)
32 aligned uint64_t in the AST file.
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
void ReadDataIntoImpl(const unsigned char *d, unsigned DataLen, data_type_builder &Val)
file_type ReadFileRef(const unsigned char *&d)
DeclarationNameKey ReadKeyBase(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
DeclarationNameKey internal_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(const internal_key_type &a)
StringRef internal_key_type
static internal_key_type ReadKey(const unsigned char *d, unsigned n)
Class that performs lookup for an identifier stored in an AST file.
IdentifierID ReadIdentifierID(const unsigned char *d)
data_type ReadData(const internal_key_type &k, const unsigned char *d, unsigned DataLen)
Class that performs lookup for a selector's entries in the global method pool stored in an AST file.
internal_key_type ReadKey(const unsigned char *d, unsigned)
data_type ReadData(Selector, const unsigned char *d, unsigned DataLen)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(Selector Sel)
external_key_type internal_key_type
Class that performs lookup to specialized decls.
file_type ReadFileRef(const unsigned char *&d)
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
unsigned internal_key_type
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
std::pair< DeclarationName, const Module * > external_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
std::pair< DeclarationNameKey, unsigned > internal_key_type
internal_key_type ReadKey(const unsigned char *d, unsigned)
static hash_value_type ComputeHash(const internal_key_type &Key)
static internal_key_type GetInternalKey(const external_key_type &Key)
PredefinedTypeIDs
Predefined type IDs.
CtorInitializerType
The different kinds of data that can occur in a CtorInitializer.
const unsigned NUM_PREDEF_TYPE_IDS
The number of predefined type IDs that are reserved for the PREDEF_TYPE_* constants.
const unsigned NumSpecialTypeIDs
The number of special type IDs.
TypeCode
Record codes for each kind of type.
@ PREDEF_TYPE_LONG_ACCUM_ID
The 'long _Accum' type.
@ PREDEF_TYPE_SAMPLER_ID
OpenCL sampler type.
@ PREDEF_TYPE_INT128_ID
The '__int128_t' type.
@ PREDEF_TYPE_CHAR32_ID
The C++ 'char32_t' type.
@ PREDEF_TYPE_SAT_SHORT_ACCUM_ID
The '_Sat short _Accum' type.
@ PREDEF_TYPE_IBM128_ID
The '__ibm128' type.
@ PREDEF_TYPE_SHORT_FRACT_ID
The 'short _Fract' type.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_BOUND_MEMBER
The placeholder type for bound member functions.
@ PREDEF_TYPE_LONGLONG_ID
The (signed) 'long long' type.
@ PREDEF_TYPE_FRACT_ID
The '_Fract' type.
@ PREDEF_TYPE_ARC_UNBRIDGED_CAST
ARC's unbridged-cast placeholder type.
@ PREDEF_TYPE_USHORT_FRACT_ID
The 'unsigned short _Fract' type.
@ PREDEF_TYPE_SAT_ULONG_FRACT_ID
The '_Sat unsigned long _Fract' type.
@ PREDEF_TYPE_BOOL_ID
The 'bool' or '_Bool' type.
@ PREDEF_TYPE_SAT_LONG_ACCUM_ID
The '_Sat long _Accum' type.
@ PREDEF_TYPE_SAT_LONG_FRACT_ID
The '_Sat long _Fract' type.
@ PREDEF_TYPE_SAT_SHORT_FRACT_ID
The '_Sat short _Fract' type.
@ PREDEF_TYPE_CHAR_U_ID
The 'char' type, when it is unsigned.
@ PREDEF_TYPE_RESERVE_ID_ID
OpenCL reserve_id type.
@ PREDEF_TYPE_SAT_ACCUM_ID
The '_Sat _Accum' type.
@ PREDEF_TYPE_BUILTIN_FN
The placeholder type for builtin functions.
@ PREDEF_TYPE_SHORT_ACCUM_ID
The 'short _Accum' type.
@ PREDEF_TYPE_FLOAT_ID
The 'float' type.
@ PREDEF_TYPE_QUEUE_ID
OpenCL queue type.
@ PREDEF_TYPE_INT_ID
The (signed) 'int' type.
@ PREDEF_TYPE_OBJC_SEL
The ObjC 'SEL' type.
@ PREDEF_TYPE_BFLOAT16_ID
The '__bf16' type.
@ PREDEF_TYPE_WCHAR_ID
The C++ 'wchar_t' type.
@ PREDEF_TYPE_UCHAR_ID
The 'unsigned char' type.
@ PREDEF_TYPE_UACCUM_ID
The 'unsigned _Accum' type.
@ PREDEF_TYPE_SCHAR_ID
The 'signed char' type.
@ PREDEF_TYPE_CHAR_S_ID
The 'char' type, when it is signed.
@ PREDEF_TYPE_NULLPTR_ID
The type of 'nullptr'.
@ PREDEF_TYPE_ULONG_FRACT_ID
The 'unsigned long _Fract' type.
@ PREDEF_TYPE_FLOAT16_ID
The '_Float16' type.
@ PREDEF_TYPE_UINT_ID
The 'unsigned int' type.
@ PREDEF_TYPE_FLOAT128_ID
The '__float128' type.
@ PREDEF_TYPE_OBJC_ID
The ObjC 'id' type.
@ PREDEF_TYPE_CHAR16_ID
The C++ 'char16_t' type.
@ PREDEF_TYPE_ARRAY_SECTION
The placeholder type for an array section.
@ PREDEF_TYPE_ULONGLONG_ID
The 'unsigned long long' type.
@ PREDEF_TYPE_SAT_UFRACT_ID
The '_Sat unsigned _Fract' type.
@ PREDEF_TYPE_USHORT_ID
The 'unsigned short' type.
@ PREDEF_TYPE_SHORT_ID
The (signed) 'short' type.
@ PREDEF_TYPE_OMP_ARRAY_SHAPING
The placeholder type for OpenMP array shaping operation.
@ PREDEF_TYPE_DEPENDENT_ID
The placeholder type for dependent types.
@ PREDEF_TYPE_LONGDOUBLE_ID
The 'long double' type.
@ PREDEF_TYPE_DOUBLE_ID
The 'double' type.
@ PREDEF_TYPE_UINT128_ID
The '__uint128_t' type.
@ PREDEF_TYPE_HALF_ID
The OpenCL 'half' / ARM NEON __fp16 type.
@ PREDEF_TYPE_VOID_ID
The void type.
@ PREDEF_TYPE_SAT_USHORT_FRACT_ID
The '_Sat unsigned short _Fract' type.
@ PREDEF_TYPE_META_INFO_ID
C++26 std::meta::info type.
@ PREDEF_TYPE_ACCUM_ID
The '_Accum' type.
@ PREDEF_TYPE_SAT_FRACT_ID
The '_Sat _Fract' type.
@ PREDEF_TYPE_NULL_ID
The NULL type.
@ PREDEF_TYPE_USHORT_ACCUM_ID
The 'unsigned short _Accum' type.
@ PREDEF_TYPE_CHAR8_ID
The C++ 'char8_t' type.
@ PREDEF_TYPE_UFRACT_ID
The 'unsigned _Fract' type.
@ PREDEF_TYPE_OVERLOAD_ID
The placeholder type for overloaded function sets.
@ PREDEF_TYPE_INCOMPLETE_MATRIX_IDX
A placeholder type for incomplete matrix index operations.
@ PREDEF_TYPE_UNRESOLVED_TEMPLATE
The placeholder type for unresolved templates.
@ PREDEF_TYPE_SAT_USHORT_ACCUM_ID
The '_Sat unsigned short _Accum' type.
@ PREDEF_TYPE_LONG_ID
The (signed) 'long' type.
@ PREDEF_TYPE_SAT_ULONG_ACCUM_ID
The '_Sat unsigned long _Accum' type.
@ PREDEF_TYPE_LONG_FRACT_ID
The 'long _Fract' type.
@ PREDEF_TYPE_UNKNOWN_ANY
The 'unknown any' placeholder type.
@ PREDEF_TYPE_OMP_ITERATOR
The placeholder type for OpenMP iterator expression.
@ PREDEF_TYPE_PSEUDO_OBJECT
The pseudo-object placeholder type.
@ PREDEF_TYPE_OBJC_CLASS
The ObjC 'Class' type.
@ PREDEF_TYPE_ULONG_ID
The 'unsigned long' type.
@ PREDEF_TYPE_SAT_UACCUM_ID
The '_Sat unsigned _Accum' type.
@ PREDEF_TYPE_CLK_EVENT_ID
OpenCL clk event type.
@ PREDEF_TYPE_EVENT_ID
OpenCL event type.
@ PREDEF_TYPE_ULONG_ACCUM_ID
The 'unsigned long _Accum' type.
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
@ CTOR_INITIALIZER_MEMBER
@ CTOR_INITIALIZER_DELEGATING
@ CTOR_INITIALIZER_INDIRECT_MEMBER
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ TYPE_EXT_QUAL
An ExtQualType record.
@ SPECIAL_TYPE_OBJC_SEL_REDEFINITION
Objective-C "SEL" redefinition type.
@ SPECIAL_TYPE_UCONTEXT_T
C ucontext_t typedef type.
@ SPECIAL_TYPE_JMP_BUF
C jmp_buf typedef type.
@ SPECIAL_TYPE_FILE
C FILE typedef type.
@ SPECIAL_TYPE_SIGJMP_BUF
C sigjmp_buf typedef type.
@ SPECIAL_TYPE_OBJC_CLASS_REDEFINITION
Objective-C "Class" redefinition type.
@ SPECIAL_TYPE_CF_CONSTANT_STRING
CFConstantString type.
@ SPECIAL_TYPE_OBJC_ID_REDEFINITION
Objective-C "id" redefinition type.
Defines the clang::TargetInfo interface.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
internal::Matcher< T > findAll(const internal::Matcher< T > &Matcher)
Matches if the node or any descendant matches.
@ ModuleFile
The module file (.pcm). Required.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
llvm::OnDiskChainedHashTable< ASTSelectorLookupTrait > ASTSelectorLookupTable
The on-disk hash table used for the global method pool.
llvm::OnDiskChainedHashTable< HeaderFileInfoTrait > HeaderFileInfoLookupTable
The on-disk hash table used for known header files.
llvm::OnDiskIterableChainedHashTable< ASTIdentifierLookupTrait > ASTIdentifierLookupTable
The on-disk hash table used to contain information about all of the identifiers in the program.
GlobalDeclID LazySpecializationInfo
@ EXTENSION_METADATA
Metadata describing this particular extension.
SubmoduleRecordTypes
Record types used within a submodule description block.
@ SUBMODULE_EXCLUDED_HEADER
Specifies a header that has been explicitly excluded from this submodule.
@ SUBMODULE_TOPHEADER
Specifies a top-level header that falls into this (sub)module.
@ SUBMODULE_PRIVATE_TEXTUAL_HEADER
Specifies a header that is private to this submodule but must be textually included.
@ SUBMODULE_HEADER
Specifies a header that falls into this (sub)module.
@ SUBMODULE_EXPORT_AS
Specifies the name of the module that will eventually re-export the entities in this module.
@ SUBMODULE_UMBRELLA_DIR
Specifies an umbrella directory.
@ SUBMODULE_UMBRELLA_HEADER
Specifies the umbrella header used to create this module, if any.
@ SUBMODULE_REQUIRES
Specifies a required feature.
@ SUBMODULE_PRIVATE_HEADER
Specifies a header that is private to this submodule.
@ SUBMODULE_IMPORTS
Specifies the submodules that are imported by this submodule.
@ SUBMODULE_CONFLICT
Specifies a conflict with another module.
@ SUBMODULE_CHILD
Specifies a direct submodule by name and ID, enabling on-demand deserialization of children without l...
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_END
Defines the end of a single submodule. Sentinel record without any data.
@ SUBMODULE_DEFINITION
Defines the major attributes of a submodule, including its name and parent.
@ SUBMODULE_LINK_LIBRARY
Specifies a library or framework to link against.
@ SUBMODULE_CONFIG_MACRO
Specifies a configuration macro for this module.
@ SUBMODULE_EXPORTS
Specifies the submodules that are re-exported from this submodule.
@ SUBMODULE_TEXTUAL_HEADER
Specifies a header that is part of the module but must be textually included.
@ SUBMODULE_AFFECTING_MODULES
Specifies affecting modules that were not imported.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
@ SkippedInBuildSession
When the validation is skipped because it was already done in the current build session.
@ AllFiles
When the validation is done both for user files and system files.
@ Disabled
When the validation is disabled. For example, for a precompiled header.
@ UserFiles
When the validation is done only for user files as an optimization.
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
OptionsRecordTypes
Record types that occur within the options block inside the control block.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ CODEGEN_OPTIONS
Record code for the codegen options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
CommentRecordTypes
Record types used within a comments block.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
@ SM_SLOC_FILE_ENTRY
Describes a source location entry (SLocEntry) for a file.
@ SM_SLOC_BUFFER_BLOB_COMPRESSED
Describes a zlib-compressed blob that contains the data for a buffer entry.
@ SM_SLOC_BUFFER_ENTRY
Describes a source location entry (SLocEntry) for a buffer.
@ SM_SLOC_BUFFER_BLOB
Describes a blob that contains the data for a buffer entry.
@ SM_SLOC_EXPANSION_ENTRY
Describes a source location entry (SLocEntry) for a macro expansion.
const unsigned int NUM_PREDEF_SELECTOR_IDS
The number of predefined selector IDs.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
uint64_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
PreprocessorRecordTypes
Record types used within a preprocessor block.
@ PP_TOKEN
Describes one token.
@ PP_MACRO_FUNCTION_LIKE
A function-like macro definition.
@ PP_MACRO_OBJECT_LIKE
An object-like macro definition.
@ PP_MACRO_DIRECTIVE_HISTORY
The macro directives history for a particular identifier.
@ PP_MODULE_MACRO
A macro directive exported by a module.
ControlRecordTypes
Record types that occur within the control block.
@ MODULE_DIRECTORY_DEPENDENCIES
Record code for the directories this AST file depends on the listing of.
@ MODULE_MAP_FILE
Record code for the module map file that was used to build this AST file.
@ MODULE_DIRECTORY
Record code for the module build directory.
@ ORIGINAL_FILE_ID
Record code for file ID of the file or buffer that was used to generate the AST file.
@ MODULE_NAME
Record code for the module name.
@ ORIGINAL_FILE
Record code for the original file that was used to generate the AST file, including both its file ID ...
@ IMPORT
Record code for another AST file imported by this AST file.
@ INPUT_FILE_OFFSETS
Offsets into the input-files block where input files reside.
@ METADATA
AST file metadata, including the AST file version number and information about the compiler used to b...
UnhashedControlBlockRecordTypes
Record codes for the unhashed control block.
@ DIAGNOSTIC_OPTIONS
Record code for the diagnostic options table.
@ HEADER_SEARCH_ENTRY_USAGE
Record code for the indices of used header search entries.
@ AST_BLOCK_HASH
Record code for the content hash of the AST block.
@ DIAG_PRAGMA_MAPPINGS
Record code for #pragma diagnostic mappings.
@ SIGNATURE
Record code for the signature that identifiers this AST file.
@ HEADER_SEARCH_PATHS
Record code for the headers search paths.
@ VFS_USAGE
Record code for the indices of used VFSs.
uint64_t MacroID
An ID number that refers to a macro in an AST file.
InputFileRecordTypes
Record types that occur within the input-files block inside the control block.
@ INPUT_FILE_HASH
The input file content hash.
@ INPUT_FILE
An input file.
uint64_t TypeID
An ID number that refers to a type in an AST file.
PreprocessorDetailRecordTypes
Record types used within a preprocessor detail block.
@ PPD_INCLUSION_DIRECTIVE
Describes an inclusion directive within the preprocessing record.
@ PPD_MACRO_EXPANSION
Describes a macro expansion within the preprocessing record.
@ PPD_MACRO_DEFINITION
Describes a macro definition within the preprocessing record.
ModuleKind
Specifies the kind of module that has been loaded.
@ MK_PCH
File is a PCH file treated as such.
@ MK_Preamble
File is a PCH file treated as the preamble.
@ MK_MainFile
File is a PCH file treated as the actual main file.
@ MK_ExplicitModule
File is an explicitly-loaded module.
@ MK_ImplicitModule
File is an implicitly-loaded module.
@ MK_PrebuiltModule
File is from a prebuilt module path.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
const unsigned int NUM_PREDEF_MACRO_IDS
The number of predefined macro IDs.
ASTRecordTypes
Record types that occur within the AST block itself.
@ DECL_UPDATE_OFFSETS
Record for offsets of DECL_UPDATES records for declarations that were modified after being deserializ...
@ STATISTICS
Record code for the extra statistics we gather while generating an AST file.
@ FLOAT_CONTROL_PRAGMA_OPTIONS
Record code for #pragma float_control options.
@ KNOWN_NAMESPACES
Record code for the set of known namespaces, which are used for typo correction.
@ SPECIAL_TYPES
Record code for the set of non-builtin, special types.
@ PENDING_IMPLICIT_INSTANTIATIONS
Record code for pending implicit instantiations.
@ CXX_ADDED_TEMPLATE_SPECIALIZATION
@ TYPE_OFFSET
Record code for the offsets of each type.
@ DELEGATING_CTORS
The list of delegating constructor declarations.
@ PP_ASSUME_NONNULL_LOC
ID 66 used to be the list of included files.
@ EXT_VECTOR_DECLS
Record code for the set of ext_vector type names.
@ OPENCL_EXTENSIONS
Record code for enabled OpenCL extensions.
@ FP_PRAGMA_OPTIONS
Record code for floating point #pragma options.
@ PP_UNSAFE_BUFFER_USAGE
Record code for #pragma clang unsafe_buffer_usage begin/end.
@ CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION
@ DECLS_WITH_EFFECTS_TO_VERIFY
Record code for Sema's vector of functions/blocks with effects to be verified.
@ VTABLE_USES
Record code for the array of VTable uses.
@ LATE_PARSED_TEMPLATE
Record code for late parsed template functions.
@ DECLS_TO_CHECK_FOR_DEFERRED_DIAGS
Record code for the Decls to be checked for deferred diags.
@ SUBMODULE_METADATA
Record that encodes the number of submodules, their base ID in the AST file, and for each module the ...
@ DECL_OFFSET
Record code for the offsets of each decl.
@ SOURCE_MANAGER_LINE_TABLE
Record code for the source manager line table information, which stores information about #line direc...
@ PP_COUNTER_VALUE
The value of the next COUNTER to dispense.
@ OMP_REQUIRES_DECLS
Record code for the OpenMP 'requires' directives seen in the TU.
@ DELETE_EXPRS_TO_ANALYZE
Delete expressions that will be analyzed later.
@ EXTNAME_UNDECLARED_IDENTIFIERS
Record code for extname-redefined undeclared identifiers.
@ RELATED_DECLS_MAP
Record code for related declarations that have to be deserialized together from the same module.
@ UPDATE_VISIBLE
Record code for an update to a decl context's lookup table.
@ CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH
Number of unmatched pragma clang cuda_force_host_device begin directives we've seen.
@ MACRO_OFFSET
Record code for the table of offsets of each macro ID.
@ PPD_ENTITIES_OFFSETS
Record code for the table of offsets to entries in the preprocessing record.
@ RISCV_VECTOR_INTRINSICS_PRAGMA
Record code for pragma clang riscv intrinsic vector.
@ VTABLES_TO_EMIT
Record code for vtables to emit.
@ UPDATE_MODULE_LOCAL_VISIBLE
@ IDENTIFIER_OFFSET
Record code for the table of offsets of each identifier ID.
@ OBJC_CATEGORIES
Record code for the array of Objective-C categories (including extensions).
@ METHOD_POOL
Record code for the Objective-C method pool,.
@ DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD
Record code for lexical and visible block for delayed namespace in reduced BMI.
@ PP_CONDITIONAL_STACK
The stack of open ifs/ifdefs recorded in a preamble.
@ REFERENCED_SELECTOR_POOL
Record code for referenced selector pool.
@ SOURCE_LOCATION_OFFSETS
Record code for the table of offsets into the block of source-location information.
@ WEAK_UNDECLARED_IDENTIFIERS
Record code for weak undeclared identifiers.
@ UNDEFINED_BUT_USED
Record code for undefined but used functions and variables that need a definition in this TU.
@ FILE_SORTED_DECLS
Record code for a file sorted array of DeclIDs in a module.
@ MSSTRUCT_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
@ TENTATIVE_DEFINITIONS
Record code for the array of tentative definitions.
@ UPDATE_TU_LOCAL_VISIBLE
@ UNUSED_FILESCOPED_DECLS
Record code for the array of unused file scoped decls.
@ ALIGN_PACK_PRAGMA_OPTIONS
Record code for #pragma align/pack options.
@ IMPORTED_MODULES
Record code for an array of all of the (sub)modules that were imported by the AST file.
@ SELECTOR_OFFSETS
Record code for the table of offsets into the Objective-C method pool.
@ UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES
Record code for potentially unused local typedef names.
@ EAGERLY_DESERIALIZED_DECLS
Record code for the array of eagerly deserialized decls.
@ INTERESTING_IDENTIFIERS
A list of "interesting" identifiers.
@ HEADER_SEARCH_TABLE
Record code for header search information.
@ OBJC_CATEGORIES_MAP
Record code for map of Objective-C class definition IDs to the ObjC categories in a module that are a...
@ CUDA_SPECIAL_DECL_REFS
Record code for special CUDA declarations.
@ TU_UPDATE_LEXICAL
Record code for an update to the TU's lexically contained declarations.
@ PPD_SKIPPED_RANGES
A table of skipped ranges within the preprocessing record.
@ IDENTIFIER_TABLE
Record code for the identifier table.
@ SEMA_DECL_REFS
Record code for declarations that Sema keeps references of.
@ OPTIMIZE_PRAGMA_OPTIONS
Record code for #pragma optimize options.
@ MODULE_OFFSET_MAP
Record code for the remapping information used to relate loaded modules to the various offsets and ID...
@ POINTERS_TO_MEMBERS_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
unsigned ComputeHash(Selector Sel)
TypeID LocalTypeID
Same with TypeID except that the LocalTypeID is only meaningful with the corresponding ModuleFile.
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Top level wrappers for InstallAPI frontend operations.
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.
@ 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',...
OpenMPNumTeamsClauseModifier
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.
@ Undefined
Keep undefined.
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.
@ PREDEF_DECL_BUILTIN_ZOS_VA_LIST_ID
The internal '__builtin_zos_va_list' typedef.
@ Property
The type of a property.
@ Result
The result type of a method or function.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
std::string createSpecificModuleCachePath(FileManager &FileMgr, StringRef ModuleCachePath, bool DisableModuleHash, std::string ContextHash)
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ Template
We are parsing a template declaration.
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
OpenMPUseDevicePtrFallbackModifier
OpenMP 6.1 use_device_ptr fallback modifier.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
TypeSpecifierWidth
Specifies the width of a type, e.g., short, long, or long long.
OpenMPMotionModifierKind
OpenMP modifier kind for 'to' or 'from' clause.
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
TypeSpecifierSign
Specifies the signedness of a type, e.g., signed or unsigned.
OpenMPDynGroupprivateClauseModifier
OpenMPThreadLimitClauseModifier
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)
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.
int32_t uint32_t uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 uint16_t
__LIBC_ATTRS FILE * stderr
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponents
Total number of expression components.
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumVars
Number of expressions listed.
unsigned NumComponentLists
Number of component lists.
Expr * AllocatorTraits
Allocator traits.
Expr * Allocator
Allocator.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
The signature of a module, which is a hash of the AST content.
static constexpr size_t size
static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)
static ASTFileSignature createDummy()
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setInfo(const DeclarationNameLoc &Info)
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
A simple structure that captures a vtable use for the purposes of the ExternalSemaSource.
ExceptionSpecInfo ExceptionSpec
static LineEntry get(unsigned Offs, unsigned Line, int Filename, SrcMgr::CharacteristicKind FileKind, unsigned IncludeOffset)
A conflict between two modules.
std::string Message
The message provided to the user when there is a conflict.
ModuleRef Other
The module that this module conflicts with.
A library or framework to link against when an entity from this module is used.
a linked list of methods with the same selector name but different signatures.
ObjCMethodList * getNext() const
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
NestedNameSpecifierLoc QualifierLoc
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
SanitizerMask Mask
Bitmask of enabled sanitizers.
Helper class that saves the current stream position and then restores it when destroyed.
PragmaMsStackAction Action
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Location information for a TemplateArgument.
Describes a single change detected in a module file or input file.
Describes the categories of an Objective-C class.
void insert(GlobalDeclID ID)
void insert(LazySpecializationInfo Info)