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) {
4887 SmallString<256> Dir(ReadPath(F,
Record, Idx));
4893bool ASTReader::isDirectoryDependencyOutOfDate(
ModuleFile &F,
bool Complain) {
4894 llvm::vfs::FileSystem &FS = PP.getFileManager().getVirtualFileSystem();
4899 auto IsNewer = [&](StringRef Dir) {
4900 llvm::ErrorOr<llvm::vfs::Status> Status = FS.status(Dir);
4901 return Status && Status->isDirectory() &&
4902 llvm::sys::toTimeT(Status->getLastModificationTime()) > F.
ModTime;
4905 ModuleCache &ModCache = getModuleManager().getModuleCache();
4906 const HeaderSearchOptions &HSOpts =
4907 PP.getHeaderSearchInfo().getHeaderSearchOpts();
4909 if (std::optional<bool> Invalidated =
4913 if (!*Invalidated ||
4916 Diag(diag::remark_module_path_invalidated) << F.
ModuleName << Dir;
4922 std::optional<std::string>
Changed;
4927 for (llvm::vfs::recursive_directory_iterator I(FS, Dir, EC), E;
4928 I != E && !EC; I.increment(EC)) {
4929 if (I->type() == llvm::sys::fs::file_type::directory_file &&
4930 IsNewer(I->path())) {
4949 SemaObjC::GlobalMethodPool::iterator Known =
4955 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4956 : Known->second.second;
4960 if (List->getMethod() == Method) {
4968 if (List->getNext())
4969 List->setMethod(List->getNext()->getMethod());
4971 List->setMethod(Method);
4977 for (
Decl *D : Names) {
4981 if (wasHidden && SemaObj) {
4994 Stack.push_back(Mod);
4995 while (!Stack.empty()) {
4996 Mod = Stack.pop_back_val();
4998 if (NameVisibility <= Mod->NameVisibility) {
5014 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
5015 if (Hidden != HiddenNamesMap.end()) {
5016 auto HiddenNames = std::move(*Hidden);
5017 HiddenNamesMap.erase(Hidden);
5019 assert(!HiddenNamesMap.contains(Mod) &&
5020 "making names visible added hidden names");
5027 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
5029 if (Visited.insert(Exported).second)
5030 Stack.push_back(Exported);
5048 PendingMergedDefinitionsToDeduplicate.insert(Def);
5057 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
5058 !PP.getLangOpts().Modules)
5062 TriedLoadingGlobalIndex =
true;
5063 StringRef SpecificModuleCachePath =
5065 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
5067 if (llvm::Error Err = std::move(
Result.second)) {
5069 consumeError(std::move(Err));
5073 GlobalIndex.reset(
Result.first);
5074 ModuleMgr.setGlobalIndex(GlobalIndex.get());
5079 return PP.getLangOpts().Modules && UseGlobalIndex &&
5091 consumeError(MaybeEntry.takeError());
5094 llvm::BitstreamEntry Entry = MaybeEntry.get();
5096 switch (Entry.Kind) {
5097 case llvm::BitstreamEntry::Error:
5098 case llvm::BitstreamEntry::EndBlock:
5101 case llvm::BitstreamEntry::Record:
5107 consumeError(Skipped.takeError());
5111 case llvm::BitstreamEntry::SubBlock:
5112 if (Entry.ID == BlockID) {
5113 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
5115 consumeError(std::move(Err));
5122 if (llvm::Error Err = Cursor.SkipBlock()) {
5124 consumeError(std::move(Err));
5134 unsigned ClientLoadCapabilities,
5136 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
5140 CurrentDeserializingModuleKind,
Type);
5146 unsigned PreviousGeneration = 0;
5150 unsigned NumModules = ModuleMgr.size();
5155 ClientLoadCapabilities)) {
5156 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
5160 GlobalIndex.reset();
5161 ModuleMgr.setGlobalIndex(
nullptr);
5165 if (NewLoadedModuleFile && !Loaded.empty())
5166 *NewLoadedModuleFile = Loaded.back().Mod;
5179 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
5182 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
5183 Error(std::move(Err));
5189 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
5195 if (llvm::Error Err = ReadExtensionBlock(F)) {
5196 Error(std::move(Err));
5225 if (!PP.getLangOpts().CPlusPlus) {
5232 auto It = PP.getIdentifierTable().find(Key);
5233 if (It == PP.getIdentifierTable().end())
5242 II = &PP.getIdentifierTable().getOwn(Key);
5260 for (
auto &Id : PP.getIdentifierTable())
5261 Id.second->setOutOfDate(
true);
5264 for (
const auto &Sel : SelectorGeneration)
5265 SelectorOutOfDate[Sel.first] =
true;
5272 ModuleMgr.moduleFileAccepted(&F);
5294 if (DeserializationListener)
5295 DeserializationListener->ReaderInitialized(
this);
5297 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5312 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5313 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5314 ObjCClassesLoaded[I], PreviousGeneration);
5319 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5324 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5343 if (!Stream.canSkipToPos(4))
5344 return llvm::createStringError(
5345 std::errc::illegal_byte_sequence,
5346 "file too small to contain precompiled file magic");
5347 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5350 return llvm::createStringError(
5351 std::errc::illegal_byte_sequence,
5352 "file doesn't start with precompiled file magic");
5354 return Res.takeError();
5355 return llvm::Error::success();
5370 llvm_unreachable(
"unknown module kind");
5376 off_t ExpectedSize, time_t ExpectedModTime,
5378 auto Result = ModuleMgr.addModule(
5383 switch (
Result.getKind()) {
5385 Diag(diag::remark_module_import)
5387 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5402 Diag(diag::err_ast_file_not_found)
5404 if (!
Result.getBufferError().empty())
5405 Diag(diag::note_ast_file_buffer_failed) <<
Result.getBufferError();
5415 Diag(diag::err_ast_file_out_of_date)
5417 for (
const auto &
C :
Result.getChanges()) {
5418 Diag(diag::note_fe_ast_file_modified)
5419 <<
C.Kind << (
C.Old &&
C.New) << llvm::itostr(
C.Old.value_or(0))
5420 << llvm::itostr(
C.New.value_or(0));
5422 Diag(diag::note_ast_file_input_files_validation_status)
5423 <<
Result.getValidationStatus();
5424 if (!
Result.getSignatureError().empty())
5425 Diag(diag::note_ast_file_signature_failed) <<
Result.getSignatureError();
5429 llvm_unreachable(
"Unexpected value from adding module.");
5432 assert(M &&
"Missing module file");
5434 bool ShouldFinalizePCM =
false;
5435 llvm::scope_exit FinalizeOrDropPCM([&]() {
5437 if (ShouldFinalizePCM)
5443 BitstreamCursor &Stream = F.
Stream;
5444 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5445 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5449 Diag(diag::err_ast_file_invalid)
5455 bool HaveReadControlBlock =
false;
5459 Error(MaybeEntry.takeError());
5462 llvm::BitstreamEntry Entry = MaybeEntry.get();
5464 switch (Entry.Kind) {
5465 case llvm::BitstreamEntry::Error:
5466 case llvm::BitstreamEntry::Record:
5467 case llvm::BitstreamEntry::EndBlock:
5468 Error(
"invalid record at top-level of AST file");
5471 case llvm::BitstreamEntry::SubBlock:
5477 HaveReadControlBlock =
true;
5478 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5486 F.ModuleName.empty()) {
5505 if (!HaveReadControlBlock) {
5507 Diag(diag::err_ast_file_version_too_old)
5514 ShouldFinalizePCM =
true;
5518 if (llvm::Error Err = Stream.SkipBlock()) {
5519 Error(std::move(Err));
5526 llvm_unreachable(
"unexpected break; expected return");
5530ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5531 unsigned ClientLoadCapabilities) {
5533 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5534 bool AllowCompatibleConfigurationMismatch =
5536 bool DisableValidation = shouldDisableValidationForFile(F);
5538 ASTReadResult
Result = readUnhashedControlBlockImpl(
5540 AllowCompatibleConfigurationMismatch, Listener.get(),
5545 if (DisableValidation || WasImportedBy ||
5546 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5550 Error(
"malformed block record in AST file");
5573 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5575 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5584 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5585 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5586 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5588 BitstreamCursor Stream(StreamData);
5593 consumeError(std::move(Err));
5605 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5608 consumeError(MaybeEntry.takeError());
5611 llvm::BitstreamEntry Entry = MaybeEntry.get();
5613 switch (Entry.Kind) {
5614 case llvm::BitstreamEntry::Error:
5615 case llvm::BitstreamEntry::SubBlock:
5618 case llvm::BitstreamEntry::EndBlock:
5621 case llvm::BitstreamEntry::Record:
5629 Expected<unsigned> MaybeRecordType =
5630 Stream.readRecord(Entry.ID,
Record, &Blob);
5631 if (!MaybeRecordType) {
5640 "Dummy AST file signature not backpatched in ASTWriter.");
5647 "Dummy AST block hash not backpatched in ASTWriter.");
5651 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5652 if (Listener && ValidateDiagnosticOptions &&
5653 !AllowCompatibleConfigurationMismatch &&
5654 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5659 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5660 if (Listener && !AllowCompatibleConfigurationMismatch &&
5661 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5662 Result = ConfigurationMismatch;
5691 if (
Record.size() < 4)
return true;
5696 unsigned BlockNameLen =
Record[2];
5697 unsigned UserInfoLen =
Record[3];
5699 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5701 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5702 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5703 Blob.data() + BlockNameLen + UserInfoLen);
5707llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5708 BitstreamCursor &Stream = F.
Stream;
5712 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5714 return MaybeEntry.takeError();
5715 llvm::BitstreamEntry Entry = MaybeEntry.get();
5717 switch (Entry.Kind) {
5718 case llvm::BitstreamEntry::SubBlock:
5719 if (llvm::Error Err = Stream.SkipBlock())
5722 case llvm::BitstreamEntry::EndBlock:
5723 return llvm::Error::success();
5724 case llvm::BitstreamEntry::Error:
5725 return llvm::createStringError(std::errc::illegal_byte_sequence,
5726 "malformed block record in AST file");
5727 case llvm::BitstreamEntry::Record:
5733 Expected<unsigned> MaybeRecCode =
5734 Stream.readRecord(Entry.ID,
Record, &Blob);
5736 return MaybeRecCode.takeError();
5737 switch (MaybeRecCode.get()) {
5739 ModuleFileExtensionMetadata Metadata;
5741 return llvm::createStringError(
5742 std::errc::illegal_byte_sequence,
5743 "malformed EXTENSION_METADATA in AST file");
5746 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5747 if (Known == ModuleFileExtensions.end())
break;
5750 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5760 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5764 assert(ContextObj &&
"no context to initialize");
5768 if (DeserializationListener)
5769 DeserializationListener->DeclRead(
5771 Context.getTranslationUnitDecl());
5779 if (!Context.CFConstantStringTypeDecl)
5780 Context.setCFConstantStringType(
GetType(String));
5785 if (FileType.isNull()) {
5786 Error(
"FILE type is NULL");
5790 if (!Context.FILEDecl) {
5792 Context.setFILEDecl(
Typedef->getDecl());
5794 const TagType *Tag = FileType->getAs<TagType>();
5796 Error(
"Invalid FILE type in AST file");
5799 Context.setFILEDecl(Tag->getDecl());
5806 if (Jmp_bufType.
isNull()) {
5807 Error(
"jmp_buf type is NULL");
5811 if (!Context.jmp_bufDecl) {
5813 Context.setjmp_bufDecl(
Typedef->getDecl());
5815 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5817 Error(
"Invalid jmp_buf type in AST file");
5820 Context.setjmp_bufDecl(Tag->getDecl());
5827 if (Sigjmp_bufType.
isNull()) {
5828 Error(
"sigjmp_buf type is NULL");
5832 if (!Context.sigjmp_bufDecl) {
5834 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5836 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5837 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5838 Context.setsigjmp_bufDecl(Tag->getDecl());
5844 if (Context.ObjCIdRedefinitionType.isNull())
5845 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5848 if (
TypeID ObjCClassRedef =
5850 if (Context.ObjCClassRedefinitionType.isNull())
5851 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5854 if (
TypeID ObjCSelRedef =
5856 if (Context.ObjCSelRedefinitionType.isNull())
5857 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5862 if (Ucontext_tType.
isNull()) {
5863 Error(
"ucontext_t type is NULL");
5867 if (!Context.ucontext_tDecl) {
5869 Context.setucontext_tDecl(
Typedef->getDecl());
5871 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5872 assert(Tag &&
"Invalid ucontext_t type in AST file");
5873 Context.setucontext_tDecl(Tag->getDecl());
5882 if (!CUDASpecialDeclRefs.empty()) {
5883 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5884 Context.setcudaConfigureCallDecl(
5885 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5886 Context.setcudaGetParameterBufferDecl(
5887 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5888 Context.setcudaLaunchDeviceDecl(
5889 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5894 for (
auto &Import : PendingImportedModules) {
5898 if (Import.ImportLoc.isValid())
5899 PP.makeModuleVisible(Imported, Import.ImportLoc);
5906 PendingImportedModulesSema.append(PendingImportedModules);
5907 PendingImportedModules.clear();
5917 BitstreamCursor Stream(
PCH);
5920 consumeError(std::move(Err));
5932 Stream.advanceSkippingSubblocks();
5935 consumeError(MaybeEntry.takeError());
5938 llvm::BitstreamEntry Entry = MaybeEntry.get();
5940 if (Entry.Kind != llvm::BitstreamEntry::Record)
5948 consumeError(MaybeRecord.takeError());
5954 "Dummy AST file signature not backpatched in ASTWriter.");
5964 const std::string &ASTFileName,
FileManager &FileMgr,
5967 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5972 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5973 << ASTFileName << Buffer.getError().message();
5974 return std::string();
5978 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5982 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5983 return std::string();
5988 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5989 return std::string();
5996 Stream.advanceSkippingSubblocks();
5999 consumeError(MaybeEntry.takeError());
6000 return std::string();
6002 llvm::BitstreamEntry Entry = MaybeEntry.get();
6004 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
6005 return std::string();
6007 if (Entry.Kind != llvm::BitstreamEntry::Record) {
6008 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
6009 return std::string();
6017 consumeError(MaybeRecord.takeError());
6018 return std::string();
6033 std::string ExistingSpecificModuleCachePath;
6035 bool StrictOptionMatches;
6038 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
6043 StringRef ExistingSpecificModuleCachePath,
6045 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
6046 ExistingTargetOpts(ExistingTargetOpts),
6047 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
6048 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
6051 bool ReadLanguageOptions(
const LangOptions &LangOpts,
6052 StringRef ModuleFilename,
bool Complain,
6053 bool AllowCompatibleDifferences)
override {
6055 nullptr, AllowCompatibleDifferences);
6058 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
6059 StringRef ModuleFilename,
bool Complain,
6060 bool AllowCompatibleDifferences)
override {
6062 nullptr, AllowCompatibleDifferences);
6065 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
6066 StringRef ModuleFilename,
bool Complain,
6067 bool AllowCompatibleDifferences)
override {
6069 nullptr, AllowCompatibleDifferences);
6072 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
6073 StringRef ASTFilename, StringRef ContextHash,
6074 bool Complain)
override {
6076 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
6077 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
6080 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
6081 StringRef ModuleFilename,
bool ReadMacros,
6083 std::string &SuggestedPredefines)
override {
6085 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
6086 FileMgr, SuggestedPredefines, ExistingLangOpts,
6098 unsigned ClientLoadCapabilities) {
6102 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
6103 llvm::MemoryBuffer *Buffer =
6112 auto Entry = Filename ==
"-" ? FileMgr.getSTDIN()
6113 : FileMgr.getFileRef(Filename,
6118 llvm::consumeError(Entry.takeError());
6122 FileMgr.getBufferForFile(*Entry,
6129 OwnedBuffer = std::move(*BufferOrErr);
6130 Buffer = OwnedBuffer.get();
6134 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
6135 BitstreamCursor Stream(Bytes);
6139 consumeError(std::move(Err));
6147 bool NeedsInputFiles = Listener.needsInputFileVisitation();
6148 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
6149 bool NeedsImports = Listener.needsImportVisitation();
6150 BitstreamCursor InputFilesCursor;
6151 uint64_t InputFilesOffsetBase = 0;
6154 std::string ModuleDir;
6155 bool DoneWithControlBlock =
false;
6157 PathBuf.reserve(256);
6162 AdditionalPathBuf.reserve(256);
6163 while (!DoneWithControlBlock) {
6167 consumeError(MaybeEntry.takeError());
6170 llvm::BitstreamEntry Entry = MaybeEntry.get();
6172 switch (Entry.Kind) {
6173 case llvm::BitstreamEntry::SubBlock: {
6176 std::string IgnoredSuggestedPredefines;
6177 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6179 Listener, IgnoredSuggestedPredefines) !=
Success)
6185 InputFilesCursor = Stream;
6186 if (llvm::Error Err = Stream.SkipBlock()) {
6188 consumeError(std::move(Err));
6191 if (NeedsInputFiles &&
6194 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6198 if (llvm::Error Err = Stream.SkipBlock()) {
6200 consumeError(std::move(Err));
6209 case llvm::BitstreamEntry::EndBlock:
6210 DoneWithControlBlock =
true;
6213 case llvm::BitstreamEntry::Error:
6216 case llvm::BitstreamEntry::Record:
6220 if (DoneWithControlBlock)
break;
6225 Stream.readRecord(Entry.ID,
Record, &Blob);
6226 if (!MaybeRecCode) {
6234 if (Listener.ReadFullVersionInformation(Blob))
6238 Listener.ReadModuleName(Blob);
6241 ModuleDir = std::string(Blob);
6247 Listener.ReadModuleMapFile(*Path);
6251 if (!NeedsInputFiles)
6254 unsigned NumInputFiles =
Record[0];
6255 unsigned NumUserFiles =
Record[1];
6256 const llvm::support::unaligned_uint64_t *InputFileOffs =
6257 (
const llvm::support::unaligned_uint64_t *)Blob.data();
6258 for (
unsigned I = 0; I != NumInputFiles; ++I) {
6260 bool isSystemFile = I >= NumUserFiles;
6262 if (isSystemFile && !NeedsSystemInputFiles)
6265 BitstreamCursor &Cursor = InputFilesCursor;
6267 if (llvm::Error Err =
6268 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6270 consumeError(std::move(Err));
6276 consumeError(MaybeCode.takeError());
6278 unsigned Code = MaybeCode.get();
6282 bool shouldContinue =
false;
6284 Cursor.readRecord(Code,
Record, &Blob);
6285 if (!MaybeRecordType) {
6287 consumeError(MaybeRecordType.takeError());
6293 time_t StoredTime =
static_cast<time_t
>(
Record[2]);
6294 bool Overridden =
static_cast<bool>(
Record[3]);
6295 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6298 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6300 if (UnresolvedFilename.empty())
6301 Filename = *FilenameAsRequestedBuf;
6304 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6305 Filename = *FilenameBuf;
6307 shouldContinue = Listener.visitInputFileAsRequested(
6308 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6312 if (!shouldContinue)
6333 bool IsStandardCXXModule =
Record[Idx++];
6337 if (IsStandardCXXModule) {
6338 Listener.visitImport(ModuleName,
"");
6349 Listener.visitImport(ModuleName, *Filename);
6360 if (FindModuleFileExtensions) {
6361 BitstreamCursor SavedStream = Stream;
6363 bool DoneWithExtensionBlock =
false;
6364 while (!DoneWithExtensionBlock) {
6370 llvm::BitstreamEntry Entry = MaybeEntry.get();
6372 switch (Entry.Kind) {
6373 case llvm::BitstreamEntry::SubBlock:
6374 if (llvm::Error Err = Stream.SkipBlock()) {
6376 consumeError(std::move(Err));
6381 case llvm::BitstreamEntry::EndBlock:
6382 DoneWithExtensionBlock =
true;
6385 case llvm::BitstreamEntry::Error:
6388 case llvm::BitstreamEntry::Record:
6395 Stream.readRecord(Entry.ID,
Record, &Blob);
6396 if (!MaybeRecCode) {
6400 switch (MaybeRecCode.get()) {
6406 Listener.readModuleFileExtension(Metadata);
6412 Stream = std::move(SavedStream);
6416 if (readUnhashedControlBlockImpl(
6417 nullptr, Bytes, Filename, ClientLoadCapabilities,
6419 ValidateDiagnosticOptions) !=
Success)
6430 StringRef SpecificModuleCachePath,
bool RequireStrictOptionMatches) {
6431 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6432 SpecificModuleCachePath, FileMgr,
6433 RequireStrictOptionMatches);
6441 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
6446 if (GlobalIndex >= SubmodulesLoaded.size()) {
6447 Error(
"submodule ID out of range in AST file");
6451 if (SubmodulesLoaded[GlobalIndex])
6452 return SubmodulesLoaded[GlobalIndex];
6455 assert(It != GlobalSubmoduleMap.end());
6458 [[maybe_unused]]
unsigned LocalID =
6465 Error(std::move(Err));
6469 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6474 auto CreateModule = !KnowsTopLevelModule
6478 Module *CurrentModule =
nullptr;
6483 Error(MaybeEntry.takeError());
6486 llvm::BitstreamEntry Entry = MaybeEntry.get();
6488 switch (Entry.Kind) {
6489 case llvm::BitstreamEntry::SubBlock:
6490 case llvm::BitstreamEntry::Error:
6491 case llvm::BitstreamEntry::EndBlock: {
6492 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6493 "malformed block record in AST file"));
6496 case llvm::BitstreamEntry::Record:
6506 Error(MaybeKind.takeError());
6513 if (!CurrentModule) {
6514 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6515 "malformed module definition"));
6518 return CurrentModule;
6521 if (
Record.size() < 13) {
6522 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6523 "malformed module definition"));
6527 StringRef Name = Blob;
6529 [[maybe_unused]]
unsigned ReadLocalID =
Record[Idx++];
6530 assert(LocalID == ReadLocalID);
6536 bool IsFramework =
Record[Idx++];
6537 bool IsExplicit =
Record[Idx++];
6538 bool IsSystem =
Record[Idx++];
6539 bool IsExternC =
Record[Idx++];
6540 bool InferSubmodules =
Record[Idx++];
6541 bool InferExplicitSubmodules =
Record[Idx++];
6542 bool InferExportWildcard =
Record[Idx++];
6543 bool ConfigMacrosExhaustive =
Record[Idx++];
6544 bool ModuleMapIsPrivate =
Record[Idx++];
6545 bool NamedModuleHasInit =
Record[Idx++];
6547 Module *ParentModule =
nullptr;
6554 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6555 IsFramework, IsExplicit);
6557 if (!ParentModule) {
6561 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6563 assert(*CurFileKey != F.
FileKey &&
6564 "ModuleManager did not de-duplicate");
6566 Diag(diag::err_module_file_conflict)
6570 auto CurModMapFile =
6572 auto ModMapFile = FileMgr.getOptionalFileRef(F.
ModuleMapPath);
6573 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6574 Diag(diag::note_module_file_conflict)
6575 << CurModMapFile->getName() << ModMapFile->getName();
6586 CurrentModule->
Kind = Kind;
6596 if (InferredAllowedBy.
isValid())
6608 if (
auto Dir = FileMgr.getOptionalDirectoryRef(F.
BaseDirectory))
6610 }
else if (ParentModule && ParentModule->
Directory) {
6615 if (DeserializationListener)
6616 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6618 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6642 CurrentModule, Blob.str(), RelativePathName)) {
6678 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6688 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6695 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6703 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6705 bool IsWildcard =
Record[Idx + 1];
6708 if (ExportedMod || IsWildcard)
6709 CurrentModule->
Exports.push_back({ExportedMod, IsWildcard});
6719 PP.getTargetInfo());
6736 Conflict.
Message = Blob.str();
6737 CurrentModule->
Conflicts.push_back(Conflict);
6747 for (
unsigned I = 0; I <
Record.size(); )
6749 ContextObj->addLazyModuleInitializers(CurrentModule,
Inits);
6776bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6777 StringRef ModuleFilename,
bool Complain,
6779 bool AllowCompatibleDifferences) {
6783#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6784 LangOpts.Name = Record[Idx++];
6785#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6786 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6787#include "clang/Basic/LangOptions.def"
6788#define SANITIZER(NAME, ID) \
6789 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6790#include "clang/Basic/Sanitizers.def"
6792 for (
unsigned N =
Record[Idx++]; N; --N)
6796 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6802 for (
unsigned N =
Record[Idx++]; N; --N) {
6804 ReadString(
Record, Idx));
6809 for (
unsigned N =
Record[Idx++]; N; --N) {
6816 AllowCompatibleDifferences);
6819bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6820 StringRef ModuleFilename,
bool Complain,
6821 ASTReaderListener &Listener,
6822 bool AllowCompatibleDifferences) {
6824 CodeGenOptions CGOpts;
6826#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6827 if constexpr (CK::Compatibility != CK::Benign) \
6828 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6829#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6830 if constexpr (CK::Compatibility != CK::Benign) \
6831 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6832#define DEBUGOPT(Name, Bits, Default, Compatibility)
6833#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6834#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6835#include "clang/Basic/CodeGenOptions.def"
6838 AllowCompatibleDifferences);
6841bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6842 StringRef ModuleFilename,
bool Complain,
6843 ASTReaderListener &Listener,
6844 bool AllowCompatibleDifferences) {
6846 TargetOptions TargetOpts;
6848 TargetOpts.
CPU = ReadString(
Record, Idx);
6850 TargetOpts.
ABI = ReadString(
Record, Idx);
6851 for (
unsigned N =
Record[Idx++]; N; --N) {
6854 for (
unsigned N =
Record[Idx++]; N; --N) {
6859 AllowCompatibleDifferences);
6862bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6863 StringRef ModuleFilename,
bool Complain,
6864 ASTReaderListener &Listener) {
6865 DiagnosticOptions DiagOpts;
6867#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6868#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6869 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6870#include "clang/Basic/DiagnosticOptions.def"
6872 for (
unsigned N =
Record[Idx++]; N; --N)
6874 for (
unsigned N =
Record[Idx++]; N; --N)
6880bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6881 ASTReaderListener &Listener) {
6882 FileSystemOptions FSOpts;
6888bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6889 StringRef ModuleFilename,
6891 ASTReaderListener &Listener) {
6892 HeaderSearchOptions HSOpts;
6907 std::string ContextHash = ReadString(
Record, Idx);
6913bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6914 ASTReaderListener &Listener) {
6915 HeaderSearchOptions HSOpts;
6919 for (
unsigned N =
Record[Idx++]; N; --N) {
6920 std::string Path = ReadString(
Record, Idx);
6923 bool IsFramework =
Record[Idx++];
6924 bool IgnoreSysRoot =
Record[Idx++];
6925 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6930 for (
unsigned N =
Record[Idx++]; N; --N) {
6931 std::string Prefix = ReadString(
Record, Idx);
6932 bool IsSystemHeader =
Record[Idx++];
6937 for (
unsigned N =
Record[Idx++]; N; --N) {
6938 std::string VFSOverlayFile = ReadString(
Record, Idx);
6945bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6946 StringRef ModuleFilename,
6948 ASTReaderListener &Listener,
6949 std::string &SuggestedPredefines) {
6950 PreprocessorOptions PPOpts;
6954 bool ReadMacros =
Record[Idx++];
6956 for (
unsigned N =
Record[Idx++]; N; --N) {
6958 bool IsUndef =
Record[Idx++];
6959 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6964 for (
unsigned N =
Record[Idx++]; N; --N) {
6969 for (
unsigned N =
Record[Idx++]; N; --N) {
6978 SuggestedPredefines.clear();
6980 Complain, SuggestedPredefines);
6983std::pair<ModuleFile *, unsigned>
6984ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6985 GlobalPreprocessedEntityMapType::iterator
6986 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6987 assert(I != GlobalPreprocessedEntityMap.end() &&
6988 "Corrupted global preprocessed entity map");
6991 return std::make_pair(M, LocalIndex);
6994llvm::iterator_range<PreprocessingRecord::iterator>
6995ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6996 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
7000 return llvm::make_range(PreprocessingRecord::iterator(),
7001 PreprocessingRecord::iterator());
7004bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
7005 unsigned int ClientLoadCapabilities) {
7006 return ClientLoadCapabilities & ARR_OutOfDate &&
7009 .getInMemoryModuleCache()
7010 .isPCMFinal(ModuleFileName);
7013llvm::iterator_range<ASTReader::ModuleDeclIterator>
7015 return llvm::make_range(
7022 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
7023 assert(I != GlobalSkippedRangeMap.end() &&
7024 "Corrupted global skipped range map");
7027 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
7031 assert(Range.isValid());
7037 unsigned ModuleFileIndex = ID >> 32;
7038 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
7039 assert(getModuleManager().size() > ModuleFileIndex - 1);
7040 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
7042 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
7047 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7049 unsigned LocalIndex = PPInfo.second;
7054 if (!PP.getPreprocessingRecord()) {
7055 Error(
"no preprocessing record");
7062 Error(std::move(Err));
7069 Error(MaybeEntry.takeError());
7072 llvm::BitstreamEntry Entry = MaybeEntry.get();
7074 if (Entry.Kind != llvm::BitstreamEntry::Record)
7085 if (!MaybeRecType) {
7086 Error(MaybeRecType.takeError());
7091 bool isBuiltin =
Record[0];
7099 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
7119 if (DeserializationListener)
7120 DeserializationListener->MacroDefinitionRead(PPID, MD);
7126 const char *FullFileNameStart = Blob.data() +
Record[0];
7127 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
7129 if (!FullFileName.empty())
7130 File = PP.getFileManager().getOptionalFileRef(FullFileName);
7137 StringRef(Blob.data(),
Record[0]),
7145 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
7154unsigned ASTReader::findNextPreprocessedEntity(
7155 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
7157 for (GlobalSLocOffsetMapType::const_iterator
7158 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7164 return getTotalNumPreprocessedEntities();
7169struct PPEntityComp {
7170 const ASTReader &Reader;
7173 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7175 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
7176 SourceLocation LHS = getLoc(L);
7177 SourceLocation RHS = getLoc(R);
7181 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
7182 SourceLocation LHS = getLoc(L);
7186 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
7187 SourceLocation RHS = getLoc(R);
7191 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
7198unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7199 bool EndsAfter)
const {
7200 if (SourceMgr.isLocalSourceLocation(Loc))
7201 return getTotalNumPreprocessedEntities();
7203 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7204 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7205 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7206 "Corrupted global sloc offset map");
7208 if (SLocMapI->second->NumPreprocessedEntities == 0)
7209 return findNextPreprocessedEntity(SLocMapI);
7220 pp_iterator
First = pp_begin;
7224 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7225 PPEntityComp(*
this, M));
7234 std::advance(PPI,
Half);
7235 if (SourceMgr.isBeforeInTranslationUnit(
7236 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7239 Count = Count -
Half - 1;
7246 return findNextPreprocessedEntity(SLocMapI);
7253std::pair<unsigned, unsigned>
7255 if (Range.isInvalid())
7256 return std::make_pair(0,0);
7257 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7259 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
7260 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
7261 return std::make_pair(BeginID, EndID);
7271 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7273 unsigned LocalIndex = PPInfo.second;
7280 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7289 class HeaderFileInfoVisitor {
7291 std::optional<HeaderFileInfo> HFI;
7294 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7303 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7304 if (Pos == Table->end())
7311 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7317 HeaderFileInfoVisitor Visitor(FE);
7318 ModuleMgr.visit(Visitor);
7319 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7326 using DiagState = DiagnosticsEngine::DiagState;
7337 auto ReadDiagState = [&](
const DiagState &BasedOn,
7338 bool IncludeNonPragmaStates) {
7339 unsigned BackrefID =
Record[Idx++];
7341 return DiagStates[BackrefID - 1];
7344 Diag.DiagStates.push_back(BasedOn);
7345 DiagState *NewState = &
Diag.DiagStates.back();
7346 DiagStates.push_back(NewState);
7347 unsigned Size =
Record[Idx++];
7348 assert(Idx + Size * 2 <=
Record.size() &&
7349 "Invalid data, not enough diag/map pairs");
7351 unsigned DiagID =
Record[Idx++];
7354 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7367 Mapping = NewMapping;
7373 DiagState *FirstState;
7378 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7379 DiagStates.push_back(FirstState);
7383 "Invalid data, unexpected backref in initial state");
7385 assert(Idx <
Record.size() &&
7386 "Invalid data, not enough state change pairs in initial state");
7391 unsigned Flags =
Record[Idx++];
7392 DiagState Initial(*
Diag.getDiagnosticIDs());
7393 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7394 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7395 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7396 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7397 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7399 FirstState = ReadDiagState(Initial,
true);
7407 .StateTransitions.push_back({FirstState, 0});
7412 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7416 unsigned NumLocations =
Record[Idx++];
7417 while (NumLocations--) {
7418 assert(Idx <
Record.size() &&
7419 "Invalid data, missing pragma diagnostic states");
7421 assert(FID.
isValid() &&
"invalid FileID for transition");
7422 unsigned Transitions =
Record[Idx++];
7428 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7429 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7430 for (
unsigned I = 0; I != Transitions; ++I) {
7431 unsigned Offset =
Record[Idx++];
7432 auto *State = ReadDiagState(*FirstState,
false);
7433 F.StateTransitions.push_back({State, Offset});
7438 assert(Idx <
Record.size() &&
7439 "Invalid data, missing final pragma diagnostic state");
7441 auto *CurState = ReadDiagState(*FirstState,
false);
7444 Diag.DiagStatesByLoc.CurDiagState = CurState;
7445 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7450 auto &
T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7452 T.push_back({CurState, 0});
7454 T[0].State = CurState;
7460 assert(Idx <
Record.size() &&
7461 "Invalid data, missing diagnostic push stack");
7462 unsigned NumPushes =
Record[Idx++];
7463 for (
unsigned I = 0; I != NumPushes; ++I) {
7464 auto *State = ReadDiagState(*FirstState,
false);
7466 Diag.DiagStateOnPushStack.push_back(State);
7475ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7476 auto [M, Index] = translateTypeIDToIndex(ID);
7483#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7484 case TYPE_##CODE_ID: return Type::CLASS_ID;
7485#include "clang/Serialization/TypeBitCodes.def"
7487 return std::nullopt;
7497QualType ASTReader::readTypeRecord(
TypeID ID) {
7498 assert(ContextObj &&
"reading type with no AST context");
7499 ASTContext &Context = *ContextObj;
7500 RecordLocation Loc = TypeCursorForIndex(ID);
7501 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7505 SavedStreamPosition SavedPosition(DeclsCursor);
7507 ReadingKindTracker ReadingKind(Read_Type, *
this);
7510 Deserializing AType(
this);
7512 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7513 Error(std::move(Err));
7516 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7518 Error(RawCode.takeError());
7522 ASTRecordReader
Record(*
this, *Loc.F);
7523 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7525 Error(Code.takeError());
7529 QualType baseType =
Record.readQualType();
7530 Qualifiers quals =
Record.readQualifiers();
7536 Error(
"Unexpected code for type");
7540 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7541 return TypeReader.read(*maybeClass);
7549 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7550 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7553 return Reader.readTypeSourceInfo();
7557 return Reader.readNestedNameSpecifierLoc();
7561 return Reader.readAttr();
7570#define ABSTRACT_TYPELOC(CLASS, PARENT)
7571#define TYPELOC(CLASS, PARENT) \
7572 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7573#include "clang/AST/TypeLocNodes.def"
7582void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7586void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7596void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7600void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7604void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7608void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7612void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7616void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7620void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7624void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7628void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7632void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7640 if (Reader.readBool())
7647 VisitArrayTypeLoc(TL);
7651 VisitArrayTypeLoc(TL);
7654void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7655 VisitArrayTypeLoc(TL);
7658void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7659 DependentSizedArrayTypeLoc TL) {
7660 VisitArrayTypeLoc(TL);
7663void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7664 DependentAddressSpaceTypeLoc TL) {
7671void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7672 DependentSizedExtVectorTypeLoc TL) {
7676void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7680void TypeLocReader::VisitDependentVectorTypeLoc(
7681 DependentVectorTypeLoc TL) {
7685void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7689void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7696void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7697 DependentSizedMatrixTypeLoc TL) {
7710 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7716 VisitFunctionTypeLoc(TL);
7720 VisitFunctionTypeLoc(TL);
7723void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7724 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7725 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7726 SourceLocation NameLoc = readSourceLocation();
7727 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7730void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7731 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7732 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7733 SourceLocation NameLoc = readSourceLocation();
7734 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7737void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7738 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7739 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7740 SourceLocation NameLoc = readSourceLocation();
7741 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7744void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7750void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7757void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7762void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7766void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7778 auto NamedConcept = readTemplateName();
7780 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7785void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7787 if (Reader.readBool())
7789 if (Reader.readBool())
7793void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7807 VisitTagTypeLoc(TL);
7811 VisitTagTypeLoc(TL);
7814void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7816void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7820void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7824void TypeLocReader::VisitLateParsedAttrTypeLoc(LateParsedAttrTypeLoc TL) {
7826 "should be replaced with a concrete type before serialization");
7829void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7833void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7837void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7838 HLSLAttributedResourceTypeLoc TL) {
7842void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7846void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7850void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7851 SubstTemplateTypeParmTypeLoc TL) {
7855void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7856 SubstTemplateTypeParmPackTypeLoc TL) {
7860void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7861 SubstBuiltinTemplatePackTypeLoc TL) {
7865void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7866 TemplateSpecializationTypeLoc TL) {
7867 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7868 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7869 SourceLocation TemplateKeywordLoc = readSourceLocation();
7870 SourceLocation NameLoc = readSourceLocation();
7871 SourceLocation LAngleLoc = readSourceLocation();
7872 SourceLocation RAngleLoc = readSourceLocation();
7873 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7874 LAngleLoc, RAngleLoc);
7875 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7876 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7877 Args[I] = Reader.readTemplateArgumentLocInfo(
7878 TL.
getTypePtr()->template_arguments()[I].getKind());
7881void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7886void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7892void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7896void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7901void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7910void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7922void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7926void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7932void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7936void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7940void TypeLocReader::VisitDependentBitIntTypeLoc(
7941 clang::DependentBitIntTypeLoc TL) {
7945void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7979std::pair<ModuleFile *, unsigned>
7982 "Predefined type shouldn't be in TypesLoaded");
7984 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7986 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7987 assert(OwningModuleFile &&
7988 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7990 return {OwningModuleFile,
7995 assert(ContextObj &&
"reading type with no AST context");
8006 llvm_unreachable(
"Invalid predefined type");
8022 T = Context.UnsignedCharTy;
8025 T = Context.UnsignedShortTy;
8028 T = Context.UnsignedIntTy;
8031 T = Context.UnsignedLongTy;
8034 T = Context.UnsignedLongLongTy;
8037 T = Context.UnsignedInt128Ty;
8040 T = Context.SignedCharTy;
8043 T = Context.WCharTy;
8046 T = Context.ShortTy;
8055 T = Context.LongLongTy;
8058 T = Context.Int128Ty;
8061 T = Context.BFloat16Ty;
8067 T = Context.FloatTy;
8070 T = Context.DoubleTy;
8073 T = Context.LongDoubleTy;
8076 T = Context.ShortAccumTy;
8079 T = Context.AccumTy;
8082 T = Context.LongAccumTy;
8085 T = Context.UnsignedShortAccumTy;
8088 T = Context.UnsignedAccumTy;
8091 T = Context.UnsignedLongAccumTy;
8094 T = Context.ShortFractTy;
8097 T = Context.FractTy;
8100 T = Context.LongFractTy;
8103 T = Context.UnsignedShortFractTy;
8106 T = Context.UnsignedFractTy;
8109 T = Context.UnsignedLongFractTy;
8112 T = Context.SatShortAccumTy;
8115 T = Context.SatAccumTy;
8118 T = Context.SatLongAccumTy;
8121 T = Context.SatUnsignedShortAccumTy;
8124 T = Context.SatUnsignedAccumTy;
8127 T = Context.SatUnsignedLongAccumTy;
8130 T = Context.SatShortFractTy;
8133 T = Context.SatFractTy;
8136 T = Context.SatLongFractTy;
8139 T = Context.SatUnsignedShortFractTy;
8142 T = Context.SatUnsignedFractTy;
8145 T = Context.SatUnsignedLongFractTy;
8148 T = Context.Float16Ty;
8151 T = Context.Float128Ty;
8154 T = Context.Ibm128Ty;
8157 T = Context.OverloadTy;
8160 T = Context.UnresolvedTemplateTy;
8163 T = Context.BoundMemberTy;
8166 T = Context.PseudoObjectTy;
8169 T = Context.DependentTy;
8172 T = Context.UnknownAnyTy;
8175 T = Context.NullPtrTy;
8178 T = Context.MetaInfoTy;
8181 T = Context.Char8Ty;
8184 T = Context.Char16Ty;
8187 T = Context.Char32Ty;
8190 T = Context.ObjCBuiltinIdTy;
8193 T = Context.ObjCBuiltinClassTy;
8196 T = Context.ObjCBuiltinSelTy;
8198#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8199 case PREDEF_TYPE_##Id##_ID: \
8200 T = Context.SingletonId; \
8202#include "clang/Basic/OpenCLImageTypes.def"
8203#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8204 case PREDEF_TYPE_##Id##_ID: \
8205 T = Context.Id##Ty; \
8207#include "clang/Basic/OpenCLExtensionTypes.def"
8209 T = Context.OCLSamplerTy;
8212 T = Context.OCLEventTy;
8215 T = Context.OCLClkEventTy;
8218 T = Context.OCLQueueTy;
8221 T = Context.OCLReserveIDTy;
8224 T = Context.getAutoDeductType();
8227 T = Context.getAutoRRefDeductType();
8230 T = Context.ARCUnbridgedCastTy;
8233 T = Context.BuiltinFnTy;
8236 T = Context.IncompleteMatrixIdxTy;
8239 T = Context.ArraySectionTy;
8242 T = Context.OMPArrayShapingTy;
8245 T = Context.OMPIteratorTy;
8247#define SVE_TYPE(Name, Id, SingletonId) \
8248 case PREDEF_TYPE_##Id##_ID: \
8249 T = Context.SingletonId; \
8251#include "clang/Basic/AArch64ACLETypes.def"
8252#define PPC_VECTOR_TYPE(Name, Id, Size) \
8253 case PREDEF_TYPE_##Id##_ID: \
8254 T = Context.Id##Ty; \
8256#include "clang/Basic/PPCTypes.def"
8257#define RVV_TYPE(Name, Id, SingletonId) \
8258 case PREDEF_TYPE_##Id##_ID: \
8259 T = Context.SingletonId; \
8261#include "clang/Basic/RISCVVTypes.def"
8262#define WASM_TYPE(Name, Id, SingletonId) \
8263 case PREDEF_TYPE_##Id##_ID: \
8264 T = Context.SingletonId; \
8266#include "clang/Basic/WebAssemblyReferenceTypes.def"
8267#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8268 case PREDEF_TYPE_##Id##_ID: \
8269 T = Context.SingletonId; \
8271#include "clang/Basic/AMDGPUTypes.def"
8272#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8273 case PREDEF_TYPE_##Id##_ID: \
8274 T = Context.SingletonId; \
8276#include "clang/Basic/HLSLIntangibleTypes.def"
8277#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
8278 case PREDEF_TYPE_##Id##_ID: \
8279 T = Context.SingletonId; \
8281#include "clang/Basic/HLSLPackedTypes.def"
8282#define SPIRV_TYPE(Name, Id, SingletonId) \
8283 case PREDEF_TYPE_##Id##_ID: \
8284 T = Context.SingletonId; \
8286#include "clang/Basic/SPIRVTypes.def"
8289 assert(!
T.isNull() &&
"Unknown predefined type");
8290 return T.withFastQualifiers(FastQuals);
8293 unsigned Index = translateTypeIDToIndex(ID).second;
8295 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
8296 if (TypesLoaded[Index].isNull()) {
8297 TypesLoaded[Index] = readTypeRecord(ID);
8298 if (TypesLoaded[Index].isNull())
8301 TypesLoaded[Index]->setFromAST();
8302 if (DeserializationListener)
8304 TypesLoaded[Index]);
8307 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8320 ReadModuleOffsetMap(F);
8323 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8325 if (ModuleFileIndex == 0)
8330 ModuleFileIndex = MF.
Index + 1;
8331 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8350 TemplateNameLoc, EllipsisLoc);
8361 llvm_unreachable(
"unexpected template argument loc");
8378 unsigned NumArgsAsWritten =
readInt();
8379 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8393 if (NumCurrentElementsDeserializing) {
8398 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8421 auto *II = Name.getAsIdentifierInfo();
8422 assert(II &&
"non-identifier name in C?");
8423 if (II->isOutOfDate())
8440 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8441 Template = CTSD->getSpecializedTemplate();
8442 Args = CTSD->getTemplateArgs().asArray();
8443 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8444 Template = VTSD->getSpecializedTemplate();
8445 Args = VTSD->getTemplateArgs().asArray();
8446 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8447 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8449 Args = FD->getTemplateSpecializationArgs()->asArray();
8454 Template->loadLazySpecializationsImpl(Args);
8459 RecordLocation Loc = getLocalBitOffset(Offset);
8462 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8463 Error(std::move(Err));
8466 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8471 Error(MaybeCode.takeError());
8474 unsigned Code = MaybeCode.get();
8478 if (!MaybeRecCode) {
8479 Error(MaybeRecCode.takeError());
8483 Error(
"malformed AST file: missing C++ ctor initializers");
8487 return Record.readCXXCtorInitializers();
8491 assert(ContextObj &&
"reading base specifiers with no AST context");
8494 RecordLocation Loc = getLocalBitOffset(Offset);
8497 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8498 Error(std::move(Err));
8501 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8506 Error(MaybeCode.takeError());
8509 unsigned Code = MaybeCode.get();
8513 if (!MaybeRecCode) {
8514 Error(MaybeCode.takeError());
8517 unsigned RecCode = MaybeRecCode.get();
8520 Error(
"malformed AST file: missing C++ base specifiers");
8524 unsigned NumBases =
Record.readInt();
8527 for (
unsigned I = 0; I != NumBases; ++I)
8528 Bases[I] =
Record.readCXXBaseSpecifier();
8541 ReadModuleOffsetMap(F);
8544 OwningModuleFileIndex == 0
8548 if (OwningModuleFileIndex == 0)
8551 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8560 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8561 return M.
Index == ModuleFileIndex - 1;
8569 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8570 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8590 DeclCursorForID(ID, Loc);
8595 assert(ContextObj &&
"reading predefined decl without AST context");
8597 Decl *NewLoaded =
nullptr;
8603 return Context.getTranslationUnitDecl();
8606 if (Context.ObjCIdDecl)
8607 return Context.ObjCIdDecl;
8608 NewLoaded = Context.getObjCIdDecl();
8612 if (Context.ObjCSelDecl)
8613 return Context.ObjCSelDecl;
8614 NewLoaded = Context.getObjCSelDecl();
8618 if (Context.ObjCClassDecl)
8619 return Context.ObjCClassDecl;
8620 NewLoaded = Context.getObjCClassDecl();
8624 if (Context.ObjCProtocolClassDecl)
8625 return Context.ObjCProtocolClassDecl;
8626 NewLoaded = Context.getObjCProtocolDecl();
8630 if (Context.Int128Decl)
8631 return Context.Int128Decl;
8632 NewLoaded = Context.getInt128Decl();
8636 if (Context.UInt128Decl)
8637 return Context.UInt128Decl;
8638 NewLoaded = Context.getUInt128Decl();
8642 if (Context.ObjCInstanceTypeDecl)
8643 return Context.ObjCInstanceTypeDecl;
8644 NewLoaded = Context.getObjCInstanceTypeDecl();
8648 if (Context.BuiltinVaListDecl)
8649 return Context.BuiltinVaListDecl;
8650 NewLoaded = Context.getBuiltinVaListDecl();
8654 if (Context.VaListTagDecl)
8655 return Context.VaListTagDecl;
8656 NewLoaded = Context.getVaListTagDecl();
8660 if (Context.BuiltinMSVaListDecl)
8661 return Context.BuiltinMSVaListDecl;
8662 NewLoaded = Context.getBuiltinMSVaListDecl();
8666 if (Context.BuiltinZOSVaListDecl)
8667 return Context.BuiltinZOSVaListDecl;
8668 NewLoaded = Context.getBuiltinZOSVaListDecl();
8673 return Context.getMSGuidTagDecl();
8676 if (Context.ExternCContext)
8677 return Context.ExternCContext;
8678 NewLoaded = Context.getExternCContextDecl();
8682 if (Context.CFConstantStringTypeDecl)
8683 return Context.CFConstantStringTypeDecl;
8684 NewLoaded = Context.getCFConstantStringDecl();
8688 if (Context.CFConstantStringTagDecl)
8689 return Context.CFConstantStringTagDecl;
8690 NewLoaded = Context.getCFConstantStringTagDecl();
8694 return Context.getMSTypeInfoTagDecl();
8696#define BuiltinTemplate(BTName) \
8697 case PREDEF_DECL##BTName##_ID: \
8698 if (Context.Decl##BTName) \
8699 return Context.Decl##BTName; \
8700 NewLoaded = Context.get##BTName##Decl(); \
8702#include "clang/Basic/BuiltinTemplates.inc"
8705 llvm_unreachable(
"Invalid decl ID");
8709 assert(NewLoaded &&
"Failed to load predefined decl?");
8711 if (DeserializationListener)
8712 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8717unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8718 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8719 if (!OwningModuleFile) {
8728 assert(ContextObj &&
"reading decl with no AST context");
8737 Merged.push_back(ID);
8742 unsigned Index = translateGlobalDeclIDToIndex(ID);
8744 if (Index >= DeclsLoaded.size()) {
8745 assert(0 &&
"declaration ID out-of-range for AST file");
8746 Error(
"declaration ID out-of-range for AST file");
8750 return DeclsLoaded[Index];
8757 unsigned Index = translateGlobalDeclIDToIndex(ID);
8759 if (Index >= DeclsLoaded.size()) {
8760 assert(0 &&
"declaration ID out-of-range for AST file");
8761 Error(
"declaration ID out-of-range for AST file");
8765 if (!DeclsLoaded[Index]) {
8767 if (DeserializationListener)
8768 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8771 return DeclsLoaded[Index];
8780 ReadModuleOffsetMap(M);
8790 uint64_t OrignalModuleFileIndex = 0;
8793 OrignalModuleFileIndex = I + 1;
8797 if (!OrignalModuleFileIndex)
8805 if (Idx >=
Record.size()) {
8806 Error(
"Corrupted AST file");
8823 RecordLocation Loc = getLocalBitOffset(Offset);
8824 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8825 Error(std::move(Err));
8828 assert(NumCurrentElementsDeserializing == 0 &&
8829 "should not be called while already deserializing");
8831 return ReadStmtFromStream(*Loc.F);
8834bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8838 auto It = SpecLookups.find(D);
8839 if (It == SpecLookups.end())
8845 It->second.Table.findAll();
8849 SpecLookups.erase(It);
8851 bool NewSpecsFound =
false;
8852 Deserializing LookupResults(
this);
8853 for (
auto &Info : Infos) {
8854 if (GetExistingDecl(Info))
8856 NewSpecsFound =
true;
8860 return NewSpecsFound;
8867 bool NewSpecsFound =
8868 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8870 return NewSpecsFound;
8872 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8873 return NewSpecsFound;
8876bool ASTReader::LoadExternalSpecializationsImpl(
8877 SpecLookupTableTy &SpecLookups,
const Decl *D,
8881 auto It = SpecLookups.find(D);
8882 if (It == SpecLookups.end())
8885 Deserializing LookupResults(
this);
8889 It->second.Table.find(HashValue);
8891 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8893 llvm::raw_string_ostream OS(Name);
8900 bool NewSpecsFound =
false;
8901 for (
auto &Info : Infos) {
8902 if (GetExistingDecl(Info))
8904 NewSpecsFound =
true;
8908 return NewSpecsFound;
8915 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8916 PartialSpecializationsLookups, D, TemplateArgs);
8918 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8920 return NewDeclsFound;
8928 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8929 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8930 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8932 if (!IsKindWeWant(K))
8935 auto ID = (
DeclID) + LexicalDecls[I + 1];
8940 if (PredefsVisited[ID])
8943 PredefsVisited[ID] =
true;
8947 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8955 for (
const auto &Lexical : TULexicalDecls)
8956 Visit(Lexical.first, Lexical.second);
8958 auto I = LexicalDecls.find(DC);
8959 if (I != LexicalDecls.end())
8960 Visit(I->second.first, I->second.second);
8963 ++NumLexicalDeclContextsRead;
8968class UnalignedDeclIDComp {
8974 : Reader(Reader), Mod(M) {}
8983 SourceLocation RHS = getLocation(R);
8988 SourceLocation LHS = getLocation(L);
9002 unsigned Offset,
unsigned Length,
9006 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
9007 if (I == FileDeclIDs.end())
9010 FileDeclsInfo &DInfo = I->second;
9011 if (DInfo.Decls.empty())
9018 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
9020 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
9021 if (BeginIt != DInfo.Decls.begin())
9027 while (BeginIt != DInfo.Decls.begin() &&
9030 ->isTopLevelDeclInObjCContainer())
9034 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
9035 if (EndIt != DInfo.Decls.end())
9048 "DeclContext has no visible decls in storage");
9055 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
9077 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
9078 ++NumVisibleDeclContextsRead;
9079 Find(It->second.Table, Name);
9082 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
9083 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
9084 ++NumModuleLocalVisibleDeclContexts;
9085 Find(It->second.Table, std::make_pair(Name, NamedModule));
9088 if (
auto *NamedModule =
9089 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
9091 FindModuleLocalLookup(NamedModule);
9096 if (ContextObj && ContextObj->getCurrentNamedModule())
9097 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
9099 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
9100 ++NumTULocalVisibleDeclContexts;
9101 Find(It->second.Table, Name);
9114 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
9115 auto It = LookupTables.find(DC);
9116 if (It == LookupTables.end())
9138 findAll(Lookups, NumVisibleDeclContextsRead);
9139 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
9140 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
9142 for (
auto &[Name, DS] : Decls)
9145 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
9150 auto I = Lookups.find(Primary);
9151 return I == Lookups.end() ?
nullptr : &I->second;
9156 auto I = ModuleLocalLookups.find(Primary);
9157 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
9162 auto I = TULocalLookups.find(Primary);
9163 return I == TULocalLookups.end() ?
nullptr : &I->second;
9170 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
9171 auto I = LookupTable.find(D);
9172 return I == LookupTable.end() ?
nullptr : &I->second;
9177 return PartialSpecializationsLookups.contains(D) ||
9178 SpecializationsLookups.contains(D);
9187 assert(ImplD && Consumer);
9189 for (
auto *I : ImplD->
methods())
9195void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9196 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9199 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9202void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9203 Consumer->HandleVTable(RD);
9207 this->Consumer = Consumer;
9210 PassInterestingDeclsToConsumer();
9212 if (DeserializationListener)
9213 DeserializationListener->ReaderInitialized(
this);
9217 std::fprintf(
stderr,
"*** AST File Statistics:\n");
9219 unsigned NumTypesLoaded =
9220 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
9221 unsigned NumDeclsLoaded =
9222 DeclsLoaded.size() -
9223 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
9224 unsigned NumIdentifiersLoaded =
9225 IdentifiersLoaded.size() -
9227 unsigned NumMacrosLoaded =
9228 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
9229 unsigned NumSelectorsLoaded =
9230 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
9233 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
9234 NumSLocEntriesRead, TotalNumSLocEntries,
9235 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9236 if (!TypesLoaded.empty())
9237 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
9238 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
9239 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
9240 if (!DeclsLoaded.empty())
9241 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
9242 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
9243 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9244 if (!IdentifiersLoaded.empty())
9245 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
9246 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
9247 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9248 if (!MacrosLoaded.empty())
9249 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9250 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
9251 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9252 if (!SelectorsLoaded.empty())
9253 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
9254 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
9255 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9256 if (TotalNumStatements)
9257 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
9258 NumStatementsRead, TotalNumStatements,
9259 ((
float)NumStatementsRead/TotalNumStatements * 100));
9261 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9262 NumMacrosRead, TotalNumMacros,
9263 ((
float)NumMacrosRead/TotalNumMacros * 100));
9264 if (TotalLexicalDeclContexts)
9265 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
9266 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9267 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9269 if (TotalVisibleDeclContexts)
9270 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
9271 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9272 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9274 if (TotalModuleLocalVisibleDeclContexts)
9276 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
9277 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9278 ((
float)NumModuleLocalVisibleDeclContexts /
9279 TotalModuleLocalVisibleDeclContexts * 100));
9280 if (TotalTULocalVisibleDeclContexts)
9281 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
9282 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9283 ((
float)NumTULocalVisibleDeclContexts /
9284 TotalTULocalVisibleDeclContexts * 100));
9285 if (TotalNumMethodPoolEntries)
9286 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
9287 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9288 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9290 if (NumMethodPoolLookups)
9291 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
9292 NumMethodPoolHits, NumMethodPoolLookups,
9293 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9294 if (NumMethodPoolTableLookups)
9295 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
9296 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9297 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9299 if (NumIdentifierLookupHits)
9301 " %u / %u identifier table lookups succeeded (%f%%)\n",
9302 NumIdentifierLookupHits, NumIdentifierLookups,
9303 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9306 std::fprintf(
stderr,
"\n");
9307 GlobalIndex->printStats();
9310 std::fprintf(
stderr,
"\n");
9312 std::fprintf(
stderr,
"\n");
9315template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9316LLVM_DUMP_METHOD
static void
9319 InitialCapacity> &Map) {
9320 if (Map.begin() == Map.end())
9325 llvm::errs() << Name <<
":\n";
9326 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9328 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9333 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9335 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9339 GlobalPreprocessedEntityMap);
9341 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9350 if (llvm::MemoryBuffer *buf = I.Buffer) {
9351 size_t bytes = buf->getBufferSize();
9352 switch (buf->getBufferKind()) {
9353 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9356 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9377 if (!FPPragmaOptions.empty()) {
9378 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9381 SemaObj->CurFPFeatures =
9387 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9388 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9389 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9390 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9392 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9394 DeclsWithEffectsToVerify.clear();
9396 SemaObj->OpenCLFeatures = OpenCLExtensions;
9402 assert(SemaObj &&
"no Sema to update");
9408 OpenMPRequiresDecls.clear();
9412 if (!SemaDeclRefs.empty()) {
9413 assert(SemaDeclRefs.size() % 3 == 0);
9414 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9415 if (!SemaObj->StdNamespace)
9416 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9417 if (!SemaObj->StdBadAlloc)
9418 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9419 if (!SemaObj->StdAlignValT)
9420 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9422 SemaDeclRefs.clear();
9427 if(OptimizeOffPragmaLocation.isValid())
9428 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9429 if (PragmaMSStructState != -1)
9431 if (PointersToMembersPragmaLocation.isValid()) {
9432 SemaObj->ActOnPragmaMSPointersToMembers(
9434 PragmaMSPointersToMembersState,
9435 PointersToMembersPragmaLocation);
9437 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9438 if (!RISCVVecIntrinsicPragma.empty()) {
9439 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9440 "Wrong number of RISCVVecIntrinsicPragma");
9441 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9442 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9443 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9446 if (PragmaAlignPackCurrentValue) {
9450 bool DropFirst =
false;
9451 if (!PragmaAlignPackStack.empty() &&
9452 PragmaAlignPackStack.front().Location.isInvalid()) {
9453 assert(PragmaAlignPackStack.front().Value ==
9454 SemaObj->AlignPackStack.DefaultValue &&
9455 "Expected a default alignment value");
9456 SemaObj->AlignPackStack.Stack.emplace_back(
9457 PragmaAlignPackStack.front().SlotLabel,
9458 SemaObj->AlignPackStack.CurrentValue,
9459 SemaObj->AlignPackStack.CurrentPragmaLocation,
9460 PragmaAlignPackStack.front().PushLocation);
9463 for (
const auto &Entry :
9464 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9465 SemaObj->AlignPackStack.Stack.emplace_back(
9466 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9468 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9469 assert(*PragmaAlignPackCurrentValue ==
9470 SemaObj->AlignPackStack.DefaultValue &&
9471 "Expected a default align and pack value");
9474 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9475 SemaObj->AlignPackStack.CurrentPragmaLocation =
9476 PragmaAlignPackCurrentLocation;
9479 if (FpPragmaCurrentValue) {
9483 bool DropFirst =
false;
9484 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9485 assert(FpPragmaStack.front().Value ==
9486 SemaObj->FpPragmaStack.DefaultValue &&
9487 "Expected a default pragma float_control value");
9488 SemaObj->FpPragmaStack.Stack.emplace_back(
9489 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9490 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9491 FpPragmaStack.front().PushLocation);
9494 for (
const auto &Entry :
9496 SemaObj->FpPragmaStack.Stack.emplace_back(
9497 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9498 if (FpPragmaCurrentLocation.isInvalid()) {
9499 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9500 "Expected a default pragma float_control value");
9503 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9504 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9509 for (
auto &Import : PendingImportedModulesSema) {
9510 if (Import.ImportLoc.isInvalid())
9513 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9516 PendingImportedModulesSema.clear();
9523 IdentifierLookupVisitor Visitor(Name, 0,
9524 NumIdentifierLookups,
9525 NumIdentifierLookupHits);
9531 if (PP.getLangOpts().CPlusPlus) {
9532 for (
auto *F : ModuleMgr.pch_modules())
9541 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9546 ModuleMgr.visit(Visitor, HitsPtr);
9568 ASTIdentifierLookupTable::key_iterator Current;
9572 ASTIdentifierLookupTable::key_iterator End;
9579 bool SkipModules =
false);
9581 StringRef
Next()
override;
9588 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9592 while (Current == End) {
9604 Current = IdTable->key_begin();
9605 End = IdTable->key_end();
9610 StringRef
Result = *Current;
9619 std::unique_ptr<IdentifierIterator> Current;
9620 std::unique_ptr<IdentifierIterator> Queued;
9623 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9624 std::unique_ptr<IdentifierIterator> Second)
9625 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9627 StringRef
Next()
override {
9631 StringRef result = Current->Next();
9632 if (!result.empty())
9637 std::swap(Current, Queued);
9646 std::unique_ptr<IdentifierIterator> ReaderIter(
9648 std::unique_ptr<IdentifierIterator> ModulesIter(
9649 GlobalIndex->createIdentifierIterator());
9650 return new ChainedIdentifierIterator(std::move(ReaderIter),
9651 std::move(ModulesIter));
9663 unsigned PriorGeneration;
9664 unsigned InstanceBits = 0;
9665 unsigned FactoryBits = 0;
9666 bool InstanceHasMoreThanOneDecl =
false;
9667 bool FactoryHasMoreThanOneDecl =
false;
9673 unsigned PriorGeneration)
9674 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9684 ++Reader.NumMethodPoolTableLookups;
9687 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9688 if (Pos == PoolTable->end())
9691 ++Reader.NumMethodPoolTableHits;
9692 ++Reader.NumSelectorsRead;
9696 ++Reader.NumMethodPoolEntriesRead;
9698 if (Reader.DeserializationListener)
9699 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9704 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9705 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9706 InstanceBits =
Data.InstanceBits;
9707 FactoryBits =
Data.FactoryBits;
9708 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9709 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9715 return InstanceMethods;
9720 return FactoryMethods;
9727 return InstanceHasMoreThanOneDecl;
9745 unsigned &Generation = SelectorGeneration[Sel];
9746 unsigned PriorGeneration = Generation;
9748 SelectorOutOfDate[Sel] =
false;
9751 ++NumMethodPoolLookups;
9753 ModuleMgr.visit(Visitor);
9759 ++NumMethodPoolHits;
9780 if (SelectorOutOfDate[Sel])
9788 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9790 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9791 Namespaces.push_back(Namespace);
9796 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9797 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9798 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9801 Undefined.insert(std::make_pair(D, Loc));
9803 UndefinedButUsed.clear();
9809 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9812 uint64_t Count = DelayedDeleteExprs[Idx++];
9813 for (uint64_t
C = 0;
C < Count; ++
C) {
9816 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9817 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9824 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9825 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9827 TentativeDefs.push_back(Var);
9829 TentativeDefinitions.clear();
9834 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9836 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9840 UnusedFileScopedDecls.clear();
9845 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9847 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9851 DelegatingCtorDecls.clear();
9855 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9857 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9861 ExtVectorDecls.clear();
9865 llvm::SmallPtrSetImpl<const TypedefNameDecl *> &Decls) {
9866 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9869 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9873 UnusedLocalTypedefNameCandidates.clear();
9878 for (
auto I : DeclsToCheckForDeferredDiags) {
9879 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9883 DeclsToCheckForDeferredDiags.clear();
9888 if (ReferencedSelectorsData.empty())
9893 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9895 while (I < DataSize) {
9899 Sels.push_back(std::make_pair(Sel, SelLoc));
9901 ReferencedSelectorsData.clear();
9906 if (WeakUndeclaredIdentifiers.empty())
9909 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9917 WeakIDs.push_back(std::make_pair(WeakId, WI));
9919 WeakUndeclaredIdentifiers.clear();
9923 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9924 if (ExtnameUndeclaredIdentifiers.empty())
9927 for (
unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9934 AsmLabelAttr *
Attr = AsmLabelAttr::CreateImplicit(
9938 ExtnameIDs.push_back(std::make_pair(NameId,
Attr));
9940 ExtnameUndeclaredIdentifiers.clear();
9944 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9946 VTableUse &TableInfo = VTableUses[Idx++];
9947 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9950 VTables.push_back(VT);
9958 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9959 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9963 Pending.push_back(std::make_pair(D, Loc));
9965 PendingInstantiations.clear();
9969 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9971 for (
auto &LPT : LateParsedTemplates) {
9974 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9978 auto LT = std::make_unique<LateParsedTemplate>();
9979 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9983 assert(F &&
"No module");
9985 unsigned TokN = LateParsed[Idx++];
9986 LT->Toks.reserve(TokN);
9987 for (
unsigned T = 0;
T < TokN; ++
T)
9988 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9990 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9994 LateParsedTemplates.clear();
10003 assert(ID &&
"Non-zero identifier ID required");
10004 unsigned Index = translateIdentifierIDToIndex(ID).second;
10005 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
10006 IdentifiersLoaded[Index] = II;
10007 if (DeserializationListener)
10008 DeserializationListener->IdentifierRead(ID, II);
10030 if (NumCurrentElementsDeserializing && !Decls) {
10031 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
10035 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
10048 Decls->push_back(D);
10055 pushExternalDeclIntoScope(D, II);
10059std::pair<ModuleFile *, unsigned>
10060ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
10062 return {
nullptr, 0};
10064 unsigned ModuleFileIndex = ID >> 32;
10065 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
10067 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
10079 if (IdentifiersLoaded.empty()) {
10080 Error(
"no identifier table in AST file");
10084 auto [M, Index] = translateIdentifierIDToIndex(ID);
10085 if (!IdentifiersLoaded[Index]) {
10086 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
10089 const unsigned char *
Data =
10094 auto Key = Trait.
ReadKey(
Data, KeyDataLen.first);
10095 auto &II = PP.getIdentifierTable().get(Key);
10096 IdentifiersLoaded[Index] = &II;
10099 if (DeserializationListener)
10100 DeserializationListener->IdentifierRead(ID, &II);
10103 return IdentifiersLoaded[Index];
10115 ReadModuleOffsetMap(M);
10117 unsigned ModuleFileIndex = LocalID >> 32;
10118 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
10121 assert(MF &&
"malformed identifier ID encoding?");
10123 if (!ModuleFileIndex)
10129std::pair<ModuleFile *, unsigned>
10130ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
10132 return {
nullptr, 0};
10134 unsigned ModuleFileIndex = ID >> 32;
10135 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
10139 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
10148 if (MacrosLoaded.empty()) {
10149 Error(
"no macro table in AST file");
10153 auto [M, Index] = translateMacroIDToIndex(ID);
10154 if (!MacrosLoaded[Index]) {
10155 assert(M !=
nullptr &&
"Untranslated Macro ID?");
10161 if (DeserializationListener)
10162 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10165 return MacrosLoaded[Index];
10173 ReadModuleOffsetMap(M);
10175 unsigned ModuleFileIndex = LocalID >> 32;
10176 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10179 assert(MF &&
"malformed identifier ID encoding?");
10181 if (!ModuleFileIndex) {
10186 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
10195 ReadModuleOffsetMap(M);
10200 &&
"Invalid index into submodule index remap");
10202 return LocalID + I->second;
10213 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
10216 int IndexFromEnd =
static_cast<int>(ID >> 1);
10217 assert(IndexFromEnd &&
"got reference to unknown module file");
10234 auto I = llvm::find(PCHModules, M);
10235 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
10236 return std::distance(I, PCHModules.end()) << 1;
10245 const auto &PCHChain = ModuleMgr.pch_modules();
10246 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10247 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10251 llvm::sys::path::parent_path(MF.
FileName),
10254 return std::nullopt;
10258 auto I = DefinitionSource.find(FD);
10259 if (I == DefinitionSource.end())
10265 return ThisDeclarationWasADefinitionSet.contains(FD);
10276 if (ID > SelectorsLoaded.size()) {
10277 Error(
"selector ID out of range in AST file");
10281 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
10284 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
10288 SelectorsLoaded[ID - 1] =
10290 if (DeserializationListener)
10291 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10294 return SelectorsLoaded[ID - 1];
10312 ReadModuleOffsetMap(M);
10317 &&
"Invalid index into selector index remap");
10319 return LocalID + I->second;
10350 NameInfo.
setName(readDeclarationName());
10364 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10365 assert(Op.isValid());
10371 unsigned NumTPLists =
readInt();
10376 for (
unsigned i = 0; i != NumTPLists; ++i)
10387 unsigned NumParams =
readInt();
10389 Params.reserve(NumParams);
10390 while (NumParams--)
10393 bool HasRequiresClause =
readBool();
10394 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10397 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10398 return TemplateParams;
10403 bool Canonicalize) {
10404 unsigned NumTemplateArgs =
readInt();
10405 TemplArgs.reserve(NumTemplateArgs);
10406 while (NumTemplateArgs--)
10412 unsigned NumDecls =
readInt();
10414 while (NumDecls--) {
10426 bool inheritConstructors =
readBool();
10432 Result.setInheritConstructors(inheritConstructors);
10439 unsigned NumInitializers =
readInt();
10440 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10442 for (
unsigned i = 0; i != NumInitializers; ++i) {
10444 bool IsBaseVirtual =
false;
10475 BOMInit =
new (Context)
10477 RParenLoc, MemberOrEllipsisLoc);
10479 BOMInit =
new (Context)
10482 BOMInit =
new (Context)
10486 BOMInit =
new (Context)
10488 LParenLoc,
Init, RParenLoc);
10491 unsigned SourceOrder =
readInt();
10495 CtorInitializers[i] = BOMInit;
10498 return CtorInitializers;
10506 for (
unsigned I = 0; I != N; ++I) {
10507 auto Kind = readNestedNameSpecifierKind();
10512 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10521 Builder.Make(Context,
T->getTypeLoc(), ColonColonLoc);
10527 Builder.MakeGlobal(Context, ColonColonLoc);
10534 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10539 llvm_unreachable(
"unexpected null nested name specifier");
10554 const StringRef Blob) {
10555 unsigned Count =
Record[0];
10556 const char *Byte = Blob.data();
10557 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10558 for (
unsigned I = 0; I < Count; ++Byte)
10559 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10560 if (*Byte & (1 << Bit))
10567 return llvm::APFloat(Sem,
readAPInt());
10572 unsigned Len =
Record[Idx++];
10580 unsigned Len =
Record[Idx++];
10581 StringRef
Result = Blob.substr(0, Len);
10582 Blob = Blob.substr(Len);
10606 unsigned Major =
Record[Idx++];
10607 unsigned Minor =
Record[Idx++];
10608 unsigned Subminor =
Record[Idx++];
10610 return VersionTuple(Major);
10612 return VersionTuple(Major, Minor - 1);
10613 return VersionTuple(Major, Minor - 1, Subminor - 1);
10624 return Diag(CurrentImportLoc, DiagID);
10628 return Diags.Report(Loc, DiagID);
10632 llvm::function_ref<
void()> Fn) {
10635 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10639 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10645 return PP.getIdentifierTable();
10651 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10652 "Already have a SwitchCase with this ID");
10653 (*CurrSwitchCaseStmts)[ID] = SC;
10658 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10659 return (*CurrSwitchCaseStmts)[ID];
10663 CurrSwitchCaseStmts->clear();
10668 std::vector<RawComment *> Comments;
10675 BitstreamCursor &Cursor = I->first;
10682 Cursor.advanceSkippingSubblocks(
10683 BitstreamCursor::AF_DontPopBlockAtEnd);
10685 Error(MaybeEntry.takeError());
10688 llvm::BitstreamEntry Entry = MaybeEntry.get();
10690 switch (Entry.Kind) {
10691 case llvm::BitstreamEntry::SubBlock:
10692 case llvm::BitstreamEntry::Error:
10693 Error(
"malformed block record in AST file");
10695 case llvm::BitstreamEntry::EndBlock:
10697 case llvm::BitstreamEntry::Record:
10705 if (!MaybeComment) {
10706 Error(MaybeComment.takeError());
10715 bool IsTrailingComment =
Record[Idx++];
10716 bool IsAlmostTrailingComment =
Record[Idx++];
10717 Comments.push_back(
new (Context)
RawComment(
10718 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10728 if (Loc.first.isValid())
10729 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10742 assert(NumUserInputs <= NumInputs);
10743 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10744 for (
unsigned I = 0; I < N; ++I) {
10745 bool IsSystem = I >= NumUserInputs;
10747 Visitor(IFI, IsSystem);
10752 bool IncludeSystem,
bool Complain,
10754 bool isSystem)> Visitor) {
10757 assert(NumUserInputs <= NumInputs);
10758 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10759 for (
unsigned I = 0; I < N; ++I) {
10760 bool IsSystem = I >= NumUserInputs;
10761 InputFile IF = getInputFile(MF, I+1, Complain);
10762 Visitor(IF, IsSystem);
10770 for (
unsigned I = 0; I < NumInputs; ++I) {
10773 if (
auto FE = getInputFile(MF, I + 1).getFile())
10778void ASTReader::finishPendingActions() {
10779 while (!PendingIdentifierInfos.empty() ||
10780 !PendingDeducedFunctionTypes.empty() ||
10781 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10782 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10783 !PendingUpdateRecords.empty() ||
10784 !PendingObjCExtensionIvarRedeclarations.empty()) {
10787 using TopLevelDeclsMap =
10788 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10789 TopLevelDeclsMap TopLevelDecls;
10791 while (!PendingIdentifierInfos.empty()) {
10794 std::move(PendingIdentifierInfos.back().second);
10795 PendingIdentifierInfos.pop_back();
10802 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10803 auto *FD = PendingDeducedFunctionTypes[I].first;
10804 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10806 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10809 if (DT->isDeduced()) {
10810 PendingDeducedTypeUpdates.insert(
10811 {FD->getCanonicalDecl(), FD->getReturnType()});
10818 PendingUndeducedFunctionDecls.push_back(FD);
10822 PendingDeducedFunctionTypes.clear();
10826 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10827 auto *VD = PendingDeducedVarTypes[I].first;
10828 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10830 PendingDeducedVarTypes.clear();
10833 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10834 loadPendingDeclChain(PendingDeclChains[I].first,
10835 PendingDeclChains[I].second);
10836 PendingDeclChains.clear();
10839 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10840 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10841 IdentifierInfo *II = TLD->first;
10842 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10848 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10849 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10850 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10851 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10853 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10855 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10856 if (!Info.M->isModule())
10860 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10862 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10863 if (Info.M->isModule())
10867 PendingMacroIDs.clear();
10871 while (!PendingDeclContextInfos.empty()) {
10872 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10873 PendingDeclContextInfos.pop_front();
10876 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10880 while (!PendingUpdateRecords.empty()) {
10881 auto Update = PendingUpdateRecords.pop_back_val();
10882 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10883 loadDeclUpdateRecords(
Update);
10886 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10887 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10888 auto DuplicateIvars =
10889 PendingObjCExtensionIvarRedeclarations.back().second;
10891 StructuralEquivalenceContext Ctx(
10892 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10893 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10897 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10899 for (
auto IvarPair : DuplicateIvars) {
10900 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10902 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10908 ExtensionsPair.first->setInvalidDecl();
10909 ExtensionsPair.second->getClassInterface()
10911 ->setIvarList(
nullptr);
10913 for (
auto IvarPair : DuplicateIvars) {
10914 Diag(IvarPair.first->getLocation(),
10915 diag::err_duplicate_ivar_declaration)
10916 << IvarPair.first->getIdentifier();
10917 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10920 PendingObjCExtensionIvarRedeclarations.pop_back();
10926 assert(PendingFakeDefinitionData.empty() &&
10927 "faked up a class definition but never saw the real one");
10933 for (Decl *D : PendingDefinitions) {
10934 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10935 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10936 for (
auto *R = getMostRecentExistingDecl(RD);
R;
10937 R =
R->getPreviousDecl()) {
10940 "declaration thinks it's the definition but it isn't");
10948 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10953 for (
auto *R = getMostRecentExistingDecl(ID);
R;
R =
R->getPreviousDecl())
10959 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10960 for (
auto *R = getMostRecentExistingDecl(PD);
R;
R =
R->getPreviousDecl())
10967 for (
auto *R = getMostRecentExistingDecl(RTD);
R;
R =
R->getPreviousDecl())
10970 PendingDefinitions.clear();
10972 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10973 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10974 if (
auto *VD = dyn_cast<VarDecl>(D))
10975 return VD->isThisDeclarationADefinition() ||
10976 VD->isThisDeclarationADemotedDefinition();
10978 if (
auto *TD = dyn_cast<TagDecl>(D))
10979 return TD->isThisDeclarationADefinition() ||
10980 TD->isThisDeclarationADemotedDefinition();
10982 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10983 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10985 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10986 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10993 return hasDefinitionImpl(D, hasDefinitionImpl);
11009 PendingWarningForDuplicatedDefsInModuleUnits.clear();
11015 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
11016 PBEnd = PendingBodies.end();
11017 PB != PBEnd; ++PB) {
11018 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
11020 const FunctionDecl *Defn =
nullptr;
11021 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
11022 FD->setLazyBody(PB->second);
11024 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
11027 if (!FD->isLateTemplateParsed() &&
11028 !NonConstDefn->isLateTemplateParsed() &&
11033 FD->getODRHash() != NonConstDefn->getODRHash()) {
11035 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
11036 }
else if (FD->getLexicalParent()->isFileContext() &&
11037 NonConstDefn->getLexicalParent()->isFileContext()) {
11041 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
11052 PendingBodies.clear();
11055 for (
auto [RD, MD] : PendingAddedClassMembers) {
11063 if (
const auto *Ctor = dyn_cast<CXXConstructorDecl>(MD)) {
11064 if (!Ctor->isInheritingConstructor()) {
11065 if (Ctor->isDefaultConstructor()) {
11070 if (Ctor->isCopyConstructor()) {
11075 if (Ctor->isMoveConstructor()) {
11081 }
else if (
const auto *Mthd = dyn_cast<CXXMethodDecl>(MD)) {
11087 if (Mthd->isCopyAssignmentOperator()) {
11092 if (Mthd->isMoveAssignmentOperator()) {
11099 if (
auto *FD = dyn_cast<FunctionDecl>(MD)) {
11103 auto needToAddMD =
true;
11105 if (
auto *RDFD = dyn_cast<FunctionDecl>(RDD)) {
11106 if (FD->getODRHash() == RDFD->getODRHash()) {
11107 needToAddMD =
false;
11120 RD->addedMember(MD);
11122 PendingAddedClassMembers.clear();
11125 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
11127 PendingMergedDefinitionsToDeduplicate.clear();
11131 for (Decl *D : PendingIncompleteDeclChains)
11132 markIncompleteDeclChain(D);
11133 PendingIncompleteDeclChains.clear();
11135 assert(PendingIdentifierInfos.empty() &&
11136 "Should be empty at the end of finishPendingActions");
11137 assert(PendingDeducedFunctionTypes.empty() &&
11138 "Should be empty at the end of finishPendingActions");
11139 assert(PendingDeducedVarTypes.empty() &&
11140 "Should be empty at the end of finishPendingActions");
11141 assert(PendingDeclChains.empty() &&
11142 "Should be empty at the end of finishPendingActions");
11143 assert(PendingMacroIDs.empty() &&
11144 "Should be empty at the end of finishPendingActions");
11145 assert(PendingDeclContextInfos.empty() &&
11146 "Should be empty at the end of finishPendingActions");
11147 assert(PendingUpdateRecords.empty() &&
11148 "Should be empty at the end of finishPendingActions");
11149 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
11150 "Should be empty at the end of finishPendingActions");
11151 assert(PendingFakeDefinitionData.empty() &&
11152 "Should be empty at the end of finishPendingActions");
11153 assert(PendingDefinitions.empty() &&
11154 "Should be empty at the end of finishPendingActions");
11155 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
11156 "Should be empty at the end of finishPendingActions");
11157 assert(PendingBodies.empty() &&
11158 "Should be empty at the end of finishPendingActions");
11159 assert(PendingAddedClassMembers.empty() &&
11160 "Should be empty at the end of finishPendingActions");
11161 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
11162 "Should be empty at the end of finishPendingActions");
11163 assert(PendingIncompleteDeclChains.empty() &&
11164 "Should be empty at the end of finishPendingActions");
11167void ASTReader::diagnoseOdrViolations() {
11168 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
11169 PendingRecordOdrMergeFailures.empty() &&
11170 PendingFunctionOdrMergeFailures.empty() &&
11171 PendingEnumOdrMergeFailures.empty() &&
11172 PendingObjCInterfaceOdrMergeFailures.empty() &&
11173 PendingObjCProtocolOdrMergeFailures.empty())
11180 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
11181 PendingOdrMergeFailures.clear();
11182 for (
auto &Merge : OdrMergeFailures) {
11183 Merge.first->buildLookup();
11184 Merge.first->decls_begin();
11185 Merge.first->bases_begin();
11186 Merge.first->vbases_begin();
11187 for (
auto &RecordPair : Merge.second) {
11188 auto *RD = RecordPair.first;
11196 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
11197 PendingRecordOdrMergeFailures.clear();
11198 for (
auto &Merge : RecordOdrMergeFailures) {
11199 Merge.first->decls_begin();
11200 for (
auto &D : Merge.second)
11205 auto ObjCInterfaceOdrMergeFailures =
11206 std::move(PendingObjCInterfaceOdrMergeFailures);
11207 PendingObjCInterfaceOdrMergeFailures.clear();
11208 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11209 Merge.first->decls_begin();
11210 for (
auto &InterfacePair : Merge.second)
11211 InterfacePair.first->decls_begin();
11215 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11216 PendingFunctionOdrMergeFailures.clear();
11217 for (
auto &Merge : FunctionOdrMergeFailures) {
11218 Merge.first->buildLookup();
11219 Merge.first->decls_begin();
11220 Merge.first->getBody();
11221 for (
auto &FD : Merge.second) {
11229 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11230 PendingEnumOdrMergeFailures.clear();
11231 for (
auto &Merge : EnumOdrMergeFailures) {
11232 Merge.first->decls_begin();
11233 for (
auto &
Enum : Merge.second) {
11234 Enum->decls_begin();
11239 auto ObjCProtocolOdrMergeFailures =
11240 std::move(PendingObjCProtocolOdrMergeFailures);
11241 PendingObjCProtocolOdrMergeFailures.clear();
11242 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11243 Merge.first->decls_begin();
11244 for (
auto &ProtocolPair : Merge.second)
11245 ProtocolPair.first->decls_begin();
11254 while (!PendingOdrMergeChecks.empty()) {
11255 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11266 bool Found =
false;
11269 for (
auto *RI : D->
redecls()) {
11270 if (RI->getLexicalDeclContext() == CanonDef) {
11284 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11285 for (
auto *CanonMember : CanonDef->
decls()) {
11286 if (CanonMember->getCanonicalDecl() == DCanon) {
11295 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
11297 Candidates.push_back(ND);
11310 std::string CanonDefModule =
11315 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11317 if (Candidates.empty())
11319 diag::note_module_odr_violation_no_possible_decls) << D;
11321 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
11322 Diag(Candidates[I]->getLocation(),
11323 diag::note_module_odr_violation_possible_decl)
11327 DiagnosedOdrMergeFailures.insert(CanonDef);
11331 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11332 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11333 ObjCInterfaceOdrMergeFailures.empty() &&
11334 ObjCProtocolOdrMergeFailures.empty())
11337 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
11341 for (
auto &Merge : OdrMergeFailures) {
11344 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11347 bool Diagnosed =
false;
11348 CXXRecordDecl *FirstRecord = Merge.first;
11349 for (
auto &RecordPair : Merge.second) {
11350 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11351 RecordPair.second)) {
11364 Diag(Merge.first->getLocation(),
11365 diag::err_module_odr_violation_different_instantiations)
11372 for (
auto &Merge : RecordOdrMergeFailures) {
11375 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11378 RecordDecl *FirstRecord = Merge.first;
11379 bool Diagnosed =
false;
11380 for (
auto *SecondRecord : Merge.second) {
11381 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11387 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11391 for (
auto &Merge : FunctionOdrMergeFailures) {
11392 FunctionDecl *FirstFunction = Merge.first;
11393 bool Diagnosed =
false;
11394 for (
auto &SecondFunction : Merge.second) {
11395 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11401 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11405 for (
auto &Merge : EnumOdrMergeFailures) {
11408 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11411 EnumDecl *FirstEnum = Merge.first;
11412 bool Diagnosed =
false;
11413 for (
auto &SecondEnum : Merge.second) {
11414 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11420 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11423 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11426 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11429 bool Diagnosed =
false;
11430 ObjCInterfaceDecl *FirstID = Merge.first;
11431 for (
auto &InterfacePair : Merge.second) {
11432 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11433 InterfacePair.second)) {
11439 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11442 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11445 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11448 ObjCProtocolDecl *FirstProtocol = Merge.first;
11449 bool Diagnosed =
false;
11450 for (
auto &ProtocolPair : Merge.second) {
11451 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11452 ProtocolPair.second)) {
11458 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11463 if (llvm::Timer *
T = ReadTimer.get();
11464 ++NumCurrentElementsDeserializing == 1 &&
T)
11465 ReadTimeRegion.emplace(
T);
11469 assert(NumCurrentElementsDeserializing &&
11470 "FinishedDeserializing not paired with StartedDeserializing");
11471 if (NumCurrentElementsDeserializing == 1) {
11474 finishPendingActions();
11476 --NumCurrentElementsDeserializing;
11478 if (NumCurrentElementsDeserializing == 0) {
11482 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11490 while (!PendingExceptionSpecUpdates.empty() ||
11491 !PendingDeducedTypeUpdates.empty() ||
11492 !PendingUndeducedFunctionDecls.empty()) {
11493 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11494 PendingExceptionSpecUpdates.clear();
11495 for (
auto Update : ESUpdates) {
11496 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11499 if (
auto *Listener =
getContext().getASTMutationListener())
11501 for (
auto *Redecl :
Update.second->redecls())
11505 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11506 PendingDeducedTypeUpdates.clear();
11507 for (
auto Update : DTUpdates) {
11508 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11515 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11516 PendingUndeducedFunctionDecls.clear();
11520 (void)UndeducedFD->getMostRecentDecl();
11523 ReadTimeRegion.reset();
11525 diagnoseOdrViolations();
11531 PassInterestingDeclsToConsumer();
11538 auto It = PendingFakeLookupResults.find(II);
11539 if (It != PendingFakeLookupResults.end()) {
11540 for (
auto *ND : It->second)
11545 It->second.clear();
11549 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11550 SemaObj->TUScope->AddDecl(D);
11551 }
else if (SemaObj->TUScope) {
11555 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11556 SemaObj->TUScope->AddDecl(D);
11564 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11565 StringRef isysroot,
11567 bool AllowASTWithCompilerErrors,
11568 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11569 bool ForceValidateUserInputs,
11570 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11571 std::unique_ptr<llvm::Timer> ReadTimer)
11576 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11577 StackHandler(Diags), PP(PP), ContextObj(Context),
11578 CodeGenOpts(CodeGenOpts),
11580 PP.getHeaderSearchInfo()),
11581 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11582 DisableValidationKind(DisableValidationKind),
11583 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11584 AllowConfigurationMismatch(AllowConfigurationMismatch),
11585 ValidateSystemInputs(ValidateSystemInputs),
11586 ForceValidateUserInputs(ForceValidateUserInputs),
11587 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11588 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11589 SourceMgr.setExternalSLocEntrySource(
this);
11591 PathBuf.reserve(256);
11593 for (
const auto &Ext : Extensions) {
11594 auto BlockName = Ext->getExtensionMetadata().BlockName;
11595 auto Known = ModuleFileExtensions.find(BlockName);
11596 if (Known != ModuleFileExtensions.end()) {
11597 Diags.Report(diag::warn_duplicate_module_file_extension)
11602 ModuleFileExtensions.insert({BlockName, Ext});
11607 if (OwnsDeserializationListener)
11608 delete DeserializationListener;
11612 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11616 unsigned AbbrevID) {
11619 return Cursor.readRecord(AbbrevID, Record);
11635 : Record(Record), Context(Record.getContext()) {}
11636#define GEN_CLANG_CLAUSE_CLASS
11637#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11638#include "llvm/Frontend/OpenMP/OMP.inc"
11652 switch (llvm::omp::Clause(Record.readInt())) {
11653 case llvm::omp::OMPC_if:
11656 case llvm::omp::OMPC_final:
11659 case llvm::omp::OMPC_num_threads:
11662 case llvm::omp::OMPC_safelen:
11665 case llvm::omp::OMPC_simdlen:
11668 case llvm::omp::OMPC_sizes: {
11669 unsigned NumSizes = Record.readInt();
11673 case llvm::omp::OMPC_counts: {
11674 unsigned NumCounts = Record.readInt();
11678 case llvm::omp::OMPC_permutation: {
11679 unsigned NumLoops = Record.readInt();
11683 case llvm::omp::OMPC_full:
11686 case llvm::omp::OMPC_partial:
11689 case llvm::omp::OMPC_depth:
11692 case llvm::omp::OMPC_looprange:
11695 case llvm::omp::OMPC_allocator:
11698 case llvm::omp::OMPC_collapse:
11701 case llvm::omp::OMPC_default:
11704 case llvm::omp::OMPC_proc_bind:
11705 C =
new (Context) OMPProcBindClause();
11707 case llvm::omp::OMPC_schedule:
11708 C =
new (Context) OMPScheduleClause();
11710 case llvm::omp::OMPC_ordered:
11711 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11713 case llvm::omp::OMPC_nowait:
11714 C =
new (Context) OMPNowaitClause();
11716 case llvm::omp::OMPC_untied:
11717 C =
new (Context) OMPUntiedClause();
11719 case llvm::omp::OMPC_mergeable:
11720 C =
new (Context) OMPMergeableClause();
11722 case llvm::omp::OMPC_threadset:
11725 case llvm::omp::OMPC_transparent:
11726 C =
new (Context) OMPTransparentClause();
11728 case llvm::omp::OMPC_read:
11729 C =
new (Context) OMPReadClause();
11731 case llvm::omp::OMPC_write:
11732 C =
new (Context) OMPWriteClause();
11734 case llvm::omp::OMPC_update:
11735 C =
new (Context) OMPUpdateClause();
11737 case llvm::omp::OMPC_update_depend_objects:
11738 C = OMPUpdateDependObjectsClause::CreateEmpty(Context);
11740 case llvm::omp::OMPC_capture:
11741 C =
new (Context) OMPCaptureClause();
11743 case llvm::omp::OMPC_compare:
11744 C =
new (Context) OMPCompareClause();
11746 case llvm::omp::OMPC_fail:
11747 C =
new (Context) OMPFailClause();
11749 case llvm::omp::OMPC_seq_cst:
11750 C =
new (Context) OMPSeqCstClause();
11752 case llvm::omp::OMPC_acq_rel:
11753 C =
new (Context) OMPAcqRelClause();
11755 case llvm::omp::OMPC_absent: {
11756 unsigned NumKinds = Record.readInt();
11757 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11760 case llvm::omp::OMPC_holds:
11761 C =
new (Context) OMPHoldsClause();
11763 case llvm::omp::OMPC_contains: {
11764 unsigned NumKinds = Record.readInt();
11765 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11768 case llvm::omp::OMPC_no_openmp:
11769 C =
new (Context) OMPNoOpenMPClause();
11771 case llvm::omp::OMPC_no_openmp_routines:
11772 C =
new (Context) OMPNoOpenMPRoutinesClause();
11774 case llvm::omp::OMPC_no_openmp_constructs:
11775 C =
new (Context) OMPNoOpenMPConstructsClause();
11777 case llvm::omp::OMPC_no_parallelism:
11778 C =
new (Context) OMPNoParallelismClause();
11780 case llvm::omp::OMPC_acquire:
11781 C =
new (Context) OMPAcquireClause();
11783 case llvm::omp::OMPC_release:
11784 C =
new (Context) OMPReleaseClause();
11786 case llvm::omp::OMPC_relaxed:
11787 C =
new (Context) OMPRelaxedClause();
11789 case llvm::omp::OMPC_weak:
11790 C =
new (Context) OMPWeakClause();
11792 case llvm::omp::OMPC_threads:
11795 case llvm::omp::OMPC_simd:
11798 case llvm::omp::OMPC_nogroup:
11801 case llvm::omp::OMPC_unified_address:
11802 C =
new (Context) OMPUnifiedAddressClause();
11804 case llvm::omp::OMPC_unified_shared_memory:
11805 C =
new (Context) OMPUnifiedSharedMemoryClause();
11807 case llvm::omp::OMPC_reverse_offload:
11808 C =
new (Context) OMPReverseOffloadClause();
11810 case llvm::omp::OMPC_dynamic_allocators:
11811 C =
new (Context) OMPDynamicAllocatorsClause();
11813 case llvm::omp::OMPC_atomic_default_mem_order:
11814 C =
new (Context) OMPAtomicDefaultMemOrderClause();
11816 case llvm::omp::OMPC_self_maps:
11817 C =
new (Context) OMPSelfMapsClause();
11819 case llvm::omp::OMPC_at:
11820 C =
new (Context) OMPAtClause();
11822 case llvm::omp::OMPC_severity:
11823 C =
new (Context) OMPSeverityClause();
11825 case llvm::omp::OMPC_message:
11826 C =
new (Context) OMPMessageClause();
11828 case llvm::omp::OMPC_private:
11829 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11831 case llvm::omp::OMPC_firstprivate:
11832 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11834 case llvm::omp::OMPC_lastprivate:
11835 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11837 case llvm::omp::OMPC_shared:
11838 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11840 case llvm::omp::OMPC_reduction: {
11841 unsigned N = Record.readInt();
11843 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11846 case llvm::omp::OMPC_task_reduction:
11847 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11849 case llvm::omp::OMPC_in_reduction:
11850 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11852 case llvm::omp::OMPC_linear:
11853 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11855 case llvm::omp::OMPC_aligned:
11858 case llvm::omp::OMPC_copyin:
11861 case llvm::omp::OMPC_copyprivate:
11864 case llvm::omp::OMPC_flush:
11867 case llvm::omp::OMPC_depobj:
11870 case llvm::omp::OMPC_depend: {
11871 unsigned NumVars = Record.readInt();
11872 unsigned NumLoops = Record.readInt();
11876 case llvm::omp::OMPC_device:
11879 case llvm::omp::OMPC_map: {
11881 Sizes.
NumVars = Record.readInt();
11888 case llvm::omp::OMPC_num_teams:
11891 case llvm::omp::OMPC_thread_limit:
11894 case llvm::omp::OMPC_priority:
11897 case llvm::omp::OMPC_grainsize:
11900 case llvm::omp::OMPC_num_tasks:
11903 case llvm::omp::OMPC_hint:
11906 case llvm::omp::OMPC_dist_schedule:
11909 case llvm::omp::OMPC_defaultmap:
11912 case llvm::omp::OMPC_to: {
11914 Sizes.
NumVars = Record.readInt();
11921 case llvm::omp::OMPC_from: {
11923 Sizes.
NumVars = Record.readInt();
11930 case llvm::omp::OMPC_use_device_ptr: {
11932 Sizes.
NumVars = Record.readInt();
11939 case llvm::omp::OMPC_use_device_addr: {
11941 Sizes.
NumVars = Record.readInt();
11948 case llvm::omp::OMPC_is_device_ptr: {
11950 Sizes.
NumVars = Record.readInt();
11957 case llvm::omp::OMPC_has_device_addr: {
11959 Sizes.
NumVars = Record.readInt();
11966 case llvm::omp::OMPC_allocate:
11969 case llvm::omp::OMPC_nontemporal:
11972 case llvm::omp::OMPC_inclusive:
11975 case llvm::omp::OMPC_exclusive:
11978 case llvm::omp::OMPC_order:
11981 case llvm::omp::OMPC_init: {
11982 unsigned VarListSize = Record.readInt();
11983 unsigned NumAttrs = Record.readInt();
11988 case llvm::omp::OMPC_use:
11991 case llvm::omp::OMPC_destroy:
11994 case llvm::omp::OMPC_novariants:
11997 case llvm::omp::OMPC_nocontext:
12000 case llvm::omp::OMPC_detach:
12003 case llvm::omp::OMPC_uses_allocators:
12006 case llvm::omp::OMPC_affinity:
12009 case llvm::omp::OMPC_filter:
12012 case llvm::omp::OMPC_bind:
12015 case llvm::omp::OMPC_align:
12018 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
12021 case llvm::omp::OMPC_dyn_groupprivate:
12024 case llvm::omp::OMPC_doacross: {
12025 unsigned NumVars = Record.readInt();
12026 unsigned NumLoops = Record.readInt();
12030 case llvm::omp::OMPC_ompx_attribute:
12033 case llvm::omp::OMPC_ompx_bare:
12036#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
12037 case llvm::omp::Enum: \
12039#include "llvm/Frontend/OpenMP/OMPKinds.def"
12043 assert(
C &&
"Unknown OMPClause type");
12046 C->setLocStart(Record.readSourceLocation());
12047 C->setLocEnd(Record.readSourceLocation());
12053 C->setPreInitStmt(Record.readSubStmt(),
12059 C->setPostUpdateExpr(Record.readSubExpr());
12062void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
12065 C->setNameModifierLoc(
Record.readSourceLocation());
12066 C->setColonLoc(
Record.readSourceLocation());
12067 C->setCondition(
Record.readSubExpr());
12068 C->setLParenLoc(
Record.readSourceLocation());
12073 C->setCondition(
Record.readSubExpr());
12074 C->setLParenLoc(
Record.readSourceLocation());
12078 C->setPrescriptivenessModifier(
12080 C->setPrescriptivenessModifierLoc(Record.readSourceLocation());
12082 C->setDimsModifierLoc(Record.readSourceLocation());
12083 C->setDimsModifierExpr(Record.readSubExpr());
12085 C->setLParenLoc(Record.readSourceLocation());
12086 unsigned NumVars =
C->varlist_size();
12087 SmallVector<Expr *, 16> Vars;
12088 Vars.reserve(NumVars);
12089 for (
unsigned I = 0; I != NumVars; ++I)
12090 Vars.push_back(Record.readSubExpr());
12091 C->setVarRefs(Vars);
12095 C->setSafelen(Record.readSubExpr());
12096 C->setLParenLoc(Record.readSourceLocation());
12100 C->setSimdlen(Record.readSubExpr());
12101 C->setLParenLoc(Record.readSourceLocation());
12105 for (Expr *&E :
C->getSizesRefs())
12106 E = Record.readSubExpr();
12107 C->setLParenLoc(Record.readSourceLocation());
12111 bool HasFill = Record.readBool();
12113 C->setOmpFillIndex(Record.readInt());
12114 C->setOmpFillLoc(Record.readSourceLocation());
12115 for (Expr *&E :
C->getCountsRefs())
12116 E = Record.readSubExpr();
12117 C->setLParenLoc(Record.readSourceLocation());
12121 for (Expr *&E :
C->getArgsRefs())
12122 E = Record.readSubExpr();
12123 C->setLParenLoc(Record.readSourceLocation());
12129 C->setFactor(Record.readSubExpr());
12130 C->setLParenLoc(Record.readSourceLocation());
12134 C->setDepth(Record.readSubExpr());
12135 C->setLParenLoc(Record.readSourceLocation());
12139 C->setFirst(Record.readSubExpr());
12140 C->setCount(Record.readSubExpr());
12141 C->setLParenLoc(Record.readSourceLocation());
12142 C->setFirstLoc(Record.readSourceLocation());
12143 C->setCountLoc(Record.readSourceLocation());
12147 C->setAllocator(Record.readExpr());
12148 C->setLParenLoc(Record.readSourceLocation());
12152 C->setNumForLoops(Record.readSubExpr());
12153 C->setLParenLoc(Record.readSourceLocation());
12157 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
12158 C->setLParenLoc(Record.readSourceLocation());
12159 C->setDefaultKindKwLoc(Record.readSourceLocation());
12160 C->setDefaultVariableCategory(
12162 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
12168 C->setLParenLoc(Record.readSourceLocation());
12169 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
12170 C->setThreadsetKindLoc(ThreadsetKindLoc);
12173 C->setThreadsetKind(TKind);
12176void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *
C) {
12177 C->setLParenLoc(Record.readSourceLocation());
12178 C->setImpexTypeKind(Record.readSubExpr());
12181void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *
C) {
12182 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
12183 C->setLParenLoc(Record.readSourceLocation());
12184 C->setProcBindKindKwLoc(Record.readSourceLocation());
12187void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *
C) {
12189 C->setScheduleKind(
12191 C->setFirstScheduleModifier(
12193 C->setSecondScheduleModifier(
12195 C->setChunkSize(Record.readSubExpr());
12196 C->setLParenLoc(Record.readSourceLocation());
12197 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
12198 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
12199 C->setScheduleKindLoc(Record.readSourceLocation());
12200 C->setCommaLoc(Record.readSourceLocation());
12203void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *
C) {
12204 C->setNumForLoops(Record.readSubExpr());
12205 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
12206 C->setLoopNumIterations(I, Record.readSubExpr());
12207 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
12208 C->setLoopCounter(I, Record.readSubExpr());
12209 C->setLParenLoc(Record.readSourceLocation());
12212void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *
C) {
12213 C->setEventHandler(Record.readSubExpr());
12214 C->setLParenLoc(Record.readSourceLocation());
12217void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *
C) {
12218 C->setCondition(Record.readSubExpr());
12219 C->setLParenLoc(Record.readSourceLocation());
12222void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12224void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12226void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12228void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12230void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {}
12232void OMPClauseReader::VisitOMPUpdateDependObjectsClause(
12233 OMPUpdateDependObjectsClause *
C) {
12234 C->setLParenLoc(Record.readSourceLocation());
12235 C->setArgumentLoc(Record.readSourceLocation());
12239void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12241void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12245void OMPClauseReader::VisitOMPFailClause(OMPFailClause *
C) {
12246 C->setLParenLoc(Record.readSourceLocation());
12247 SourceLocation FailParameterLoc = Record.readSourceLocation();
12248 C->setFailParameterLoc(FailParameterLoc);
12250 C->setFailParameter(CKind);
12253void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *
C) {
12254 unsigned Count =
C->getDirectiveKinds().size();
12255 C->setLParenLoc(Record.readSourceLocation());
12256 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12257 DKVec.reserve(Count);
12258 for (
unsigned I = 0; I < Count; I++) {
12261 C->setDirectiveKinds(DKVec);
12264void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *
C) {
12265 C->setExpr(Record.readExpr());
12266 C->setLParenLoc(Record.readSourceLocation());
12269void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *
C) {
12270 unsigned Count =
C->getDirectiveKinds().size();
12271 C->setLParenLoc(Record.readSourceLocation());
12272 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12273 DKVec.reserve(Count);
12274 for (
unsigned I = 0; I < Count; I++) {
12277 C->setDirectiveKinds(DKVec);
12280void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12282void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12283 OMPNoOpenMPRoutinesClause *) {}
12285void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12286 OMPNoOpenMPConstructsClause *) {}
12288void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12290void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12292void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12294void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12296void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12298void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12300void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12302void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12304void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12306void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12308void OMPClauseReader::VisitOMPInitClause(OMPInitClause *
C) {
12309 unsigned NumVars =
C->varlist_size();
12310 SmallVector<Expr *, 16> Vars;
12311 Vars.reserve(NumVars);
12312 for (
unsigned I = 0; I != NumVars; ++I)
12313 Vars.push_back(Record.readSubExpr());
12314 C->setVarRefs(Vars);
12315 C->setIsTarget(Record.readBool());
12316 C->setIsTargetSync(Record.readBool());
12317 C->setHasPreferAttrs(Record.readBool());
12319 unsigned NumPrefs =
C->varlist_size() - 1;
12320 SmallVector<unsigned, 4> Counts;
12321 SmallVector<Expr *, 8> Attrs;
12322 Counts.reserve(NumPrefs);
12323 for (
unsigned I = 0; I < NumPrefs; ++I) {
12324 unsigned NA = Record.readInt();
12325 Counts.push_back(NA);
12326 for (
unsigned J = 0; J < NA; ++J)
12327 Attrs.push_back(Record.readSubExpr());
12329 C->setAttrs(Counts, Attrs);
12331 C->setLParenLoc(Record.readSourceLocation());
12332 C->setVarLoc(Record.readSourceLocation());
12335void OMPClauseReader::VisitOMPUseClause(OMPUseClause *
C) {
12336 C->setInteropVar(Record.readSubExpr());
12337 C->setLParenLoc(Record.readSourceLocation());
12338 C->setVarLoc(Record.readSourceLocation());
12341void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *
C) {
12342 C->setInteropVar(Record.readSubExpr());
12343 C->setLParenLoc(Record.readSourceLocation());
12344 C->setVarLoc(Record.readSourceLocation());
12347void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
12349 C->setCondition(Record.readSubExpr());
12350 C->setLParenLoc(Record.readSourceLocation());
12353void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *
C) {
12355 C->setCondition(Record.readSubExpr());
12356 C->setLParenLoc(Record.readSourceLocation());
12359void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12361void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12362 OMPUnifiedSharedMemoryClause *) {}
12364void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12367OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12370void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12371 OMPAtomicDefaultMemOrderClause *
C) {
12372 C->setAtomicDefaultMemOrderKind(
12374 C->setLParenLoc(Record.readSourceLocation());
12375 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12378void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12380void OMPClauseReader::VisitOMPAtClause(OMPAtClause *
C) {
12382 C->setLParenLoc(Record.readSourceLocation());
12383 C->setAtKindKwLoc(Record.readSourceLocation());
12386void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *
C) {
12388 C->setLParenLoc(Record.readSourceLocation());
12389 C->setSeverityKindKwLoc(Record.readSourceLocation());
12392void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *
C) {
12394 C->setMessageString(Record.readSubExpr());
12395 C->setLParenLoc(Record.readSourceLocation());
12398void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *
C) {
12399 C->setLParenLoc(Record.readSourceLocation());
12400 unsigned NumVars =
C->varlist_size();
12401 SmallVector<Expr *, 16> Vars;
12402 Vars.reserve(NumVars);
12403 for (
unsigned i = 0; i != NumVars; ++i)
12404 Vars.push_back(Record.readSubExpr());
12405 C->setVarRefs(Vars);
12407 for (
unsigned i = 0; i != NumVars; ++i)
12408 Vars.push_back(Record.readSubExpr());
12409 C->setPrivateCopies(Vars);
12412void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
12414 C->setLParenLoc(Record.readSourceLocation());
12415 unsigned NumVars =
C->varlist_size();
12416 SmallVector<Expr *, 16> Vars;
12417 Vars.reserve(NumVars);
12418 for (
unsigned i = 0; i != NumVars; ++i)
12419 Vars.push_back(Record.readSubExpr());
12420 C->setVarRefs(Vars);
12422 for (
unsigned i = 0; i != NumVars; ++i)
12423 Vars.push_back(Record.readSubExpr());
12424 C->setPrivateCopies(Vars);
12426 for (
unsigned i = 0; i != NumVars; ++i)
12427 Vars.push_back(Record.readSubExpr());
12431void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
12433 C->setLParenLoc(Record.readSourceLocation());
12435 C->setKindLoc(Record.readSourceLocation());
12436 C->setColonLoc(Record.readSourceLocation());
12437 unsigned NumVars =
C->varlist_size();
12438 SmallVector<Expr *, 16> Vars;
12439 Vars.reserve(NumVars);
12440 for (
unsigned i = 0; i != NumVars; ++i)
12441 Vars.push_back(Record.readSubExpr());
12442 C->setVarRefs(Vars);
12444 for (
unsigned i = 0; i != NumVars; ++i)
12445 Vars.push_back(Record.readSubExpr());
12446 C->setPrivateCopies(Vars);
12448 for (
unsigned i = 0; i != NumVars; ++i)
12449 Vars.push_back(Record.readSubExpr());
12450 C->setSourceExprs(Vars);
12452 for (
unsigned i = 0; i != NumVars; ++i)
12453 Vars.push_back(Record.readSubExpr());
12454 C->setDestinationExprs(Vars);
12456 for (
unsigned i = 0; i != NumVars; ++i)
12457 Vars.push_back(Record.readSubExpr());
12458 C->setAssignmentOps(Vars);
12461void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *
C) {
12462 C->setLParenLoc(Record.readSourceLocation());
12463 unsigned NumVars =
C->varlist_size();
12464 SmallVector<Expr *, 16> Vars;
12465 Vars.reserve(NumVars);
12466 for (
unsigned i = 0; i != NumVars; ++i)
12467 Vars.push_back(Record.readSubExpr());
12468 C->setVarRefs(Vars);
12471void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *
C) {
12473 C->setLParenLoc(Record.readSourceLocation());
12474 C->setModifierLoc(Record.readSourceLocation());
12475 C->setColonLoc(Record.readSourceLocation());
12476 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12477 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12478 C->setQualifierLoc(NNSL);
12479 C->setNameInfo(DNI);
12481 unsigned NumVars =
C->varlist_size();
12482 SmallVector<Expr *, 16> Vars;
12483 Vars.reserve(NumVars);
12484 for (
unsigned i = 0; i != NumVars; ++i)
12485 Vars.push_back(Record.readSubExpr());
12486 C->setVarRefs(Vars);
12488 for (
unsigned i = 0; i != NumVars; ++i)
12489 Vars.push_back(Record.readSubExpr());
12490 C->setPrivates(Vars);
12492 for (
unsigned i = 0; i != NumVars; ++i)
12493 Vars.push_back(Record.readSubExpr());
12494 C->setLHSExprs(Vars);
12496 for (
unsigned i = 0; i != NumVars; ++i)
12497 Vars.push_back(Record.readSubExpr());
12498 C->setRHSExprs(Vars);
12500 for (
unsigned i = 0; i != NumVars; ++i)
12501 Vars.push_back(Record.readSubExpr());
12502 C->setReductionOps(Vars);
12503 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12505 for (
unsigned i = 0; i != NumVars; ++i)
12506 Vars.push_back(Record.readSubExpr());
12507 C->setInscanCopyOps(Vars);
12509 for (
unsigned i = 0; i != NumVars; ++i)
12510 Vars.push_back(Record.readSubExpr());
12511 C->setInscanCopyArrayTemps(Vars);
12513 for (
unsigned i = 0; i != NumVars; ++i)
12514 Vars.push_back(Record.readSubExpr());
12515 C->setInscanCopyArrayElems(Vars);
12517 unsigned NumFlags = Record.readInt();
12518 SmallVector<bool, 16> Flags;
12519 Flags.reserve(NumFlags);
12520 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12521 Flags.push_back(Record.readInt());
12522 C->setPrivateVariableReductionFlags(Flags);
12525void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
12527 C->setLParenLoc(Record.readSourceLocation());
12528 C->setColonLoc(Record.readSourceLocation());
12529 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12530 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12531 C->setQualifierLoc(NNSL);
12532 C->setNameInfo(DNI);
12534 unsigned NumVars =
C->varlist_size();
12535 SmallVector<Expr *, 16> Vars;
12536 Vars.reserve(NumVars);
12537 for (
unsigned I = 0; I != NumVars; ++I)
12538 Vars.push_back(Record.readSubExpr());
12539 C->setVarRefs(Vars);
12541 for (
unsigned I = 0; I != NumVars; ++I)
12542 Vars.push_back(Record.readSubExpr());
12543 C->setPrivates(Vars);
12545 for (
unsigned I = 0; I != NumVars; ++I)
12546 Vars.push_back(Record.readSubExpr());
12547 C->setLHSExprs(Vars);
12549 for (
unsigned I = 0; I != NumVars; ++I)
12550 Vars.push_back(Record.readSubExpr());
12551 C->setRHSExprs(Vars);
12553 for (
unsigned I = 0; I != NumVars; ++I)
12554 Vars.push_back(Record.readSubExpr());
12555 C->setReductionOps(Vars);
12558void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *
C) {
12560 C->setLParenLoc(Record.readSourceLocation());
12561 C->setColonLoc(Record.readSourceLocation());
12562 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12563 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12564 C->setQualifierLoc(NNSL);
12565 C->setNameInfo(DNI);
12567 unsigned NumVars =
C->varlist_size();
12568 SmallVector<Expr *, 16> Vars;
12569 Vars.reserve(NumVars);
12570 for (
unsigned I = 0; I != NumVars; ++I)
12571 Vars.push_back(Record.readSubExpr());
12572 C->setVarRefs(Vars);
12574 for (
unsigned I = 0; I != NumVars; ++I)
12575 Vars.push_back(Record.readSubExpr());
12576 C->setPrivates(Vars);
12578 for (
unsigned I = 0; I != NumVars; ++I)
12579 Vars.push_back(Record.readSubExpr());
12580 C->setLHSExprs(Vars);
12582 for (
unsigned I = 0; I != NumVars; ++I)
12583 Vars.push_back(Record.readSubExpr());
12584 C->setRHSExprs(Vars);
12586 for (
unsigned I = 0; I != NumVars; ++I)
12587 Vars.push_back(Record.readSubExpr());
12588 C->setReductionOps(Vars);
12590 for (
unsigned I = 0; I != NumVars; ++I)
12591 Vars.push_back(Record.readSubExpr());
12592 C->setTaskgroupDescriptors(Vars);
12595void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *
C) {
12597 C->setLParenLoc(Record.readSourceLocation());
12598 C->setColonLoc(Record.readSourceLocation());
12600 C->setModifierLoc(Record.readSourceLocation());
12601 unsigned NumVars =
C->varlist_size();
12602 SmallVector<Expr *, 16> Vars;
12603 Vars.reserve(NumVars);
12604 for (
unsigned i = 0; i != NumVars; ++i)
12605 Vars.push_back(Record.readSubExpr());
12606 C->setVarRefs(Vars);
12608 for (
unsigned i = 0; i != NumVars; ++i)
12609 Vars.push_back(Record.readSubExpr());
12610 C->setPrivates(Vars);
12612 for (
unsigned i = 0; i != NumVars; ++i)
12613 Vars.push_back(Record.readSubExpr());
12616 for (
unsigned i = 0; i != NumVars; ++i)
12617 Vars.push_back(Record.readSubExpr());
12618 C->setUpdates(Vars);
12620 for (
unsigned i = 0; i != NumVars; ++i)
12621 Vars.push_back(Record.readSubExpr());
12622 C->setFinals(Vars);
12623 C->setStep(Record.readSubExpr());
12624 C->setCalcStep(Record.readSubExpr());
12626 for (
unsigned I = 0; I != NumVars + 1; ++I)
12627 Vars.push_back(Record.readSubExpr());
12628 C->setUsedExprs(Vars);
12631void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *
C) {
12632 C->setLParenLoc(Record.readSourceLocation());
12633 C->setColonLoc(Record.readSourceLocation());
12634 unsigned NumVars =
C->varlist_size();
12635 SmallVector<Expr *, 16> Vars;
12636 Vars.reserve(NumVars);
12637 for (
unsigned i = 0; i != NumVars; ++i)
12638 Vars.push_back(Record.readSubExpr());
12639 C->setVarRefs(Vars);
12640 C->setAlignment(Record.readSubExpr());
12643void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *
C) {
12644 C->setLParenLoc(Record.readSourceLocation());
12645 unsigned NumVars =
C->varlist_size();
12646 SmallVector<Expr *, 16> Exprs;
12647 Exprs.reserve(NumVars);
12648 for (
unsigned i = 0; i != NumVars; ++i)
12649 Exprs.push_back(Record.readSubExpr());
12650 C->setVarRefs(Exprs);
12652 for (
unsigned i = 0; i != NumVars; ++i)
12653 Exprs.push_back(Record.readSubExpr());
12654 C->setSourceExprs(Exprs);
12656 for (
unsigned i = 0; i != NumVars; ++i)
12657 Exprs.push_back(Record.readSubExpr());
12658 C->setDestinationExprs(Exprs);
12660 for (
unsigned i = 0; i != NumVars; ++i)
12661 Exprs.push_back(Record.readSubExpr());
12662 C->setAssignmentOps(Exprs);
12665void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
12666 C->setLParenLoc(Record.readSourceLocation());
12667 unsigned NumVars =
C->varlist_size();
12668 SmallVector<Expr *, 16> Exprs;
12669 Exprs.reserve(NumVars);
12670 for (
unsigned i = 0; i != NumVars; ++i)
12671 Exprs.push_back(Record.readSubExpr());
12672 C->setVarRefs(Exprs);
12674 for (
unsigned i = 0; i != NumVars; ++i)
12675 Exprs.push_back(Record.readSubExpr());
12676 C->setSourceExprs(Exprs);
12678 for (
unsigned i = 0; i != NumVars; ++i)
12679 Exprs.push_back(Record.readSubExpr());
12680 C->setDestinationExprs(Exprs);
12682 for (
unsigned i = 0; i != NumVars; ++i)
12683 Exprs.push_back(Record.readSubExpr());
12684 C->setAssignmentOps(Exprs);
12687void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *
C) {
12688 C->setLParenLoc(Record.readSourceLocation());
12689 unsigned NumVars =
C->varlist_size();
12690 SmallVector<Expr *, 16> Vars;
12691 Vars.reserve(NumVars);
12692 for (
unsigned i = 0; i != NumVars; ++i)
12693 Vars.push_back(Record.readSubExpr());
12694 C->setVarRefs(Vars);
12697void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *
C) {
12698 C->setDepobj(Record.readSubExpr());
12699 C->setLParenLoc(Record.readSourceLocation());
12702void OMPClauseReader::VisitOMPDependClause(OMPDependClause *
C) {
12703 C->setLParenLoc(Record.readSourceLocation());
12704 C->setModifier(Record.readSubExpr());
12705 C->setDependencyKind(
12707 C->setDependencyLoc(Record.readSourceLocation());
12708 C->setColonLoc(Record.readSourceLocation());
12709 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12710 unsigned NumVars =
C->varlist_size();
12711 SmallVector<Expr *, 16> Vars;
12712 Vars.reserve(NumVars);
12713 for (
unsigned I = 0; I != NumVars; ++I)
12714 Vars.push_back(Record.readSubExpr());
12715 C->setVarRefs(Vars);
12716 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12717 C->setLoopData(I, Record.readSubExpr());
12720void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *
C) {
12723 C->setDevice(Record.readSubExpr());
12724 C->setModifierLoc(Record.readSourceLocation());
12725 C->setLParenLoc(Record.readSourceLocation());
12728void OMPClauseReader::VisitOMPMapClause(OMPMapClause *
C) {
12729 C->setLParenLoc(Record.readSourceLocation());
12730 bool HasIteratorModifier =
false;
12732 C->setMapTypeModifier(
12734 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12735 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12736 HasIteratorModifier =
true;
12738 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12739 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12742 C->setMapLoc(Record.readSourceLocation());
12743 C->setColonLoc(Record.readSourceLocation());
12744 auto NumVars =
C->varlist_size();
12745 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12746 auto TotalLists =
C->getTotalComponentListNum();
12747 auto TotalComponents =
C->getTotalComponentsNum();
12749 SmallVector<Expr *, 16> Vars;
12750 Vars.reserve(NumVars);
12751 for (
unsigned i = 0; i != NumVars; ++i)
12752 Vars.push_back(Record.readExpr());
12753 C->setVarRefs(Vars);
12755 SmallVector<Expr *, 16> UDMappers;
12756 UDMappers.reserve(NumVars);
12757 for (
unsigned I = 0; I < NumVars; ++I)
12758 UDMappers.push_back(Record.readExpr());
12759 C->setUDMapperRefs(UDMappers);
12761 if (HasIteratorModifier)
12762 C->setIteratorModifier(Record.readExpr());
12764 SmallVector<ValueDecl *, 16> Decls;
12765 Decls.reserve(UniqueDecls);
12766 for (
unsigned i = 0; i < UniqueDecls; ++i)
12767 Decls.push_back(Record.readDeclAs<ValueDecl>());
12768 C->setUniqueDecls(Decls);
12770 SmallVector<unsigned, 16> ListsPerDecl;
12771 ListsPerDecl.reserve(UniqueDecls);
12772 for (
unsigned i = 0; i < UniqueDecls; ++i)
12773 ListsPerDecl.push_back(Record.readInt());
12774 C->setDeclNumLists(ListsPerDecl);
12776 SmallVector<unsigned, 32> ListSizes;
12777 ListSizes.reserve(TotalLists);
12778 for (
unsigned i = 0; i < TotalLists; ++i)
12779 ListSizes.push_back(Record.readInt());
12780 C->setComponentListSizes(ListSizes);
12782 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12783 Components.reserve(TotalComponents);
12784 for (
unsigned i = 0; i < TotalComponents; ++i) {
12785 Expr *AssociatedExprPr = Record.readExpr();
12786 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12787 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12790 C->setComponents(Components, ListSizes);
12796 C->setLParenLoc(Record.readSourceLocation());
12797 C->setColonLoc(Record.readSourceLocation());
12798 C->setAllocator(Record.readSubExpr());
12799 C->setAlignment(Record.readSubExpr());
12800 unsigned NumVars =
C->varlist_size();
12801 SmallVector<Expr *, 16> Vars;
12802 Vars.reserve(NumVars);
12803 for (
unsigned i = 0; i != NumVars; ++i)
12804 Vars.push_back(Record.readSubExpr());
12805 C->setVarRefs(Vars);
12808void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
12810 C->setModifierLoc(Record.readSourceLocation());
12811 C->setModifierExpr(Record.readSubExpr());
12813 C->setLParenLoc(Record.readSourceLocation());
12814 unsigned NumVars =
C->varlist_size();
12815 SmallVector<Expr *, 16> Vars;
12816 Vars.reserve(NumVars);
12817 for (
unsigned I = 0; I != NumVars; ++I)
12818 Vars.push_back(Record.readSubExpr());
12819 C->setVarRefs(Vars);
12822void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
12824 C->setModifierLoc(Record.readSourceLocation());
12825 C->setModifierExpr(Record.readSubExpr());
12827 C->setLParenLoc(Record.readSourceLocation());
12828 unsigned NumVars =
C->varlist_size();
12829 SmallVector<Expr *, 16> Vars;
12830 Vars.reserve(NumVars);
12831 for (
unsigned I = 0; I != NumVars; ++I)
12832 Vars.push_back(Record.readSubExpr());
12833 C->setVarRefs(Vars);
12836void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *
C) {
12838 C->setPriority(Record.readSubExpr());
12839 C->setLParenLoc(Record.readSourceLocation());
12842void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
12845 C->setGrainsize(Record.readSubExpr());
12846 C->setModifierLoc(Record.readSourceLocation());
12847 C->setLParenLoc(Record.readSourceLocation());
12850void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
12853 C->setNumTasks(Record.readSubExpr());
12854 C->setModifierLoc(Record.readSourceLocation());
12855 C->setLParenLoc(Record.readSourceLocation());
12858void OMPClauseReader::VisitOMPHintClause(OMPHintClause *
C) {
12859 C->setHint(Record.readSubExpr());
12860 C->setLParenLoc(Record.readSourceLocation());
12863void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
12865 C->setDistScheduleKind(
12867 C->setChunkSize(Record.readSubExpr());
12868 C->setLParenLoc(Record.readSourceLocation());
12869 C->setDistScheduleKindLoc(Record.readSourceLocation());
12870 C->setCommaLoc(Record.readSourceLocation());
12873void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
12874 C->setDefaultmapKind(
12876 C->setDefaultmapModifier(
12878 C->setLParenLoc(Record.readSourceLocation());
12879 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12880 C->setDefaultmapKindLoc(Record.readSourceLocation());
12883void OMPClauseReader::VisitOMPToClause(OMPToClause *
C) {
12884 C->setLParenLoc(Record.readSourceLocation());
12886 C->setMotionModifier(
12888 C->setMotionModifierLoc(I, Record.readSourceLocation());
12889 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12890 C->setIteratorModifier(Record.readExpr());
12892 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12893 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12894 C->setColonLoc(Record.readSourceLocation());
12895 auto NumVars =
C->varlist_size();
12896 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12897 auto TotalLists =
C->getTotalComponentListNum();
12898 auto TotalComponents =
C->getTotalComponentsNum();
12900 SmallVector<Expr *, 16> Vars;
12901 Vars.reserve(NumVars);
12902 for (
unsigned i = 0; i != NumVars; ++i)
12903 Vars.push_back(Record.readSubExpr());
12904 C->setVarRefs(Vars);
12906 SmallVector<Expr *, 16> UDMappers;
12907 UDMappers.reserve(NumVars);
12908 for (
unsigned I = 0; I < NumVars; ++I)
12909 UDMappers.push_back(Record.readSubExpr());
12910 C->setUDMapperRefs(UDMappers);
12912 SmallVector<ValueDecl *, 16> Decls;
12913 Decls.reserve(UniqueDecls);
12914 for (
unsigned i = 0; i < UniqueDecls; ++i)
12915 Decls.push_back(Record.readDeclAs<ValueDecl>());
12916 C->setUniqueDecls(Decls);
12918 SmallVector<unsigned, 16> ListsPerDecl;
12919 ListsPerDecl.reserve(UniqueDecls);
12920 for (
unsigned i = 0; i < UniqueDecls; ++i)
12921 ListsPerDecl.push_back(Record.readInt());
12922 C->setDeclNumLists(ListsPerDecl);
12924 SmallVector<unsigned, 32> ListSizes;
12925 ListSizes.reserve(TotalLists);
12926 for (
unsigned i = 0; i < TotalLists; ++i)
12927 ListSizes.push_back(Record.readInt());
12928 C->setComponentListSizes(ListSizes);
12930 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12931 Components.reserve(TotalComponents);
12932 for (
unsigned i = 0; i < TotalComponents; ++i) {
12933 Expr *AssociatedExprPr = Record.readSubExpr();
12934 bool IsNonContiguous = Record.readBool();
12935 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12936 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12938 C->setComponents(Components, ListSizes);
12941void OMPClauseReader::VisitOMPFromClause(OMPFromClause *
C) {
12942 C->setLParenLoc(Record.readSourceLocation());
12944 C->setMotionModifier(
12946 C->setMotionModifierLoc(I, Record.readSourceLocation());
12947 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12948 C->setIteratorModifier(Record.readExpr());
12950 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12951 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12952 C->setColonLoc(Record.readSourceLocation());
12953 auto NumVars =
C->varlist_size();
12954 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12955 auto TotalLists =
C->getTotalComponentListNum();
12956 auto TotalComponents =
C->getTotalComponentsNum();
12958 SmallVector<Expr *, 16> Vars;
12959 Vars.reserve(NumVars);
12960 for (
unsigned i = 0; i != NumVars; ++i)
12961 Vars.push_back(Record.readSubExpr());
12962 C->setVarRefs(Vars);
12964 SmallVector<Expr *, 16> UDMappers;
12965 UDMappers.reserve(NumVars);
12966 for (
unsigned I = 0; I < NumVars; ++I)
12967 UDMappers.push_back(Record.readSubExpr());
12968 C->setUDMapperRefs(UDMappers);
12970 SmallVector<ValueDecl *, 16> Decls;
12971 Decls.reserve(UniqueDecls);
12972 for (
unsigned i = 0; i < UniqueDecls; ++i)
12973 Decls.push_back(Record.readDeclAs<ValueDecl>());
12974 C->setUniqueDecls(Decls);
12976 SmallVector<unsigned, 16> ListsPerDecl;
12977 ListsPerDecl.reserve(UniqueDecls);
12978 for (
unsigned i = 0; i < UniqueDecls; ++i)
12979 ListsPerDecl.push_back(Record.readInt());
12980 C->setDeclNumLists(ListsPerDecl);
12982 SmallVector<unsigned, 32> ListSizes;
12983 ListSizes.reserve(TotalLists);
12984 for (
unsigned i = 0; i < TotalLists; ++i)
12985 ListSizes.push_back(Record.readInt());
12986 C->setComponentListSizes(ListSizes);
12988 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12989 Components.reserve(TotalComponents);
12990 for (
unsigned i = 0; i < TotalComponents; ++i) {
12991 Expr *AssociatedExprPr = Record.readSubExpr();
12992 bool IsNonContiguous = Record.readBool();
12993 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12994 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12996 C->setComponents(Components, ListSizes);
12999void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
13000 C->setLParenLoc(Record.readSourceLocation());
13002 C->setFallbackModifierLoc(Record.readSourceLocation());
13003 auto NumVars =
C->varlist_size();
13004 auto UniqueDecls =
C->getUniqueDeclarationsNum();
13005 auto TotalLists =
C->getTotalComponentListNum();
13006 auto TotalComponents =
C->getTotalComponentsNum();
13008 SmallVector<Expr *, 16> Vars;
13009 Vars.reserve(NumVars);
13010 for (
unsigned i = 0; i != NumVars; ++i)
13011 Vars.push_back(Record.readSubExpr());
13012 C->setVarRefs(Vars);
13014 for (
unsigned i = 0; i != NumVars; ++i)
13015 Vars.push_back(Record.readSubExpr());
13016 C->setPrivateCopies(Vars);
13018 for (
unsigned i = 0; i != NumVars; ++i)
13019 Vars.push_back(Record.readSubExpr());
13022 SmallVector<ValueDecl *, 16> Decls;
13023 Decls.reserve(UniqueDecls);
13024 for (
unsigned i = 0; i < UniqueDecls; ++i)
13025 Decls.push_back(Record.readDeclAs<ValueDecl>());
13026 C->setUniqueDecls(Decls);
13028 SmallVector<unsigned, 16> ListsPerDecl;
13029 ListsPerDecl.reserve(UniqueDecls);
13030 for (
unsigned i = 0; i < UniqueDecls; ++i)
13031 ListsPerDecl.push_back(Record.readInt());
13032 C->setDeclNumLists(ListsPerDecl);
13034 SmallVector<unsigned, 32> ListSizes;
13035 ListSizes.reserve(TotalLists);
13036 for (
unsigned i = 0; i < TotalLists; ++i)
13037 ListSizes.push_back(Record.readInt());
13038 C->setComponentListSizes(ListSizes);
13040 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13041 Components.reserve(TotalComponents);
13042 for (
unsigned i = 0; i < TotalComponents; ++i) {
13043 auto *AssociatedExprPr = Record.readSubExpr();
13044 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13045 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
13048 C->setComponents(Components, ListSizes);
13051void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
13052 C->setLParenLoc(Record.readSourceLocation());
13053 auto NumVars =
C->varlist_size();
13054 auto UniqueDecls =
C->getUniqueDeclarationsNum();
13055 auto TotalLists =
C->getTotalComponentListNum();
13056 auto TotalComponents =
C->getTotalComponentsNum();
13058 SmallVector<Expr *, 16> Vars;
13059 Vars.reserve(NumVars);
13060 for (
unsigned i = 0; i != NumVars; ++i)
13061 Vars.push_back(Record.readSubExpr());
13062 C->setVarRefs(Vars);
13064 SmallVector<ValueDecl *, 16> Decls;
13065 Decls.reserve(UniqueDecls);
13066 for (
unsigned i = 0; i < UniqueDecls; ++i)
13067 Decls.push_back(Record.readDeclAs<ValueDecl>());
13068 C->setUniqueDecls(Decls);
13070 SmallVector<unsigned, 16> ListsPerDecl;
13071 ListsPerDecl.reserve(UniqueDecls);
13072 for (
unsigned i = 0; i < UniqueDecls; ++i)
13073 ListsPerDecl.push_back(Record.readInt());
13074 C->setDeclNumLists(ListsPerDecl);
13076 SmallVector<unsigned, 32> ListSizes;
13077 ListSizes.reserve(TotalLists);
13078 for (
unsigned i = 0; i < TotalLists; ++i)
13079 ListSizes.push_back(Record.readInt());
13080 C->setComponentListSizes(ListSizes);
13082 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13083 Components.reserve(TotalComponents);
13084 for (
unsigned i = 0; i < TotalComponents; ++i) {
13085 Expr *AssociatedExpr = Record.readSubExpr();
13086 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13087 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13090 C->setComponents(Components, ListSizes);
13093void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
13094 C->setLParenLoc(Record.readSourceLocation());
13095 auto NumVars =
C->varlist_size();
13096 auto UniqueDecls =
C->getUniqueDeclarationsNum();
13097 auto TotalLists =
C->getTotalComponentListNum();
13098 auto TotalComponents =
C->getTotalComponentsNum();
13100 SmallVector<Expr *, 16> Vars;
13101 Vars.reserve(NumVars);
13102 for (
unsigned i = 0; i != NumVars; ++i)
13103 Vars.push_back(Record.readSubExpr());
13104 C->setVarRefs(Vars);
13107 SmallVector<ValueDecl *, 16> Decls;
13108 Decls.reserve(UniqueDecls);
13109 for (
unsigned i = 0; i < UniqueDecls; ++i)
13110 Decls.push_back(Record.readDeclAs<ValueDecl>());
13111 C->setUniqueDecls(Decls);
13113 SmallVector<unsigned, 16> ListsPerDecl;
13114 ListsPerDecl.reserve(UniqueDecls);
13115 for (
unsigned i = 0; i < UniqueDecls; ++i)
13116 ListsPerDecl.push_back(Record.readInt());
13117 C->setDeclNumLists(ListsPerDecl);
13119 SmallVector<unsigned, 32> ListSizes;
13120 ListSizes.reserve(TotalLists);
13121 for (
unsigned i = 0; i < TotalLists; ++i)
13122 ListSizes.push_back(Record.readInt());
13123 C->setComponentListSizes(ListSizes);
13125 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13126 Components.reserve(TotalComponents);
13127 for (
unsigned i = 0; i < TotalComponents; ++i) {
13128 Expr *AssociatedExpr = Record.readSubExpr();
13129 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13130 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13133 C->setComponents(Components, ListSizes);
13136void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
13137 C->setLParenLoc(Record.readSourceLocation());
13138 auto NumVars =
C->varlist_size();
13139 auto UniqueDecls =
C->getUniqueDeclarationsNum();
13140 auto TotalLists =
C->getTotalComponentListNum();
13141 auto TotalComponents =
C->getTotalComponentsNum();
13143 SmallVector<Expr *, 16> Vars;
13144 Vars.reserve(NumVars);
13145 for (
unsigned I = 0; I != NumVars; ++I)
13146 Vars.push_back(Record.readSubExpr());
13147 C->setVarRefs(Vars);
13150 SmallVector<ValueDecl *, 16> Decls;
13151 Decls.reserve(UniqueDecls);
13152 for (
unsigned I = 0; I < UniqueDecls; ++I)
13153 Decls.push_back(Record.readDeclAs<ValueDecl>());
13154 C->setUniqueDecls(Decls);
13156 SmallVector<unsigned, 16> ListsPerDecl;
13157 ListsPerDecl.reserve(UniqueDecls);
13158 for (
unsigned I = 0; I < UniqueDecls; ++I)
13159 ListsPerDecl.push_back(Record.readInt());
13160 C->setDeclNumLists(ListsPerDecl);
13162 SmallVector<unsigned, 32> ListSizes;
13163 ListSizes.reserve(TotalLists);
13164 for (
unsigned i = 0; i < TotalLists; ++i)
13165 ListSizes.push_back(Record.readInt());
13166 C->setComponentListSizes(ListSizes);
13168 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
13169 Components.reserve(TotalComponents);
13170 for (
unsigned I = 0; I < TotalComponents; ++I) {
13171 Expr *AssociatedExpr = Record.readSubExpr();
13172 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
13173 Components.emplace_back(AssociatedExpr, AssociatedDecl,
13176 C->setComponents(Components, ListSizes);
13179void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
13180 C->setLParenLoc(Record.readSourceLocation());
13181 unsigned NumVars =
C->varlist_size();
13182 SmallVector<Expr *, 16> Vars;
13183 Vars.reserve(NumVars);
13184 for (
unsigned i = 0; i != NumVars; ++i)
13185 Vars.push_back(Record.readSubExpr());
13186 C->setVarRefs(Vars);
13188 Vars.reserve(NumVars);
13189 for (
unsigned i = 0; i != NumVars; ++i)
13190 Vars.push_back(Record.readSubExpr());
13191 C->setPrivateRefs(Vars);
13194void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
13195 C->setLParenLoc(Record.readSourceLocation());
13196 unsigned NumVars =
C->varlist_size();
13197 SmallVector<Expr *, 16> Vars;
13198 Vars.reserve(NumVars);
13199 for (
unsigned i = 0; i != NumVars; ++i)
13200 Vars.push_back(Record.readSubExpr());
13201 C->setVarRefs(Vars);
13204void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
13205 C->setLParenLoc(Record.readSourceLocation());
13206 unsigned NumVars =
C->varlist_size();
13207 SmallVector<Expr *, 16> Vars;
13208 Vars.reserve(NumVars);
13209 for (
unsigned i = 0; i != NumVars; ++i)
13210 Vars.push_back(Record.readSubExpr());
13211 C->setVarRefs(Vars);
13214void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
13215 C->setLParenLoc(Record.readSourceLocation());
13216 unsigned NumOfAllocators =
C->getNumberOfAllocators();
13217 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
13218 Data.reserve(NumOfAllocators);
13219 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
13220 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
13223 D.
LParenLoc = Record.readSourceLocation();
13224 D.
RParenLoc = Record.readSourceLocation();
13226 C->setAllocatorsData(
Data);
13229void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *
C) {
13230 C->setLParenLoc(Record.readSourceLocation());
13231 C->setModifier(Record.readSubExpr());
13232 C->setColonLoc(Record.readSourceLocation());
13233 unsigned NumOfLocators =
C->varlist_size();
13234 SmallVector<Expr *, 4> Locators;
13235 Locators.reserve(NumOfLocators);
13236 for (
unsigned I = 0; I != NumOfLocators; ++I)
13237 Locators.push_back(Record.readSubExpr());
13238 C->setVarRefs(Locators);
13241void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *
C) {
13244 C->setLParenLoc(Record.readSourceLocation());
13245 C->setKindKwLoc(Record.readSourceLocation());
13246 C->setModifierKwLoc(Record.readSourceLocation());
13249void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *
C) {
13251 C->setThreadID(Record.readSubExpr());
13252 C->setLParenLoc(Record.readSourceLocation());
13255void OMPClauseReader::VisitOMPBindClause(OMPBindClause *
C) {
13257 C->setLParenLoc(Record.readSourceLocation());
13258 C->setBindKindLoc(Record.readSourceLocation());
13262 C->setAlignment(Record.readExpr());
13263 C->setLParenLoc(Record.readSourceLocation());
13266void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
13268 C->setSize(Record.readSubExpr());
13269 C->setLParenLoc(Record.readSourceLocation());
13272void OMPClauseReader::VisitOMPDynGroupprivateClause(
13273 OMPDynGroupprivateClause *
C) {
13275 C->setDynGroupprivateModifier(
13277 C->setDynGroupprivateFallbackModifier(
13279 C->setSize(Record.readSubExpr());
13280 C->setLParenLoc(Record.readSourceLocation());
13281 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13282 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13285void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
13286 C->setLParenLoc(Record.readSourceLocation());
13287 C->setDependenceType(
13289 C->setDependenceLoc(Record.readSourceLocation());
13290 C->setColonLoc(Record.readSourceLocation());
13291 unsigned NumVars =
C->varlist_size();
13292 SmallVector<Expr *, 16> Vars;
13293 Vars.reserve(NumVars);
13294 for (
unsigned I = 0; I != NumVars; ++I)
13295 Vars.push_back(Record.readSubExpr());
13296 C->setVarRefs(Vars);
13297 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
13298 C->setLoopData(I, Record.readSubExpr());
13301void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
13303 Record.readAttributes(Attrs);
13304 C->setAttrs(Attrs);
13305 C->setLocStart(Record.readSourceLocation());
13306 C->setLParenLoc(Record.readSourceLocation());
13307 C->setLocEnd(Record.readSourceLocation());
13310void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *
C) {}
13320 Selector.ScoreOrCondition =
nullptr;
13322 Selector.ScoreOrCondition = readExprRef();
13334 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13339 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
13341 Data->setClauses(Clauses);
13342 if (
Data->hasAssociatedStmt())
13344 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
13349 unsigned NumVars =
readInt();
13351 for (
unsigned I = 0; I < NumVars; ++I)
13357 unsigned NumExprs =
readInt();
13359 for (
unsigned I = 0; I < NumExprs; ++I)
13369 switch (ClauseKind) {
13384 bool isConditionExprClause =
readBool();
13385 if (isConditionExprClause) {
13390 unsigned NumVars =
readInt();
13392 for (
unsigned I = 0; I < NumVars; ++I)
13399 unsigned NumClauses =
readInt();
13401 for (
unsigned I = 0; I < NumClauses; ++I)
13435 for (
unsigned I = 0; I < VarList.size(); ++I) {
13438 RecipeList.push_back({Alloca});
13442 VarList, RecipeList, EndLoc);
13460 for (
unsigned I = 0; I < VarList.size(); ++I) {
13464 RecipeList.push_back({Recipe, RecipeTemp});
13468 VarList, RecipeList, EndLoc);
13519 LParenLoc, ModList, VarList, EndLoc);
13528 LParenLoc, ModList, VarList, EndLoc);
13537 LParenLoc, ModList, VarList, EndLoc);
13546 LParenLoc, ModList, VarList, EndLoc);
13552 AsyncExpr, EndLoc);
13560 DevNumExpr, QueuesLoc, QueueIdExprs,
13567 unsigned NumArchs =
readInt();
13569 for (
unsigned I = 0; I < NumArchs; ++I) {
13572 Archs.emplace_back(Loc, Ident);
13576 LParenLoc, Archs, EndLoc);
13584 for (
unsigned I = 0; I < VarList.size(); ++I) {
13588 3 *
sizeof(
int *));
13591 unsigned NumCombiners =
readInt();
13592 for (
unsigned I = 0; I < NumCombiners; ++I) {
13597 Combiners.push_back({LHS, RHS, Op});
13600 RecipeList.push_back({Recipe, Combiners});
13604 VarList, RecipeList, EndLoc);
13623 HasForce, LoopCount, EndLoc);
13627 unsigned NumClauses =
readInt();
13629 for (
unsigned I = 0; I < NumClauses; ++I)
13632 SizeExprs, EndLoc);
13636 unsigned NumExprs =
readInt();
13639 for (
unsigned I = 0; I < NumExprs; ++I) {
13645 GangKinds, Exprs, EndLoc);
13651 WorkerExpr, EndLoc);
13657 VectorExpr, EndLoc);
13669 LParenLoc, VarList, EndLoc);
13683 llvm_unreachable(
"Clause serialization not yet implemented");
13685 llvm_unreachable(
"Invalid Clause Kind");
13690 for (
unsigned I = 0; I < Clauses.size(); ++I)
13695 unsigned NumVars =
readInt();
13696 A->Clauses.resize(NumVars);
13703 llvm::FoldingSetNodeID ID;
13704 ID.AddString(PrimaryModuleName);
13705 return ID.computeStableHash();
13710 return std::nullopt;
13713 return std::nullopt;
13716 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.
bool needsImplicitDefaultConstructor() const
Determine if we need to declare a default constructor for this class.
bool needsImplicitMoveConstructor() const
Determine whether this class should get an implicit move constructor or if any existing special membe...
base_class_iterator bases_begin()
base_class_iterator vbases_begin()
bool needsImplicitCopyConstructor() const
Determine whether this class needs an implicit copy constructor to be lazily declared.
bool needsImplicitDestructor() const
Determine whether this class needs an implicit destructor to be lazily declared.
bool needsImplicitMoveAssignment() const
Determine whether this class should get an implicit move assignment operator or if any existing speci...
bool needsImplicitCopyAssignment() const
Determine whether this class needs an implicit copy assignment operator to be lazily declared.
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...
decl_range noload_decls() const
noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...
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.
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
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.
static void canonicalizeDirectoryDependency(const FileManager &FileMgr, SmallVectorImpl< char > &Path)
Spell Path the way directory dependencies are recorded: absolute, with dots removed.
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.
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __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)