96#include "llvm/ADT/APFloat.h"
97#include "llvm/ADT/APInt.h"
98#include "llvm/ADT/ArrayRef.h"
99#include "llvm/ADT/DenseMap.h"
100#include "llvm/ADT/FoldingSet.h"
101#include "llvm/ADT/IntrusiveRefCntPtr.h"
102#include "llvm/ADT/STLExtras.h"
103#include "llvm/ADT/ScopeExit.h"
104#include "llvm/ADT/Sequence.h"
105#include "llvm/ADT/SmallPtrSet.h"
106#include "llvm/ADT/SmallVector.h"
107#include "llvm/ADT/StringExtras.h"
108#include "llvm/ADT/StringMap.h"
109#include "llvm/ADT/StringRef.h"
110#include "llvm/ADT/iterator_range.h"
111#include "llvm/Bitstream/BitstreamReader.h"
112#include "llvm/Support/Compiler.h"
113#include "llvm/Support/Compression.h"
114#include "llvm/Support/DJB.h"
115#include "llvm/Support/Endian.h"
116#include "llvm/Support/Error.h"
117#include "llvm/Support/ErrorHandling.h"
118#include "llvm/Support/LEB128.h"
119#include "llvm/Support/MemoryBuffer.h"
120#include "llvm/Support/Path.h"
121#include "llvm/Support/SaveAndRestore.h"
122#include "llvm/Support/TimeProfiler.h"
123#include "llvm/Support/Timer.h"
124#include "llvm/Support/VersionTuple.h"
125#include "llvm/Support/raw_ostream.h"
126#include "llvm/TargetParser/Triple.h"
139#include <system_error>
144using namespace clang;
147using llvm::BitstreamCursor;
155 return First->ReadFullVersionInformation(FullVersion) ||
156 Second->ReadFullVersionInformation(FullVersion);
160 First->ReadModuleName(ModuleName);
161 Second->ReadModuleName(ModuleName);
165 First->ReadModuleMapFile(ModuleMapPath);
166 Second->ReadModuleMapFile(ModuleMapPath);
170 const LangOptions &LangOpts, StringRef ModuleFilename,
bool Complain,
171 bool AllowCompatibleDifferences) {
172 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
173 AllowCompatibleDifferences) ||
174 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
175 AllowCompatibleDifferences);
179 const CodeGenOptions &CGOpts, StringRef ModuleFilename,
bool Complain,
180 bool AllowCompatibleDifferences) {
181 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
182 AllowCompatibleDifferences) ||
183 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
184 AllowCompatibleDifferences);
188 const TargetOptions &TargetOpts, StringRef ModuleFilename,
bool Complain,
189 bool AllowCompatibleDifferences) {
190 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
191 AllowCompatibleDifferences) ||
192 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
193 AllowCompatibleDifferences);
198 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
199 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
205 return First->ReadFileSystemOptions(FSOpts, Complain) ||
206 Second->ReadFileSystemOptions(FSOpts, Complain);
211 StringRef SpecificModuleCachePath,
bool Complain) {
212 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
213 SpecificModuleCachePath, Complain) ||
214 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
215 SpecificModuleCachePath, Complain);
220 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
221 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
222 Complain, SuggestedPredefines) ||
223 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
224 Complain, SuggestedPredefines);
229 First->ReadCounter(M,
Value);
230 Second->ReadCounter(M,
Value);
234 return First->needsInputFileVisitation() ||
235 Second->needsInputFileVisitation();
239 return First->needsSystemInputFileVisitation() ||
240 Second->needsSystemInputFileVisitation();
245 First->visitModuleFile(Filename, Kind);
246 Second->visitModuleFile(Filename, Kind);
252 bool isExplicitModule) {
253 bool Continue =
false;
254 if (First->needsInputFileVisitation() &&
255 (!isSystem || First->needsSystemInputFileVisitation()))
256 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
258 if (Second->needsInputFileVisitation() &&
259 (!isSystem || Second->needsSystemInputFileVisitation()))
260 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
267 First->readModuleFileExtension(Metadata);
268 Second->readModuleFileExtension(Metadata);
287 StringRef ModuleFilename,
289 bool AllowCompatibleDifferences =
true) {
293#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
294 if constexpr (CK::Compatibility != CK::Benign) { \
295 if ((CK::Compatibility == CK::NotCompatible) || \
296 (CK::Compatibility == CK::Compatible && \
297 !AllowCompatibleDifferences)) { \
298 if (ExistingLangOpts.Name != LangOpts.Name) { \
301 Diags->Report(diag::err_ast_file_langopt_mismatch) \
302 << Description << LangOpts.Name << ExistingLangOpts.Name \
305 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
306 << Description << ModuleFilename; \
313#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
314 if constexpr (CK::Compatibility != CK::Benign) { \
315 if ((CK::Compatibility == CK::NotCompatible) || \
316 (CK::Compatibility == CK::Compatible && \
317 !AllowCompatibleDifferences)) { \
318 if (ExistingLangOpts.Name != LangOpts.Name) { \
320 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
321 << Description << ModuleFilename; \
327#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
328 if constexpr (CK::Compatibility != CK::Benign) { \
329 if ((CK::Compatibility == CK::NotCompatible) || \
330 (CK::Compatibility == CK::Compatible && \
331 !AllowCompatibleDifferences)) { \
332 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
334 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
335 << Description << ModuleFilename; \
341#include "clang/Basic/LangOptions.def"
345 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
346 <<
"module features" << ModuleFilename;
352 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
353 <<
"target Objective-C runtime" << ModuleFilename;
360 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
361 <<
"block command names" << ModuleFilename;
369 if (!AllowCompatibleDifferences) {
373 ExistingSanitizers.
clear(ModularSanitizers);
374 ImportedSanitizers.
clear(ModularSanitizers);
375 if (ExistingSanitizers.
Mask != ImportedSanitizers.
Mask) {
376 const std::string Flag =
"-fsanitize=";
378#define SANITIZER(NAME, ID) \
380 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
381 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
382 if (InExistingModule != InImportedModule) \
383 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
384 << InExistingModule << ModuleFilename << (Flag + NAME); \
386#include "clang/Basic/Sanitizers.def"
397 StringRef ModuleFilename,
399 bool AllowCompatibleDifferences =
true) {
403#define CODEGENOPT(Name, Bits, Default, Compatibility) \
404 if constexpr (CK::Compatibility != CK::Benign) { \
405 if ((CK::Compatibility == CK::NotCompatible) || \
406 (CK::Compatibility == CK::Compatible && \
407 !AllowCompatibleDifferences)) { \
408 if (ExistingCGOpts.Name != CGOpts.Name) { \
411 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
412 << #Name << CGOpts.Name << ExistingCGOpts.Name \
415 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
416 << #Name << ModuleFilename; \
423#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
424 if constexpr (CK::Compatibility != CK::Benign) { \
425 if ((CK::Compatibility == CK::NotCompatible) || \
426 (CK::Compatibility == CK::Compatible && \
427 !AllowCompatibleDifferences)) { \
428 if (ExistingCGOpts.Name != CGOpts.Name) { \
430 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
431 << #Name << ModuleFilename; \
436#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
437 if constexpr (CK::Compatibility != CK::Benign) { \
438 if ((CK::Compatibility == CK::NotCompatible) || \
439 (CK::Compatibility == CK::Compatible && \
440 !AllowCompatibleDifferences)) { \
441 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
443 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
444 << #Name << ModuleFilename; \
449#define DEBUGOPT(Name, Bits, Default, Compatibility)
450#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
451#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
452#include "clang/Basic/CodeGenOptions.def"
465 StringRef ModuleFilename,
467 bool AllowCompatibleDifferences =
true) {
468#define CHECK_TARGET_OPT(Field, Name) \
469 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
471 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
472 << ModuleFilename << Name << TargetOpts.Field \
473 << ExistingTargetOpts.Field; \
484 if (!AllowCompatibleDifferences) {
489#undef CHECK_TARGET_OPT
497 llvm::sort(ExistingFeatures);
498 llvm::sort(ReadFeatures);
504 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
505 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
506 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
507 ExistingFeatures.begin(), ExistingFeatures.end(),
508 std::back_inserter(UnmatchedReadFeatures));
512 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
516 for (StringRef
Feature : UnmatchedReadFeatures)
517 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
518 <<
false << ModuleFilename <<
Feature;
519 for (StringRef
Feature : UnmatchedExistingFeatures)
520 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
521 <<
true << ModuleFilename <<
Feature;
524 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
528 StringRef ModuleFilename,
bool Complain,
529 bool AllowCompatibleDifferences) {
530 const LangOptions &ExistingLangOpts = PP.getLangOpts();
532 Complain ? &Reader.Diags :
nullptr,
533 AllowCompatibleDifferences);
537 StringRef ModuleFilename,
bool Complain,
538 bool AllowCompatibleDifferences) {
541 Complain ? &Reader.Diags :
nullptr,
542 AllowCompatibleDifferences);
546 StringRef ModuleFilename,
bool Complain,
547 bool AllowCompatibleDifferences) {
548 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
550 Complain ? &Reader.Diags :
nullptr,
551 AllowCompatibleDifferences);
556using MacroDefinitionsMap =
557 llvm::StringMap<std::pair<StringRef,
bool >>;
558using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>;
564 StringRef ModuleFilename,
574 for (
auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
583 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
585 ->getWarningOptionForDiag(DiagID)
605 StringRef ModuleFilename,
bool IsSystem,
606 bool SystemHeaderWarningsInModule,
615 !SystemHeaderWarningsInModule) {
617 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
618 <<
"-Wsystem-headers" << ModuleFilename;
625 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
626 <<
"-Werror" << ModuleFilename;
633 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
634 <<
"-Weverything -Werror" << ModuleFilename;
641 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
642 <<
"-pedantic-errors" << ModuleFilename;
667 assert(!ModuleName.empty() &&
"diagnostic options read before module name");
671 assert(M &&
"missing module");
676 StringRef ModuleFilename,
680 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
684 PP.getFileManager().getVirtualFileSystem(),
688 assert(ModuleMgr.
size() >= 1 &&
"what ASTFile is this then");
694 Module *Importer = PP.getCurrentModule();
697 bool SystemHeaderWarningsInModule =
704 TopM->
IsSystem, SystemHeaderWarningsInModule,
712 MacroDefinitionsMap &
Macros,
714 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
716 bool IsUndef = PPOpts.
Macros[I].second;
718 std::pair<StringRef, StringRef> MacroPair =
Macro.split(
'=');
719 StringRef MacroName = MacroPair.first;
720 StringRef MacroBody = MacroPair.second;
724 auto [It, Inserted] =
Macros.try_emplace(MacroName);
725 if (MacroNames && Inserted)
726 MacroNames->push_back(MacroName);
728 It->second = std::make_pair(
"",
true);
733 if (MacroName.size() ==
Macro.size())
737 StringRef::size_type End = MacroBody.find_first_of(
"\n\r");
738 MacroBody = MacroBody.substr(0, End);
741 auto [It, Inserted] =
Macros.try_emplace(MacroName);
742 if (MacroNames && Inserted)
743 MacroNames->push_back(MacroName);
744 It->second = std::make_pair(MacroBody,
false);
768 std::string &SuggestedPredefines,
const LangOptions &LangOpts,
772 MacroDefinitionsMap ASTFileMacros;
774 MacroDefinitionsMap ExistingMacros;
777 &ExistingMacroNames);
781 SuggestedPredefines +=
"# 1 \"<command line>\" 1\n";
783 for (
unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
785 StringRef MacroName = ExistingMacroNames[I];
786 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
789 llvm::StringMap<std::pair<StringRef,
bool >>
::iterator Known =
790 ASTFileMacros.find(MacroName);
796 Diags->
Report(diag::err_ast_file_macro_def_undef)
797 << MacroName <<
true << ModuleFilename;
805 if (Existing.second) {
806 SuggestedPredefines +=
"#undef ";
807 SuggestedPredefines += MacroName.str();
808 SuggestedPredefines +=
'\n';
810 SuggestedPredefines +=
"#define ";
811 SuggestedPredefines += MacroName.str();
812 SuggestedPredefines +=
' ';
813 SuggestedPredefines += Existing.first.str();
814 SuggestedPredefines +=
'\n';
821 if (Existing.second != Known->second.second) {
823 Diags->
Report(diag::err_ast_file_macro_def_undef)
824 << MacroName << Known->second.second << ModuleFilename;
831 if (Existing.second || Existing.first == Known->second.first) {
832 ASTFileMacros.erase(Known);
838 Diags->
Report(diag::err_ast_file_macro_def_conflict)
839 << MacroName << Known->second.first << Existing.first
846 SuggestedPredefines +=
"# 1 \"<built-in>\" 2\n";
851 for (
const auto &MacroName : ASTFileMacros.keys()) {
853 Diags->
Report(diag::err_ast_file_macro_def_undef)
854 << MacroName <<
false << ModuleFilename;
865 Diags->
Report(diag::err_ast_file_undef)
872 if (LangOpts.Modules &&
876 Diags->
Report(diag::err_ast_file_pp_detailed_record)
883 for (
unsigned I = 0, N = ExistingPPOpts.
Includes.size(); I != N; ++I) {
890 SuggestedPredefines +=
"#include \"";
891 SuggestedPredefines +=
File;
892 SuggestedPredefines +=
"\"\n";
902 SuggestedPredefines +=
"#include \"";
903 SuggestedPredefines +=
File;
904 SuggestedPredefines +=
"\"\n";
907 for (
unsigned I = 0, N = ExistingPPOpts.
MacroIncludes.size(); I != N; ++I) {
912 SuggestedPredefines +=
"#__include_macros \"";
913 SuggestedPredefines +=
File;
914 SuggestedPredefines +=
"\"\n##\n";
921 StringRef ModuleFilename,
922 bool ReadMacros,
bool Complain,
923 std::string &SuggestedPredefines) {
927 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
928 Complain ? &Reader.Diags :
nullptr, PP.getFileManager(),
929 SuggestedPredefines, PP.getLangOpts());
934 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
936 ModuleFilename, ReadMacros,
nullptr,
937 PP.getFileManager(), SuggestedPredefines,
946 StringRef SpecificModuleCachePath,
947 StringRef ExistingModuleCachePath,
948 StringRef ModuleFilename,
953 SpecificModuleCachePath == ExistingModuleCachePath)
956 VFS.equivalent(SpecificModuleCachePath, ExistingModuleCachePath);
957 if (EqualOrErr && *EqualOrErr)
960 Diags->
Report(diag::err_ast_file_modulecache_mismatch)
961 << SpecificModuleCachePath << ExistingModuleCachePath << ModuleFilename;
966 StringRef ModuleFilename,
967 StringRef SpecificModuleCachePath,
970 Reader.getFileManager().getVirtualFileSystem(), SpecificModuleCachePath,
971 PP.getHeaderSearchInfo().getModuleCachePath(), ModuleFilename,
972 Complain ? &Reader.Diags :
nullptr, PP.getLangOpts(),
973 PP.getPreprocessorOpts());
977 PP.setCounterValue(
Value);
986 const char *
Error =
nullptr;
988 uint64_t Val = llvm::decodeULEB128(P, &Length,
nullptr, &
Error);
990 llvm::report_fatal_error(
Error);
996static std::pair<unsigned, unsigned>
999 if ((
unsigned)KeyLen != KeyLen)
1000 llvm::report_fatal_error(
"key too large");
1003 if ((
unsigned)DataLen != DataLen)
1004 llvm::report_fatal_error(
"data too large");
1006 return std::make_pair(KeyLen, DataLen);
1010 bool TakeOwnership) {
1011 DeserializationListener = Listener;
1012 OwnsDeserializationListener = TakeOwnership;
1023 Reader.ReadModuleOffsetMap(MF);
1025 unsigned ModuleFileIndex =
ID.getModuleFileIndex();
1026 unsigned LocalDeclID =
ID.getLocalDeclIndex();
1032 assert(OwningModuleFile);
1036 if (!ModuleFileIndex)
1039 assert(LocalDeclID < LocalNumDecls);
1047 unsigned ModuleFileIndex,
unsigned LocalDeclID) {
1052std::pair<unsigned, unsigned>
1059 using namespace llvm::support;
1062 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1064 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1071 Args.push_back(FirstII);
1072 for (
unsigned I = 1; I != N; ++I)
1073 Args.push_back(Reader.getLocalIdentifier(
1074 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1082 using namespace llvm::support;
1086 Result.ID = Reader.getGlobalSelectorID(
1087 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1088 unsigned FullInstanceBits =
1089 endian::readNext<uint16_t, llvm::endianness::little>(d);
1090 unsigned FullFactoryBits =
1091 endian::readNext<uint16_t, llvm::endianness::little>(d);
1092 Result.InstanceBits = FullInstanceBits & 0x3;
1093 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1094 Result.FactoryBits = FullFactoryBits & 0x3;
1095 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1096 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1097 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1100 for (
unsigned I = 0; I != NumInstanceMethods; ++I) {
1104 endian::readNext<DeclID, llvm::endianness::little>(d))))
1109 for (
unsigned I = 0; I != NumFactoryMethods; ++I) {
1113 endian::readNext<DeclID, llvm::endianness::little>(d))))
1121 return llvm::djbHash(a);
1124std::pair<unsigned, unsigned>
1131 assert(n >= 2 && d[n-1] ==
'\0');
1132 return StringRef((
const char*) d, n-1);
1138 bool IsInteresting =
1149 bool Value = Bits & 0x1;
1155 using namespace llvm::support;
1158 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1159 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1172 const unsigned char* d,
1174 using namespace llvm::support;
1177 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1178 bool IsInteresting = RawID & 0x01;
1188 II = &Reader.getIdentifierTable().getOwn(k);
1191 bool IsModule = Reader.getPreprocessor().getCurrentModule() !=
nullptr;
1193 Reader.markIdentifierUpToDate(II);
1195 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1196 if (!IsInteresting) {
1199 Reader.SetIdentifierInfo(ID, II);
1203 unsigned ObjCOrBuiltinID =
1204 endian::readNext<uint16_t, llvm::endianness::little>(d);
1205 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1206 bool CPlusPlusOperatorKeyword =
readBit(Bits);
1207 bool HasRevertedTokenIDToIdentifier =
readBit(Bits);
1208 bool Poisoned =
readBit(Bits);
1209 bool ExtensionToken =
readBit(Bits);
1210 bool HasMacroDefinition =
readBit(Bits);
1212 assert(Bits == 0 &&
"Extra bits in the identifier?");
1213 DataLen -=
sizeof(uint16_t) * 2;
1217 if (HasRevertedTokenIDToIdentifier && II->
getTokenID() != tok::identifier)
1222 "Incorrect extension token flag");
1223 (void)ExtensionToken;
1227 "Incorrect C++ operator keyword flag");
1228 (void)CPlusPlusOperatorKeyword;
1232 if (HasMacroDefinition) {
1233 uint32_t MacroDirectivesOffset =
1234 endian::readNext<uint32_t, llvm::endianness::little>(d);
1237 if (MacroDirectivesOffset)
1238 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1240 hasMacroDefinitionInDependencies =
true;
1243 Reader.SetIdentifierInfo(ID, II);
1249 for (; DataLen > 0; DataLen -=
sizeof(
DeclID))
1250 DeclIDs.push_back(Reader.getGlobalDeclID(
1253 endian::readNext<DeclID, llvm::endianness::little>(d))));
1254 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1261 : Kind(Name.getNameKind()) {
1291 llvm::FoldingSetNodeID ID;
1292 ID.AddInteger(Kind);
1315 return ID.computeStableHash();
1320 using namespace llvm::support;
1322 uint32_t ModuleFileID =
1323 endian::readNext<uint32_t, llvm::endianness::little>(d);
1324 return Reader.getLocalModuleFile(
F, ModuleFileID);
1327std::pair<unsigned, unsigned>
1334 using namespace llvm::support;
1343 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1350 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1374 using namespace llvm::support;
1376 for (
unsigned NumDecls = DataLen /
sizeof(
DeclID); NumDecls; --NumDecls) {
1378 Reader,
F, endian::readNext<DeclID, llvm::endianness::little>(d));
1384 const unsigned char *d,
1392 llvm::FoldingSetNodeID ID;
1393 ID.AddInteger(Key.first.getHash());
1394 ID.AddInteger(Key.second);
1395 return ID.computeStableHash();
1406 return {Name, *ModuleHash};
1412 unsigned PrimaryModuleHash =
1413 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1414 return {Name, PrimaryModuleHash};
1418 const unsigned char *d,
1426 using namespace llvm::support;
1428 uint32_t ModuleFileID =
1429 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1430 return Reader.getLocalModuleFile(F, ModuleFileID);
1435 using namespace llvm::support;
1436 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1439std::pair<unsigned, unsigned>
1445 const unsigned char *d,
1448 using namespace llvm::support;
1450 for (
unsigned NumDecls =
1452 NumDecls; --NumDecls) {
1455 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1456 Val.
insert(Reader.getGlobalDeclID(F, LocalID));
1460bool ASTReader::ReadLexicalDeclContextStorage(
ModuleFile &M,
1461 BitstreamCursor &Cursor,
1464 assert(Offset != 0);
1467 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1468 Error(std::move(Err));
1476 Error(MaybeCode.takeError());
1479 unsigned Code = MaybeCode.get();
1482 if (!MaybeRecCode) {
1483 Error(MaybeRecCode.takeError());
1486 unsigned RecCode = MaybeRecCode.get();
1488 Error(
"Expected lexical block");
1493 "expected a TU_UPDATE_LEXICAL record for TU");
1498 auto &Lex = LexicalDecls[DC];
1500 Lex = std::make_pair(
1503 Blob.size() /
sizeof(
DeclID)));
1509bool ASTReader::ReadVisibleDeclContextStorage(
1510 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1511 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1512 assert(Offset != 0);
1514 SavedStreamPosition SavedPosition(Cursor);
1515 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1516 Error(std::move(Err));
1522 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1524 Error(MaybeCode.takeError());
1527 unsigned Code = MaybeCode.get();
1529 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1530 if (!MaybeRecCode) {
1531 Error(MaybeRecCode.takeError());
1534 unsigned RecCode = MaybeRecCode.get();
1535 switch (VisibleKind) {
1536 case VisibleDeclContextStorageKind::GenerallyVisible:
1538 Error(
"Expected visible lookup table block");
1542 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1544 Error(
"Expected module local visible lookup table block");
1548 case VisibleDeclContextStorageKind::TULocalVisible:
1550 Error(
"Expected TU local lookup table block");
1558 auto *
Data = (
const unsigned char*)Blob.data();
1559 switch (VisibleKind) {
1560 case VisibleDeclContextStorageKind::GenerallyVisible:
1561 PendingVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1563 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1564 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1566 case VisibleDeclContextStorageKind::TULocalVisible:
1568 TULocalUpdates[
ID].push_back(UpdateData{&M,
Data});
1574void ASTReader::AddSpecializations(
const Decl *D,
const unsigned char *
Data,
1578 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1579 SpecLookups[D].Table.add(&M,
Data,
1583bool ASTReader::ReadSpecializations(
ModuleFile &M, BitstreamCursor &Cursor,
1584 uint64_t Offset, Decl *D,
bool IsPartial) {
1585 assert(Offset != 0);
1587 SavedStreamPosition SavedPosition(Cursor);
1588 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1589 Error(std::move(Err));
1595 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1597 Error(MaybeCode.takeError());
1600 unsigned Code = MaybeCode.get();
1602 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1603 if (!MaybeRecCode) {
1604 Error(MaybeRecCode.takeError());
1607 unsigned RecCode = MaybeRecCode.get();
1610 Error(
"Expected decl specs block");
1614 auto *
Data = (
const unsigned char *)Blob.data();
1615 AddSpecializations(D,
Data, M, IsPartial);
1619void ASTReader::Error(StringRef Msg)
const {
1620 Error(diag::err_fe_ast_file_malformed, Msg);
1621 if (PP.getLangOpts().Modules &&
1622 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1623 Diag(diag::note_module_cache_path)
1624 << PP.getHeaderSearchInfo().getModuleCachePath();
1628void ASTReader::Error(
unsigned DiagID, StringRef Arg1, StringRef Arg2,
1629 StringRef Arg3)
const {
1630 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1634struct AlreadyReportedDiagnosticError
1635 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1638 void log(raw_ostream &OS)
const override {
1639 llvm_unreachable(
"reporting an already-reported diagnostic error");
1642 std::error_code convertToErrorCode()
const override {
1643 return llvm::inconvertibleErrorCode();
1647char AlreadyReportedDiagnosticError::ID = 0;
1650void ASTReader::Error(llvm::Error &&Err)
const {
1652 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1653 [&](llvm::ErrorInfoBase &E) {
return Error(E.message()); });
1663 LineTableInfo &LineTable = SourceMgr.getLineTable();
1666 std::map<int, int> FileIDs;
1668 for (
unsigned I = 0;
Record[Idx]; ++I) {
1670 auto Filename = ReadPath(F,
Record, Idx);
1676 std::vector<LineEntry> Entries;
1677 while (Idx <
Record.size()) {
1678 FileID FID = ReadFileID(F,
Record, Idx);
1681 unsigned NumEntries =
Record[Idx++];
1682 assert(NumEntries &&
"no line entries for file ID");
1684 Entries.reserve(NumEntries);
1685 for (
unsigned I = 0; I != NumEntries; ++I) {
1686 unsigned FileOffset =
Record[Idx++];
1687 unsigned LineNo =
Record[Idx++];
1688 int FilenameID = FileIDs[
Record[Idx++]];
1691 unsigned IncludeOffset =
Record[Idx++];
1693 FileKind, IncludeOffset));
1700llvm::Error ASTReader::ReadSourceManagerBlock(
ModuleFile &F) {
1701 using namespace SrcMgr;
1709 SLocEntryCursor = F.
Stream;
1712 if (llvm::Error Err = F.
Stream.SkipBlock())
1722 Expected<llvm::BitstreamEntry> MaybeE =
1723 SLocEntryCursor.advanceSkippingSubblocks();
1725 return MaybeE.takeError();
1726 llvm::BitstreamEntry E = MaybeE.get();
1729 case llvm::BitstreamEntry::SubBlock:
1730 case llvm::BitstreamEntry::Error:
1731 return llvm::createStringError(std::errc::illegal_byte_sequence,
1732 "malformed block record in AST file");
1733 case llvm::BitstreamEntry::EndBlock:
1734 return llvm::Error::success();
1735 case llvm::BitstreamEntry::Record:
1743 Expected<unsigned> MaybeRecord =
1744 SLocEntryCursor.readRecord(E.ID,
Record, &Blob);
1746 return MaybeRecord.takeError();
1747 switch (MaybeRecord.get()) {
1755 return llvm::Error::success();
1760llvm::Expected<SourceLocation::UIntTy>
1766 return std::move(Err);
1770 return MaybeEntry.takeError();
1772 llvm::BitstreamEntry Entry = MaybeEntry.get();
1773 if (Entry.Kind != llvm::BitstreamEntry::Record)
1774 return llvm::createStringError(
1775 std::errc::illegal_byte_sequence,
1776 "incorrectly-formatted source location entry in AST file");
1782 return MaybeSLOC.takeError();
1784 switch (MaybeSLOC.get()) {
1786 return llvm::createStringError(
1787 std::errc::illegal_byte_sequence,
1788 "incorrectly-formatted source location entry in AST file");
1798 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1799 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1800 "Corrupted global sloc offset map");
1805 auto It = llvm::upper_bound(
1808 int ID = F->SLocEntryBaseID + LocalIndex;
1809 std::size_t Index = -ID - 2;
1810 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1811 assert(!SourceMgr.SLocEntryLoaded[Index]);
1812 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1813 if (!MaybeEntryOffset) {
1814 Error(MaybeEntryOffset.takeError());
1818 SourceMgr.LoadedSLocEntryTable[Index] =
1819 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1820 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1822 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1838 Error(
"source location entry ID out-of-range for AST file");
1844 auto ReadBuffer = [
this](
1845 BitstreamCursor &SLocEntryCursor,
1846 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1851 Error(MaybeCode.takeError());
1854 unsigned Code = MaybeCode.get();
1857 SLocEntryCursor.readRecord(Code,
Record, &Blob);
1858 if (!MaybeRecCode) {
1859 Error(MaybeRecCode.takeError());
1862 unsigned RecCode = MaybeRecCode.get();
1867 const llvm::compression::Format F =
1868 Blob.size() > 0 && Blob.data()[0] == 0x78
1869 ? llvm::compression::Format::Zlib
1870 : llvm::compression::Format::Zstd;
1871 if (
const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1876 if (llvm::Error E = llvm::compression::decompress(
1877 F, llvm::arrayRefFromStringRef(Blob), Decompressed,
Record[0])) {
1878 Error(
"could not decompress embedded file contents: " +
1879 llvm::toString(std::move(E)));
1882 return llvm::MemoryBuffer::getMemBufferCopy(
1883 llvm::toStringRef(Decompressed), Name);
1885 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name,
true);
1887 Error(
"AST record has invalid code");
1892 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1896 Error(std::move(Err));
1903 ++NumSLocEntriesRead;
1906 Error(MaybeEntry.takeError());
1909 llvm::BitstreamEntry Entry = MaybeEntry.get();
1911 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1912 Error(
"incorrectly-formatted source location entry in AST file");
1919 SLocEntryCursor.readRecord(Entry.ID,
Record, &Blob);
1921 Error(MaybeSLOC.takeError());
1924 switch (MaybeSLOC.get()) {
1926 Error(
"incorrectly-formatted source location entry in AST file");
1932 unsigned InputID =
Record[4];
1933 InputFile IF = getInputFile(*F, InputID);
1946 IncludeLoc = getImportLocation(F);
1950 FileID FID = SourceMgr.createFileID(*
File, IncludeLoc, FileCharacter, ID,
1953 FileInfo.NumCreatedFIDs =
Record[5];
1957 unsigned NumFileDecls =
Record[7];
1958 if (NumFileDecls && ContextObj) {
1960 assert(F->
FileSortedDecls &&
"FILE_SORTED_DECLS not encountered yet ?");
1966 SourceMgr.getOrCreateContentCache(*
File, isSystem(FileCharacter));
1970 auto Buffer = ReadBuffer(SLocEntryCursor,
File->getName());
1973 SourceMgr.overrideFileContents(*
File, std::move(Buffer));
1980 const char *Name = Blob.data();
1981 unsigned Offset =
Record[0];
1986 IncludeLoc = getImportLocation(F);
1989 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
1992 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
1993 BaseOffset + Offset, IncludeLoc);
1995 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
1996 FileInfo.setHasLineDirectives();
2005 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2020 Error(
"source location entry ID out-of-range for AST file");
2025 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2043 assert(SourceMgr.getMainFileID().isValid() &&
"missing main file");
2044 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2054 uint64_t *StartOfBlockOffset) {
2055 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2058 if (StartOfBlockOffset)
2059 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2062 uint64_t Offset = Cursor.GetCurrentBitNo();
2065 return MaybeCode.takeError();
2066 unsigned Code = MaybeCode.get();
2069 if (Code != llvm::bitc::DEFINE_ABBREV) {
2070 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2072 return llvm::Error::success();
2074 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2087 if (
Tok.isAnnotation()) {
2089 switch (
Tok.getKind()) {
2090 case tok::annot_pragma_loop_hint: {
2094 unsigned NumTokens =
Record[Idx++];
2096 Toks.reserve(NumTokens);
2097 for (
unsigned I = 0; I < NumTokens; ++I)
2099 Info->Toks =
llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2100 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2103 case tok::annot_pragma_pack: {
2108 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2110 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2114 case tok::annot_pragma_openmp:
2115 case tok::annot_pragma_openmp_end:
2116 case tok::annot_pragma_unused:
2117 case tok::annot_pragma_openacc:
2118 case tok::annot_pragma_openacc_end:
2119 case tok::annot_repl_input_end:
2122 llvm_unreachable(
"missing deserialization code for annotation token");
2127 Tok.setIdentifierInfo(II);
2139 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2141 consumeError(std::move(Err));
2153 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2155 Stream.advanceSkippingSubblocks(Flags);
2157 Error(MaybeEntry.takeError());
2160 llvm::BitstreamEntry Entry = MaybeEntry.get();
2162 switch (Entry.Kind) {
2163 case llvm::BitstreamEntry::SubBlock:
2164 case llvm::BitstreamEntry::Error:
2165 Error(
"malformed block record in AST file");
2167 case llvm::BitstreamEntry::EndBlock:
2169 case llvm::BitstreamEntry::Record:
2180 Error(MaybeRecType.takeError());
2196 unsigned NextIndex = 1;
2198 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2203 PP.getPreprocessorAllocator());
2206 bool isC99VarArgs =
Record[NextIndex++];
2207 bool isGNUVarArgs =
Record[NextIndex++];
2208 bool hasCommaPasting =
Record[NextIndex++];
2209 MacroParams.clear();
2210 unsigned NumArgs =
Record[NextIndex++];
2211 for (
unsigned i = 0; i != NumArgs; ++i)
2226 if (NextIndex + 1 ==
Record.size() && PP.getPreprocessingRecord() &&
2232 PreprocessingRecord::PPEntityID PPID =
2233 PPRec.getPPEntityID(GlobalID - 1,
true);
2235 PPRec.getPreprocessedEntity(PPID));
2237 PPRec.RegisterMacroDefinition(
Macro, PPDef);
2248 if (MacroTokens.empty()) {
2249 Error(
"unexpected number of macro tokens for a macro in AST file");
2255 MacroTokens = MacroTokens.drop_front();
2264 unsigned LocalID)
const {
2266 ReadModuleOffsetMap(M);
2271 &&
"Invalid index into preprocessed entity index remap");
2273 return LocalID + I->second;
2277HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
2280 return FileMgr.getOptionalFileRef(Key.Filename);
2284 return FileMgr.getOptionalFileRef(*Resolved);
2288 uint8_t buf[
sizeof(ikey.
Size) +
sizeof(ikey.
ModTime)];
2291 return llvm::xxh3_64bits(buf);
2312 return FEA && FEA == FEB;
2315std::pair<unsigned, unsigned>
2322 using namespace llvm::support;
2325 ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2327 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2336 using namespace llvm::support;
2338 const unsigned char *End = d + DataLen;
2340 unsigned Flags = *d++;
2343 bool Included = (Flags >> 6) & 0x01;
2345 if ((FE = getFile(key)))
2348 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2351 HFI.
isImport |= (Flags >> 5) & 0x01;
2353 HFI.
DirInfo = (Flags >> 1) & 0x07;
2355 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2357 assert((End - d) % 4 == 0 &&
2358 "Wrong data length in HeaderFileInfo deserialization");
2360 uint32_t LocalSMID =
2361 endian::readNext<uint32_t, llvm::endianness::little>(d);
2367 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2368 Module *Mod = Reader.getSubmodule(GlobalSMID);
2370 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2372 if (FE || (FE = getFile(key))) {
2375 ModMap.
addHeader(Mod, H, HeaderRole,
true);
2387 uint32_t MacroDirectivesOffset) {
2388 assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
2389 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2396 for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
2397 BitstreamCursor &MacroCursor = I.MacroCursor;
2400 if (MacroCursor.getBitcodeBytes().empty())
2403 BitstreamCursor Cursor = MacroCursor;
2404 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2405 Error(std::move(Err));
2413 Error(MaybeE.takeError());
2416 llvm::BitstreamEntry E = MaybeE.get();
2419 case llvm::BitstreamEntry::SubBlock:
2420 case llvm::BitstreamEntry::Error:
2421 Error(
"malformed block record in AST file");
2423 case llvm::BitstreamEntry::EndBlock:
2426 case llvm::BitstreamEntry::Record: {
2430 Error(MaybeRecord.takeError());
2433 switch (MaybeRecord.get()) {
2460 class IdentifierLookupVisitor {
2463 unsigned PriorGeneration;
2464 unsigned &NumIdentifierLookups;
2465 unsigned &NumIdentifierLookupHits;
2469 IdentifierLookupVisitor(StringRef Name,
unsigned PriorGeneration,
2470 unsigned &NumIdentifierLookups,
2471 unsigned &NumIdentifierLookupHits)
2473 PriorGeneration(PriorGeneration),
2474 NumIdentifierLookups(NumIdentifierLookups),
2475 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2489 ++NumIdentifierLookups;
2490 ASTIdentifierLookupTable::iterator Pos =
2491 IdTable->find_hashed(Name, NameHash, &Trait);
2492 if (Pos == IdTable->end())
2498 ++NumIdentifierLookupHits;
2500 if (Trait.hasMoreInformationInDependencies()) {
2509 IdentifierInfo *getIdentifierInfo()
const {
return Found; }
2518 unsigned PriorGeneration = 0;
2520 PriorGeneration = IdentifierGeneration[&II];
2527 if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
2532 IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
2533 NumIdentifierLookups,
2534 NumIdentifierLookupHits);
2535 ModuleMgr.visit(Visitor, HitsPtr);
2551 const PendingMacroInfo &PMInfo) {
2556 if (llvm::Error Err =
2558 Error(std::move(Err));
2562 struct ModuleMacroRecord {
2575 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2577 Error(MaybeEntry.takeError());
2580 llvm::BitstreamEntry Entry = MaybeEntry.get();
2582 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2583 Error(
"malformed block record in AST file");
2590 Error(MaybePP.takeError());
2598 ModuleMacros.push_back(ModuleMacroRecord());
2599 auto &Info = ModuleMacros.back();
2602 for (
int I = 2, N =
Record.size(); I != N; ++I)
2608 Error(
"malformed block record in AST file");
2619 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2621 for (
auto &MMR : ModuleMacros) {
2623 for (
unsigned ModID : MMR.Overrides) {
2625 auto *
Macro = PP.getModuleMacro(Mod, II);
2626 assert(
Macro &&
"missing definition for overridden macro");
2627 Overrides.push_back(
Macro);
2630 bool Inserted =
false;
2632 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2643 unsigned Idx = 0, N =
Record.size();
2651 MD = PP.AllocateDefMacroDirective(MI, Loc);
2655 MD = PP.AllocateUndefMacroDirective(Loc);
2658 bool isPublic =
Record[Idx++];
2659 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2671 PP.setLoadedMacroDirective(II, Earliest, Latest);
2674bool ASTReader::shouldDisableValidationForFile(
2697static std::pair<StringRef, StringRef>
2699 const StringRef InputBlob) {
2700 uint16_t AsRequestedLength =
Record[7];
2701 return {InputBlob.substr(0, AsRequestedLength),
2702 InputBlob.substr(AsRequestedLength)};
2716 SavedStreamPosition SavedPosition(Cursor);
2720 consumeError(std::move(Err));
2723 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
2726 consumeError(MaybeCode.takeError());
2728 unsigned Code = MaybeCode.get();
2732 if (Expected<unsigned> Maybe =
Cursor.readRecord(Code,
Record, &Blob))
2734 "invalid record type for input file");
2737 consumeError(
Maybe.takeError());
2740 assert(
Record[0] == ID &&
"Bogus stored ID or offset");
2748 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2752 ? UnresolvedFilenameAsRequested
2753 : UnresolvedFilename;
2755 Expected<llvm::BitstreamEntry> MaybeEntry =
Cursor.advance();
2757 consumeError(MaybeEntry.takeError());
2758 llvm::BitstreamEntry Entry = MaybeEntry.get();
2759 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2760 "expected record type for input file hash");
2763 if (Expected<unsigned> Maybe =
Cursor.readRecord(Entry.ID,
Record))
2765 "invalid record type for input file hash");
2768 consumeError(
Maybe.takeError());
2793 SavedStreamPosition SavedPosition(Cursor);
2797 consumeError(std::move(Err));
2812 const HeaderSearchOptions &HSOpts =
2813 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2826 if ((Overridden || Transient || SkipChecks) && !
File)
2831 std::string ErrorStr =
"could not find file '";
2832 ErrorStr += *Filename;
2833 ErrorStr +=
"' referenced by AST file '";
2847 SourceManager &
SM = getSourceManager();
2849 if ((!Overridden && !Transient) && !SkipChecks &&
2850 SM.isFileOverridden(*
File)) {
2852 Error(diag::err_fe_pch_file_overridden, *Filename);
2864 enum ModificationKind {
2870 std::optional<int64_t> Old = std::nullopt;
2871 std::optional<int64_t>
New = std::nullopt;
2873 auto HasInputContentChanged = [&](Change OriginalChange) {
2874 assert(ValidateASTInputFilesContent &&
2875 "We should only check the content of the inputs with "
2876 "ValidateASTInputFilesContent enabled.");
2878 if (StoredContentHash == 0)
2879 return OriginalChange;
2882 if (!MemBuffOrError) {
2884 return OriginalChange;
2885 std::string ErrorStr =
"could not get buffer for file '";
2886 ErrorStr +=
File->getName();
2889 return OriginalChange;
2892 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2893 if (StoredContentHash ==
static_cast<uint64_t>(ContentHash))
2894 return Change{Change::None};
2896 return Change{Change::Content};
2898 auto HasInputFileChanged = [&]() {
2899 if (StoredSize !=
File->getSize())
2900 return Change{Change::Size, StoredSize,
File->getSize()};
2901 if (!shouldDisableValidationForFile(F) && StoredTime &&
2902 StoredTime !=
File->getModificationTime()) {
2903 Change MTimeChange = {Change::ModTime, StoredTime,
2904 File->getModificationTime()};
2908 if (ValidateASTInputFilesContent)
2909 return HasInputContentChanged(MTimeChange);
2913 return Change{Change::None};
2916 bool IsOutOfDate =
false;
2917 auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
2923 FileChange = HasInputContentChanged(FileChange);
2929 if (!StoredTime && ValidateASTInputFilesContent &&
2930 FileChange.Kind == Change::None)
2931 FileChange = HasInputContentChanged(FileChange);
2934 if (!Overridden && FileChange.Kind != Change::None) {
2937 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2938 while (!ImportStack.back()->ImportedBy.empty())
2939 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2942 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
2943 Diag(diag::err_fe_ast_file_modified)
2945 << TopLevelASTFileName << FileChange.Kind
2946 << (FileChange.Old && FileChange.New)
2947 << llvm::itostr(FileChange.Old.value_or(0))
2948 << llvm::itostr(FileChange.New.value_or(0));
2951 if (ImportStack.size() > 1) {
2952 Diag(diag::note_ast_file_required_by)
2953 << *Filename << ImportStack[0]->FileName;
2954 for (
unsigned I = 1; I < ImportStack.size(); ++I)
2955 Diag(diag::note_ast_file_required_by)
2956 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
2959 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
2974ASTReader::TemporarilyOwnedStringRef
2980ASTReader::TemporarilyOwnedStringRef
2983 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
2985 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
2986 Path ==
"<built-in>" || Path ==
"<command line>")
2990 llvm::sys::path::append(Buf, Prefix, Path);
2991 StringRef ResolvedPath{Buf.data(), Buf.size()};
2992 return {ResolvedPath, Buf};
3005 return ResolvedPath->str();
3020 llvm_unreachable(
"unknown ASTReadResult");
3024 BitstreamCursor &Stream, StringRef Filename,
3025 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3026 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3029 consumeError(std::move(Err));
3037 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3040 consumeError(MaybeEntry.takeError());
3043 llvm::BitstreamEntry Entry = MaybeEntry.get();
3045 switch (Entry.Kind) {
3046 case llvm::BitstreamEntry::Error:
3047 case llvm::BitstreamEntry::SubBlock:
3050 case llvm::BitstreamEntry::EndBlock:
3053 case llvm::BitstreamEntry::Record:
3060 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3061 if (!MaybeRecordType) {
3063 consumeError(MaybeRecordType.takeError());
3068 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3069 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3070 AllowCompatibleConfigurationMismatch))
3071 Result = ConfigurationMismatch;
3076 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3077 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3078 AllowCompatibleConfigurationMismatch))
3079 Result = ConfigurationMismatch;
3084 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3085 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3086 AllowCompatibleConfigurationMismatch))
3087 Result = ConfigurationMismatch;
3092 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3093 if (!AllowCompatibleConfigurationMismatch &&
3094 ParseFileSystemOptions(
Record, Complain, Listener))
3095 Result = ConfigurationMismatch;
3100 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3101 if (!AllowCompatibleConfigurationMismatch &&
3102 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3103 Result = ConfigurationMismatch;
3108 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3109 if (!AllowCompatibleConfigurationMismatch &&
3110 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3111 SuggestedPredefines))
3112 Result = ConfigurationMismatch;
3120 SmallVectorImpl<ImportedModule> &Loaded,
3122 unsigned ClientLoadCapabilities) {
3123 BitstreamCursor &Stream = F.
Stream;
3126 Error(std::move(Err));
3136 bool HasReadUnhashedControlBlock =
false;
3137 auto readUnhashedControlBlockOnce = [&]() {
3138 if (!HasReadUnhashedControlBlock) {
3139 HasReadUnhashedControlBlock =
true;
3140 if (ASTReadResult
Result =
3141 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3147 bool DisableValidation = shouldDisableValidationForFile(F);
3151 unsigned NumInputs = 0;
3152 unsigned NumUserInputs = 0;
3153 StringRef BaseDirectoryAsWritten;
3155 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3157 Error(MaybeEntry.takeError());
3160 llvm::BitstreamEntry Entry = MaybeEntry.get();
3162 switch (Entry.Kind) {
3163 case llvm::BitstreamEntry::Error:
3164 Error(
"malformed block record in AST file");
3166 case llvm::BitstreamEntry::EndBlock: {
3169 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3173 const HeaderSearchOptions &HSOpts =
3174 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3181 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3187 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3191 N = ForceValidateUserInputs ? NumUserInputs : 0;
3194 Diag(diag::remark_module_validation)
3197 for (
unsigned I = 0; I < N; ++I) {
3198 InputFile IF = getInputFile(F, I+1, Complain);
3210 for (
unsigned I = 0; I < N; ++I) {
3211 bool IsSystem = I >= NumUserInputs;
3213 auto FilenameAsRequested = ResolveImportedPath(
3216 *FilenameAsRequested, IsSystem, FI.
Overridden,
3224 case llvm::BitstreamEntry::SubBlock:
3228 if (llvm::Error Err = Stream.SkipBlock()) {
3229 Error(std::move(Err));
3233 Error(
"malformed block record in AST file");
3243 if (Listener && !ImportedBy) {
3249 bool AllowCompatibleConfigurationMismatch =
3253 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3254 AllowCompatibleConfigurationMismatch, *Listener,
3255 SuggestedPredefines);
3257 Error(
"malformed block record in AST file");
3261 if (DisableValidation ||
3262 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3270 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3271 Error(std::move(Err));
3277 if (llvm::Error Err = Stream.SkipBlock()) {
3278 Error(std::move(Err));
3284 case llvm::BitstreamEntry::Record:
3292 Expected<unsigned> MaybeRecordType =
3293 Stream.readRecord(Entry.ID,
Record, &Blob);
3294 if (!MaybeRecordType) {
3295 Error(MaybeRecordType.takeError());
3301 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3303 : diag::err_ast_file_version_too_new)
3308 bool hasErrors =
Record[7];
3309 if (hasErrors && !DisableValidation) {
3312 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3313 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3316 if (!AllowASTWithCompilerErrors) {
3317 Diag(diag::err_ast_file_with_compiler_errors)
3323 Diags.ErrorOccurred =
true;
3324 Diags.UncompilableErrorOccurred =
true;
3325 Diags.UnrecoverableErrorOccurred =
true;
3338 StringRef ASTBranch = Blob;
3339 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3340 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3341 Diag(diag::err_ast_file_different_branch)
3353 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3363 auto [ImportLoc, ImportModuleFileIndex] =
3364 ReadUntranslatedSourceLocation(
Record[Idx++]);
3366 assert(ImportModuleFileIndex == 0);
3368 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3370 bool IsImportingStdCXXModule =
Record[Idx++];
3372 off_t StoredSize = 0;
3373 time_t StoredModTime = 0;
3374 ASTFileSignature StoredSignature;
3375 std::string ImportedFile;
3376 std::string StoredFile;
3377 bool IgnoreImportedByNote =
false;
3386 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3387 ImportedName, !IsImportingStdCXXModule);
3389 if (IsImportingStdCXXModule && ImportedFile.empty()) {
3390 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3394 if (!IsImportingStdCXXModule) {
3395 StoredSize = (off_t)
Record[Idx++];
3396 StoredModTime = (time_t)
Record[Idx++];
3400 SignatureBytes.end());
3405 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3406 if (ImportedFile.empty()) {
3407 ImportedFile = StoredFile;
3408 }
else if (!getDiags().isIgnored(
3409 diag::warn_module_file_mapping_mismatch,
3410 CurrentImportLoc)) {
3411 auto ImportedFileRef =
3412 PP.getFileManager().getOptionalFileRef(ImportedFile);
3413 auto StoredFileRef =
3414 PP.getFileManager().getOptionalFileRef(StoredFile);
3415 if ((ImportedFileRef && StoredFileRef) &&
3416 (*ImportedFileRef != *StoredFileRef)) {
3417 Diag(diag::warn_module_file_mapping_mismatch)
3418 << ImportedFile << StoredFile;
3419 Diag(diag::note_module_file_imported_by)
3421 IgnoreImportedByNote =
true;
3428 unsigned Capabilities = ClientLoadCapabilities;
3429 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3430 Capabilities &= ~ARR_Missing;
3433 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3434 Loaded, StoredSize, StoredModTime,
3435 StoredSignature, Capabilities);
3440 if (IsImportingStdCXXModule) {
3441 if (
const auto *Imported =
3442 getModuleManager().lookupByFileName(ImportedFile);
3443 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3444 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3450 bool recompilingFinalized =
Result == OutOfDate &&
3451 (Capabilities & ARR_OutOfDate) &&
3454 .getInMemoryModuleCache()
3456 if (!IgnoreImportedByNote &&
3458 Diag(diag::note_module_file_imported_by)
3462 case Failure:
return Failure;
3465 case OutOfDate:
return OutOfDate;
3467 case ConfigurationMismatch:
return ConfigurationMismatch;
3468 case HadErrors:
return HadErrors;
3487 Diag(diag::remark_module_import)
3489 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3495 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3503 BaseDirectoryAsWritten = Blob;
3505 "MODULE_DIRECTORY found before MODULE_NAME");
3507 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3511 Module *M = PP.getHeaderSearchInfo().lookupModule(
3518 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3521 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3522 if (!BuildDir || *BuildDir != M->
Directory) {
3523 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3524 Diag(diag::err_imported_module_relocated)
3535 if (ASTReadResult
Result =
3536 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3542 NumUserInputs =
Record[1];
3544 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3553llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3554 unsigned ClientLoadCapabilities) {
3555 BitstreamCursor &Stream = F.
Stream;
3557 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3564 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3566 return MaybeEntry.takeError();
3567 llvm::BitstreamEntry Entry = MaybeEntry.get();
3569 switch (Entry.Kind) {
3570 case llvm::BitstreamEntry::Error:
3571 return llvm::createStringError(
3572 std::errc::illegal_byte_sequence,
3573 "error at end of module block in AST file");
3574 case llvm::BitstreamEntry::EndBlock:
3580 if (ASTContext *Ctx = ContextObj) {
3581 DeclContext *DC = Ctx->getTranslationUnitDecl();
3586 return llvm::Error::success();
3587 case llvm::BitstreamEntry::SubBlock:
3595 if (llvm::Error Err = Stream.SkipBlock())
3597 if (llvm::Error Err = ReadBlockAbbrevs(
3604 if (!PP.getExternalSource())
3605 PP.setExternalSource(
this);
3607 if (llvm::Error Err = Stream.SkipBlock())
3609 if (llvm::Error Err =
3618 if (llvm::Error Err = Stream.SkipBlock()) {
3627 if (!PP.getPreprocessingRecord())
3628 PP.createPreprocessingRecord();
3629 if (!PP.getPreprocessingRecord()->getExternalSource())
3630 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3634 if (llvm::Error Err = ReadSourceManagerBlock(F))
3639 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3644 BitstreamCursor
C = Stream;
3646 if (llvm::Error Err = Stream.SkipBlock())
3650 CommentsCursors.push_back(std::make_pair(
C, &F));
3655 if (llvm::Error Err = Stream.SkipBlock())
3661 case llvm::BitstreamEntry::Record:
3669 Expected<unsigned> MaybeRecordType =
3670 Stream.readRecord(Entry.ID,
Record, &Blob);
3671 if (!MaybeRecordType)
3672 return MaybeRecordType.takeError();
3677 switch (RecordType) {
3698 switch (RecordType) {
3704 return llvm::createStringError(
3705 std::errc::illegal_byte_sequence,
3706 "duplicate TYPE_OFFSET record in AST file");
3719 return llvm::createStringError(
3720 std::errc::illegal_byte_sequence,
3721 "duplicate DECL_OFFSET record in AST file");
3733 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3734 LexicalContents Contents(
3736 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3737 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3744 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3745 auto *
Data = (
const unsigned char*)Blob.data();
3746 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3749 if (Decl *D = GetExistingDecl(ID))
3750 PendingUpdateRecords.push_back(
3751 PendingUpdateRecord(ID, D,
false));
3757 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3758 auto *
Data = (
const unsigned char *)Blob.data();
3759 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3762 if (Decl *D = GetExistingDecl(ID))
3763 PendingUpdateRecords.push_back(
3764 PendingUpdateRecord(ID, D,
false));
3772 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3773 auto *
Data = (
const unsigned char *)Blob.data();
3774 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3777 if (Decl *D = GetExistingDecl(ID))
3778 PendingUpdateRecords.push_back(
3779 PendingUpdateRecord(ID, D,
false));
3785 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3786 auto *
Data = (
const unsigned char *)Blob.data();
3787 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3790 if (Decl *D = GetExistingDecl(ID))
3791 PendingUpdateRecords.push_back(
3792 PendingUpdateRecord(ID, D,
false));
3798 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3799 auto *
Data = (
const unsigned char *)Blob.data();
3800 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3803 if (Decl *D = GetExistingDecl(ID))
3804 PendingUpdateRecords.push_back(
3805 PendingUpdateRecord(ID, D,
false));
3811 reinterpret_cast<const unsigned char *
>(Blob.data());
3817 ASTIdentifierLookupTrait(*
this, F));
3819 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
3825 return llvm::createStringError(
3826 std::errc::illegal_byte_sequence,
3827 "duplicate IDENTIFIER_OFFSET record in AST file");
3833 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3845 for (
unsigned I = 0, N =
Record.size(); I != N; )
3846 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3853 getContext().getLangOpts().BuildingPCHWithObjectFile)
3854 for (
unsigned I = 0, N =
Record.size(); I != N; )
3855 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3859 if (SpecialTypes.empty()) {
3860 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
3861 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
3868 if (SpecialTypes.size() !=
Record.size())
3869 return llvm::createStringError(std::errc::illegal_byte_sequence,
3870 "invalid special-types record");
3872 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
3874 if (!SpecialTypes[I])
3875 SpecialTypes[I] =
ID;
3882 TotalNumStatements +=
Record[0];
3883 TotalNumMacros +=
Record[1];
3884 TotalLexicalDeclContexts +=
Record[2];
3885 TotalVisibleDeclContexts +=
Record[3];
3886 TotalModuleLocalVisibleDeclContexts +=
Record[4];
3887 TotalTULocalVisibleDeclContexts +=
Record[5];
3891 for (
unsigned I = 0, N =
Record.size(); I != N; )
3892 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
3896 for (
unsigned I = 0, N =
Record.size(); I != N; )
3897 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
3901 if (
Record.size() % 3 != 0)
3902 return llvm::createStringError(std::errc::illegal_byte_sequence,
3903 "invalid weak identifiers record");
3907 WeakUndeclaredIdentifiers.clear();
3910 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
3911 WeakUndeclaredIdentifiers.push_back(
3912 getGlobalIdentifierID(F,
Record[I++]));
3913 WeakUndeclaredIdentifiers.push_back(
3914 getGlobalIdentifierID(F,
Record[I++]));
3915 WeakUndeclaredIdentifiers.push_back(
3916 ReadSourceLocation(F,
Record, I).getRawEncoding());
3923 unsigned LocalBaseSelectorID =
Record[1];
3929 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3934 std::make_pair(LocalBaseSelectorID,
3946 = ASTSelectorLookupTable::Create(
3949 ASTSelectorLookupTrait(*
this, F));
3950 TotalNumMethodPoolEntries +=
Record[1];
3955 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
3956 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3958 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
3967 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
3968 ReadSourceLocation(F,
Record, Idx));
3974 SmallVector<SourceLocation, 64> SrcLocs;
3976 while (Idx <
Record.size())
3977 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
3978 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
3985 unsigned Idx = 0, End =
Record.size() - 1;
3986 bool ReachedEOFWhileSkipping =
Record[Idx++];
3987 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
3988 if (ReachedEOFWhileSkipping) {
3989 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
3990 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
3991 bool FoundNonSkipPortion =
Record[Idx++];
3992 bool FoundElse =
Record[Idx++];
3993 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
3994 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
3995 FoundElse, ElseLoc);
3997 SmallVector<PPConditionalInfo, 4> ConditionalStack;
3999 auto Loc = ReadSourceLocation(F,
Record, Idx);
4000 bool WasSkipping =
Record[Idx++];
4001 bool FoundNonSkip =
Record[Idx++];
4002 bool FoundElse =
Record[Idx++];
4003 ConditionalStack.push_back(
4004 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4006 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4011 if (!
Record.empty() && Listener)
4029 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4030 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4031 return llvm::createStringError(std::errc::invalid_argument,
4032 "ran out of source locations");
4037 unsigned RangeStart =
4039 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4044 GlobalSLocOffsetMap.insert(
4046 - SLocSpaceSize,&F));
4057 ParseLineTable(F,
Record);
4061 for (
unsigned I = 0, N =
Record.size(); I != N; )
4062 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4066 if (
Record.size() % 3 != 0)
4067 return llvm::createStringError(std::errc::illegal_byte_sequence,
4068 "Invalid VTABLE_USES record");
4075 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4076 VTableUses.push_back(
4077 {ReadDeclID(F,
Record, Idx),
4078 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4085 if (
Record.size() % 2 != 0)
4086 return llvm::createStringError(
4087 std::errc::illegal_byte_sequence,
4088 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4090 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4091 PendingInstantiations.push_back(
4092 {ReadDeclID(F,
Record, I),
4093 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4099 return llvm::createStringError(std::errc::illegal_byte_sequence,
4100 "Invalid SEMA_DECL_REFS block");
4101 for (
unsigned I = 0, N =
Record.size(); I != N; )
4102 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4110 unsigned LocalBasePreprocessedEntityID =
Record[0];
4112 unsigned StartingID;
4113 if (!PP.getPreprocessingRecord())
4114 PP.createPreprocessingRecord();
4115 if (!PP.getPreprocessingRecord()->getExternalSource())
4116 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4118 = PP.getPreprocessingRecord()
4125 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4130 std::make_pair(LocalBasePreprocessedEntityID,
4142 if (!PP.getPreprocessingRecord())
4143 PP.createPreprocessingRecord();
4144 if (!PP.getPreprocessingRecord()->getExternalSource())
4145 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4150 GlobalSkippedRangeMap.insert(
4156 if (
Record.size() % 2 != 0)
4157 return llvm::createStringError(
4158 std::errc::illegal_byte_sequence,
4159 "invalid DECL_UPDATE_OFFSETS block in AST file");
4160 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4161 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4162 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4166 if (Decl *D = GetExistingDecl(ID))
4167 PendingUpdateRecords.push_back(
4168 PendingUpdateRecord(ID, D,
false));
4173 if (
Record.size() % 5 != 0)
4174 return llvm::createStringError(
4175 std::errc::illegal_byte_sequence,
4176 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4178 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4179 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4182 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4185 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4188 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4191 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4194 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4196 DelayedNamespaceOffsetMap[
ID] = {
4197 {VisibleOffset, TULocalOffset, ModuleLocalOffset}, LexicalOffset};
4199 assert(!GetExistingDecl(ID) &&
4200 "We shouldn't load the namespace in the front of delayed "
4201 "namespace lexical and visible block");
4207 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4208 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4209 auto &RelatedDecls = RelatedDeclsMap[
ID];
4210 unsigned NN =
Record[I++];
4211 RelatedDecls.reserve(NN);
4212 for (
unsigned II = 0; II < NN; II++)
4213 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4219 return llvm::createStringError(
4220 std::errc::illegal_byte_sequence,
4221 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4234 CUDASpecialDeclRefs.clear();
4235 for (
unsigned I = 0, N =
Record.size(); I != N; )
4236 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4246 HeaderFileInfoTrait(*
this, F));
4248 PP.getHeaderSearchInfo().SetExternalSource(
this);
4249 if (!PP.getHeaderSearchInfo().getExternalLookup())
4250 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4256 FPPragmaOptions.swap(
Record);
4260 for (
unsigned I = 0, N =
Record.size(); I != N; )
4261 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4265 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4266 auto Name = ReadString(
Record, I);
4267 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4268 OptInfo.Supported =
Record[I++] != 0;
4269 OptInfo.Enabled =
Record[I++] != 0;
4270 OptInfo.WithPragma =
Record[I++] != 0;
4271 OptInfo.Avail =
Record[I++];
4272 OptInfo.Core =
Record[I++];
4273 OptInfo.Opt =
Record[I++];
4278 for (
unsigned I = 0, N =
Record.size(); I != N; )
4279 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4283 for (
unsigned I = 0, N =
Record.size(); I != N; )
4284 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4288 if (
Record.size() % 2 != 0)
4289 return llvm::createStringError(std::errc::illegal_byte_sequence,
4290 "invalid undefined-but-used record");
4291 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4292 UndefinedButUsed.push_back(
4293 {ReadDeclID(F,
Record, I),
4294 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4299 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4300 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4302 DelayedDeleteExprs.push_back(Count);
4303 for (uint64_t
C = 0;
C < Count; ++
C) {
4304 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4305 bool IsArrayForm =
Record[I++] == 1;
4306 DelayedDeleteExprs.push_back(IsArrayForm);
4313 getContext().getLangOpts().BuildingPCHWithObjectFile)
4314 for (
unsigned I = 0, N =
Record.size(); I != N;)
4315 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4323 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4324 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4325 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4327 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4328 if (DeserializationListener)
4329 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4337 return llvm::createStringError(
4338 std::errc::illegal_byte_sequence,
4339 "duplicate MACRO_OFFSET record in AST file");
4342 unsigned LocalBaseMacroID =
Record[1];
4348 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
4352 std::make_pair(LocalBaseMacroID,
4361 LateParsedTemplates.emplace_back(
4362 std::piecewise_construct, std::forward_as_tuple(&F),
4368 return llvm::createStringError(std::errc::illegal_byte_sequence,
4369 "invalid pragma optimize record");
4370 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4375 return llvm::createStringError(std::errc::illegal_byte_sequence,
4376 "invalid pragma ms_struct record");
4377 PragmaMSStructState =
Record[0];
4382 return llvm::createStringError(
4383 std::errc::illegal_byte_sequence,
4384 "invalid pragma pointers to members record");
4385 PragmaMSPointersToMembersState =
Record[0];
4386 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4390 for (
unsigned I = 0, N =
Record.size(); I != N; )
4391 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4396 return llvm::createStringError(std::errc::illegal_byte_sequence,
4397 "invalid cuda pragma options record");
4398 ForceHostDeviceDepth =
Record[0];
4403 return llvm::createStringError(std::errc::illegal_byte_sequence,
4404 "invalid pragma pack record");
4405 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4406 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4407 unsigned NumStackEntries =
Record[2];
4410 PragmaAlignPackStack.clear();
4411 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4412 PragmaAlignPackStackEntry Entry;
4413 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4414 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4415 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4416 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4417 Entry.SlotLabel = PragmaAlignPackStrings.back();
4418 PragmaAlignPackStack.push_back(Entry);
4425 return llvm::createStringError(std::errc::illegal_byte_sequence,
4426 "invalid pragma float control record");
4428 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4429 unsigned NumStackEntries =
Record[2];
4432 FpPragmaStack.clear();
4433 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4434 FpPragmaStackEntry Entry;
4436 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4437 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4438 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4439 Entry.SlotLabel = FpPragmaStrings.back();
4440 FpPragmaStack.push_back(Entry);
4446 for (
unsigned I = 0, N =
Record.size(); I != N; )
4447 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4453void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4468 assert(ImportedModuleVector.empty());
4470 while (
Data < DataEnd) {
4474 using namespace llvm::support;
4476 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4477 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4478 StringRef Name = StringRef((
const char*)
Data, Len);
4482 ? ModuleMgr.lookupByModuleName(Name)
4483 : ModuleMgr.lookupByFileName(Name));
4485 std::string Msg =
"refers to unknown module, cannot find ";
4486 Msg.append(std::string(Name));
4491 ImportedModuleVector.push_back(OM);
4494 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4495 uint32_t PreprocessedEntityIDOffset =
4496 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4498 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4500 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4503 RemapBuilder &Remap) {
4504 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4506 Remap.insert(std::make_pair(Offset,
4507 static_cast<int>(BaseOffset - Offset)));
4510 mapOffset(MacroIDOffset, OM->
BaseMacroID, MacroRemap);
4512 PreprocessedEntityRemap);
4521 unsigned ClientLoadCapabilities) {
4530 "MODULE_NAME should come before MODULE_MAP_FILE");
4531 if (PP.getPreprocessorOpts().ModulesCheckRelocated &&
4537 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4539 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4541 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
4544 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4545 if (
auto ASTFE = M ? M->
getASTFile() : std::nullopt) {
4548 << ASTFE->getName();
4552 Diag(diag::err_imported_module_not_found)
4559 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4560 Diag(diag::note_imported_by_pch_module_not_found)
4567 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4571 if (!StoredModMap || *StoredModMap != ModMap) {
4572 assert(ModMap &&
"found module is missing module map file");
4574 "top-level import should be verified");
4576 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4577 Diag(diag::err_imported_module_modmap_changed)
4584 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4586 std::string Filename = ReadPath(F,
Record, Idx);
4589 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4590 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4593 AdditionalStoredMaps.insert(*SF);
4598 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4599 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4602 if (!AdditionalStoredMaps.erase(ModMap)) {
4603 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4604 Diag(diag::err_module_different_modmap)
4613 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4614 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4615 Diag(diag::err_module_different_modmap)
4629 SemaObjC::GlobalMethodPool::iterator Known =
4635 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4636 : Known->second.second;
4640 if (List->getMethod() == Method) {
4648 if (List->getNext())
4649 List->setMethod(List->getNext()->getMethod());
4651 List->setMethod(Method);
4657 for (
Decl *D : Names) {
4661 if (wasHidden && SemaObj) {
4674 Stack.push_back(Mod);
4675 while (!Stack.empty()) {
4676 Mod = Stack.pop_back_val();
4678 if (NameVisibility <= Mod->NameVisibility) {
4694 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4695 if (Hidden != HiddenNamesMap.end()) {
4696 auto HiddenNames = std::move(*Hidden);
4697 HiddenNamesMap.erase(Hidden);
4699 assert(!HiddenNamesMap.contains(Mod) &&
4700 "making names visible added hidden names");
4707 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4709 if (Visited.insert(Exported).second)
4710 Stack.push_back(Exported);
4728 PendingMergedDefinitionsToDeduplicate.insert(Def);
4737 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4738 !PP.getLangOpts().Modules)
4742 TriedLoadingGlobalIndex =
true;
4743 StringRef ModuleCachePath
4745 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4747 if (llvm::Error Err = std::move(
Result.second)) {
4749 consumeError(std::move(Err));
4753 GlobalIndex.reset(
Result.first);
4754 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4759 return PP.getLangOpts().Modules && UseGlobalIndex &&
4771 consumeError(MaybeEntry.takeError());
4774 llvm::BitstreamEntry Entry = MaybeEntry.get();
4776 switch (Entry.Kind) {
4777 case llvm::BitstreamEntry::Error:
4778 case llvm::BitstreamEntry::EndBlock:
4781 case llvm::BitstreamEntry::Record:
4787 consumeError(Skipped.takeError());
4791 case llvm::BitstreamEntry::SubBlock:
4792 if (Entry.ID == BlockID) {
4793 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4795 consumeError(std::move(Err));
4802 if (llvm::Error Err = Cursor.SkipBlock()) {
4804 consumeError(std::move(Err));
4813 unsigned ClientLoadCapabilities,
4815 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
4819 CurrentDeserializingModuleKind,
Type);
4825 unsigned PreviousGeneration = 0;
4829 unsigned NumModules = ModuleMgr.size();
4834 ClientLoadCapabilities)) {
4835 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4839 GlobalIndex.reset();
4840 ModuleMgr.setGlobalIndex(
nullptr);
4844 if (NewLoadedModuleFile && !Loaded.empty())
4845 *NewLoadedModuleFile = Loaded.back().Mod;
4856 for (ImportedModule &M : Loaded) {
4858 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
4861 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4862 Error(std::move(Err));
4868 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
4874 if (llvm::Error Err = ReadExtensionBlock(F)) {
4875 Error(std::move(Err));
4888 for (ImportedModule &M : Loaded) {
4904 if (!PP.getLangOpts().CPlusPlus) {
4911 auto It = PP.getIdentifierTable().find(Key);
4912 if (It == PP.getIdentifierTable().end())
4921 II = &PP.getIdentifierTable().getOwn(Key);
4939 for (
auto &Id : PP.getIdentifierTable())
4940 Id.second->setOutOfDate(
true);
4943 for (
const auto &Sel : SelectorGeneration)
4944 SelectorOutOfDate[Sel.first] =
true;
4948 for (ImportedModule &M : Loaded) {
4951 ModuleMgr.moduleFileAccepted(&F);
4964 for (
unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4965 UnresolvedModuleRef &
Unresolved = UnresolvedModuleRefs[I];
4970 case UnresolvedModuleRef::Conflict:
4973 Conflict.
Other = ResolvedMod;
4975 Unresolved.Mod->Conflicts.push_back(Conflict);
4979 case UnresolvedModuleRef::Import:
4984 case UnresolvedModuleRef::Affecting:
4986 Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
4989 case UnresolvedModuleRef::Export:
4996 UnresolvedModuleRefs.clear();
5008 if (DeserializationListener)
5009 DeserializationListener->ReaderInitialized(
this);
5011 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5026 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5027 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5028 ObjCClassesLoaded[I], PreviousGeneration);
5033 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5038 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5039 ImportedModule &M = Loaded[I];
5057 if (!Stream.canSkipToPos(4))
5058 return llvm::createStringError(
5059 std::errc::illegal_byte_sequence,
5060 "file too small to contain precompiled file magic");
5061 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5064 return llvm::createStringError(
5065 std::errc::illegal_byte_sequence,
5066 "file doesn't start with precompiled file magic");
5068 return Res.takeError();
5069 return llvm::Error::success();
5084 llvm_unreachable(
"unknown module kind");
5088ASTReader::ReadASTCore(StringRef
FileName,
5090 SourceLocation ImportLoc,
5092 SmallVectorImpl<ImportedModule> &Loaded,
5093 off_t ExpectedSize, time_t ExpectedModTime,
5094 ASTFileSignature ExpectedSignature,
5095 unsigned ClientLoadCapabilities) {
5097 std::string ErrorStr;
5099 = ModuleMgr.addModule(
FileName,
Type, ImportLoc, ImportedBy,
5100 getGeneration(), ExpectedSize, ExpectedModTime,
5104 switch (AddResult) {
5106 Diag(diag::remark_module_import)
5108 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5118 if (ClientLoadCapabilities & ARR_Missing)
5122 Diag(diag::err_ast_file_not_found)
5130 if (ClientLoadCapabilities & ARR_OutOfDate)
5134 Diag(diag::err_ast_file_out_of_date)
5140 assert(M &&
"Missing module file");
5142 bool ShouldFinalizePCM =
false;
5143 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
5144 auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
5145 if (ShouldFinalizePCM)
5151 BitstreamCursor &Stream = F.Stream;
5152 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5153 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5157 Diag(diag::err_ast_file_invalid)
5163 bool HaveReadControlBlock =
false;
5165 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5167 Error(MaybeEntry.takeError());
5170 llvm::BitstreamEntry Entry = MaybeEntry.get();
5172 switch (Entry.Kind) {
5173 case llvm::BitstreamEntry::Error:
5174 case llvm::BitstreamEntry::Record:
5175 case llvm::BitstreamEntry::EndBlock:
5176 Error(
"invalid record at top-level of AST file");
5179 case llvm::BitstreamEntry::SubBlock:
5185 HaveReadControlBlock =
true;
5186 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5194 F.ModuleName.empty()) {
5196 if (
Result != OutOfDate ||
5197 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
5203 case Failure:
return Failure;
5204 case Missing:
return Missing;
5205 case OutOfDate:
return OutOfDate;
5207 case ConfigurationMismatch:
return ConfigurationMismatch;
5208 case HadErrors:
return HadErrors;
5213 if (!HaveReadControlBlock) {
5214 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
5215 Diag(diag::err_ast_file_version_too_old)
5221 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
5222 ShouldFinalizePCM =
true;
5226 if (llvm::Error Err = Stream.SkipBlock()) {
5227 Error(std::move(Err));
5234 llvm_unreachable(
"unexpected break; expected return");
5238ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5239 unsigned ClientLoadCapabilities) {
5240 const HeaderSearchOptions &HSOpts =
5241 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5242 bool AllowCompatibleConfigurationMismatch =
5244 bool DisableValidation = shouldDisableValidationForFile(F);
5246 ASTReadResult
Result = readUnhashedControlBlockImpl(
5248 AllowCompatibleConfigurationMismatch, Listener.get(),
5253 if (DisableValidation || WasImportedBy ||
5254 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5258 Error(
"malformed block record in AST file");
5281 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5283 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5292 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5293 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5294 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5296 BitstreamCursor Stream(StreamData);
5301 consumeError(std::move(Err));
5313 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5316 consumeError(MaybeEntry.takeError());
5319 llvm::BitstreamEntry Entry = MaybeEntry.get();
5321 switch (Entry.Kind) {
5322 case llvm::BitstreamEntry::Error:
5323 case llvm::BitstreamEntry::SubBlock:
5326 case llvm::BitstreamEntry::EndBlock:
5329 case llvm::BitstreamEntry::Record:
5337 Expected<unsigned> MaybeRecordType =
5338 Stream.readRecord(Entry.ID,
Record, &Blob);
5339 if (!MaybeRecordType) {
5348 "Dummy AST file signature not backpatched in ASTWriter.");
5355 "Dummy AST block hash not backpatched in ASTWriter.");
5359 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5360 if (Listener && ValidateDiagnosticOptions &&
5361 !AllowCompatibleConfigurationMismatch &&
5362 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5367 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5368 if (Listener && !AllowCompatibleConfigurationMismatch &&
5369 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5370 Result = ConfigurationMismatch;
5399 if (
Record.size() < 4)
return true;
5404 unsigned BlockNameLen =
Record[2];
5405 unsigned UserInfoLen =
Record[3];
5407 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5409 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5410 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5411 Blob.data() + BlockNameLen + UserInfoLen);
5415llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5416 BitstreamCursor &Stream = F.
Stream;
5420 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5422 return MaybeEntry.takeError();
5423 llvm::BitstreamEntry Entry = MaybeEntry.get();
5425 switch (Entry.Kind) {
5426 case llvm::BitstreamEntry::SubBlock:
5427 if (llvm::Error Err = Stream.SkipBlock())
5430 case llvm::BitstreamEntry::EndBlock:
5431 return llvm::Error::success();
5432 case llvm::BitstreamEntry::Error:
5433 return llvm::createStringError(std::errc::illegal_byte_sequence,
5434 "malformed block record in AST file");
5435 case llvm::BitstreamEntry::Record:
5441 Expected<unsigned> MaybeRecCode =
5442 Stream.readRecord(Entry.ID,
Record, &Blob);
5444 return MaybeRecCode.takeError();
5445 switch (MaybeRecCode.get()) {
5447 ModuleFileExtensionMetadata Metadata;
5449 return llvm::createStringError(
5450 std::errc::illegal_byte_sequence,
5451 "malformed EXTENSION_METADATA in AST file");
5454 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5455 if (Known == ModuleFileExtensions.end())
break;
5458 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5468 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5472 assert(ContextObj &&
"no context to initialize");
5476 if (DeserializationListener)
5477 DeserializationListener->DeclRead(
5479 Context.getTranslationUnitDecl());
5487 if (!Context.CFConstantStringTypeDecl)
5488 Context.setCFConstantStringType(
GetType(String));
5493 if (FileType.isNull()) {
5494 Error(
"FILE type is NULL");
5498 if (!Context.FILEDecl) {
5500 Context.setFILEDecl(
Typedef->getDecl());
5502 const TagType *Tag = FileType->getAs<TagType>();
5504 Error(
"Invalid FILE type in AST file");
5507 Context.setFILEDecl(Tag->getDecl());
5514 if (Jmp_bufType.
isNull()) {
5515 Error(
"jmp_buf type is NULL");
5519 if (!Context.jmp_bufDecl) {
5521 Context.setjmp_bufDecl(
Typedef->getDecl());
5523 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5525 Error(
"Invalid jmp_buf type in AST file");
5528 Context.setjmp_bufDecl(Tag->getDecl());
5535 if (Sigjmp_bufType.
isNull()) {
5536 Error(
"sigjmp_buf type is NULL");
5540 if (!Context.sigjmp_bufDecl) {
5542 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5544 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5545 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5546 Context.setsigjmp_bufDecl(Tag->getDecl());
5552 if (Context.ObjCIdRedefinitionType.isNull())
5553 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5556 if (
TypeID ObjCClassRedef =
5558 if (Context.ObjCClassRedefinitionType.isNull())
5559 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5562 if (
TypeID ObjCSelRedef =
5564 if (Context.ObjCSelRedefinitionType.isNull())
5565 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5570 if (Ucontext_tType.
isNull()) {
5571 Error(
"ucontext_t type is NULL");
5575 if (!Context.ucontext_tDecl) {
5577 Context.setucontext_tDecl(
Typedef->getDecl());
5579 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5580 assert(Tag &&
"Invalid ucontext_t type in AST file");
5581 Context.setucontext_tDecl(Tag->getDecl());
5590 if (!CUDASpecialDeclRefs.empty()) {
5591 assert(CUDASpecialDeclRefs.size() == 1 &&
"More decl refs than expected!");
5592 Context.setcudaConfigureCallDecl(
5598 for (
auto &Import : PendingImportedModules) {
5602 if (Import.ImportLoc.isValid())
5603 PP.makeModuleVisible(Imported, Import.ImportLoc);
5610 PendingImportedModulesSema.append(PendingImportedModules);
5611 PendingImportedModules.clear();
5621 BitstreamCursor Stream(
PCH);
5624 consumeError(std::move(Err));
5636 Stream.advanceSkippingSubblocks();
5639 consumeError(MaybeEntry.takeError());
5642 llvm::BitstreamEntry Entry = MaybeEntry.get();
5644 if (Entry.Kind != llvm::BitstreamEntry::Record)
5652 consumeError(MaybeRecord.takeError());
5658 "Dummy AST file signature not backpatched in ASTWriter.");
5668 const std::string &ASTFileName,
FileManager &FileMgr,
5671 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5676 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5677 << ASTFileName << Buffer.getError().message();
5678 return std::string();
5682 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5686 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5687 return std::string();
5692 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5693 return std::string();
5700 Stream.advanceSkippingSubblocks();
5703 consumeError(MaybeEntry.takeError());
5704 return std::string();
5706 llvm::BitstreamEntry Entry = MaybeEntry.get();
5708 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5709 return std::string();
5711 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5712 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5713 return std::string();
5721 consumeError(MaybeRecord.takeError());
5722 return std::string();
5736 std::string ExistingModuleCachePath;
5738 bool StrictOptionMatches;
5741 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5746 bool StrictOptionMatches)
5747 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5748 ExistingTargetOpts(ExistingTargetOpts),
5749 ExistingPPOpts(ExistingPPOpts),
5750 ExistingModuleCachePath(ExistingModuleCachePath),
FileMgr(
FileMgr),
5751 StrictOptionMatches(StrictOptionMatches) {}
5753 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5754 StringRef ModuleFilename,
bool Complain,
5755 bool AllowCompatibleDifferences)
override {
5757 nullptr, AllowCompatibleDifferences);
5760 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5761 StringRef ModuleFilename,
bool Complain,
5762 bool AllowCompatibleDifferences)
override {
5764 nullptr, AllowCompatibleDifferences);
5767 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5768 StringRef ModuleFilename,
bool Complain,
5769 bool AllowCompatibleDifferences)
override {
5771 nullptr, AllowCompatibleDifferences);
5774 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5775 StringRef ModuleFilename,
5776 StringRef SpecificModuleCachePath,
5777 bool Complain)
override {
5779 SpecificModuleCachePath,
5780 ExistingModuleCachePath, ModuleFilename,
5781 nullptr, ExistingLangOpts, ExistingPPOpts);
5784 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5785 StringRef ModuleFilename,
bool ReadMacros,
5787 std::string &SuggestedPredefines)
override {
5789 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5790 FileMgr, SuggestedPredefines, ExistingLangOpts,
5802 unsigned ClientLoadCapabilities) {
5804 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5805 llvm::MemoryBuffer *Buffer =
5815 Filename ==
"-" ? FileMgr.getSTDIN() : FileMgr.getFileRef(Filename);
5817 llvm::consumeError(Entry.takeError());
5820 auto BufferOrErr = FileMgr.getBufferForFile(*Entry);
5823 OwnedBuffer = std::move(*BufferOrErr);
5824 Buffer = OwnedBuffer.get();
5828 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
5829 BitstreamCursor Stream(Bytes);
5833 consumeError(std::move(Err));
5841 bool NeedsInputFiles = Listener.needsInputFileVisitation();
5842 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5843 bool NeedsImports = Listener.needsImportVisitation();
5844 BitstreamCursor InputFilesCursor;
5845 uint64_t InputFilesOffsetBase = 0;
5848 std::string ModuleDir;
5849 bool DoneWithControlBlock =
false;
5851 PathBuf.reserve(256);
5856 AdditionalPathBuf.reserve(256);
5857 while (!DoneWithControlBlock) {
5861 consumeError(MaybeEntry.takeError());
5864 llvm::BitstreamEntry Entry = MaybeEntry.get();
5866 switch (Entry.Kind) {
5867 case llvm::BitstreamEntry::SubBlock: {
5870 std::string IgnoredSuggestedPredefines;
5871 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
5873 Listener, IgnoredSuggestedPredefines) !=
Success)
5879 InputFilesCursor = Stream;
5880 if (llvm::Error Err = Stream.SkipBlock()) {
5882 consumeError(std::move(Err));
5885 if (NeedsInputFiles &&
5888 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
5892 if (llvm::Error Err = Stream.SkipBlock()) {
5894 consumeError(std::move(Err));
5903 case llvm::BitstreamEntry::EndBlock:
5904 DoneWithControlBlock =
true;
5907 case llvm::BitstreamEntry::Error:
5910 case llvm::BitstreamEntry::Record:
5914 if (DoneWithControlBlock)
break;
5919 Stream.readRecord(Entry.ID,
Record, &Blob);
5920 if (!MaybeRecCode) {
5928 if (Listener.ReadFullVersionInformation(Blob))
5932 Listener.ReadModuleName(Blob);
5935 ModuleDir = std::string(Blob);
5941 Listener.ReadModuleMapFile(*Path);
5945 if (!NeedsInputFiles)
5948 unsigned NumInputFiles =
Record[0];
5949 unsigned NumUserFiles =
Record[1];
5950 const llvm::support::unaligned_uint64_t *InputFileOffs =
5951 (
const llvm::support::unaligned_uint64_t *)Blob.data();
5952 for (
unsigned I = 0; I != NumInputFiles; ++I) {
5954 bool isSystemFile = I >= NumUserFiles;
5956 if (isSystemFile && !NeedsSystemInputFiles)
5959 BitstreamCursor &Cursor = InputFilesCursor;
5961 if (llvm::Error Err =
5962 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
5964 consumeError(std::move(Err));
5970 consumeError(MaybeCode.takeError());
5972 unsigned Code = MaybeCode.get();
5976 bool shouldContinue =
false;
5978 Cursor.readRecord(Code,
Record, &Blob);
5979 if (!MaybeRecordType) {
5981 consumeError(MaybeRecordType.takeError());
5987 bool Overridden =
static_cast<bool>(
Record[3]);
5988 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
5991 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
5993 if (UnresolvedFilename.empty())
5994 Filename = *FilenameAsRequestedBuf;
5997 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
5998 Filename = *FilenameBuf;
6000 shouldContinue = Listener.visitInputFileAsRequested(
6001 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6005 if (!shouldContinue)
6026 bool IsStandardCXXModule =
Record[Idx++];
6030 if (IsStandardCXXModule) {
6031 Listener.visitImport(ModuleName,
"");
6042 Listener.visitImport(ModuleName, *Filename);
6053 if (FindModuleFileExtensions) {
6054 BitstreamCursor SavedStream = Stream;
6056 bool DoneWithExtensionBlock =
false;
6057 while (!DoneWithExtensionBlock) {
6063 llvm::BitstreamEntry Entry = MaybeEntry.get();
6065 switch (Entry.Kind) {
6066 case llvm::BitstreamEntry::SubBlock:
6067 if (llvm::Error Err = Stream.SkipBlock()) {
6069 consumeError(std::move(Err));
6074 case llvm::BitstreamEntry::EndBlock:
6075 DoneWithExtensionBlock =
true;
6078 case llvm::BitstreamEntry::Error:
6081 case llvm::BitstreamEntry::Record:
6088 Stream.readRecord(Entry.ID,
Record, &Blob);
6089 if (!MaybeRecCode) {
6093 switch (MaybeRecCode.get()) {
6099 Listener.readModuleFileExtension(Metadata);
6105 Stream = std::move(SavedStream);
6109 if (readUnhashedControlBlockImpl(
6110 nullptr, Bytes, Filename, ClientLoadCapabilities,
6112 ValidateDiagnosticOptions) !=
Success)
6123 bool RequireStrictOptionMatches) {
6124 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts,
6125 ExistingModuleCachePath, FileMgr,
6126 RequireStrictOptionMatches);
6132llvm::Error ASTReader::ReadSubmoduleBlock(
ModuleFile &F,
6133 unsigned ClientLoadCapabilities) {
6138 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6143 auto CreateModule = !KnowsTopLevelModule
6148 Module *CurrentModule =
nullptr;
6152 F.
Stream.advanceSkippingSubblocks();
6154 return MaybeEntry.takeError();
6155 llvm::BitstreamEntry Entry = MaybeEntry.get();
6157 switch (Entry.Kind) {
6158 case llvm::BitstreamEntry::SubBlock:
6159 case llvm::BitstreamEntry::Error:
6160 return llvm::createStringError(std::errc::illegal_byte_sequence,
6161 "malformed block record in AST file");
6162 case llvm::BitstreamEntry::EndBlock:
6163 return llvm::Error::success();
6164 case llvm::BitstreamEntry::Record:
6174 return MaybeKind.takeError();
6175 unsigned Kind = MaybeKind.get();
6178 return llvm::createStringError(
6179 std::errc::illegal_byte_sequence,
6180 "submodule metadata record should be at beginning of block");
6195 return llvm::createStringError(std::errc::illegal_byte_sequence,
6196 "malformed module definition");
6198 StringRef Name = Blob;
6205 bool IsFramework =
Record[Idx++];
6206 bool IsExplicit =
Record[Idx++];
6207 bool IsSystem =
Record[Idx++];
6208 bool IsExternC =
Record[Idx++];
6209 bool InferSubmodules =
Record[Idx++];
6210 bool InferExplicitSubmodules =
Record[Idx++];
6211 bool InferExportWildcard =
Record[Idx++];
6212 bool ConfigMacrosExhaustive =
Record[Idx++];
6213 bool ModuleMapIsPrivate =
Record[Idx++];
6214 bool NamedModuleHasInit =
Record[Idx++];
6216 Module *ParentModule =
nullptr;
6218 ParentModule = getSubmodule(Parent);
6220 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6221 IsFramework, IsExplicit);
6224 if (GlobalIndex >= SubmodulesLoaded.size() ||
6225 SubmodulesLoaded[GlobalIndex])
6226 return llvm::createStringError(std::errc::invalid_argument,
6227 "too many submodules");
6229 if (!ParentModule) {
6232 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6234 assert(CurFile != F.
File &&
"ModuleManager did not de-duplicate");
6236 Diag(diag::err_module_file_conflict)
6240 auto CurModMapFile =
6243 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6244 Diag(diag::note_module_file_conflict)
6245 << CurModMapFile->getName() << ModMapFile->getName();
6247 return llvm::make_error<AlreadyReportedDiagnosticError>();
6266 if (InferredAllowedBy.
isValid())
6276 if (DeserializationListener)
6277 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6279 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6304 auto Filename = ResolveImportedPath(PathBuf, Blob, F);
6305 if (
auto Umbrella = PP.getFileManager().getOptionalFileRef(*Filename)) {
6333 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6340 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6342 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6354 unsigned LocalBaseSubmoduleID =
Record[1];
6358 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
6363 std::make_pair(LocalBaseSubmoduleID,
6372 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6384 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6396 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6413 PP.getTargetInfo());
6419 Module::LinkLibrary(std::string(Blob),
Record[0]));
6441 SmallVector<GlobalDeclID, 16> Inits;
6442 for (
unsigned I = 0; I <
Record.size(); )
6443 Inits.push_back(ReadDeclID(F,
Record, I));
6444 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
6463bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6464 StringRef ModuleFilename,
bool Complain,
6465 ASTReaderListener &Listener,
6466 bool AllowCompatibleDifferences) {
6467 LangOptions LangOpts;
6469#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6470 LangOpts.Name = Record[Idx++];
6471#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6472 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6473#include "clang/Basic/LangOptions.def"
6474#define SANITIZER(NAME, ID) \
6475 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6476#include "clang/Basic/Sanitizers.def"
6478 for (
unsigned N =
Record[Idx++]; N; --N)
6482 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6483 LangOpts.
ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6488 for (
unsigned N =
Record[Idx++]; N; --N) {
6490 ReadString(
Record, Idx));
6495 for (
unsigned N =
Record[Idx++]; N; --N) {
6502 AllowCompatibleDifferences);
6505bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6506 StringRef ModuleFilename,
bool Complain,
6507 ASTReaderListener &Listener,
6508 bool AllowCompatibleDifferences) {
6510 CodeGenOptions CGOpts;
6512#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6513 if constexpr (CK::Compatibility != CK::Benign) \
6514 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6515#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6516 if constexpr (CK::Compatibility != CK::Benign) \
6517 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6518#define DEBUGOPT(Name, Bits, Default, Compatibility)
6519#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6520#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6521#include "clang/Basic/CodeGenOptions.def"
6524 AllowCompatibleDifferences);
6527bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6528 StringRef ModuleFilename,
bool Complain,
6529 ASTReaderListener &Listener,
6530 bool AllowCompatibleDifferences) {
6532 TargetOptions TargetOpts;
6534 TargetOpts.
CPU = ReadString(
Record, Idx);
6536 TargetOpts.
ABI = ReadString(
Record, Idx);
6537 for (
unsigned N =
Record[Idx++]; N; --N) {
6540 for (
unsigned N =
Record[Idx++]; N; --N) {
6545 AllowCompatibleDifferences);
6548bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6549 StringRef ModuleFilename,
bool Complain,
6550 ASTReaderListener &Listener) {
6551 DiagnosticOptions DiagOpts;
6553#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6554#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6555 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6556#include "clang/Basic/DiagnosticOptions.def"
6558 for (
unsigned N =
Record[Idx++]; N; --N)
6560 for (
unsigned N =
Record[Idx++]; N; --N)
6566bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6567 ASTReaderListener &Listener) {
6568 FileSystemOptions FSOpts;
6574bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6575 StringRef ModuleFilename,
6577 ASTReaderListener &Listener) {
6578 HeaderSearchOptions HSOpts;
6593 std::string SpecificModuleCachePath = ReadString(
Record, Idx);
6596 SpecificModuleCachePath, Complain);
6599bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6600 ASTReaderListener &Listener) {
6601 HeaderSearchOptions HSOpts;
6605 for (
unsigned N =
Record[Idx++]; N; --N) {
6606 std::string Path = ReadString(
Record, Idx);
6609 bool IsFramework =
Record[Idx++];
6610 bool IgnoreSysRoot =
Record[Idx++];
6611 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6616 for (
unsigned N =
Record[Idx++]; N; --N) {
6617 std::string Prefix = ReadString(
Record, Idx);
6618 bool IsSystemHeader =
Record[Idx++];
6623 for (
unsigned N =
Record[Idx++]; N; --N) {
6624 std::string VFSOverlayFile = ReadString(
Record, Idx);
6631bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6632 StringRef ModuleFilename,
6634 ASTReaderListener &Listener,
6635 std::string &SuggestedPredefines) {
6636 PreprocessorOptions PPOpts;
6640 bool ReadMacros =
Record[Idx++];
6642 for (
unsigned N =
Record[Idx++]; N; --N) {
6644 bool IsUndef =
Record[Idx++];
6645 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6650 for (
unsigned N =
Record[Idx++]; N; --N) {
6655 for (
unsigned N =
Record[Idx++]; N; --N) {
6664 SuggestedPredefines.clear();
6666 Complain, SuggestedPredefines);
6669std::pair<ModuleFile *, unsigned>
6670ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6671 GlobalPreprocessedEntityMapType::iterator
6672 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6673 assert(I != GlobalPreprocessedEntityMap.end() &&
6674 "Corrupted global preprocessed entity map");
6677 return std::make_pair(M, LocalIndex);
6680llvm::iterator_range<PreprocessingRecord::iterator>
6681ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6682 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6686 return llvm::make_range(PreprocessingRecord::iterator(),
6687 PreprocessingRecord::iterator());
6690bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6691 unsigned int ClientLoadCapabilities) {
6692 return ClientLoadCapabilities & ARR_OutOfDate &&
6695 .getInMemoryModuleCache()
6696 .isPCMFinal(ModuleFileName);
6699llvm::iterator_range<ASTReader::ModuleDeclIterator>
6701 return llvm::make_range(
6708 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6709 assert(I != GlobalSkippedRangeMap.end() &&
6710 "Corrupted global skipped range map");
6713 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6717 assert(Range.isValid());
6723 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6725 unsigned LocalIndex = PPInfo.second;
6728 if (!PP.getPreprocessingRecord()) {
6729 Error(
"no preprocessing record");
6736 Error(std::move(Err));
6743 Error(MaybeEntry.takeError());
6746 llvm::BitstreamEntry Entry = MaybeEntry.get();
6748 if (Entry.Kind != llvm::BitstreamEntry::Record)
6759 if (!MaybeRecType) {
6760 Error(MaybeRecType.takeError());
6765 bool isBuiltin =
Record[0];
6774 PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
6792 if (DeserializationListener)
6793 DeserializationListener->MacroDefinitionRead(PPID, MD);
6799 const char *FullFileNameStart = Blob.data() +
Record[0];
6800 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
6802 if (!FullFileName.empty())
6803 File = PP.getFileManager().getOptionalFileRef(FullFileName);
6810 StringRef(Blob.data(),
Record[0]),
6818 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
6828 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
6830 for (GlobalSLocOffsetMapType::const_iterator
6831 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6837 return getTotalNumPreprocessedEntities();
6842struct PPEntityComp {
6843 const ASTReader &Reader;
6846 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6848 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
6849 SourceLocation LHS = getLoc(L);
6850 SourceLocation RHS = getLoc(R);
6854 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
6855 SourceLocation LHS = getLoc(L);
6859 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
6860 SourceLocation RHS = getLoc(R);
6864 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
6872 bool EndsAfter)
const {
6873 if (SourceMgr.isLocalSourceLocation(Loc))
6874 return getTotalNumPreprocessedEntities();
6876 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
6877 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6878 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
6879 "Corrupted global sloc offset map");
6881 if (SLocMapI->second->NumPreprocessedEntities == 0)
6882 return findNextPreprocessedEntity(SLocMapI);
6893 pp_iterator
First = pp_begin;
6897 PPI = std::upper_bound(pp_begin, pp_end, Loc,
6898 PPEntityComp(*
this, M));
6907 std::advance(PPI,
Half);
6908 if (SourceMgr.isBeforeInTranslationUnit(
6909 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
6912 Count = Count -
Half - 1;
6919 return findNextPreprocessedEntity(SLocMapI);
6926std::pair<unsigned, unsigned>
6928 if (Range.isInvalid())
6929 return std::make_pair(0,0);
6930 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
6933 findPreprocessedEntity(Range.getBegin(),
false);
6935 return std::make_pair(BeginID, EndID);
6945 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6947 unsigned LocalIndex = PPInfo.second;
6954 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
6963 class HeaderFileInfoVisitor {
6965 std::optional<HeaderFileInfo> HFI;
6968 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
6977 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
6978 if (Pos == Table->end())
6985 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
6991 HeaderFileInfoVisitor Visitor(FE);
6992 ModuleMgr.visit(Visitor);
6993 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7000 using DiagState = DiagnosticsEngine::DiagState;
7011 auto ReadDiagState = [&](
const DiagState &BasedOn,
7012 bool IncludeNonPragmaStates) {
7013 unsigned BackrefID =
Record[Idx++];
7015 return DiagStates[BackrefID - 1];
7018 Diag.DiagStates.push_back(BasedOn);
7019 DiagState *NewState = &
Diag.DiagStates.back();
7020 DiagStates.push_back(NewState);
7021 unsigned Size =
Record[Idx++];
7022 assert(Idx + Size * 2 <=
Record.size() &&
7023 "Invalid data, not enough diag/map pairs");
7025 unsigned DiagID =
Record[Idx++];
7028 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7041 Mapping = NewMapping;
7047 DiagState *FirstState;
7052 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7053 DiagStates.push_back(FirstState);
7057 "Invalid data, unexpected backref in initial state");
7059 assert(Idx <
Record.size() &&
7060 "Invalid data, not enough state change pairs in initial state");
7065 unsigned Flags =
Record[Idx++];
7066 DiagState Initial(*
Diag.getDiagnosticIDs());
7067 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7068 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7069 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7070 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7071 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7073 FirstState = ReadDiagState(Initial,
true);
7081 .StateTransitions.push_back({FirstState, 0});
7086 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7090 unsigned NumLocations =
Record[Idx++];
7091 while (NumLocations--) {
7092 assert(Idx <
Record.size() &&
7093 "Invalid data, missing pragma diagnostic states");
7095 assert(FID.
isValid() &&
"invalid FileID for transition");
7096 unsigned Transitions =
Record[Idx++];
7102 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7103 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7104 for (
unsigned I = 0; I != Transitions; ++I) {
7105 unsigned Offset =
Record[Idx++];
7106 auto *State = ReadDiagState(*FirstState,
false);
7107 F.StateTransitions.push_back({State, Offset});
7112 assert(Idx <
Record.size() &&
7113 "Invalid data, missing final pragma diagnostic state");
7115 auto *CurState = ReadDiagState(*FirstState,
false);
7118 Diag.DiagStatesByLoc.CurDiagState = CurState;
7119 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7124 auto &
T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7126 T.push_back({CurState, 0});
7128 T[0].State = CurState;
7137ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7138 auto [M, Index] = translateTypeIDToIndex(ID);
7145#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7146 case TYPE_##CODE_ID: return Type::CLASS_ID;
7147#include "clang/Serialization/TypeBitCodes.def"
7149 return std::nullopt;
7159QualType ASTReader::readTypeRecord(
TypeID ID) {
7160 assert(ContextObj &&
"reading type with no AST context");
7161 ASTContext &Context = *ContextObj;
7162 RecordLocation Loc = TypeCursorForIndex(ID);
7163 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7167 SavedStreamPosition SavedPosition(DeclsCursor);
7169 ReadingKindTracker ReadingKind(Read_Type, *
this);
7172 Deserializing AType(
this);
7174 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7175 Error(std::move(Err));
7178 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7180 Error(RawCode.takeError());
7184 ASTRecordReader
Record(*
this, *Loc.F);
7185 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7187 Error(Code.takeError());
7191 QualType baseType =
Record.readQualType();
7192 Qualifiers quals =
Record.readQualifiers();
7198 Error(
"Unexpected code for type");
7202 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7203 return TypeReader.read(*maybeClass);
7211 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7212 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7215 return Reader.readTypeSourceInfo();
7219 return Reader.readNestedNameSpecifierLoc();
7223 return Reader.readAttr();
7232#define ABSTRACT_TYPELOC(CLASS, PARENT)
7233#define TYPELOC(CLASS, PARENT) \
7234 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7235#include "clang/AST/TypeLocNodes.def"
7244void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7248void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7258void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7262void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7266void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7270void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7274void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7278void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7282void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7286void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7290void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7294void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7302 if (Reader.readBool())
7309 VisitArrayTypeLoc(TL);
7313 VisitArrayTypeLoc(TL);
7316void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7317 VisitArrayTypeLoc(TL);
7320void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7321 DependentSizedArrayTypeLoc TL) {
7322 VisitArrayTypeLoc(TL);
7325void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7326 DependentAddressSpaceTypeLoc TL) {
7333void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7334 DependentSizedExtVectorTypeLoc TL) {
7338void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7342void TypeLocReader::VisitDependentVectorTypeLoc(
7343 DependentVectorTypeLoc TL) {
7347void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7351void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7358void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7359 DependentSizedMatrixTypeLoc TL) {
7372 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7378 VisitFunctionTypeLoc(TL);
7382 VisitFunctionTypeLoc(TL);
7385void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7386 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7387 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7388 SourceLocation NameLoc = readSourceLocation();
7389 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7392void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7393 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7394 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7395 SourceLocation NameLoc = readSourceLocation();
7396 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7399void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7400 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7401 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7402 SourceLocation NameLoc = readSourceLocation();
7403 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7406void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7412void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7419void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7424void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7428void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7442 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7447void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7449 if (Reader.readBool())
7451 if (Reader.readBool())
7455void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7469 VisitTagTypeLoc(TL);
7473 VisitTagTypeLoc(TL);
7476void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7478void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7482void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7486void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7490void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7491 HLSLAttributedResourceTypeLoc TL) {
7495void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7499void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7503void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7504 SubstTemplateTypeParmTypeLoc TL) {
7508void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7509 SubstTemplateTypeParmPackTypeLoc TL) {
7513void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7514 SubstBuiltinTemplatePackTypeLoc TL) {
7518void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7519 TemplateSpecializationTypeLoc TL) {
7520 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7521 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7522 SourceLocation TemplateKeywordLoc = readSourceLocation();
7523 SourceLocation NameLoc = readSourceLocation();
7524 SourceLocation LAngleLoc = readSourceLocation();
7525 SourceLocation RAngleLoc = readSourceLocation();
7526 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7527 LAngleLoc, RAngleLoc);
7528 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7529 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7530 Args[I] = Reader.readTemplateArgumentLocInfo(
7531 TL.
getTypePtr()->template_arguments()[I].getKind());
7534void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7539void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7545void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7549void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7554void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7563void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7575void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7579void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7585void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7589void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7593void TypeLocReader::VisitDependentBitIntTypeLoc(
7594 clang::DependentBitIntTypeLoc TL) {
7598void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7632std::pair<ModuleFile *, unsigned>
7635 "Predefined type shouldn't be in TypesLoaded");
7637 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7639 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7640 assert(OwningModuleFile &&
7641 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7643 return {OwningModuleFile,
7648 assert(ContextObj &&
"reading type with no AST context");
7659 llvm_unreachable(
"Invalid predefined type");
7675 T = Context.UnsignedCharTy;
7678 T = Context.UnsignedShortTy;
7681 T = Context.UnsignedIntTy;
7684 T = Context.UnsignedLongTy;
7687 T = Context.UnsignedLongLongTy;
7690 T = Context.UnsignedInt128Ty;
7693 T = Context.SignedCharTy;
7696 T = Context.WCharTy;
7699 T = Context.ShortTy;
7708 T = Context.LongLongTy;
7711 T = Context.Int128Ty;
7714 T = Context.BFloat16Ty;
7720 T = Context.FloatTy;
7723 T = Context.DoubleTy;
7726 T = Context.LongDoubleTy;
7729 T = Context.ShortAccumTy;
7732 T = Context.AccumTy;
7735 T = Context.LongAccumTy;
7738 T = Context.UnsignedShortAccumTy;
7741 T = Context.UnsignedAccumTy;
7744 T = Context.UnsignedLongAccumTy;
7747 T = Context.ShortFractTy;
7750 T = Context.FractTy;
7753 T = Context.LongFractTy;
7756 T = Context.UnsignedShortFractTy;
7759 T = Context.UnsignedFractTy;
7762 T = Context.UnsignedLongFractTy;
7765 T = Context.SatShortAccumTy;
7768 T = Context.SatAccumTy;
7771 T = Context.SatLongAccumTy;
7774 T = Context.SatUnsignedShortAccumTy;
7777 T = Context.SatUnsignedAccumTy;
7780 T = Context.SatUnsignedLongAccumTy;
7783 T = Context.SatShortFractTy;
7786 T = Context.SatFractTy;
7789 T = Context.SatLongFractTy;
7792 T = Context.SatUnsignedShortFractTy;
7795 T = Context.SatUnsignedFractTy;
7798 T = Context.SatUnsignedLongFractTy;
7801 T = Context.Float16Ty;
7804 T = Context.Float128Ty;
7807 T = Context.Ibm128Ty;
7810 T = Context.OverloadTy;
7813 T = Context.UnresolvedTemplateTy;
7816 T = Context.BoundMemberTy;
7819 T = Context.PseudoObjectTy;
7822 T = Context.DependentTy;
7825 T = Context.UnknownAnyTy;
7828 T = Context.NullPtrTy;
7831 T = Context.Char8Ty;
7834 T = Context.Char16Ty;
7837 T = Context.Char32Ty;
7840 T = Context.ObjCBuiltinIdTy;
7843 T = Context.ObjCBuiltinClassTy;
7846 T = Context.ObjCBuiltinSelTy;
7848#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7849 case PREDEF_TYPE_##Id##_ID: \
7850 T = Context.SingletonId; \
7852#include "clang/Basic/OpenCLImageTypes.def"
7853#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7854 case PREDEF_TYPE_##Id##_ID: \
7855 T = Context.Id##Ty; \
7857#include "clang/Basic/OpenCLExtensionTypes.def"
7859 T = Context.OCLSamplerTy;
7862 T = Context.OCLEventTy;
7865 T = Context.OCLClkEventTy;
7868 T = Context.OCLQueueTy;
7871 T = Context.OCLReserveIDTy;
7874 T = Context.getAutoDeductType();
7877 T = Context.getAutoRRefDeductType();
7880 T = Context.ARCUnbridgedCastTy;
7883 T = Context.BuiltinFnTy;
7886 T = Context.IncompleteMatrixIdxTy;
7889 T = Context.ArraySectionTy;
7892 T = Context.OMPArrayShapingTy;
7895 T = Context.OMPIteratorTy;
7897#define SVE_TYPE(Name, Id, SingletonId) \
7898 case PREDEF_TYPE_##Id##_ID: \
7899 T = Context.SingletonId; \
7901#include "clang/Basic/AArch64ACLETypes.def"
7902#define PPC_VECTOR_TYPE(Name, Id, Size) \
7903 case PREDEF_TYPE_##Id##_ID: \
7904 T = Context.Id##Ty; \
7906#include "clang/Basic/PPCTypes.def"
7907#define RVV_TYPE(Name, Id, SingletonId) \
7908 case PREDEF_TYPE_##Id##_ID: \
7909 T = Context.SingletonId; \
7911#include "clang/Basic/RISCVVTypes.def"
7912#define WASM_TYPE(Name, Id, SingletonId) \
7913 case PREDEF_TYPE_##Id##_ID: \
7914 T = Context.SingletonId; \
7916#include "clang/Basic/WebAssemblyReferenceTypes.def"
7917#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
7918 case PREDEF_TYPE_##Id##_ID: \
7919 T = Context.SingletonId; \
7921#include "clang/Basic/AMDGPUTypes.def"
7922#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
7923 case PREDEF_TYPE_##Id##_ID: \
7924 T = Context.SingletonId; \
7926#include "clang/Basic/HLSLIntangibleTypes.def"
7929 assert(!
T.isNull() &&
"Unknown predefined type");
7930 return T.withFastQualifiers(FastQuals);
7933 unsigned Index = translateTypeIDToIndex(ID).second;
7935 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
7936 if (TypesLoaded[Index].isNull()) {
7937 TypesLoaded[Index] = readTypeRecord(ID);
7938 if (TypesLoaded[Index].isNull())
7941 TypesLoaded[Index]->setFromAST();
7942 if (DeserializationListener)
7944 TypesLoaded[Index]);
7947 return TypesLoaded[Index].withFastQualifiers(FastQuals);
7960 ReadModuleOffsetMap(F);
7963 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
7965 if (ModuleFileIndex == 0)
7970 ModuleFileIndex = MF.
Index + 1;
7971 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
7990 TemplateNameLoc, EllipsisLoc);
8001 llvm_unreachable(
"unexpected template argument loc");
8018 unsigned NumArgsAsWritten =
readInt();
8019 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8033 if (NumCurrentElementsDeserializing) {
8038 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8061 auto *II = Name.getAsIdentifierInfo();
8062 assert(II &&
"non-identifier name in C?");
8063 if (II->isOutOfDate())
8080 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8081 Template = CTSD->getSpecializedTemplate();
8082 Args = CTSD->getTemplateArgs().asArray();
8083 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8084 Template = VTSD->getSpecializedTemplate();
8085 Args = VTSD->getTemplateArgs().asArray();
8086 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8087 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8089 Args = FD->getTemplateSpecializationArgs()->asArray();
8097 Template->loadLazySpecializationsImpl();
8099 Template->loadLazySpecializationsImpl(Args);
8105 RecordLocation Loc = getLocalBitOffset(Offset);
8108 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8109 Error(std::move(Err));
8112 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8117 Error(MaybeCode.takeError());
8120 unsigned Code = MaybeCode.get();
8124 if (!MaybeRecCode) {
8125 Error(MaybeRecCode.takeError());
8129 Error(
"malformed AST file: missing C++ ctor initializers");
8133 return Record.readCXXCtorInitializers();
8137 assert(ContextObj &&
"reading base specifiers with no AST context");
8140 RecordLocation Loc = getLocalBitOffset(Offset);
8143 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8144 Error(std::move(Err));
8147 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8152 Error(MaybeCode.takeError());
8155 unsigned Code = MaybeCode.get();
8159 if (!MaybeRecCode) {
8160 Error(MaybeCode.takeError());
8163 unsigned RecCode = MaybeRecCode.get();
8166 Error(
"malformed AST file: missing C++ base specifiers");
8170 unsigned NumBases =
Record.readInt();
8173 for (
unsigned I = 0; I != NumBases; ++I)
8174 Bases[I] =
Record.readCXXBaseSpecifier();
8187 ReadModuleOffsetMap(F);
8190 OwningModuleFileIndex == 0
8194 if (OwningModuleFileIndex == 0)
8197 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8206 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8207 return M.
Index == ModuleFileIndex - 1;
8215 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8216 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8236 DeclCursorForID(ID, Loc);
8241 assert(ContextObj &&
"reading predefined decl without AST context");
8243 Decl *NewLoaded =
nullptr;
8249 return Context.getTranslationUnitDecl();
8252 if (Context.ObjCIdDecl)
8253 return Context.ObjCIdDecl;
8254 NewLoaded = Context.getObjCIdDecl();
8258 if (Context.ObjCSelDecl)
8259 return Context.ObjCSelDecl;
8260 NewLoaded = Context.getObjCSelDecl();
8264 if (Context.ObjCClassDecl)
8265 return Context.ObjCClassDecl;
8266 NewLoaded = Context.getObjCClassDecl();
8270 if (Context.ObjCProtocolClassDecl)
8271 return Context.ObjCProtocolClassDecl;
8272 NewLoaded = Context.getObjCProtocolDecl();
8276 if (Context.Int128Decl)
8277 return Context.Int128Decl;
8278 NewLoaded = Context.getInt128Decl();
8282 if (Context.UInt128Decl)
8283 return Context.UInt128Decl;
8284 NewLoaded = Context.getUInt128Decl();
8288 if (Context.ObjCInstanceTypeDecl)
8289 return Context.ObjCInstanceTypeDecl;
8290 NewLoaded = Context.getObjCInstanceTypeDecl();
8294 if (Context.BuiltinVaListDecl)
8295 return Context.BuiltinVaListDecl;
8296 NewLoaded = Context.getBuiltinVaListDecl();
8300 if (Context.VaListTagDecl)
8301 return Context.VaListTagDecl;
8302 NewLoaded = Context.getVaListTagDecl();
8306 if (Context.BuiltinMSVaListDecl)
8307 return Context.BuiltinMSVaListDecl;
8308 NewLoaded = Context.getBuiltinMSVaListDecl();
8313 return Context.getMSGuidTagDecl();
8316 if (Context.ExternCContext)
8317 return Context.ExternCContext;
8318 NewLoaded = Context.getExternCContextDecl();
8322 if (Context.CFConstantStringTypeDecl)
8323 return Context.CFConstantStringTypeDecl;
8324 NewLoaded = Context.getCFConstantStringDecl();
8328 if (Context.CFConstantStringTagDecl)
8329 return Context.CFConstantStringTagDecl;
8330 NewLoaded = Context.getCFConstantStringTagDecl();
8334 return Context.getMSTypeInfoTagDecl();
8336#define BuiltinTemplate(BTName) \
8337 case PREDEF_DECL##BTName##_ID: \
8338 if (Context.Decl##BTName) \
8339 return Context.Decl##BTName; \
8340 NewLoaded = Context.get##BTName##Decl(); \
8342#include "clang/Basic/BuiltinTemplates.inc"
8345 llvm_unreachable(
"Invalid decl ID");
8349 assert(NewLoaded &&
"Failed to load predefined decl?");
8351 if (DeserializationListener)
8352 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8357unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8358 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8359 if (!OwningModuleFile) {
8368 assert(ContextObj &&
"reading decl with no AST context");
8377 Merged.push_back(ID);
8382 unsigned Index = translateGlobalDeclIDToIndex(ID);
8384 if (Index >= DeclsLoaded.size()) {
8385 assert(0 &&
"declaration ID out-of-range for AST file");
8386 Error(
"declaration ID out-of-range for AST file");
8390 return DeclsLoaded[Index];
8397 unsigned Index = translateGlobalDeclIDToIndex(ID);
8399 if (Index >= DeclsLoaded.size()) {
8400 assert(0 &&
"declaration ID out-of-range for AST file");
8401 Error(
"declaration ID out-of-range for AST file");
8405 if (!DeclsLoaded[Index]) {
8407 if (DeserializationListener)
8408 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8411 return DeclsLoaded[Index];
8420 ReadModuleOffsetMap(M);
8430 uint64_t OrignalModuleFileIndex = 0;
8433 OrignalModuleFileIndex = I + 1;
8437 if (!OrignalModuleFileIndex)
8445 if (Idx >=
Record.size()) {
8446 Error(
"Corrupted AST file");
8463 RecordLocation Loc = getLocalBitOffset(Offset);
8464 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8465 Error(std::move(Err));
8468 assert(NumCurrentElementsDeserializing == 0 &&
8469 "should not be called while already deserializing");
8471 return ReadStmtFromStream(*Loc.F);
8474bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8478 auto It = SpecLookups.find(D);
8479 if (It == SpecLookups.end())
8485 It->second.Table.findAll();
8489 SpecLookups.erase(It);
8491 bool NewSpecsFound =
false;
8492 Deserializing LookupResults(
this);
8493 for (
auto &Info : Infos) {
8494 if (GetExistingDecl(Info))
8496 NewSpecsFound =
true;
8500 return NewSpecsFound;
8507 bool NewSpecsFound =
8508 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8510 return NewSpecsFound;
8512 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8513 return NewSpecsFound;
8516bool ASTReader::LoadExternalSpecializationsImpl(
8517 SpecLookupTableTy &SpecLookups,
const Decl *D,
8521 auto It = SpecLookups.find(D);
8522 if (It == SpecLookups.end())
8525 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8527 llvm::raw_string_ostream OS(Name);
8529 ND->getNameForDiagnostic(OS, ND->getASTContext().getPrintingPolicy(),
8534 Deserializing LookupResults(
this);
8539 It->second.Table.find(HashValue);
8541 bool NewSpecsFound =
false;
8542 for (
auto &Info : Infos) {
8543 if (GetExistingDecl(Info))
8545 NewSpecsFound =
true;
8549 return NewSpecsFound;
8556 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8557 PartialSpecializationsLookups, D, TemplateArgs);
8559 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8561 return NewDeclsFound;
8569 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8570 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8571 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8573 if (!IsKindWeWant(K))
8576 auto ID = (
DeclID) + LexicalDecls[I + 1];
8581 if (PredefsVisited[ID])
8584 PredefsVisited[ID] =
true;
8588 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8596 for (
const auto &Lexical : TULexicalDecls)
8597 Visit(Lexical.first, Lexical.second);
8599 auto I = LexicalDecls.find(DC);
8600 if (I != LexicalDecls.end())
8601 Visit(I->second.first, I->second.second);
8604 ++NumLexicalDeclContextsRead;
8609class UnalignedDeclIDComp {
8615 : Reader(Reader), Mod(M) {}
8624 SourceLocation RHS = getLocation(R);
8629 SourceLocation LHS = getLocation(L);
8643 unsigned Offset,
unsigned Length,
8647 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8648 if (I == FileDeclIDs.end())
8651 FileDeclsInfo &DInfo = I->second;
8652 if (DInfo.Decls.empty())
8656 BeginLoc =
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
8659 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8661 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8662 if (BeginIt != DInfo.Decls.begin())
8668 while (BeginIt != DInfo.Decls.begin() &&
8671 ->isTopLevelDeclInObjCContainer())
8675 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8676 if (EndIt != DInfo.Decls.end())
8689 "DeclContext has no visible decls in storage");
8697 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8701 Decls.push_back(ND);
8709 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8710 ++NumVisibleDeclContextsRead;
8711 Find(It->second.Table, Name);
8714 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8715 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8716 ++NumModuleLocalVisibleDeclContexts;
8717 Find(It->second.Table, std::make_pair(Name, NamedModule));
8720 if (
auto *NamedModule =
8721 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8723 FindModuleLocalLookup(NamedModule);
8728 if (ContextObj && ContextObj->getCurrentNamedModule())
8729 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8731 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8732 ++NumTULocalVisibleDeclContexts;
8733 Find(It->second.Table, Name);
8737 return !Decls.empty();
8746 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
8747 auto It = LookupTables.find(DC);
8748 if (It == LookupTables.end())
8761 findAll(Lookups, NumVisibleDeclContextsRead);
8762 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8763 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8765 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
8768 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
8773 auto I = Lookups.find(Primary);
8774 return I == Lookups.end() ?
nullptr : &I->second;
8779 auto I = ModuleLocalLookups.find(Primary);
8780 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
8785 auto I = TULocalLookups.find(Primary);
8786 return I == TULocalLookups.end() ?
nullptr : &I->second;
8793 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
8794 auto I = LookupTable.find(D);
8795 return I == LookupTable.end() ?
nullptr : &I->second;
8800 return PartialSpecializationsLookups.contains(D) ||
8801 SpecializationsLookups.contains(D);
8810 assert(ImplD && Consumer);
8812 for (
auto *I : ImplD->
methods())
8818void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
8819 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
8822 Consumer->HandleInterestingDecl(DeclGroupRef(D));
8825void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
8826 Consumer->HandleVTable(RD);
8830 this->Consumer = Consumer;
8833 PassInterestingDeclsToConsumer();
8835 if (DeserializationListener)
8836 DeserializationListener->ReaderInitialized(
this);
8840 std::fprintf(stderr,
"*** AST File Statistics:\n");
8842 unsigned NumTypesLoaded =
8843 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
8844 unsigned NumDeclsLoaded =
8845 DeclsLoaded.size() -
8846 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
8847 unsigned NumIdentifiersLoaded =
8848 IdentifiersLoaded.size() -
8850 unsigned NumMacrosLoaded =
8851 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
8852 unsigned NumSelectorsLoaded =
8853 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
8856 std::fprintf(stderr,
" %u/%u source location entries read (%f%%)\n",
8857 NumSLocEntriesRead, TotalNumSLocEntries,
8858 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
8859 if (!TypesLoaded.empty())
8860 std::fprintf(stderr,
" %u/%u types read (%f%%)\n",
8861 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
8862 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
8863 if (!DeclsLoaded.empty())
8864 std::fprintf(stderr,
" %u/%u declarations read (%f%%)\n",
8865 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
8866 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
8867 if (!IdentifiersLoaded.empty())
8868 std::fprintf(stderr,
" %u/%u identifiers read (%f%%)\n",
8869 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
8870 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
8871 if (!MacrosLoaded.empty())
8872 std::fprintf(stderr,
" %u/%u macros read (%f%%)\n",
8873 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
8874 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
8875 if (!SelectorsLoaded.empty())
8876 std::fprintf(stderr,
" %u/%u selectors read (%f%%)\n",
8877 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
8878 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
8879 if (TotalNumStatements)
8880 std::fprintf(stderr,
" %u/%u statements read (%f%%)\n",
8881 NumStatementsRead, TotalNumStatements,
8882 ((
float)NumStatementsRead/TotalNumStatements * 100));
8884 std::fprintf(stderr,
" %u/%u macros read (%f%%)\n",
8885 NumMacrosRead, TotalNumMacros,
8886 ((
float)NumMacrosRead/TotalNumMacros * 100));
8887 if (TotalLexicalDeclContexts)
8888 std::fprintf(stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
8889 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
8890 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
8892 if (TotalVisibleDeclContexts)
8893 std::fprintf(stderr,
" %u/%u visible declcontexts read (%f%%)\n",
8894 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
8895 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
8897 if (TotalModuleLocalVisibleDeclContexts)
8899 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
8900 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
8901 ((
float)NumModuleLocalVisibleDeclContexts /
8902 TotalModuleLocalVisibleDeclContexts * 100));
8903 if (TotalTULocalVisibleDeclContexts)
8904 std::fprintf(stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
8905 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
8906 ((
float)NumTULocalVisibleDeclContexts /
8907 TotalTULocalVisibleDeclContexts * 100));
8908 if (TotalNumMethodPoolEntries)
8909 std::fprintf(stderr,
" %u/%u method pool entries read (%f%%)\n",
8910 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
8911 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
8913 if (NumMethodPoolLookups)
8914 std::fprintf(stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
8915 NumMethodPoolHits, NumMethodPoolLookups,
8916 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
8917 if (NumMethodPoolTableLookups)
8918 std::fprintf(stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
8919 NumMethodPoolTableHits, NumMethodPoolTableLookups,
8920 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
8922 if (NumIdentifierLookupHits)
8923 std::fprintf(stderr,
8924 " %u / %u identifier table lookups succeeded (%f%%)\n",
8925 NumIdentifierLookupHits, NumIdentifierLookups,
8926 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
8929 std::fprintf(stderr,
"\n");
8930 GlobalIndex->printStats();
8933 std::fprintf(stderr,
"\n");
8935 std::fprintf(stderr,
"\n");
8938template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
8939LLVM_DUMP_METHOD
static void
8942 InitialCapacity> &Map) {
8943 if (Map.begin() == Map.end())
8948 llvm::errs() << Name <<
":\n";
8949 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
8951 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
8956 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
8958 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
8963 GlobalPreprocessedEntityMap);
8965 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
8974 if (llvm::MemoryBuffer *buf = I.Buffer) {
8975 size_t bytes = buf->getBufferSize();
8976 switch (buf->getBufferKind()) {
8977 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
8980 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9001 if (!FPPragmaOptions.empty()) {
9002 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9005 SemaObj->CurFPFeatures =
9011 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9012 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9013 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9014 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9016 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9018 DeclsWithEffectsToVerify.clear();
9020 SemaObj->OpenCLFeatures = OpenCLExtensions;
9026 assert(SemaObj &&
"no Sema to update");
9030 if (!SemaDeclRefs.empty()) {
9031 assert(SemaDeclRefs.size() % 3 == 0);
9032 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9033 if (!SemaObj->StdNamespace)
9034 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9035 if (!SemaObj->StdBadAlloc)
9036 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9037 if (!SemaObj->StdAlignValT)
9038 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9040 SemaDeclRefs.clear();
9045 if(OptimizeOffPragmaLocation.isValid())
9046 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9047 if (PragmaMSStructState != -1)
9049 if (PointersToMembersPragmaLocation.isValid()) {
9050 SemaObj->ActOnPragmaMSPointersToMembers(
9052 PragmaMSPointersToMembersState,
9053 PointersToMembersPragmaLocation);
9055 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9057 if (PragmaAlignPackCurrentValue) {
9061 bool DropFirst =
false;
9062 if (!PragmaAlignPackStack.empty() &&
9063 PragmaAlignPackStack.front().Location.isInvalid()) {
9064 assert(PragmaAlignPackStack.front().Value ==
9065 SemaObj->AlignPackStack.DefaultValue &&
9066 "Expected a default alignment value");
9067 SemaObj->AlignPackStack.Stack.emplace_back(
9068 PragmaAlignPackStack.front().SlotLabel,
9069 SemaObj->AlignPackStack.CurrentValue,
9070 SemaObj->AlignPackStack.CurrentPragmaLocation,
9071 PragmaAlignPackStack.front().PushLocation);
9074 for (
const auto &Entry :
9075 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9076 SemaObj->AlignPackStack.Stack.emplace_back(
9077 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9079 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9080 assert(*PragmaAlignPackCurrentValue ==
9081 SemaObj->AlignPackStack.DefaultValue &&
9082 "Expected a default align and pack value");
9085 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9086 SemaObj->AlignPackStack.CurrentPragmaLocation =
9087 PragmaAlignPackCurrentLocation;
9090 if (FpPragmaCurrentValue) {
9094 bool DropFirst =
false;
9095 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9096 assert(FpPragmaStack.front().Value ==
9097 SemaObj->FpPragmaStack.DefaultValue &&
9098 "Expected a default pragma float_control value");
9099 SemaObj->FpPragmaStack.Stack.emplace_back(
9100 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9101 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9102 FpPragmaStack.front().PushLocation);
9105 for (
const auto &Entry :
9107 SemaObj->FpPragmaStack.Stack.emplace_back(
9108 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9109 if (FpPragmaCurrentLocation.isInvalid()) {
9110 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9111 "Expected a default pragma float_control value");
9114 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9115 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9120 for (
auto &Import : PendingImportedModulesSema) {
9121 if (Import.ImportLoc.isInvalid())
9124 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9127 PendingImportedModulesSema.clear();
9134 IdentifierLookupVisitor Visitor(Name, 0,
9135 NumIdentifierLookups,
9136 NumIdentifierLookupHits);
9142 if (PP.getLangOpts().CPlusPlus) {
9143 for (
auto *F : ModuleMgr.pch_modules())
9152 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9157 ModuleMgr.visit(Visitor, HitsPtr);
9179 ASTIdentifierLookupTable::key_iterator Current;
9183 ASTIdentifierLookupTable::key_iterator End;
9190 bool SkipModules =
false);
9192 StringRef
Next()
override;
9199 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9203 while (Current == End) {
9215 Current = IdTable->key_begin();
9216 End = IdTable->key_end();
9221 StringRef
Result = *Current;
9230 std::unique_ptr<IdentifierIterator> Current;
9231 std::unique_ptr<IdentifierIterator> Queued;
9234 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9235 std::unique_ptr<IdentifierIterator> Second)
9236 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9238 StringRef
Next()
override {
9242 StringRef result = Current->Next();
9243 if (!result.empty())
9248 std::swap(Current, Queued);
9257 std::unique_ptr<IdentifierIterator> ReaderIter(
9259 std::unique_ptr<IdentifierIterator> ModulesIter(
9260 GlobalIndex->createIdentifierIterator());
9261 return new ChainedIdentifierIterator(std::move(ReaderIter),
9262 std::move(ModulesIter));
9274 unsigned PriorGeneration;
9275 unsigned InstanceBits = 0;
9276 unsigned FactoryBits = 0;
9277 bool InstanceHasMoreThanOneDecl =
false;
9278 bool FactoryHasMoreThanOneDecl =
false;
9284 unsigned PriorGeneration)
9285 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9295 ++Reader.NumMethodPoolTableLookups;
9298 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9299 if (Pos == PoolTable->end())
9302 ++Reader.NumMethodPoolTableHits;
9303 ++Reader.NumSelectorsRead;
9307 ++Reader.NumMethodPoolEntriesRead;
9309 if (Reader.DeserializationListener)
9310 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9315 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9316 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9317 InstanceBits =
Data.InstanceBits;
9318 FactoryBits =
Data.FactoryBits;
9319 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9320 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9326 return InstanceMethods;
9331 return FactoryMethods;
9338 return InstanceHasMoreThanOneDecl;
9356 unsigned &Generation = SelectorGeneration[Sel];
9357 unsigned PriorGeneration = Generation;
9359 SelectorOutOfDate[Sel] =
false;
9362 ++NumMethodPoolLookups;
9364 ModuleMgr.visit(Visitor);
9370 ++NumMethodPoolHits;
9391 if (SelectorOutOfDate[Sel])
9399 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9401 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9402 Namespaces.push_back(Namespace);
9407 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9408 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9409 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9412 Undefined.insert(std::make_pair(D, Loc));
9414 UndefinedButUsed.clear();
9420 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9423 uint64_t Count = DelayedDeleteExprs[Idx++];
9424 for (uint64_t
C = 0;
C < Count; ++
C) {
9427 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9428 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9435 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9436 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9438 TentativeDefs.push_back(Var);
9440 TentativeDefinitions.clear();
9445 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9447 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9451 UnusedFileScopedDecls.clear();
9456 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9458 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9462 DelegatingCtorDecls.clear();
9466 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9468 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9472 ExtVectorDecls.clear();
9477 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9480 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9484 UnusedLocalTypedefNameCandidates.clear();
9489 for (
auto I : DeclsToCheckForDeferredDiags) {
9490 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9494 DeclsToCheckForDeferredDiags.clear();
9499 if (ReferencedSelectorsData.empty())
9504 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9506 while (I < DataSize) {
9510 Sels.push_back(std::make_pair(Sel, SelLoc));
9512 ReferencedSelectorsData.clear();
9517 if (WeakUndeclaredIdentifiers.empty())
9520 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9528 WeakIDs.push_back(std::make_pair(WeakId, WI));
9530 WeakUndeclaredIdentifiers.clear();
9534 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9536 VTableUse &TableInfo = VTableUses[Idx++];
9537 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9540 VTables.push_back(VT);
9548 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9549 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9553 Pending.push_back(std::make_pair(D, Loc));
9555 PendingInstantiations.clear();
9559 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9561 for (
auto &LPT : LateParsedTemplates) {
9564 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9568 auto LT = std::make_unique<LateParsedTemplate>();
9569 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9573 assert(F &&
"No module");
9575 unsigned TokN = LateParsed[Idx++];
9576 LT->Toks.reserve(TokN);
9577 for (
unsigned T = 0;
T < TokN; ++
T)
9578 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9580 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9584 LateParsedTemplates.clear();
9596 if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9597 Iter != LambdaDeclarationsForMerging.end() &&
9598 Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
9607 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9616 assert(ID &&
"Non-zero identifier ID required");
9617 unsigned Index = translateIdentifierIDToIndex(ID).second;
9618 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9619 IdentifiersLoaded[Index] = II;
9620 if (DeserializationListener)
9621 DeserializationListener->IdentifierRead(ID, II);
9643 if (NumCurrentElementsDeserializing && !Decls) {
9644 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9648 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9661 Decls->push_back(D);
9668 pushExternalDeclIntoScope(D, II);
9672std::pair<ModuleFile *, unsigned>
9673ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9675 return {
nullptr, 0};
9677 unsigned ModuleFileIndex = ID >> 32;
9678 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9680 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9692 if (IdentifiersLoaded.empty()) {
9693 Error(
"no identifier table in AST file");
9697 auto [M, Index] = translateIdentifierIDToIndex(ID);
9698 if (!IdentifiersLoaded[Index]) {
9699 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9702 const unsigned char *
Data =
9708 auto &II = PP.getIdentifierTable().get(Key);
9709 IdentifiersLoaded[Index] = &II;
9712 if (DeserializationListener)
9713 DeserializationListener->IdentifierRead(ID, &II);
9716 return IdentifiersLoaded[Index];
9728 ReadModuleOffsetMap(M);
9730 unsigned ModuleFileIndex = LocalID >> 32;
9731 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9734 assert(MF &&
"malformed identifier ID encoding?");
9736 if (!ModuleFileIndex)
9746 if (MacrosLoaded.empty()) {
9747 Error(
"no macro table in AST file");
9752 if (!MacrosLoaded[ID]) {
9755 assert(I != GlobalMacroMap.end() &&
"Corrupted global macro map");
9761 if (DeserializationListener)
9766 return MacrosLoaded[ID];
9774 ReadModuleOffsetMap(M);
9778 assert(I != M.
MacroRemap.
end() &&
"Invalid index into macro index remap");
9780 return LocalID + I->second;
9789 ReadModuleOffsetMap(M);
9794 &&
"Invalid index into submodule index remap");
9796 return LocalID + I->second;
9801 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
9805 if (GlobalID > SubmodulesLoaded.size()) {
9806 Error(
"submodule ID out of range in AST file");
9821 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
9824 int IndexFromEnd =
static_cast<int>(ID >> 1);
9825 assert(IndexFromEnd &&
"got reference to unknown module file");
9842 auto I = llvm::find(PCHModules, M);
9843 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
9844 return std::distance(I, PCHModules.end()) << 1;
9853 const auto &PCHChain = ModuleMgr.pch_modules();
9854 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
9855 ModuleFile &MF = ModuleMgr.getPrimaryModule();
9859 llvm::sys::path::parent_path(MF.
FileName),
9862 return std::nullopt;
9866 auto I = DefinitionSource.find(FD);
9867 if (I == DefinitionSource.end())
9873 return ThisDeclarationWasADefinitionSet.contains(FD);
9884 if (ID > SelectorsLoaded.size()) {
9885 Error(
"selector ID out of range in AST file");
9889 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
9892 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
9896 SelectorsLoaded[ID - 1] =
9898 if (DeserializationListener)
9899 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
9902 return SelectorsLoaded[ID - 1];
9920 ReadModuleOffsetMap(M);
9925 &&
"Invalid index into selector index remap");
9927 return LocalID + I->second;
9958 NameInfo.
setName(readDeclarationName());
9972 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
9973 assert(Op.isValid());
9979 unsigned NumTPLists =
readInt();
9984 for (
unsigned i = 0; i != NumTPLists; ++i)
9995 unsigned NumParams =
readInt();
9997 Params.reserve(NumParams);
10001 bool HasRequiresClause =
readBool();
10002 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10005 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10006 return TemplateParams;
10011 bool Canonicalize) {
10012 unsigned NumTemplateArgs =
readInt();
10013 TemplArgs.reserve(NumTemplateArgs);
10014 while (NumTemplateArgs--)
10020 unsigned NumDecls =
readInt();
10022 while (NumDecls--) {
10034 bool inheritConstructors =
readBool();
10040 Result.setInheritConstructors(inheritConstructors);
10047 unsigned NumInitializers =
readInt();
10048 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10050 for (
unsigned i = 0; i != NumInitializers; ++i) {
10052 bool IsBaseVirtual =
false;
10083 BOMInit =
new (Context)
10085 RParenLoc, MemberOrEllipsisLoc);
10087 BOMInit =
new (Context)
10090 BOMInit =
new (Context)
10094 BOMInit =
new (Context)
10096 LParenLoc,
Init, RParenLoc);
10099 unsigned SourceOrder =
readInt();
10103 CtorInitializers[i] = BOMInit;
10106 return CtorInitializers;
10114 for (
unsigned I = 0; I != N; ++I) {
10115 auto Kind = readNestedNameSpecifierKind();
10120 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10129 Builder.Make(Context,
T->getTypeLoc(), ColonColonLoc);
10135 Builder.MakeGlobal(Context, ColonColonLoc);
10142 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10147 llvm_unreachable(
"unexpected null nested name specifier");
10162 const StringRef Blob) {
10163 unsigned Count =
Record[0];
10164 const char *Byte = Blob.data();
10165 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10166 for (
unsigned I = 0; I < Count; ++Byte)
10167 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10168 if (*Byte & (1 << Bit))
10175 return llvm::APFloat(Sem,
readAPInt());
10180 unsigned Len =
Record[Idx++];
10188 unsigned Len =
Record[Idx++];
10189 StringRef
Result = Blob.substr(0, Len);
10190 Blob = Blob.substr(Len);
10214 unsigned Major =
Record[Idx++];
10215 unsigned Minor =
Record[Idx++];
10216 unsigned Subminor =
Record[Idx++];
10218 return VersionTuple(Major);
10220 return VersionTuple(Major, Minor - 1);
10221 return VersionTuple(Major, Minor - 1, Subminor - 1);
10232 return Diag(CurrentImportLoc, DiagID);
10236 return Diags.Report(Loc, DiagID);
10240 llvm::function_ref<
void()> Fn) {
10243 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10247 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10253 return PP.getIdentifierTable();
10259 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10260 "Already have a SwitchCase with this ID");
10261 (*CurrSwitchCaseStmts)[ID] = SC;
10266 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10267 return (*CurrSwitchCaseStmts)[ID];
10271 CurrSwitchCaseStmts->clear();
10276 std::vector<RawComment *> Comments;
10283 BitstreamCursor &Cursor = I->first;
10290 Cursor.advanceSkippingSubblocks(
10291 BitstreamCursor::AF_DontPopBlockAtEnd);
10293 Error(MaybeEntry.takeError());
10296 llvm::BitstreamEntry Entry = MaybeEntry.get();
10298 switch (Entry.Kind) {
10299 case llvm::BitstreamEntry::SubBlock:
10300 case llvm::BitstreamEntry::Error:
10301 Error(
"malformed block record in AST file");
10303 case llvm::BitstreamEntry::EndBlock:
10305 case llvm::BitstreamEntry::Record:
10313 if (!MaybeComment) {
10314 Error(MaybeComment.takeError());
10323 bool IsTrailingComment =
Record[Idx++];
10324 bool IsAlmostTrailingComment =
Record[Idx++];
10325 Comments.push_back(
new (Context)
RawComment(
10326 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10336 if (Loc.first.isValid())
10337 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10350 assert(NumUserInputs <= NumInputs);
10351 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10352 for (
unsigned I = 0; I < N; ++I) {
10353 bool IsSystem = I >= NumUserInputs;
10355 Visitor(IFI, IsSystem);
10360 bool IncludeSystem,
bool Complain,
10362 bool isSystem)> Visitor) {
10365 assert(NumUserInputs <= NumInputs);
10366 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10367 for (
unsigned I = 0; I < N; ++I) {
10368 bool IsSystem = I >= NumUserInputs;
10369 InputFile IF = getInputFile(MF, I+1, Complain);
10370 Visitor(IF, IsSystem);
10378 for (
unsigned I = 0; I < NumInputs; ++I) {
10381 if (
auto FE = getInputFile(MF, I + 1).getFile())
10386void ASTReader::finishPendingActions() {
10387 while (!PendingIdentifierInfos.empty() ||
10388 !PendingDeducedFunctionTypes.empty() ||
10389 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10390 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10391 !PendingUpdateRecords.empty() ||
10392 !PendingObjCExtensionIvarRedeclarations.empty()) {
10395 using TopLevelDeclsMap =
10396 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10397 TopLevelDeclsMap TopLevelDecls;
10399 while (!PendingIdentifierInfos.empty()) {
10402 std::move(PendingIdentifierInfos.back().second);
10403 PendingIdentifierInfos.pop_back();
10410 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10411 auto *FD = PendingDeducedFunctionTypes[I].first;
10412 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10414 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10417 if (DT->isDeduced()) {
10418 PendingDeducedTypeUpdates.insert(
10419 {FD->getCanonicalDecl(), FD->getReturnType()});
10426 PendingUndeducedFunctionDecls.push_back(FD);
10430 PendingDeducedFunctionTypes.clear();
10434 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10435 auto *VD = PendingDeducedVarTypes[I].first;
10436 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10438 PendingDeducedVarTypes.clear();
10441 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10442 loadPendingDeclChain(PendingDeclChains[I].first,
10443 PendingDeclChains[I].second);
10444 PendingDeclChains.clear();
10447 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10448 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10449 IdentifierInfo *II = TLD->first;
10450 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10456 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10457 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10458 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10459 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10461 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10463 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10464 if (!Info.M->isModule())
10468 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10470 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10471 if (Info.M->isModule())
10475 PendingMacroIDs.clear();
10479 while (!PendingDeclContextInfos.empty()) {
10480 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10481 PendingDeclContextInfos.pop_front();
10484 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10488 while (!PendingUpdateRecords.empty()) {
10489 auto Update = PendingUpdateRecords.pop_back_val();
10490 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10491 loadDeclUpdateRecords(
Update);
10494 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10495 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10496 auto DuplicateIvars =
10497 PendingObjCExtensionIvarRedeclarations.back().second;
10499 StructuralEquivalenceContext Ctx(
10500 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10501 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10505 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10507 for (
auto IvarPair : DuplicateIvars) {
10508 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10510 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10516 ExtensionsPair.first->setInvalidDecl();
10517 ExtensionsPair.second->getClassInterface()
10519 ->setIvarList(
nullptr);
10521 for (
auto IvarPair : DuplicateIvars) {
10522 Diag(IvarPair.first->getLocation(),
10523 diag::err_duplicate_ivar_declaration)
10524 << IvarPair.first->getIdentifier();
10525 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10528 PendingObjCExtensionIvarRedeclarations.pop_back();
10534 assert(PendingFakeDefinitionData.empty() &&
10535 "faked up a class definition but never saw the real one");
10541 for (Decl *D : PendingDefinitions) {
10542 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10543 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10544 for (
auto *R = getMostRecentExistingDecl(RD); R;
10545 R = R->getPreviousDecl()) {
10548 "declaration thinks it's the definition but it isn't");
10556 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10561 for (
auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10567 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10568 for (
auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10575 for (
auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10578 PendingDefinitions.clear();
10580 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10581 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10582 if (
auto *VD = dyn_cast<VarDecl>(D))
10583 return VD->isThisDeclarationADefinition() ||
10584 VD->isThisDeclarationADemotedDefinition();
10586 if (
auto *TD = dyn_cast<TagDecl>(D))
10587 return TD->isThisDeclarationADefinition() ||
10588 TD->isThisDeclarationADemotedDefinition();
10590 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10591 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10593 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10594 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10601 return hasDefinitionImpl(D, hasDefinitionImpl);
10617 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10623 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10624 PBEnd = PendingBodies.end();
10625 PB != PBEnd; ++PB) {
10626 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10628 const FunctionDecl *Defn =
nullptr;
10629 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10630 FD->setLazyBody(PB->second);
10632 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10635 if (!FD->isLateTemplateParsed() &&
10636 !NonConstDefn->isLateTemplateParsed() &&
10641 FD->getODRHash() != NonConstDefn->getODRHash()) {
10643 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10644 }
else if (FD->getLexicalParent()->isFileContext() &&
10645 NonConstDefn->getLexicalParent()->isFileContext()) {
10649 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10660 PendingBodies.clear();
10663 for (
auto [RD, MD] : PendingAddedClassMembers) {
10664 RD->addedMember(MD);
10666 PendingAddedClassMembers.clear();
10669 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10671 PendingMergedDefinitionsToDeduplicate.clear();
10675 for (Decl *D : PendingIncompleteDeclChains)
10676 markIncompleteDeclChain(D);
10677 PendingIncompleteDeclChains.clear();
10679 assert(PendingIdentifierInfos.empty() &&
10680 "Should be empty at the end of finishPendingActions");
10681 assert(PendingDeducedFunctionTypes.empty() &&
10682 "Should be empty at the end of finishPendingActions");
10683 assert(PendingDeducedVarTypes.empty() &&
10684 "Should be empty at the end of finishPendingActions");
10685 assert(PendingDeclChains.empty() &&
10686 "Should be empty at the end of finishPendingActions");
10687 assert(PendingMacroIDs.empty() &&
10688 "Should be empty at the end of finishPendingActions");
10689 assert(PendingDeclContextInfos.empty() &&
10690 "Should be empty at the end of finishPendingActions");
10691 assert(PendingUpdateRecords.empty() &&
10692 "Should be empty at the end of finishPendingActions");
10693 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10694 "Should be empty at the end of finishPendingActions");
10695 assert(PendingFakeDefinitionData.empty() &&
10696 "Should be empty at the end of finishPendingActions");
10697 assert(PendingDefinitions.empty() &&
10698 "Should be empty at the end of finishPendingActions");
10699 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10700 "Should be empty at the end of finishPendingActions");
10701 assert(PendingBodies.empty() &&
10702 "Should be empty at the end of finishPendingActions");
10703 assert(PendingAddedClassMembers.empty() &&
10704 "Should be empty at the end of finishPendingActions");
10705 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10706 "Should be empty at the end of finishPendingActions");
10707 assert(PendingIncompleteDeclChains.empty() &&
10708 "Should be empty at the end of finishPendingActions");
10711void ASTReader::diagnoseOdrViolations() {
10712 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10713 PendingRecordOdrMergeFailures.empty() &&
10714 PendingFunctionOdrMergeFailures.empty() &&
10715 PendingEnumOdrMergeFailures.empty() &&
10716 PendingObjCInterfaceOdrMergeFailures.empty() &&
10717 PendingObjCProtocolOdrMergeFailures.empty())
10724 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10725 PendingOdrMergeFailures.clear();
10726 for (
auto &Merge : OdrMergeFailures) {
10727 Merge.first->buildLookup();
10728 Merge.first->decls_begin();
10729 Merge.first->bases_begin();
10730 Merge.first->vbases_begin();
10731 for (
auto &RecordPair : Merge.second) {
10732 auto *RD = RecordPair.first;
10740 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
10741 PendingRecordOdrMergeFailures.clear();
10742 for (
auto &Merge : RecordOdrMergeFailures) {
10743 Merge.first->decls_begin();
10744 for (
auto &D : Merge.second)
10749 auto ObjCInterfaceOdrMergeFailures =
10750 std::move(PendingObjCInterfaceOdrMergeFailures);
10751 PendingObjCInterfaceOdrMergeFailures.clear();
10752 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
10753 Merge.first->decls_begin();
10754 for (
auto &InterfacePair : Merge.second)
10755 InterfacePair.first->decls_begin();
10759 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
10760 PendingFunctionOdrMergeFailures.clear();
10761 for (
auto &Merge : FunctionOdrMergeFailures) {
10762 Merge.first->buildLookup();
10763 Merge.first->decls_begin();
10764 Merge.first->getBody();
10765 for (
auto &FD : Merge.second) {
10773 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
10774 PendingEnumOdrMergeFailures.clear();
10775 for (
auto &Merge : EnumOdrMergeFailures) {
10776 Merge.first->decls_begin();
10777 for (
auto &
Enum : Merge.second) {
10778 Enum->decls_begin();
10783 auto ObjCProtocolOdrMergeFailures =
10784 std::move(PendingObjCProtocolOdrMergeFailures);
10785 PendingObjCProtocolOdrMergeFailures.clear();
10786 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
10787 Merge.first->decls_begin();
10788 for (
auto &ProtocolPair : Merge.second)
10789 ProtocolPair.first->decls_begin();
10798 while (!PendingOdrMergeChecks.empty()) {
10799 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
10810 bool Found =
false;
10813 for (
auto *RI : D->
redecls()) {
10814 if (RI->getLexicalDeclContext() == CanonDef) {
10828 llvm::SmallVector<const NamedDecl*, 4> Candidates;
10829 for (
auto *CanonMember : CanonDef->
decls()) {
10830 if (CanonMember->getCanonicalDecl() == DCanon) {
10839 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
10841 Candidates.push_back(ND);
10854 std::string CanonDefModule =
10859 << CanonDef << CanonDefModule.empty() << CanonDefModule;
10861 if (Candidates.empty())
10863 diag::note_module_odr_violation_no_possible_decls) << D;
10865 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
10866 Diag(Candidates[I]->getLocation(),
10867 diag::note_module_odr_violation_possible_decl)
10871 DiagnosedOdrMergeFailures.insert(CanonDef);
10875 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
10876 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
10877 ObjCInterfaceOdrMergeFailures.empty() &&
10878 ObjCProtocolOdrMergeFailures.empty())
10881 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
10885 for (
auto &Merge : OdrMergeFailures) {
10888 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10891 bool Diagnosed =
false;
10892 CXXRecordDecl *FirstRecord = Merge.first;
10893 for (
auto &RecordPair : Merge.second) {
10894 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
10895 RecordPair.second)) {
10908 Diag(Merge.first->getLocation(),
10909 diag::err_module_odr_violation_different_instantiations)
10916 for (
auto &Merge : RecordOdrMergeFailures) {
10919 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10922 RecordDecl *FirstRecord = Merge.first;
10923 bool Diagnosed =
false;
10924 for (
auto *SecondRecord : Merge.second) {
10925 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
10931 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
10935 for (
auto &Merge : FunctionOdrMergeFailures) {
10936 FunctionDecl *FirstFunction = Merge.first;
10937 bool Diagnosed =
false;
10938 for (
auto &SecondFunction : Merge.second) {
10939 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
10945 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
10949 for (
auto &Merge : EnumOdrMergeFailures) {
10952 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10955 EnumDecl *FirstEnum = Merge.first;
10956 bool Diagnosed =
false;
10957 for (
auto &SecondEnum : Merge.second) {
10958 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
10964 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
10967 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
10970 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10973 bool Diagnosed =
false;
10974 ObjCInterfaceDecl *FirstID = Merge.first;
10975 for (
auto &InterfacePair : Merge.second) {
10976 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
10977 InterfacePair.second)) {
10983 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
10986 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
10989 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10992 ObjCProtocolDecl *FirstProtocol = Merge.first;
10993 bool Diagnosed =
false;
10994 for (
auto &ProtocolPair : Merge.second) {
10995 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
10996 ProtocolPair.second)) {
11002 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11007 if (llvm::Timer *
T = ReadTimer.get();
11008 ++NumCurrentElementsDeserializing == 1 &&
T)
11009 ReadTimeRegion.emplace(
T);
11013 assert(NumCurrentElementsDeserializing &&
11014 "FinishedDeserializing not paired with StartedDeserializing");
11015 if (NumCurrentElementsDeserializing == 1) {
11018 finishPendingActions();
11020 --NumCurrentElementsDeserializing;
11022 if (NumCurrentElementsDeserializing == 0) {
11026 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11034 while (!PendingExceptionSpecUpdates.empty() ||
11035 !PendingDeducedTypeUpdates.empty() ||
11036 !PendingUndeducedFunctionDecls.empty()) {
11037 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11038 PendingExceptionSpecUpdates.clear();
11039 for (
auto Update : ESUpdates) {
11040 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11043 if (
auto *Listener =
getContext().getASTMutationListener())
11045 for (
auto *Redecl :
Update.second->redecls())
11049 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11050 PendingDeducedTypeUpdates.clear();
11051 for (
auto Update : DTUpdates) {
11052 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11059 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11060 PendingUndeducedFunctionDecls.clear();
11064 (void)UndeducedFD->getMostRecentDecl();
11067 ReadTimeRegion.reset();
11069 diagnoseOdrViolations();
11075 PassInterestingDeclsToConsumer();
11082 auto It = PendingFakeLookupResults.find(II);
11083 if (It != PendingFakeLookupResults.end()) {
11084 for (
auto *ND : It->second)
11089 It->second.clear();
11093 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11094 SemaObj->TUScope->AddDecl(D);
11095 }
else if (SemaObj->TUScope) {
11099 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11100 SemaObj->TUScope->AddDecl(D);
11108 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11109 StringRef isysroot,
11111 bool AllowASTWithCompilerErrors,
11112 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11113 bool ForceValidateUserInputs,
11114 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11115 std::unique_ptr<llvm::Timer> ReadTimer)
11120 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11121 StackHandler(Diags), PP(PP), ContextObj(Context),
11122 CodeGenOpts(CodeGenOpts),
11124 PP.getHeaderSearchInfo()),
11125 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11126 DisableValidationKind(DisableValidationKind),
11127 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11128 AllowConfigurationMismatch(AllowConfigurationMismatch),
11129 ValidateSystemInputs(ValidateSystemInputs),
11130 ForceValidateUserInputs(ForceValidateUserInputs),
11131 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11132 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11133 SourceMgr.setExternalSLocEntrySource(
this);
11135 PathBuf.reserve(256);
11137 for (
const auto &Ext : Extensions) {
11138 auto BlockName = Ext->getExtensionMetadata().BlockName;
11139 auto Known = ModuleFileExtensions.find(BlockName);
11140 if (Known != ModuleFileExtensions.end()) {
11141 Diags.Report(diag::warn_duplicate_module_file_extension)
11146 ModuleFileExtensions.insert({BlockName, Ext});
11151 if (OwnsDeserializationListener)
11152 delete DeserializationListener;
11156 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11160 unsigned AbbrevID) {
11163 return Cursor.readRecord(AbbrevID, Record);
11179 : Record(Record), Context(Record.getContext()) {}
11180#define GEN_CLANG_CLAUSE_CLASS
11181#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11182#include "llvm/Frontend/OpenMP/OMP.inc"
11196 switch (llvm::omp::Clause(Record.readInt())) {
11197 case llvm::omp::OMPC_if:
11200 case llvm::omp::OMPC_final:
11203 case llvm::omp::OMPC_num_threads:
11206 case llvm::omp::OMPC_safelen:
11209 case llvm::omp::OMPC_simdlen:
11212 case llvm::omp::OMPC_sizes: {
11213 unsigned NumSizes = Record.readInt();
11217 case llvm::omp::OMPC_permutation: {
11218 unsigned NumLoops = Record.readInt();
11222 case llvm::omp::OMPC_full:
11225 case llvm::omp::OMPC_partial:
11228 case llvm::omp::OMPC_looprange:
11231 case llvm::omp::OMPC_allocator:
11234 case llvm::omp::OMPC_collapse:
11237 case llvm::omp::OMPC_default:
11240 case llvm::omp::OMPC_proc_bind:
11243 case llvm::omp::OMPC_schedule:
11246 case llvm::omp::OMPC_ordered:
11249 case llvm::omp::OMPC_nowait:
11252 case llvm::omp::OMPC_untied:
11255 case llvm::omp::OMPC_mergeable:
11258 case llvm::omp::OMPC_threadset:
11261 case llvm::omp::OMPC_read:
11264 case llvm::omp::OMPC_write:
11267 case llvm::omp::OMPC_update:
11270 case llvm::omp::OMPC_capture:
11273 case llvm::omp::OMPC_compare:
11276 case llvm::omp::OMPC_fail:
11279 case llvm::omp::OMPC_seq_cst:
11282 case llvm::omp::OMPC_acq_rel:
11285 case llvm::omp::OMPC_absent: {
11286 unsigned NumKinds = Record.readInt();
11290 case llvm::omp::OMPC_holds:
11293 case llvm::omp::OMPC_contains: {
11294 unsigned NumKinds = Record.readInt();
11298 case llvm::omp::OMPC_no_openmp:
11301 case llvm::omp::OMPC_no_openmp_routines:
11304 case llvm::omp::OMPC_no_openmp_constructs:
11307 case llvm::omp::OMPC_no_parallelism:
11310 case llvm::omp::OMPC_acquire:
11313 case llvm::omp::OMPC_release:
11316 case llvm::omp::OMPC_relaxed:
11319 case llvm::omp::OMPC_weak:
11322 case llvm::omp::OMPC_threads:
11325 case llvm::omp::OMPC_simd:
11328 case llvm::omp::OMPC_nogroup:
11331 case llvm::omp::OMPC_unified_address:
11334 case llvm::omp::OMPC_unified_shared_memory:
11337 case llvm::omp::OMPC_reverse_offload:
11340 case llvm::omp::OMPC_dynamic_allocators:
11343 case llvm::omp::OMPC_atomic_default_mem_order:
11346 case llvm::omp::OMPC_self_maps:
11349 case llvm::omp::OMPC_at:
11352 case llvm::omp::OMPC_severity:
11355 case llvm::omp::OMPC_message:
11358 case llvm::omp::OMPC_private:
11361 case llvm::omp::OMPC_firstprivate:
11364 case llvm::omp::OMPC_lastprivate:
11367 case llvm::omp::OMPC_shared:
11370 case llvm::omp::OMPC_reduction: {
11371 unsigned N = Record.readInt();
11376 case llvm::omp::OMPC_task_reduction:
11379 case llvm::omp::OMPC_in_reduction:
11382 case llvm::omp::OMPC_linear:
11385 case llvm::omp::OMPC_aligned:
11388 case llvm::omp::OMPC_copyin:
11391 case llvm::omp::OMPC_copyprivate:
11394 case llvm::omp::OMPC_flush:
11397 case llvm::omp::OMPC_depobj:
11400 case llvm::omp::OMPC_depend: {
11401 unsigned NumVars = Record.readInt();
11402 unsigned NumLoops = Record.readInt();
11406 case llvm::omp::OMPC_device:
11409 case llvm::omp::OMPC_map: {
11411 Sizes.
NumVars = Record.readInt();
11418 case llvm::omp::OMPC_num_teams:
11421 case llvm::omp::OMPC_thread_limit:
11424 case llvm::omp::OMPC_priority:
11427 case llvm::omp::OMPC_grainsize:
11430 case llvm::omp::OMPC_num_tasks:
11433 case llvm::omp::OMPC_hint:
11436 case llvm::omp::OMPC_dist_schedule:
11439 case llvm::omp::OMPC_defaultmap:
11442 case llvm::omp::OMPC_to: {
11444 Sizes.
NumVars = Record.readInt();
11451 case llvm::omp::OMPC_from: {
11453 Sizes.
NumVars = Record.readInt();
11460 case llvm::omp::OMPC_use_device_ptr: {
11462 Sizes.
NumVars = Record.readInt();
11469 case llvm::omp::OMPC_use_device_addr: {
11471 Sizes.
NumVars = Record.readInt();
11478 case llvm::omp::OMPC_is_device_ptr: {
11480 Sizes.
NumVars = Record.readInt();
11487 case llvm::omp::OMPC_has_device_addr: {
11489 Sizes.
NumVars = Record.readInt();
11496 case llvm::omp::OMPC_allocate:
11499 case llvm::omp::OMPC_nontemporal:
11502 case llvm::omp::OMPC_inclusive:
11505 case llvm::omp::OMPC_exclusive:
11508 case llvm::omp::OMPC_order:
11511 case llvm::omp::OMPC_init:
11514 case llvm::omp::OMPC_use:
11517 case llvm::omp::OMPC_destroy:
11520 case llvm::omp::OMPC_novariants:
11523 case llvm::omp::OMPC_nocontext:
11526 case llvm::omp::OMPC_detach:
11529 case llvm::omp::OMPC_uses_allocators:
11532 case llvm::omp::OMPC_affinity:
11535 case llvm::omp::OMPC_filter:
11538 case llvm::omp::OMPC_bind:
11541 case llvm::omp::OMPC_align:
11544 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11547 case llvm::omp::OMPC_dyn_groupprivate:
11550 case llvm::omp::OMPC_doacross: {
11551 unsigned NumVars = Record.readInt();
11552 unsigned NumLoops = Record.readInt();
11556 case llvm::omp::OMPC_ompx_attribute:
11559 case llvm::omp::OMPC_ompx_bare:
11562#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11563 case llvm::omp::Enum: \
11565#include "llvm/Frontend/OpenMP/OMPKinds.def"
11569 assert(
C &&
"Unknown OMPClause type");
11572 C->setLocStart(Record.readSourceLocation());
11573 C->setLocEnd(Record.readSourceLocation());
11579 C->setPreInitStmt(Record.readSubStmt(),
11585 C->setPostUpdateExpr(Record.readSubExpr());
11588void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11591 C->setNameModifierLoc(
Record.readSourceLocation());
11592 C->setColonLoc(
Record.readSourceLocation());
11593 C->setCondition(
Record.readSubExpr());
11594 C->setLParenLoc(
Record.readSourceLocation());
11599 C->setCondition(
Record.readSubExpr());
11600 C->setLParenLoc(
Record.readSourceLocation());
11606 C->setNumThreads(Record.readSubExpr());
11607 C->setModifierLoc(Record.readSourceLocation());
11608 C->setLParenLoc(Record.readSourceLocation());
11612 C->setSafelen(Record.readSubExpr());
11613 C->setLParenLoc(Record.readSourceLocation());
11617 C->setSimdlen(Record.readSubExpr());
11618 C->setLParenLoc(Record.readSourceLocation());
11622 for (Expr *&E :
C->getSizesRefs())
11623 E = Record.readSubExpr();
11624 C->setLParenLoc(Record.readSourceLocation());
11628 for (Expr *&E :
C->getArgsRefs())
11629 E = Record.readSubExpr();
11630 C->setLParenLoc(Record.readSourceLocation());
11636 C->setFactor(Record.readSubExpr());
11637 C->setLParenLoc(Record.readSourceLocation());
11641 C->setFirst(Record.readSubExpr());
11642 C->setCount(Record.readSubExpr());
11643 C->setLParenLoc(Record.readSourceLocation());
11644 C->setFirstLoc(Record.readSourceLocation());
11645 C->setCountLoc(Record.readSourceLocation());
11649 C->setAllocator(Record.readExpr());
11650 C->setLParenLoc(Record.readSourceLocation());
11654 C->setNumForLoops(Record.readSubExpr());
11655 C->setLParenLoc(Record.readSourceLocation());
11659 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11660 C->setLParenLoc(Record.readSourceLocation());
11661 C->setDefaultKindKwLoc(Record.readSourceLocation());
11662 C->setDefaultVariableCategory(
11664 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11670 C->setLParenLoc(Record.readSourceLocation());
11671 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11672 C->setThreadsetKindLoc(ThreadsetKindLoc);
11675 C->setThreadsetKind(TKind);
11679 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11680 C->setLParenLoc(Record.readSourceLocation());
11681 C->setProcBindKindKwLoc(Record.readSourceLocation());
11686 C->setScheduleKind(
11688 C->setFirstScheduleModifier(
11690 C->setSecondScheduleModifier(
11692 C->setChunkSize(Record.readSubExpr());
11693 C->setLParenLoc(Record.readSourceLocation());
11694 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11695 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11696 C->setScheduleKindLoc(Record.readSourceLocation());
11697 C->setCommaLoc(Record.readSourceLocation());
11701 C->setNumForLoops(Record.readSubExpr());
11702 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11703 C->setLoopNumIterations(I, Record.readSubExpr());
11704 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11705 C->setLoopCounter(I, Record.readSubExpr());
11706 C->setLParenLoc(Record.readSourceLocation());
11710 C->setEventHandler(Record.readSubExpr());
11711 C->setLParenLoc(Record.readSourceLocation());
11715 C->setCondition(Record.readSubExpr());
11716 C->setLParenLoc(Record.readSourceLocation());
11723void OMPClauseReader::VisitOMPReadClause(
OMPReadClause *) {}
11728 if (
C->isExtended()) {
11729 C->setLParenLoc(Record.readSourceLocation());
11730 C->setArgumentLoc(Record.readSourceLocation());
11742 C->setLParenLoc(Record.readSourceLocation());
11743 SourceLocation FailParameterLoc = Record.readSourceLocation();
11744 C->setFailParameterLoc(FailParameterLoc);
11746 C->setFailParameter(CKind);
11750 unsigned Count =
C->getDirectiveKinds().size();
11751 C->setLParenLoc(Record.readSourceLocation());
11752 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11753 DKVec.reserve(Count);
11754 for (
unsigned I = 0; I < Count; I++) {
11757 C->setDirectiveKinds(DKVec);
11761 C->setExpr(Record.readExpr());
11762 C->setLParenLoc(Record.readSourceLocation());
11766 unsigned Count =
C->getDirectiveKinds().size();
11767 C->setLParenLoc(Record.readSourceLocation());
11768 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11769 DKVec.reserve(Count);
11770 for (
unsigned I = 0; I < Count; I++) {
11773 C->setDirectiveKinds(DKVec);
11778void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
11781void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
11796void OMPClauseReader::VisitOMPWeakClause(
OMPWeakClause *) {}
11800void OMPClauseReader::VisitOMPSIMDClause(
OMPSIMDClause *) {}
11805 unsigned NumVars =
C->varlist_size();
11806 SmallVector<Expr *, 16> Vars;
11807 Vars.reserve(NumVars);
11808 for (
unsigned I = 0; I != NumVars; ++I)
11809 Vars.push_back(Record.readSubExpr());
11810 C->setVarRefs(Vars);
11811 C->setIsTarget(Record.readBool());
11812 C->setIsTargetSync(Record.readBool());
11813 C->setLParenLoc(Record.readSourceLocation());
11814 C->setVarLoc(Record.readSourceLocation());
11818 C->setInteropVar(Record.readSubExpr());
11819 C->setLParenLoc(Record.readSourceLocation());
11820 C->setVarLoc(Record.readSourceLocation());
11824 C->setInteropVar(Record.readSubExpr());
11825 C->setLParenLoc(Record.readSourceLocation());
11826 C->setVarLoc(Record.readSourceLocation());
11831 C->setCondition(Record.readSubExpr());
11832 C->setLParenLoc(Record.readSourceLocation());
11837 C->setCondition(Record.readSubExpr());
11838 C->setLParenLoc(Record.readSourceLocation());
11843void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
11852void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
11854 C->setAtomicDefaultMemOrderKind(
11856 C->setLParenLoc(Record.readSourceLocation());
11857 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
11862void OMPClauseReader::VisitOMPAtClause(
OMPAtClause *
C) {
11864 C->setLParenLoc(Record.readSourceLocation());
11865 C->setAtKindKwLoc(Record.readSourceLocation());
11870 C->setLParenLoc(Record.readSourceLocation());
11871 C->setSeverityKindKwLoc(Record.readSourceLocation());
11876 C->setMessageString(Record.readSubExpr());
11877 C->setLParenLoc(Record.readSourceLocation());
11881 C->setLParenLoc(Record.readSourceLocation());
11882 unsigned NumVars =
C->varlist_size();
11883 SmallVector<Expr *, 16> Vars;
11884 Vars.reserve(NumVars);
11885 for (
unsigned i = 0; i != NumVars; ++i)
11886 Vars.push_back(Record.readSubExpr());
11887 C->setVarRefs(Vars);
11889 for (
unsigned i = 0; i != NumVars; ++i)
11890 Vars.push_back(Record.readSubExpr());
11891 C->setPrivateCopies(Vars);
11896 C->setLParenLoc(Record.readSourceLocation());
11897 unsigned NumVars =
C->varlist_size();
11898 SmallVector<Expr *, 16> Vars;
11899 Vars.reserve(NumVars);
11900 for (
unsigned i = 0; i != NumVars; ++i)
11901 Vars.push_back(Record.readSubExpr());
11902 C->setVarRefs(Vars);
11904 for (
unsigned i = 0; i != NumVars; ++i)
11905 Vars.push_back(Record.readSubExpr());
11906 C->setPrivateCopies(Vars);
11908 for (
unsigned i = 0; i != NumVars; ++i)
11909 Vars.push_back(Record.readSubExpr());
11915 C->setLParenLoc(Record.readSourceLocation());
11917 C->setKindLoc(Record.readSourceLocation());
11918 C->setColonLoc(Record.readSourceLocation());
11919 unsigned NumVars =
C->varlist_size();
11920 SmallVector<Expr *, 16> Vars;
11921 Vars.reserve(NumVars);
11922 for (
unsigned i = 0; i != NumVars; ++i)
11923 Vars.push_back(Record.readSubExpr());
11924 C->setVarRefs(Vars);
11926 for (
unsigned i = 0; i != NumVars; ++i)
11927 Vars.push_back(Record.readSubExpr());
11928 C->setPrivateCopies(Vars);
11930 for (
unsigned i = 0; i != NumVars; ++i)
11931 Vars.push_back(Record.readSubExpr());
11932 C->setSourceExprs(Vars);
11934 for (
unsigned i = 0; i != NumVars; ++i)
11935 Vars.push_back(Record.readSubExpr());
11936 C->setDestinationExprs(Vars);
11938 for (
unsigned i = 0; i != NumVars; ++i)
11939 Vars.push_back(Record.readSubExpr());
11940 C->setAssignmentOps(Vars);
11944 C->setLParenLoc(Record.readSourceLocation());
11945 unsigned NumVars =
C->varlist_size();
11946 SmallVector<Expr *, 16> Vars;
11947 Vars.reserve(NumVars);
11948 for (
unsigned i = 0; i != NumVars; ++i)
11949 Vars.push_back(Record.readSubExpr());
11950 C->setVarRefs(Vars);
11955 C->setLParenLoc(Record.readSourceLocation());
11956 C->setModifierLoc(Record.readSourceLocation());
11957 C->setColonLoc(Record.readSourceLocation());
11958 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
11959 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
11960 C->setQualifierLoc(NNSL);
11961 C->setNameInfo(DNI);
11963 unsigned NumVars =
C->varlist_size();
11964 SmallVector<Expr *, 16> Vars;
11965 Vars.reserve(NumVars);
11966 for (
unsigned i = 0; i != NumVars; ++i)
11967 Vars.push_back(Record.readSubExpr());
11968 C->setVarRefs(Vars);
11970 for (
unsigned i = 0; i != NumVars; ++i)
11971 Vars.push_back(Record.readSubExpr());
11972 C->setPrivates(Vars);
11974 for (
unsigned i = 0; i != NumVars; ++i)
11975 Vars.push_back(Record.readSubExpr());
11976 C->setLHSExprs(Vars);
11978 for (
unsigned i = 0; i != NumVars; ++i)
11979 Vars.push_back(Record.readSubExpr());
11980 C->setRHSExprs(Vars);
11982 for (
unsigned i = 0; i != NumVars; ++i)
11983 Vars.push_back(Record.readSubExpr());
11984 C->setReductionOps(Vars);
11985 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
11987 for (
unsigned i = 0; i != NumVars; ++i)
11988 Vars.push_back(Record.readSubExpr());
11989 C->setInscanCopyOps(Vars);
11991 for (
unsigned i = 0; i != NumVars; ++i)
11992 Vars.push_back(Record.readSubExpr());
11993 C->setInscanCopyArrayTemps(Vars);
11995 for (
unsigned i = 0; i != NumVars; ++i)
11996 Vars.push_back(Record.readSubExpr());
11997 C->setInscanCopyArrayElems(Vars);
11999 unsigned NumFlags = Record.readInt();
12000 SmallVector<bool, 16> Flags;
12001 Flags.reserve(NumFlags);
12002 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12003 Flags.push_back(Record.readInt());
12004 C->setPrivateVariableReductionFlags(Flags);
12009 C->setLParenLoc(Record.readSourceLocation());
12010 C->setColonLoc(Record.readSourceLocation());
12011 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12012 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12013 C->setQualifierLoc(NNSL);
12014 C->setNameInfo(DNI);
12016 unsigned NumVars =
C->varlist_size();
12017 SmallVector<Expr *, 16> Vars;
12018 Vars.reserve(NumVars);
12019 for (
unsigned I = 0; I != NumVars; ++I)
12020 Vars.push_back(Record.readSubExpr());
12021 C->setVarRefs(Vars);
12023 for (
unsigned I = 0; I != NumVars; ++I)
12024 Vars.push_back(Record.readSubExpr());
12025 C->setPrivates(Vars);
12027 for (
unsigned I = 0; I != NumVars; ++I)
12028 Vars.push_back(Record.readSubExpr());
12029 C->setLHSExprs(Vars);
12031 for (
unsigned I = 0; I != NumVars; ++I)
12032 Vars.push_back(Record.readSubExpr());
12033 C->setRHSExprs(Vars);
12035 for (
unsigned I = 0; I != NumVars; ++I)
12036 Vars.push_back(Record.readSubExpr());
12037 C->setReductionOps(Vars);
12042 C->setLParenLoc(Record.readSourceLocation());
12043 C->setColonLoc(Record.readSourceLocation());
12044 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12045 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12046 C->setQualifierLoc(NNSL);
12047 C->setNameInfo(DNI);
12049 unsigned NumVars =
C->varlist_size();
12050 SmallVector<Expr *, 16> Vars;
12051 Vars.reserve(NumVars);
12052 for (
unsigned I = 0; I != NumVars; ++I)
12053 Vars.push_back(Record.readSubExpr());
12054 C->setVarRefs(Vars);
12056 for (
unsigned I = 0; I != NumVars; ++I)
12057 Vars.push_back(Record.readSubExpr());
12058 C->setPrivates(Vars);
12060 for (
unsigned I = 0; I != NumVars; ++I)
12061 Vars.push_back(Record.readSubExpr());
12062 C->setLHSExprs(Vars);
12064 for (
unsigned I = 0; I != NumVars; ++I)
12065 Vars.push_back(Record.readSubExpr());
12066 C->setRHSExprs(Vars);
12068 for (
unsigned I = 0; I != NumVars; ++I)
12069 Vars.push_back(Record.readSubExpr());
12070 C->setReductionOps(Vars);
12072 for (
unsigned I = 0; I != NumVars; ++I)
12073 Vars.push_back(Record.readSubExpr());
12074 C->setTaskgroupDescriptors(Vars);
12079 C->setLParenLoc(Record.readSourceLocation());
12080 C->setColonLoc(Record.readSourceLocation());
12082 C->setModifierLoc(Record.readSourceLocation());
12083 unsigned NumVars =
C->varlist_size();
12084 SmallVector<Expr *, 16> Vars;
12085 Vars.reserve(NumVars);
12086 for (
unsigned i = 0; i != NumVars; ++i)
12087 Vars.push_back(Record.readSubExpr());
12088 C->setVarRefs(Vars);
12090 for (
unsigned i = 0; i != NumVars; ++i)
12091 Vars.push_back(Record.readSubExpr());
12092 C->setPrivates(Vars);
12094 for (
unsigned i = 0; i != NumVars; ++i)
12095 Vars.push_back(Record.readSubExpr());
12098 for (
unsigned i = 0; i != NumVars; ++i)
12099 Vars.push_back(Record.readSubExpr());
12100 C->setUpdates(Vars);
12102 for (
unsigned i = 0; i != NumVars; ++i)
12103 Vars.push_back(Record.readSubExpr());
12104 C->setFinals(Vars);
12105 C->setStep(Record.readSubExpr());
12106 C->setCalcStep(Record.readSubExpr());
12108 for (
unsigned I = 0; I != NumVars + 1; ++I)
12109 Vars.push_back(Record.readSubExpr());
12110 C->setUsedExprs(Vars);
12114 C->setLParenLoc(Record.readSourceLocation());
12115 C->setColonLoc(Record.readSourceLocation());
12116 unsigned NumVars =
C->varlist_size();
12117 SmallVector<Expr *, 16> Vars;
12118 Vars.reserve(NumVars);
12119 for (
unsigned i = 0; i != NumVars; ++i)
12120 Vars.push_back(Record.readSubExpr());
12121 C->setVarRefs(Vars);
12122 C->setAlignment(Record.readSubExpr());
12126 C->setLParenLoc(Record.readSourceLocation());
12127 unsigned NumVars =
C->varlist_size();
12128 SmallVector<Expr *, 16> Exprs;
12129 Exprs.reserve(NumVars);
12130 for (
unsigned i = 0; i != NumVars; ++i)
12131 Exprs.push_back(Record.readSubExpr());
12132 C->setVarRefs(Exprs);
12134 for (
unsigned i = 0; i != NumVars; ++i)
12135 Exprs.push_back(Record.readSubExpr());
12136 C->setSourceExprs(Exprs);
12138 for (
unsigned i = 0; i != NumVars; ++i)
12139 Exprs.push_back(Record.readSubExpr());
12140 C->setDestinationExprs(Exprs);
12142 for (
unsigned i = 0; i != NumVars; ++i)
12143 Exprs.push_back(Record.readSubExpr());
12144 C->setAssignmentOps(Exprs);
12148 C->setLParenLoc(Record.readSourceLocation());
12149 unsigned NumVars =
C->varlist_size();
12150 SmallVector<Expr *, 16> Exprs;
12151 Exprs.reserve(NumVars);
12152 for (
unsigned i = 0; i != NumVars; ++i)
12153 Exprs.push_back(Record.readSubExpr());
12154 C->setVarRefs(Exprs);
12156 for (
unsigned i = 0; i != NumVars; ++i)
12157 Exprs.push_back(Record.readSubExpr());
12158 C->setSourceExprs(Exprs);
12160 for (
unsigned i = 0; i != NumVars; ++i)
12161 Exprs.push_back(Record.readSubExpr());
12162 C->setDestinationExprs(Exprs);
12164 for (
unsigned i = 0; i != NumVars; ++i)
12165 Exprs.push_back(Record.readSubExpr());
12166 C->setAssignmentOps(Exprs);
12170 C->setLParenLoc(Record.readSourceLocation());
12171 unsigned NumVars =
C->varlist_size();
12172 SmallVector<Expr *, 16> Vars;
12173 Vars.reserve(NumVars);
12174 for (
unsigned i = 0; i != NumVars; ++i)
12175 Vars.push_back(Record.readSubExpr());
12176 C->setVarRefs(Vars);
12180 C->setDepobj(Record.readSubExpr());
12181 C->setLParenLoc(Record.readSourceLocation());
12185 C->setLParenLoc(Record.readSourceLocation());
12186 C->setModifier(Record.readSubExpr());
12187 C->setDependencyKind(
12189 C->setDependencyLoc(Record.readSourceLocation());
12190 C->setColonLoc(Record.readSourceLocation());
12191 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12192 unsigned NumVars =
C->varlist_size();
12193 SmallVector<Expr *, 16> Vars;
12194 Vars.reserve(NumVars);
12195 for (
unsigned I = 0; I != NumVars; ++I)
12196 Vars.push_back(Record.readSubExpr());
12197 C->setVarRefs(Vars);
12198 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12199 C->setLoopData(I, Record.readSubExpr());
12205 C->setDevice(Record.readSubExpr());
12206 C->setModifierLoc(Record.readSourceLocation());
12207 C->setLParenLoc(Record.readSourceLocation());
12211 C->setLParenLoc(Record.readSourceLocation());
12212 bool HasIteratorModifier =
false;
12214 C->setMapTypeModifier(
12216 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12217 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12218 HasIteratorModifier =
true;
12220 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12221 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12224 C->setMapLoc(Record.readSourceLocation());
12225 C->setColonLoc(Record.readSourceLocation());
12226 auto NumVars =
C->varlist_size();
12227 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12228 auto TotalLists =
C->getTotalComponentListNum();
12229 auto TotalComponents =
C->getTotalComponentsNum();
12231 SmallVector<Expr *, 16> Vars;
12232 Vars.reserve(NumVars);
12233 for (
unsigned i = 0; i != NumVars; ++i)
12234 Vars.push_back(Record.readExpr());
12235 C->setVarRefs(Vars);
12237 SmallVector<Expr *, 16> UDMappers;
12238 UDMappers.reserve(NumVars);
12239 for (
unsigned I = 0; I < NumVars; ++I)
12240 UDMappers.push_back(Record.readExpr());
12241 C->setUDMapperRefs(UDMappers);
12243 if (HasIteratorModifier)
12244 C->setIteratorModifier(Record.readExpr());
12246 SmallVector<ValueDecl *, 16> Decls;
12247 Decls.reserve(UniqueDecls);
12248 for (
unsigned i = 0; i < UniqueDecls; ++i)
12249 Decls.push_back(Record.readDeclAs<ValueDecl>());
12250 C->setUniqueDecls(Decls);
12252 SmallVector<unsigned, 16> ListsPerDecl;
12253 ListsPerDecl.reserve(UniqueDecls);
12254 for (
unsigned i = 0; i < UniqueDecls; ++i)
12255 ListsPerDecl.push_back(Record.readInt());
12256 C->setDeclNumLists(ListsPerDecl);
12258 SmallVector<unsigned, 32> ListSizes;
12259 ListSizes.reserve(TotalLists);
12260 for (
unsigned i = 0; i < TotalLists; ++i)
12261 ListSizes.push_back(Record.readInt());
12262 C->setComponentListSizes(ListSizes);
12264 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12265 Components.reserve(TotalComponents);
12266 for (
unsigned i = 0; i < TotalComponents; ++i) {
12267 Expr *AssociatedExprPr = Record.readExpr();
12268 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12269 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12272 C->setComponents(Components, ListSizes);
12278 C->setLParenLoc(Record.readSourceLocation());
12279 C->setColonLoc(Record.readSourceLocation());
12280 C->setAllocator(Record.readSubExpr());
12281 C->setAlignment(Record.readSubExpr());
12282 unsigned NumVars =
C->varlist_size();
12283 SmallVector<Expr *, 16> Vars;
12284 Vars.reserve(NumVars);
12285 for (
unsigned i = 0; i != NumVars; ++i)
12286 Vars.push_back(Record.readSubExpr());
12287 C->setVarRefs(Vars);
12292 C->setLParenLoc(Record.readSourceLocation());
12293 unsigned NumVars =
C->varlist_size();
12294 SmallVector<Expr *, 16> Vars;
12295 Vars.reserve(NumVars);
12296 for (
unsigned I = 0; I != NumVars; ++I)
12297 Vars.push_back(Record.readSubExpr());
12298 C->setVarRefs(Vars);
12303 C->setLParenLoc(Record.readSourceLocation());
12304 unsigned NumVars =
C->varlist_size();
12305 SmallVector<Expr *, 16> Vars;
12306 Vars.reserve(NumVars);
12307 for (
unsigned I = 0; I != NumVars; ++I)
12308 Vars.push_back(Record.readSubExpr());
12309 C->setVarRefs(Vars);
12314 C->setPriority(Record.readSubExpr());
12315 C->setLParenLoc(Record.readSourceLocation());
12321 C->setGrainsize(Record.readSubExpr());
12322 C->setModifierLoc(Record.readSourceLocation());
12323 C->setLParenLoc(Record.readSourceLocation());
12329 C->setNumTasks(Record.readSubExpr());
12330 C->setModifierLoc(Record.readSourceLocation());
12331 C->setLParenLoc(Record.readSourceLocation());
12335 C->setHint(Record.readSubExpr());
12336 C->setLParenLoc(Record.readSourceLocation());
12341 C->setDistScheduleKind(
12343 C->setChunkSize(Record.readSubExpr());
12344 C->setLParenLoc(Record.readSourceLocation());
12345 C->setDistScheduleKindLoc(Record.readSourceLocation());
12346 C->setCommaLoc(Record.readSourceLocation());
12350 C->setDefaultmapKind(
12352 C->setDefaultmapModifier(
12354 C->setLParenLoc(Record.readSourceLocation());
12355 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12356 C->setDefaultmapKindLoc(Record.readSourceLocation());
12359void OMPClauseReader::VisitOMPToClause(
OMPToClause *
C) {
12360 C->setLParenLoc(Record.readSourceLocation());
12362 C->setMotionModifier(
12364 C->setMotionModifierLoc(I, Record.readSourceLocation());
12366 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12367 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12368 C->setColonLoc(Record.readSourceLocation());
12369 auto NumVars =
C->varlist_size();
12370 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12371 auto TotalLists =
C->getTotalComponentListNum();
12372 auto TotalComponents =
C->getTotalComponentsNum();
12374 SmallVector<Expr *, 16> Vars;
12375 Vars.reserve(NumVars);
12376 for (
unsigned i = 0; i != NumVars; ++i)
12377 Vars.push_back(Record.readSubExpr());
12378 C->setVarRefs(Vars);
12380 SmallVector<Expr *, 16> UDMappers;
12381 UDMappers.reserve(NumVars);
12382 for (
unsigned I = 0; I < NumVars; ++I)
12383 UDMappers.push_back(Record.readSubExpr());
12384 C->setUDMapperRefs(UDMappers);
12386 SmallVector<ValueDecl *, 16> Decls;
12387 Decls.reserve(UniqueDecls);
12388 for (
unsigned i = 0; i < UniqueDecls; ++i)
12389 Decls.push_back(Record.readDeclAs<ValueDecl>());
12390 C->setUniqueDecls(Decls);
12392 SmallVector<unsigned, 16> ListsPerDecl;
12393 ListsPerDecl.reserve(UniqueDecls);
12394 for (
unsigned i = 0; i < UniqueDecls; ++i)
12395 ListsPerDecl.push_back(Record.readInt());
12396 C->setDeclNumLists(ListsPerDecl);
12398 SmallVector<unsigned, 32> ListSizes;
12399 ListSizes.reserve(TotalLists);
12400 for (
unsigned i = 0; i < TotalLists; ++i)
12401 ListSizes.push_back(Record.readInt());
12402 C->setComponentListSizes(ListSizes);
12404 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12405 Components.reserve(TotalComponents);
12406 for (
unsigned i = 0; i < TotalComponents; ++i) {
12407 Expr *AssociatedExprPr = Record.readSubExpr();
12408 bool IsNonContiguous = Record.readBool();
12409 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12410 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12412 C->setComponents(Components, ListSizes);
12416 C->setLParenLoc(Record.readSourceLocation());
12418 C->setMotionModifier(
12420 C->setMotionModifierLoc(I, Record.readSourceLocation());
12422 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12423 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12424 C->setColonLoc(Record.readSourceLocation());
12425 auto NumVars =
C->varlist_size();
12426 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12427 auto TotalLists =
C->getTotalComponentListNum();
12428 auto TotalComponents =
C->getTotalComponentsNum();
12430 SmallVector<Expr *, 16> Vars;
12431 Vars.reserve(NumVars);
12432 for (
unsigned i = 0; i != NumVars; ++i)
12433 Vars.push_back(Record.readSubExpr());
12434 C->setVarRefs(Vars);
12436 SmallVector<Expr *, 16> UDMappers;
12437 UDMappers.reserve(NumVars);
12438 for (
unsigned I = 0; I < NumVars; ++I)
12439 UDMappers.push_back(Record.readSubExpr());
12440 C->setUDMapperRefs(UDMappers);
12442 SmallVector<ValueDecl *, 16> Decls;
12443 Decls.reserve(UniqueDecls);
12444 for (
unsigned i = 0; i < UniqueDecls; ++i)
12445 Decls.push_back(Record.readDeclAs<ValueDecl>());
12446 C->setUniqueDecls(Decls);
12448 SmallVector<unsigned, 16> ListsPerDecl;
12449 ListsPerDecl.reserve(UniqueDecls);
12450 for (
unsigned i = 0; i < UniqueDecls; ++i)
12451 ListsPerDecl.push_back(Record.readInt());
12452 C->setDeclNumLists(ListsPerDecl);
12454 SmallVector<unsigned, 32> ListSizes;
12455 ListSizes.reserve(TotalLists);
12456 for (
unsigned i = 0; i < TotalLists; ++i)
12457 ListSizes.push_back(Record.readInt());
12458 C->setComponentListSizes(ListSizes);
12460 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12461 Components.reserve(TotalComponents);
12462 for (
unsigned i = 0; i < TotalComponents; ++i) {
12463 Expr *AssociatedExprPr = Record.readSubExpr();
12464 bool IsNonContiguous = Record.readBool();
12465 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12466 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12468 C->setComponents(Components, ListSizes);
12472 C->setLParenLoc(Record.readSourceLocation());
12473 auto NumVars =
C->varlist_size();
12474 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12475 auto TotalLists =
C->getTotalComponentListNum();
12476 auto TotalComponents =
C->getTotalComponentsNum();
12478 SmallVector<Expr *, 16> Vars;
12479 Vars.reserve(NumVars);
12480 for (
unsigned i = 0; i != NumVars; ++i)
12481 Vars.push_back(Record.readSubExpr());
12482 C->setVarRefs(Vars);
12484 for (
unsigned i = 0; i != NumVars; ++i)
12485 Vars.push_back(Record.readSubExpr());
12486 C->setPrivateCopies(Vars);
12488 for (
unsigned i = 0; i != NumVars; ++i)
12489 Vars.push_back(Record.readSubExpr());
12492 SmallVector<ValueDecl *, 16> Decls;
12493 Decls.reserve(UniqueDecls);
12494 for (
unsigned i = 0; i < UniqueDecls; ++i)
12495 Decls.push_back(Record.readDeclAs<ValueDecl>());
12496 C->setUniqueDecls(Decls);
12498 SmallVector<unsigned, 16> ListsPerDecl;
12499 ListsPerDecl.reserve(UniqueDecls);
12500 for (
unsigned i = 0; i < UniqueDecls; ++i)
12501 ListsPerDecl.push_back(Record.readInt());
12502 C->setDeclNumLists(ListsPerDecl);
12504 SmallVector<unsigned, 32> ListSizes;
12505 ListSizes.reserve(TotalLists);
12506 for (
unsigned i = 0; i < TotalLists; ++i)
12507 ListSizes.push_back(Record.readInt());
12508 C->setComponentListSizes(ListSizes);
12510 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12511 Components.reserve(TotalComponents);
12512 for (
unsigned i = 0; i < TotalComponents; ++i) {
12513 auto *AssociatedExprPr = Record.readSubExpr();
12514 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12515 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12518 C->setComponents(Components, ListSizes);
12522 C->setLParenLoc(Record.readSourceLocation());
12523 auto NumVars =
C->varlist_size();
12524 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12525 auto TotalLists =
C->getTotalComponentListNum();
12526 auto TotalComponents =
C->getTotalComponentsNum();
12528 SmallVector<Expr *, 16> Vars;
12529 Vars.reserve(NumVars);
12530 for (
unsigned i = 0; i != NumVars; ++i)
12531 Vars.push_back(Record.readSubExpr());
12532 C->setVarRefs(Vars);
12534 SmallVector<ValueDecl *, 16> Decls;
12535 Decls.reserve(UniqueDecls);
12536 for (
unsigned i = 0; i < UniqueDecls; ++i)
12537 Decls.push_back(Record.readDeclAs<ValueDecl>());
12538 C->setUniqueDecls(Decls);
12540 SmallVector<unsigned, 16> ListsPerDecl;
12541 ListsPerDecl.reserve(UniqueDecls);
12542 for (
unsigned i = 0; i < UniqueDecls; ++i)
12543 ListsPerDecl.push_back(Record.readInt());
12544 C->setDeclNumLists(ListsPerDecl);
12546 SmallVector<unsigned, 32> ListSizes;
12547 ListSizes.reserve(TotalLists);
12548 for (
unsigned i = 0; i < TotalLists; ++i)
12549 ListSizes.push_back(Record.readInt());
12550 C->setComponentListSizes(ListSizes);
12552 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12553 Components.reserve(TotalComponents);
12554 for (
unsigned i = 0; i < TotalComponents; ++i) {
12555 Expr *AssociatedExpr = Record.readSubExpr();
12556 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12557 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12560 C->setComponents(Components, ListSizes);
12564 C->setLParenLoc(Record.readSourceLocation());
12565 auto NumVars =
C->varlist_size();
12566 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12567 auto TotalLists =
C->getTotalComponentListNum();
12568 auto TotalComponents =
C->getTotalComponentsNum();
12570 SmallVector<Expr *, 16> Vars;
12571 Vars.reserve(NumVars);
12572 for (
unsigned i = 0; i != NumVars; ++i)
12573 Vars.push_back(Record.readSubExpr());
12574 C->setVarRefs(Vars);
12577 SmallVector<ValueDecl *, 16> Decls;
12578 Decls.reserve(UniqueDecls);
12579 for (
unsigned i = 0; i < UniqueDecls; ++i)
12580 Decls.push_back(Record.readDeclAs<ValueDecl>());
12581 C->setUniqueDecls(Decls);
12583 SmallVector<unsigned, 16> ListsPerDecl;
12584 ListsPerDecl.reserve(UniqueDecls);
12585 for (
unsigned i = 0; i < UniqueDecls; ++i)
12586 ListsPerDecl.push_back(Record.readInt());
12587 C->setDeclNumLists(ListsPerDecl);
12589 SmallVector<unsigned, 32> ListSizes;
12590 ListSizes.reserve(TotalLists);
12591 for (
unsigned i = 0; i < TotalLists; ++i)
12592 ListSizes.push_back(Record.readInt());
12593 C->setComponentListSizes(ListSizes);
12595 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12596 Components.reserve(TotalComponents);
12597 for (
unsigned i = 0; i < TotalComponents; ++i) {
12598 Expr *AssociatedExpr = Record.readSubExpr();
12599 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12600 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12603 C->setComponents(Components, ListSizes);
12607 C->setLParenLoc(Record.readSourceLocation());
12608 auto NumVars =
C->varlist_size();
12609 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12610 auto TotalLists =
C->getTotalComponentListNum();
12611 auto TotalComponents =
C->getTotalComponentsNum();
12613 SmallVector<Expr *, 16> Vars;
12614 Vars.reserve(NumVars);
12615 for (
unsigned I = 0; I != NumVars; ++I)
12616 Vars.push_back(Record.readSubExpr());
12617 C->setVarRefs(Vars);
12620 SmallVector<ValueDecl *, 16> Decls;
12621 Decls.reserve(UniqueDecls);
12622 for (
unsigned I = 0; I < UniqueDecls; ++I)
12623 Decls.push_back(Record.readDeclAs<ValueDecl>());
12624 C->setUniqueDecls(Decls);
12626 SmallVector<unsigned, 16> ListsPerDecl;
12627 ListsPerDecl.reserve(UniqueDecls);
12628 for (
unsigned I = 0; I < UniqueDecls; ++I)
12629 ListsPerDecl.push_back(Record.readInt());
12630 C->setDeclNumLists(ListsPerDecl);
12632 SmallVector<unsigned, 32> ListSizes;
12633 ListSizes.reserve(TotalLists);
12634 for (
unsigned i = 0; i < TotalLists; ++i)
12635 ListSizes.push_back(Record.readInt());
12636 C->setComponentListSizes(ListSizes);
12638 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12639 Components.reserve(TotalComponents);
12640 for (
unsigned I = 0; I < TotalComponents; ++I) {
12641 Expr *AssociatedExpr = Record.readSubExpr();
12642 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12643 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12646 C->setComponents(Components, ListSizes);
12650 C->setLParenLoc(Record.readSourceLocation());
12651 unsigned NumVars =
C->varlist_size();
12652 SmallVector<Expr *, 16> Vars;
12653 Vars.reserve(NumVars);
12654 for (
unsigned i = 0; i != NumVars; ++i)
12655 Vars.push_back(Record.readSubExpr());
12656 C->setVarRefs(Vars);
12658 Vars.reserve(NumVars);
12659 for (
unsigned i = 0; i != NumVars; ++i)
12660 Vars.push_back(Record.readSubExpr());
12661 C->setPrivateRefs(Vars);
12665 C->setLParenLoc(Record.readSourceLocation());
12666 unsigned NumVars =
C->varlist_size();
12667 SmallVector<Expr *, 16> Vars;
12668 Vars.reserve(NumVars);
12669 for (
unsigned i = 0; i != NumVars; ++i)
12670 Vars.push_back(Record.readSubExpr());
12671 C->setVarRefs(Vars);
12675 C->setLParenLoc(Record.readSourceLocation());
12676 unsigned NumVars =
C->varlist_size();
12677 SmallVector<Expr *, 16> Vars;
12678 Vars.reserve(NumVars);
12679 for (
unsigned i = 0; i != NumVars; ++i)
12680 Vars.push_back(Record.readSubExpr());
12681 C->setVarRefs(Vars);
12685 C->setLParenLoc(Record.readSourceLocation());
12686 unsigned NumOfAllocators =
C->getNumberOfAllocators();
12687 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
12688 Data.reserve(NumOfAllocators);
12689 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
12690 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
12693 D.
LParenLoc = Record.readSourceLocation();
12694 D.
RParenLoc = Record.readSourceLocation();
12696 C->setAllocatorsData(
Data);
12700 C->setLParenLoc(Record.readSourceLocation());
12701 C->setModifier(Record.readSubExpr());
12702 C->setColonLoc(Record.readSourceLocation());
12703 unsigned NumOfLocators =
C->varlist_size();
12704 SmallVector<Expr *, 4> Locators;
12705 Locators.reserve(NumOfLocators);
12706 for (
unsigned I = 0; I != NumOfLocators; ++I)
12707 Locators.push_back(Record.readSubExpr());
12708 C->setVarRefs(Locators);
12714 C->setLParenLoc(Record.readSourceLocation());
12715 C->setKindKwLoc(Record.readSourceLocation());
12716 C->setModifierKwLoc(Record.readSourceLocation());
12721 C->setThreadID(Record.readSubExpr());
12722 C->setLParenLoc(Record.readSourceLocation());
12727 C->setLParenLoc(Record.readSourceLocation());
12728 C->setBindKindLoc(Record.readSourceLocation());
12732 C->setAlignment(Record.readExpr());
12733 C->setLParenLoc(Record.readSourceLocation());
12738 C->setSize(Record.readSubExpr());
12739 C->setLParenLoc(Record.readSourceLocation());
12742void OMPClauseReader::VisitOMPDynGroupprivateClause(
12745 C->setDynGroupprivateModifier(
12747 C->setDynGroupprivateFallbackModifier(
12749 C->setSize(Record.readSubExpr());
12750 C->setLParenLoc(Record.readSourceLocation());
12751 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
12752 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
12756 C->setLParenLoc(Record.readSourceLocation());
12757 C->setDependenceType(
12759 C->setDependenceLoc(Record.readSourceLocation());
12760 C->setColonLoc(Record.readSourceLocation());
12761 unsigned NumVars =
C->varlist_size();
12762 SmallVector<Expr *, 16> Vars;
12763 Vars.reserve(NumVars);
12764 for (
unsigned I = 0; I != NumVars; ++I)
12765 Vars.push_back(Record.readSubExpr());
12766 C->setVarRefs(Vars);
12767 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12768 C->setLoopData(I, Record.readSubExpr());
12773 Record.readAttributes(Attrs);
12774 C->setAttrs(Attrs);
12775 C->setLocStart(Record.readSourceLocation());
12776 C->setLParenLoc(Record.readSourceLocation());
12777 C->setLocEnd(Record.readSourceLocation());
12790 Selector.ScoreOrCondition =
nullptr;
12792 Selector.ScoreOrCondition = readExprRef();
12804 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
12809 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
12811 Data->setClauses(Clauses);
12812 if (
Data->hasAssociatedStmt())
12814 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
12819 unsigned NumVars =
readInt();
12821 for (
unsigned I = 0; I < NumVars; ++I)
12827 unsigned NumExprs =
readInt();
12829 for (
unsigned I = 0; I < NumExprs; ++I)
12839 switch (ClauseKind) {
12854 bool isConditionExprClause =
readBool();
12855 if (isConditionExprClause) {
12860 unsigned NumVars =
readInt();
12862 for (
unsigned I = 0; I < NumVars; ++I)
12869 unsigned NumClauses =
readInt();
12871 for (
unsigned I = 0; I < NumClauses; ++I)
12905 for (
unsigned I = 0; I < VarList.size(); ++I) {
12908 RecipeList.push_back({Alloca});
12912 VarList, RecipeList, EndLoc);
12930 for (
unsigned I = 0; I < VarList.size(); ++I) {
12934 RecipeList.push_back({Recipe, RecipeTemp});
12938 VarList, RecipeList, EndLoc);
12989 LParenLoc, ModList, VarList, EndLoc);
12998 LParenLoc, ModList, VarList, EndLoc);
13007 LParenLoc, ModList, VarList, EndLoc);
13016 LParenLoc, ModList, VarList, EndLoc);
13022 AsyncExpr, EndLoc);
13030 DevNumExpr, QueuesLoc, QueueIdExprs,
13037 unsigned NumArchs =
readInt();
13039 for (
unsigned I = 0; I < NumArchs; ++I) {
13042 Archs.emplace_back(Loc, Ident);
13046 LParenLoc, Archs, EndLoc);
13054 for (
unsigned I = 0; I < VarList.size(); ++I) {
13058 3 *
sizeof(
int *));
13061 unsigned NumCombiners =
readInt();
13062 for (
unsigned I = 0; I < NumCombiners; ++I) {
13067 Combiners.push_back({LHS, RHS, Op});
13070 RecipeList.push_back({Recipe, Combiners});
13074 VarList, RecipeList, EndLoc);
13093 HasForce, LoopCount, EndLoc);
13097 unsigned NumClauses =
readInt();
13099 for (
unsigned I = 0; I < NumClauses; ++I)
13102 SizeExprs, EndLoc);
13106 unsigned NumExprs =
readInt();
13109 for (
unsigned I = 0; I < NumExprs; ++I) {
13115 GangKinds, Exprs, EndLoc);
13121 WorkerExpr, EndLoc);
13127 VectorExpr, EndLoc);
13139 LParenLoc, VarList, EndLoc);
13153 llvm_unreachable(
"Clause serialization not yet implemented");
13155 llvm_unreachable(
"Invalid Clause Kind");
13160 for (
unsigned I = 0; I < Clauses.size(); ++I)
13165 unsigned NumVars =
readInt();
13166 A->Clauses.resize(NumVars);
13173 llvm::FoldingSetNodeID ID;
13174 ID.AddString(PrimaryModuleName);
13175 return ID.computeStableHash();
13180 return std::nullopt;
13183 return std::nullopt;
13186 return std::nullopt;
Defines the clang::ASTContext interface.
static unsigned moduleKindForDiagnostic(ModuleKind Kind)
static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, ASTConsumer *Consumer)
Under non-PCH compilation the consumer receives the objc methods before receiving the implementation,...
static bool checkCodegenOptions(const CodeGenOptions &CGOpts, const CodeGenOptions &ExistingCGOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream)
Whether Stream doesn't start with the AST file magic number 'CPCH'.
static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags)
static bool checkModuleCachePath(llvm::vfs::FileSystem &VFS, StringRef SpecificModuleCachePath, StringRef ExistingModuleCachePath, StringRef ModuleFilename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts)
Check that the specified and the existing module cache paths are equivalent.
static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID)
static void collectMacroDefinitions(const PreprocessorOptions &PPOpts, MacroDefinitionsMap &Macros, SmallVectorImpl< StringRef > *MacroNames=nullptr)
Collect the macro definitions provided by the given preprocessor options.
static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II, bool IsModule)
static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method)
Move the given method to the back of the global list of methods.
static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps)
static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)
Whether the given identifier is "interesting".
static bool parseModuleFileExtensionMetadata(const SmallVectorImpl< uint64_t > &Record, StringRef Blob, ModuleFileExtensionMetadata &Metadata)
Parse a record and blob containing module file extension metadata.
static Module * getTopImportImplicitModule(ModuleManager &ModuleMgr, Preprocessor &PP)
Return the top import module if it is implicit, nullptr otherwise.
static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename, bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr, std::string &SuggestedPredefines, const LangOptions &LangOpts, OptionValidation Validation=OptionValidateContradictions)
Check the preprocessor options deserialized from the control block against the preprocessor options i...
static void addMethodsToPool(Sema &S, ArrayRef< ObjCMethodDecl * > Methods, ObjCMethodList &List)
Add the given set of methods to the method list.
static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool IsSystem, bool SystemHeaderWarningsInModule, bool Complain)
static bool isPredefinedType(serialization::TypeID ID)
static bool readBit(unsigned &Bits)
static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool Complain)
static std::optional< Type::TypeClass > getTypeClassForCode(TypeCode code)
static std::pair< unsigned, unsigned > readULEBKeyDataLength(const unsigned char *&P)
Read ULEB-encoded key length and data length.
static unsigned getStableHashForModuleName(StringRef PrimaryModuleName)
static LLVM_DUMP_METHOD void dumpModuleIDMap(StringRef Name, const ContinuousRangeMap< Key, ModuleFile *, InitialCapacity > &Map)
@ OptionValidateStrictMatches
@ OptionValidateContradictions
static bool checkTargetOptions(const TargetOptions &TargetOpts, const TargetOptions &ExistingTargetOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of target options against an existing set of target options.
static bool checkLanguageOptions(const LangOptions &LangOpts, const LangOptions &ExistingLangOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of language options against an existing set of language options.
static std::pair< StringRef, StringRef > getUnresolvedInputFilenames(const ASTReader::RecordData &Record, const StringRef InputBlob)
#define CHECK_TARGET_OPT(Field, Name)
static ASTFileSignature readASTFileSignature(StringRef PCH)
Reads and return the signature record from PCH's control block, or else returns 0.
static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID)
Given a cursor at the start of an AST file, scan ahead and drop the cursor into the start of the give...
static unsigned getIndexForTypeID(serialization::TypeID ID)
static uint64_t readULEB(const unsigned char *&P)
Defines the clang::ASTSourceDescriptor class, which abstracts clang modules and precompiled header fi...
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines the Diagnostic-related interfaces.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the Diagnostic IDs-related interfaces.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::FileManager interface and associated types.
Defines the clang::FileSystemOptions interface.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
Defines some OpenACC-specific enums and functions.
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
Defines an enumeration for C++ overloaded operators.
Defines the clang::Preprocessor interface.
Defines the clang::SanitizerKind enum.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for Objective-C.
Defines the clang::SourceLocation class and associated facilities.
Defines implementation details of the clang::SourceManager class.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
Defines the clang::TargetOptions class.
#define IMPORT(DERIVED, BASE)
Defines the clang::TokenKind enum and support functions.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
Defines version macros and version-related utility functions for Clang.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
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,...
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
ASTIdentifierIterator(const ASTReader &Reader, bool SkipModules=false)
StringRef Next() override
Retrieve the next string in the identifier table and advances the iterator for the following string.
Abstract interface for callback invocations by the ASTReader.
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
virtual ~ASTReaderListener()
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain)
Receives the header search options.
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
virtual void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind)
This is called for each AST file loaded.
virtual void ReadModuleName(StringRef ModuleName)
virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value)
Receives COUNTER value.
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the codegen options.
Reads an AST files chain containing the contents of a translation unit.
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const
Retrieve the global submodule ID given a module and its local ID number.
ExtKind hasExternalDefinitions(const Decl *D) override
IdentifierTable & getIdentifierTable()
Retrieve the identifier table associated with the preprocessor.
ModuleManager & getModuleManager()
Retrieve the module manager.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx)
void ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector< Decl *, 4 > &Decls) override
Read the set of decls to be checked for deferred diags.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
@ ARR_VersionMismatch
The client can handle an AST file that cannot load because it was built with a different version of C...
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &Exprs) override
void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls) override
Get the decls that are contained in a file in the Offset/Length range.
std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record, unsigned &Idx, StringRef &Blob)
SourceRange ReadSkippedRange(unsigned Index) override
Read a preallocated skipped range from the external source.
serialization::TypeID getGlobalTypeID(ModuleFile &F, serialization::LocalTypeID LocalID) const
Map a local type ID within a given AST file into a global type ID.
void dump()
Dump information about the AST reader to standard error.
MacroInfo * ReadMacroRecord(ModuleFile &F, uint64_t Offset)
Reads the macro record located at the given offset.
SmallVector< std::pair< llvm::BitstreamCursor, serialization::ModuleFile * >, 8 > CommentsCursors
Cursors for comments blocks.
Selector getLocalSelector(ModuleFile &M, unsigned LocalID)
Retrieve a selector from the given module with its local ID number.
void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Decls) override
Read all of the declarations lexically stored in a declaration context.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
std::optional< ASTSourceDescriptor > getSourceDescriptor(unsigned ID) override
Return a descriptor for the corresponding module.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ClearSwitchCaseIDs()
void SetGloballyVisibleDecls(IdentifierInfo *II, const SmallVectorImpl< GlobalDeclID > &DeclIDs, SmallVectorImpl< Decl * > *Decls=nullptr)
Set the globally-visible declarations associated with the given identifier.
serialization::ModuleKind ModuleKind
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility, SourceLocation ImportLoc)
Make the entities in the given module and any of its (non-explicit) submodules visible to name lookup...
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a source range.
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
static std::string ResolveImportedPathAndAllocate(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx, StringRef &Blob)
CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
Read the contents of a CXXCtorInitializer array.
void visitInputFileInfos(serialization::ModuleFile &MF, bool IncludeSystem, llvm::function_ref< void(const serialization::InputFileInfo &IFI, bool IsSystem)> Visitor)
Visit all the input file infos of the given module file.
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo)
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs) override
Read the set of tentative definitions known to the external Sema source.
Decl * GetExternalDecl(GlobalDeclID ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
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)
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
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.
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, StringRef ExistingModuleCachePath, bool RequireStrictOptionMatches=false)
Determine whether the given AST file is acceptable to load into a translation unit with the given lan...
llvm::iterator_range< ModuleDeclIterator > getModuleFileLevelDecls(ModuleFile &Mod)
Stmt * GetExternalDeclStmt(uint64_t Offset) override
Resolve the offset of a statement into a statement.
Selector GetExternalSelector(serialization::SelectorID ID) override
Resolve a selector ID into a selector.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
MacroInfo * getMacro(serialization::MacroID ID)
Retrieve the macro with the given ID.
void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined) override
Load the set of used but not defined functions or variables with internal linkage,...
void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls) override
Read the set of delegating constructors known to the external Sema source.
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
void addPendingMacro(IdentifierInfo *II, ModuleFile *M, uint32_t MacroDirectivesOffset)
Add a macro to deserialize its macro directive history.
GlobalDeclID getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const
Map from a local declaration ID within a given module to a global declaration ID.
void ReadWeakUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, WeakInfo > > &WeakIDs) override
Read the set of weak, undeclared identifiers known to the external Sema source.
void completeVisibleDeclsMap(const DeclContext *DC) override
Load all external visible decls in the given DeclContext.
void AssignedLambdaNumbering(CXXRecordDecl *Lambda) override
Notify the external source that a lambda was assigned a mangling number.
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector< const TypedefNameDecl *, 4 > &Decls) override
Read the set of potentially unused typedefs known to the source.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
SmallVector< GlobalDeclID, 16 > PreloadedDeclIDs
std::pair< SourceLocation, StringRef > getModuleImportLoc(int ID) override
Retrieve the module import location and module name for the given source manager entry ID.
void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls) override
Read the set of unused file-scope declarations known to the external Sema source.
void ReadReferencedSelectors(SmallVectorImpl< std::pair< Selector, SourceLocation > > &Sels) override
Read the set of referenced selectors known to the external Sema source.
Selector DecodeSelector(serialization::SelectorID Idx)
ASTReadResult ReadAST(StringRef FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
friend class serialization::reader::ASTIdentifierLookupTrait
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC) override
Finds all the visible declarations with a given name.
IdentifierInfo * DecodeIdentifierInfo(serialization::IdentifierID ID)
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
@ Success
The control block was read successfully.
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
@ Failure
The AST file itself appears corrupted.
@ VersionMismatch
The AST file was written by a different version of Clang.
@ HadErrors
The AST file has errors.
@ Missing
The AST file was missing.
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx)
Reads a token out of a record.
SwitchCase * getSwitchCaseWithID(unsigned ID)
Retrieve the switch-case statement with the given ID.
serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID)
FileID TranslateFileID(ModuleFile &F, FileID FID) const
Translate a FileID from another module file's FileID space into ours.
void ReadLateParsedTemplates(llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > &LPTMap) override
Read the set of late parsed template functions for this source.
IdentifierIterator * getIdentifiers() override
Retrieve an iterator into the set of all identifiers in all loaded AST files.
void ReadUsedVTables(SmallVectorImpl< ExternalVTableUse > &VTables) override
Read the set of used vtables known to the external Sema source.
bool isGlobalIndexUnavailable() const
Determine whether we tried to load the global index, but failed, e.g., because it is out-of-date or d...
uint32_t GetNumExternalSelectors() override
Returns the number of selectors known to the external AST source.
static TemporarilyOwnedStringRef ResolveImportedPath(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
void updateOutOfDateSelector(Selector Sel) override
Load the contents of the global method pool for a given selector if necessary.
Decl * GetExistingDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration.
static llvm::BitVector ReadBitVector(const RecordData &Record, const StringRef Blob)
ModuleFile * getLocalModuleFile(ModuleFile &M, unsigned ID) const
Retrieve the module file with a given local ID within the specified ModuleFile.
ASTReader(Preprocessor &PP, ModuleCache &ModCache, ASTContext *Context, const PCHContainerReader &PCHContainerRdr, const CodeGenOptions &CodeGenOpts, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, StringRef isysroot="", DisableValidationForModuleKind DisableValidationKind=DisableValidationForModuleKind::None, bool AllowASTWithCompilerErrors=false, bool AllowConfigurationMismatch=false, bool ValidateSystemInputs=false, bool ForceValidateUserInputs=true, bool ValidateASTInputFilesContent=false, bool UseGlobalIndex=true, std::unique_ptr< llvm::Timer > ReadTimer={})
Load the AST file and validate its contents against the given Preprocessor.
void LoadSelector(Selector Sel)
Load a selector from disk, registering its ID if it exists.
void ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag)
void makeNamesVisible(const HiddenNames &Names, Module *Owner)
Make the names within this set of hidden names visible.
void UpdateSema()
Update the state of Sema after loading some additional modules.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Decl * GetLocalDecl(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override
Get the index ID for the loaded SourceLocation offset.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
void ReadPendingInstantiations(SmallVectorImpl< std::pair< ValueDecl *, SourceLocation > > &Pending) override
Read the set of pending instantiations known to the external Sema source.
Preprocessor & getPreprocessor() const
Retrieve the preprocessor.
serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)
Get the loaded specializations lookup tables for D, if any.
CXXTemporary * ReadCXXTemporary(ModuleFile &F, const RecordData &Record, unsigned &Idx)
void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces) override
Load the set of namespaces that are known to the external source, which will be used during typo corr...
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
void PrintStats() override
Print some statistics about AST usage.
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 ...
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
FileManager & getFileManager() const
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::MacroID getGlobalMacroID(ModuleFile &M, unsigned LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
serialization::ModuleFile ModuleFile
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
void setKWLoc(SourceLocation Loc)
Attr - This represents one attribute.
void setAttr(const Attr *A)
void setConceptReference(ConceptReference *CR)
void setRParenLoc(SourceLocation Loc)
void setCaretLoc(SourceLocation Loc)
void setWrittenTypeSpec(TypeSpecifierType written)
bool needsExtraLocalData() const
void setModeAttr(bool written)
void setBuiltinLoc(SourceLocation Loc)
void setWrittenWidthSpec(TypeSpecifierWidth written)
void setWrittenSignSpec(TypeSpecifierSign written)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
void setSourceOrder(int Pos)
Set the source order of this initializer.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
unsigned getLambdaIndexInContext() const
Retrieve the index of this lambda within the context declaration returned by getLambdaContextDecl().
base_class_iterator bases_begin()
base_class_iterator vbases_begin()
Represents a C++ temporary.
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule) override
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind) override
This is called for each AST file loaded.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A reference to a concept and its template args, as it appears in the code.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
A map from continuous integer ranges to some value, with a very specialized interface.
void insertOrReplace(const value_type &Val)
typename Representation::const_iterator const_iterator
typename Representation::iterator iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool hasExternalVisibleStorage() const
Whether this DeclContext has external storage containing additional declarations that are visible in ...
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void setMustBuildLookupTable()
Mark that there are external lexical declarations that we need to include in our lookup table (and th...
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
bool isDeclInLexicalTraversal(const Decl *D) const
Determine whether the given declaration is stored in the list of declarations lexically within this c...
decl_iterator decls_begin() const
unsigned getModuleFileIndex() const
DeclID getRawValue() const
unsigned getLocalDeclIndex() const
uint64_t DeclID
An ID number that refers to a declaration in an AST file.
Decl - This represents one declaration (or definition), e.g.
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Kind
Lists the kind of concrete classes of Decl.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
SourceLocation getLocation() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
GlobalDeclID getGlobalID() const
Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
static DeclarationNameLoc makeCXXLiteralOperatorNameLoc(SourceLocation Loc)
Construct location information for a literal C++ operator.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NameKind
The kind of the name stored in this DeclarationName.
@ CXXConversionFunctionName
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
void setRParenLoc(SourceLocation Loc)
void setDecltypeLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setTemplateNameLoc(SourceLocation Loc)
void setAttrNameLoc(SourceLocation loc)
void setAttrOperandParensRange(SourceRange range)
void setAttrExprOperand(Expr *e)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
A little helper class used to produce diagnostics.
bool wasUpgradedFromWarning() const
Whether this mapping attempted to map the diagnostic to a warning, but was overruled because the diag...
bool isErrorOrFatal() const
void setSeverity(diag::Severity Value)
static DiagnosticMapping deserialize(unsigned Bits)
Deserialize a mapping.
void setUpgradedFromWarning(bool Value)
Options for controlling the compiler diagnostics engine.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > SystemHeaderWarningsModules
The list of -Wsystem-headers-in-module=... options used to override whether -Wsystem-headers is enabl...
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
bool getEnableAllWarnings() const
Level
The level of the diagnostic, after it has been through mapping.
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
bool getSuppressSystemWarnings() const
bool getWarningsAsErrors() const
diag::Severity getExtensionHandlingBehavior() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
StringRef getName() const
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
This represents one expression.
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl * > Decls)
uint32_t incrementGeneration(ASTContext &C)
Increment the current generation.
uint32_t getGeneration() const
Get the current generation of this AST source.
Represents difference between two FPOptions values.
static FPOptionsOverride getFromOpaqueInt(storage_type I)
FPOptions applyOverrides(FPOptions Base)
static FPOptions getFromOpaqueInt(storage_type Value)
Represents a member of a struct/union/class.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
time_t getModificationTime() const
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
llvm::vfs::FileSystem & getVirtualFileSystem() const
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Get a FileEntryRef if it exists, without doing anything on error.
FileEntryRef getVirtualFileRef(StringRef Filename, off_t Size, time_t ModificationTime)
Retrieve a file entry for a "virtual" file that acts as if there were a file with the given name on d...
Keeps track of options that affect how file operations are performed.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
Wrapper for source info for functions.
unsigned getNumParams() const
void setLocalRangeBegin(SourceLocation L)
void setLParenLoc(SourceLocation Loc)
void setParam(unsigned i, ParmVarDecl *VD)
void setRParenLoc(SourceLocation Loc)
void setLocalRangeEnd(SourceLocation L)
void setExceptionSpecRange(SourceRange R)
llvm::SmallPtrSet< ModuleFile *, 4 > HitSet
A set of module files in which we found a result.
static std::pair< GlobalModuleIndex *, llvm::Error > readIndex(llvm::StringRef Path)
Read a global index file for the given directory.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isCPlusPlusOperatorKeyword() const
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
bool isPoisoned() const
Return true if this token has been poisoned.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
tok::NotableIdentifierKind getNotableIdentifierID() const
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
void setObjCOrBuiltinID(unsigned ID)
void revertTokenIDToIdentifier()
Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2 compatibility.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
void * getFETokenInfo() const
Get and set FETokenInfo.
StringRef getName() const
Return the actual identifier string.
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
An iterator that walks over all of the known identifiers in the lookup table.
IdentifierIterator()=default
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
Implements an efficient mapping from strings to IdentifierInfo nodes.
llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename) const
Get a pointer to the pCM if it exists; else nullptr.
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
Represents a field injected from an anonymous union/struct into the parent scope.
Wrapper for source info for injected class names of class templates.
void setAmpLoc(SourceLocation Loc)
PragmaMSPointersToMembersKind
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
An UnresolvedSet-like class that might not have been loaded from the external AST source yet.
unsigned getLineTableFilenameID(StringRef Str)
void AddEntry(FileID FID, const std::vector< LineEntry > &Entries)
Add a new line entry that has already been encoded into the internal representation of the line table...
static LocalDeclID get(ASTReader &Reader, serialization::ModuleFile &MF, DeclID ID)
Record the location of a macro definition.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
void setPrevious(MacroDirective *Prev)
Set previous definition of the macro with the same name.
Records the location of a macro expansion.
Encapsulates the data about a macro definition (e.g.
void setUsedForHeaderGuard(bool Val)
void setHasCommaPasting()
void setDefinitionEndLoc(SourceLocation EndLoc)
Set the location of the last token in the macro.
void setParameterList(ArrayRef< IdentifierInfo * > List, llvm::BumpPtrAllocator &PPAllocator)
Set the specified list of identifiers as the parameter list for this macro.
llvm::MutableArrayRef< Token > allocateTokens(unsigned NumTokens, llvm::BumpPtrAllocator &PPAllocator)
void setIsFunctionLike()
Function/Object-likeness.
void setIsC99Varargs()
Varargs querying methods. This can only be set for function-like macros.
void setIsUsed(bool Val)
Set the value of the IsUsed flag.
void setExpansionLoc(SourceLocation Loc)
void setAttrRowOperand(Expr *e)
void setAttrColumnOperand(Expr *e)
void setAttrOperandParensRange(SourceRange range)
void setAttrNameLoc(SourceLocation loc)
void setStarLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
The module cache used for compiling modules implicitly.
virtual InMemoryModuleCache & getInMemoryModuleCache()=0
Returns this process's view of the module cache.
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory)
Sets the umbrella directory of the given module to the given directory.
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory)
Sets the umbrella header of the given module to the given header.
llvm::DenseSet< FileEntryRef > AdditionalModMapsSet
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
ModuleHeaderRole
Flags describing the role of a module header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false)
Adds this header to the given module.
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
void addRequirement(StringRef Feature, bool RequiredState, const LangOptions &LangOpts, const TargetInfo &Target)
Add the given feature requirement to the list of features required by this module.
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
NameVisibilityKind
Describes the visibility of the various names within a particular module.
@ Hidden
All of the names in this module are hidden.
@ AllVisible
All of the names in this module are visible.
SourceLocation DefinitionLoc
The location of the module definition.
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
ModuleKind Kind
The kind of this module.
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
bool isUnimportable() const
Determine whether this module has been declared unimportable.
void setASTFile(OptionalFileEntryRef File)
Set the serialized AST file for the top-level module of this module.
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
std::string Name
The name of this module.
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
OptionalDirectoryEntryRef Directory
The build directory of this module.
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
ASTFileSignature Signature
The module signature.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
llvm::PointerIntPair< Module *, 1, bool > ExportDecl
Describes an exported module.
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
unsigned IsAvailable
Whether this module is available in the current translation unit.
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
OptionalFileEntryRef getASTFile() const
The serialized AST file for this module, if one was created.
std::vector< Conflict > Conflicts
The list of conflicts.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
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 'absent' clause in the 'pragma omp assume' directive.
static OMPAbsentClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
This represents 'acq_rel' clause in the 'pragma omp atomic|flush' directives.
This represents 'acquire' clause in the 'pragma omp atomic|flush' directives.
This represents clause 'affinity' in the 'pragma omp task'-based directives.
static OMPAffinityClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N locator items.
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'aligned' in the 'pragma omp ...' directives.
static OMPAlignedClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
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.
This represents 'at' clause in the 'pragma omp error' directive.
This represents 'atomic_default_mem_order' clause in the 'pragma omp requires' directive.
This represents 'bind' clause in the 'pragma omp ...' directives.
static OMPBindClause * CreateEmpty(const ASTContext &C)
Build an empty 'bind' clause.
This represents 'capture' clause in the 'pragma omp atomic' directive.
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C)
OMPClauseReader(ASTRecordReader &Record)
void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C)
void Visit(PTR(OMPClause) S)
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 'compare' clause in the 'pragma omp atomic' directive.
This represents the 'contains' clause in the 'pragma omp assume' directive.
static OMPContainsClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
This represents clause 'copyin' in the 'pragma omp ...' directives.
static OMPCopyinClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents clause 'copyprivate' in the 'pragma omp ...' directives.
static OMPCopyprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents 'defaultmap' clause in the 'pragma omp ...' directive.
This represents implicit clause 'depend' for the 'pragma omp task' 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.
static OMPDepobjClause * CreateEmpty(const ASTContext &C)
Creates an empty clause.
This represents 'destroy' clause in the 'pragma omp depobj' directive or the 'pragma omp interop' dir...
This represents 'detach' clause in the 'pragma omp task' directive.
This represents 'device' clause in the 'pragma omp ...' directive.
This represents 'dist_schedule' clause in the 'pragma omp ...' directive.
This represents the 'doacross' clause for the 'pragma omp ordered' 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 ....
This represents 'dynamic_allocators' clause in the 'pragma omp requires' directive.
This represents clause 'exclusive' in the 'pragma omp scan' directive.
static OMPExclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'fail' clause in the 'pragma omp atomic' directive.
This represents 'filter' clause in the 'pragma omp ...' directive.
This represents 'final' clause in the 'pragma omp ...' directive.
This represents clause 'firstprivate' in the 'pragma omp ...' directives.
static OMPFirstprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents implicit clause 'flush' for the 'pragma omp flush' directive.
static OMPFlushClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents clause 'from' in the 'pragma omp ...' directives.
static OMPFromClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
static OMPFullClause * CreateEmpty(const ASTContext &C)
Build an empty 'full' AST node for deserialization.
This represents 'grainsize' clause in the 'pragma omp ...' directive.
This represents clause 'has_device_ptr' in the 'pragma omp ...' directives.
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.
This represents the 'holds' clause in the 'pragma omp assume' directive.
This represents 'if' clause in the 'pragma omp ...' directive.
This represents clause 'in_reduction' in the 'pragma omp task' directives.
static OMPInReductionClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents clause 'inclusive' in the 'pragma omp scan' directive.
static OMPInclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents the 'init' clause in 'pragma omp ...' directives.
static OMPInitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N expressions.
This represents clause 'is_device_ptr' in the 'pragma omp ...' directives.
static OMPIsDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'lastprivate' in the 'pragma omp ...' directives.
static OMPLastprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents clause 'linear' in the 'pragma omp ...' directives.
static OMPLinearClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
static OMPLoopRangeClause * CreateEmpty(const ASTContext &C)
Build an empty 'looprange' clause node.
This represents clause 'map' in the 'pragma omp ...' directives.
static OMPMapClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars original expressions, NumUniqueDeclarations declar...
This represents 'mergeable' clause in the 'pragma omp ...' directive.
This represents the 'message' clause in the 'pragma omp error' and the 'pragma omp parallel' directiv...
This represents the 'no_openmp' clause in the 'pragma omp assume' directive.
This represents the 'no_openmp_constructs' clause in the.
This represents the 'no_openmp_routines' clause in the 'pragma omp assume' directive.
This represents the 'no_parallelism' clause in the 'pragma omp assume' directive.
This represents 'nocontext' clause in the 'pragma omp ...' directive.
This represents 'nogroup' clause in the 'pragma omp ...' directive.
This represents clause 'nontemporal' in the 'pragma omp ...' directives.
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 'nowait' clause in the 'pragma omp ...' directive.
This represents 'num_tasks' clause in the 'pragma omp ...' directive.
This represents 'num_teams' clause in the 'pragma omp ...' directive.
static OMPNumTeamsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
This represents 'order' clause in the 'pragma omp ...' directive.
This represents 'ordered' clause in the 'pragma omp ...' directive.
static OMPOrderedClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty clause.
Representation of the 'partial' clause of the 'pragma omp unroll' directive.
static OMPPartialClause * CreateEmpty(const ASTContext &C)
Build an empty 'partial' AST node for deserialization.
This class represents the 'permutation' clause in the 'pragma omp interchange' directive.
static OMPPermutationClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty 'permutation' AST node for deserialization.
This represents 'priority' clause in the 'pragma omp ...' directive.
This represents clause 'private' in the 'pragma omp ...' directives.
static OMPPrivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'proc_bind' clause in the 'pragma omp ...' directive.
This represents 'read' clause in the 'pragma omp atomic' directive.
This represents clause 'reduction' in the 'pragma omp ...' directives.
static OMPReductionClause * CreateEmpty(const ASTContext &C, unsigned N, OpenMPReductionClauseModifier Modifier)
Creates an empty clause with the place for N variables.
This represents 'relaxed' clause in the 'pragma omp atomic' directives.
This represents 'release' clause in the 'pragma omp atomic|flush' directives.
This represents 'reverse_offload' clause in the 'pragma omp requires' directive.
This represents 'simd' clause in the 'pragma omp ...' directive.
This represents 'safelen' clause in the 'pragma omp ...' directive.
This represents 'schedule' clause in the 'pragma omp ...' directive.
This represents 'self_maps' clause in the 'pragma omp requires' directive.
This represents 'seq_cst' clause in the 'pragma omp atomic|flush' directives.
This represents the 'severity' clause in the 'pragma omp error' and the 'pragma omp parallel' directi...
This represents clause 'shared' in the 'pragma omp ...' directives.
static OMPSharedClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
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 clause 'task_reduction' in the 'pragma omp taskgroup' directives.
static OMPTaskReductionClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'thread_limit' 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.
This represents 'threadset' clause in the 'pragma omp task ...' directive.
This represents clause 'to' in the 'pragma omp ...' directives.
static OMPToClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
This represents 'unified_address' clause in the 'pragma omp requires' directive.
This represents 'unified_shared_memory' clause in the 'pragma omp requires' directive.
This represents 'untied' clause in the 'pragma omp ...' directive.
This represents 'update' clause in the 'pragma omp atomic' directive.
static OMPUpdateClause * CreateEmpty(const ASTContext &C, bool IsExtended)
Creates an empty clause with the place for N variables.
This represents the 'use' clause in 'pragma omp ...' directives.
This represents clause 'use_device_addr' in the 'pragma omp ...' directives.
static OMPUseDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'use_device_ptr' in the 'pragma omp ...' directives.
static OMPUseDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'uses_allocators' in the 'pragma omp target'-based directives.
static OMPUsesAllocatorsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N allocators.
This represents 'weak' clause in the 'pragma omp atomic' directives.
This represents 'write' clause in the 'pragma omp atomic' directive.
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.
method_range methods() const
void setNameLoc(SourceLocation Loc)
void setNameEndLoc(SourceLocation Loc)
ObjCMethodDecl - Represents an instance or class method declaration.
bool hasBody() const override
Determine whether this method has a body.
void setLazyBody(uint64_t Offset)
void setStarLoc(SourceLocation Loc)
void setTypeArgsRAngleLoc(SourceLocation Loc)
unsigned getNumTypeArgs() const
unsigned getNumProtocols() const
void setTypeArgsLAngleLoc(SourceLocation Loc)
void setTypeArgTInfo(unsigned i, TypeSourceInfo *TInfo)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
void setHasBaseTypeAsWritten(bool HasBaseType)
void setProtocolLoc(unsigned i, SourceLocation Loc)
Kind
The basic Objective-C runtimes that we know about.
unsigned getNumProtocols() const
void setProtocolLoc(unsigned i, SourceLocation Loc)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
static OpenACCAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCAttachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCAutoClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
This is the base type for all OpenACC Clauses.
static OpenACCCollapseClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, bool HasForce, Expr *LoopCount, SourceLocation EndLoc)
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDefaultAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDefaultClause * Create(const ASTContext &C, OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static OpenACCDeleteClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDetachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceNumClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCFinalizeClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCFirstPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCFirstPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCGangClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< OpenACCGangKind > GangKinds, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCHostClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCIfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCIfPresentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCIndependentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoCreateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCNumGangsClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCNumWorkersClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCReductionClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCReductionOperator Operator, ArrayRef< Expr * > VarList, ArrayRef< OpenACCReductionRecipeWithStorage > Recipes, SourceLocation EndLoc)
static OpenACCSelfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCTileClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > SizeExprs, SourceLocation EndLoc)
static OpenACCUseDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCVectorLengthClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWaitClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef< Expr * > QueueIdExprs, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain) override
Receives the header search options.
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void setEllipsisLoc(SourceLocation Loc)
void setEllipsisLoc(SourceLocation Loc)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
Represents a parameter to a function.
void setKWLoc(SourceLocation Loc)
void setStarLoc(SourceLocation Loc)
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
std::string PCHThroughHeader
If non-empty, the filename used in an include directive in the primary source file (or command-line p...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool AllowPCHWithDifferentModulesCachePath
When true, a PCH with modules cache path different to the current compilation will not be rejected.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
HeaderSearch & getHeaderSearchInfo() const
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
@ FastWidth
The width of the "fast" qualifier mask.
@ FastMask
The fast qualifier mask.
void setAmpAmpLoc(SourceLocation Loc)
Wrapper for source info for record types.
Declaration of a redeclarable template.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
This table allows us to fully hide how we implement multi-keyword caching.
Selector getNullarySelector(const IdentifierInfo *ID)
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Selector getUnarySelector(const IdentifierInfo *ID)
Smart pointer class that efficiently represents Objective-C method names.
void * getAsOpaquePtr() const
void addMethodToGlobalList(ObjCMethodList *List, ObjCMethodDecl *Method)
Add the given method to the list of globally-known methods.
GlobalMethodPool MethodPool
Method Pool - allows efficient lookup when typechecking messages to "id".
Sema - This implements semantic analysis and AST building for C.
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
IdentifierResolver IdResolver
ASTReaderListenter implementation to set SuggestedPredefines of ASTReader which is required to use a ...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
Encodes a location in the source.
static SourceLocation getFromRawEncoding(UIntTy Encoding)
Turn a raw encoding of a SourceLocation object into a real SourceLocation.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
SourceLocation getFileLoc(SourceLocation Loc) const
Given Loc, if it is a macro location return the expansion location or the spelling location,...
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
One instance of this struct is kept for every file loaded or used.
OptionalFileEntryRef ContentsEntry
References the file which the contents were actually loaded from.
std::optional< llvm::MemoryBufferRef > getBufferIfLoaded() const
Return the buffer, only if it has been loaded.
unsigned BufferOverridden
Indicates whether the buffer itself was provided to override the actual file contents.
OptionalFileEntryRef OrigEntry
Reference to the file entry representing this ContentCache.
Information about a FileID, basically just the logical file that it represents and include stack info...
void setHasLineDirectives()
Set the flag that indicates that this FileID has line table entries associated with it.
Stmt - This represents one statement.
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string ABI
If given, the name of the target ABI to use.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
A convenient class for passing around template argument information.
Location wrapper for a TemplateArgument.
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
ArgKind
The kind of template argument we're storing.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
unsigned getNumArgs() const
MutableArrayRef< TemplateArgumentLocInfo > getArgLocInfos()
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, SourceLocation NameLoc, SourceLocation LAngleLoc, SourceLocation RAngleLoc)
Token - This structure provides full information about a lexed token.
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
TypeLocReader(ASTRecordReader &Reader)
void VisitArrayTypeLoc(ArrayTypeLoc)
void VisitFunctionTypeLoc(FunctionTypeLoc)
void VisitTagTypeLoc(TagTypeLoc TL)
RetTy Visit(TypeLoc TyLoc)
Base wrapper for a particular "section" of type source info.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
void setUnmodifiedTInfo(TypeSourceInfo *TI) const
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
void setLParenLoc(SourceLocation Loc)
void setTypeofLoc(SourceLocation Loc)
void setRParenLoc(SourceLocation Loc)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
void setNameLoc(SourceLocation Loc)
Captures information about a #pragma weak directive.
Source location and bit offset of a declaration.
A key used when looking up entities by DeclarationName.
unsigned getHash() const
Compute a fingerprint of this key for use in on-disk hash table.
DeclarationNameKey()=default
Information about a module that has been loaded by the ASTReader.
const PPEntityOffset * PreprocessedEntityOffsets
void * IdentifierLookupTable
A pointer to an on-disk hash table of opaque type IdentifierHashTable.
void * SelectorLookupTable
A pointer to an on-disk hash table of opaque type ASTSelectorLookupTable.
std::vector< std::unique_ptr< ModuleFileExtensionReader > > ExtensionReaders
The list of extension readers that are attached to this module file.
SourceLocation DirectImportLoc
The source location where the module was explicitly or implicitly imported in the local translation u...
StringRef Data
The serialized bitstream data for this file.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
ContinuousRangeMap< uint32_t, int, 2 > PreprocessedEntityRemap
Remapping table for preprocessed entity IDs in this module.
int SLocEntryBaseID
The base ID in the source manager's view of this module.
serialization::IdentifierID BaseIdentifierID
Base identifier ID for identifiers local to this module.
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
const unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
uint64_t SLocEntryOffsetsBase
Base file offset for the offsets in SLocEntryOffsets.
llvm::BitstreamCursor InputFilesCursor
The cursor to the start of the input-files block.
std::vector< InputFile > InputFilesLoaded
The input files that have been loaded from this AST file.
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
llvm::SetVector< ModuleFile * > ImportedBy
List of modules which depend on this module.
const char * HeaderFileInfoTableData
Actual data for the on-disk hash table of header file information.
SourceLocation ImportLoc
The source location where this module was first imported.
const serialization::unaligned_decl_id_t * FileSortedDecls
Array of file-level DeclIDs sorted by file.
const uint32_t * SLocEntryOffsets
Offsets for all of the source location entries in the AST file.
llvm::BitstreamCursor MacroCursor
The cursor to the start of the preprocessor block, which stores all of the macro definitions.
FileID OriginalSourceFileID
The file ID for the original source file that was used to build this AST file.
FileEntryRef File
The file entry for the module file.
std::string ActualOriginalSourceFileName
The actual original source file name that was used to build this AST file.
uint64_t PreprocessorDetailStartOffset
The offset of the start of the preprocessor detail cursor.
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
unsigned LocalNumSubmodules
The number of submodules in this module.
SourceLocation FirstLoc
The first source location in this module.
ASTFileSignature ASTBlockHash
The signature of the AST block of the module file, this can be used to unique module files based on A...
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
std::string OriginalSourceFileName
The original source file name that was used to build the primary AST file, which may have been modifi...
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
bool HasTimestamps
Whether timestamps are included in this module file.
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
unsigned NumPreprocessedEntities
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
unsigned NumFileSortedDecls
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
unsigned Index
The index of this module in the list of modules.
unsigned NumUserInputFiles
llvm::BitstreamCursor Stream
The main bitstream cursor for the main block.
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
uint64_t SizeInBits
The size of this file, in bits.
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
bool StandardCXXModule
Whether this module file is a standard C++ module.
unsigned LocalNumTypes
The number of types in this AST file.
StringRef ModuleOffsetMap
The module offset map data for this file.
const PPSkippedRange * PreprocessedSkippedRangeOffsets
std::string FileName
The file name of the module file.
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
std::string ModuleMapPath
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
unsigned LocalNumMacros
The number of macros in this AST file.
unsigned NumPreprocessedSkippedRanges
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
unsigned Generation
The generation of which this module file is a part.
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
ContinuousRangeMap< uint32_t, int, 2 > MacroRemap
Remapping table for macro IDs in this module.
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
ContinuousRangeMap< uint32_t, int, 2 > SubmoduleRemap
Remapping table for submodule IDs in this module.
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
unsigned LocalNumSelectors
The number of selectors new to this file.
ModuleKind Kind
The type of this module.
std::string ModuleName
The name of the module.
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
std::string BaseDirectory
The base directory of the module.
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Manages the set of modules loaded by an AST reader.
AddModuleResult
The result of attempting to add a new module.
@ Missing
The module file is missing.
@ OutOfDate
The module file is out-of-date.
@ NewlyLoaded
The module file was just loaded in response to this call.
@ AlreadyLoaded
The module file had already been loaded.
llvm::iterator_range< SmallVectorImpl< ModuleFile * >::const_iterator > pch_modules() const
A range covering the PCH and preamble module files loaded.
ModuleReverseIterator rbegin()
Reverse iterator to traverse all loaded modules.
unsigned size() const
Number of modules loaded.
Source range/offset of a preprocessed entity.
uint32_t getOffset() const
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
Source range of a skipped preprocessor region.
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
unsigned getFactoryBits() const
ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, unsigned PriorGeneration)
ArrayRef< ObjCMethodDecl * > getInstanceMethods() const
Retrieve the instance methods found by this visitor.
ArrayRef< ObjCMethodDecl * > getFactoryMethods() const
Retrieve the instance methods found by this visitor.
bool instanceHasMoreThanOneDecl() const
bool operator()(ModuleFile &M)
bool factoryHasMoreThanOneDecl() const
unsigned getInstanceBits() const
static TypeIdx fromTypeID(TypeID ID)
32 aligned uint64_t in the AST file.
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
void ReadDataIntoImpl(const unsigned char *d, unsigned DataLen, data_type_builder &Val)
file_type ReadFileRef(const unsigned char *&d)
DeclarationNameKey ReadKeyBase(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
DeclarationNameKey internal_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(const internal_key_type &a)
StringRef internal_key_type
static internal_key_type ReadKey(const unsigned char *d, unsigned n)
Class that performs lookup for an identifier stored in an AST file.
IdentifierID ReadIdentifierID(const unsigned char *d)
data_type ReadData(const internal_key_type &k, const unsigned char *d, unsigned DataLen)
Class that performs lookup for a selector's entries in the global method pool stored in an AST file.
internal_key_type ReadKey(const unsigned char *d, unsigned)
data_type ReadData(Selector, const unsigned char *d, unsigned DataLen)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(Selector Sel)
external_key_type internal_key_type
Class that performs lookup to specialized decls.
file_type ReadFileRef(const unsigned char *&d)
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
unsigned internal_key_type
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
std::pair< DeclarationName, const Module * > external_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
std::pair< DeclarationNameKey, unsigned > internal_key_type
internal_key_type ReadKey(const unsigned char *d, unsigned)
static hash_value_type ComputeHash(const internal_key_type &Key)
static internal_key_type GetInternalKey(const external_key_type &Key)
PredefinedTypeIDs
Predefined type IDs.
CtorInitializerType
The different kinds of data that can occur in a CtorInitializer.
const unsigned NUM_PREDEF_TYPE_IDS
The number of predefined type IDs that are reserved for the PREDEF_TYPE_* constants.
const unsigned NumSpecialTypeIDs
The number of special type IDs.
TypeCode
Record codes for each kind of type.
@ PREDEF_TYPE_LONG_ACCUM_ID
The 'long _Accum' type.
@ PREDEF_TYPE_SAMPLER_ID
OpenCL sampler type.
@ PREDEF_TYPE_INT128_ID
The '__int128_t' type.
@ PREDEF_TYPE_CHAR32_ID
The C++ 'char32_t' type.
@ PREDEF_TYPE_SAT_SHORT_ACCUM_ID
The '_Sat short _Accum' type.
@ PREDEF_TYPE_IBM128_ID
The '__ibm128' type.
@ PREDEF_TYPE_SHORT_FRACT_ID
The 'short _Fract' type.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_BOUND_MEMBER
The placeholder type for bound member functions.
@ PREDEF_TYPE_LONGLONG_ID
The (signed) 'long long' type.
@ PREDEF_TYPE_FRACT_ID
The '_Fract' type.
@ PREDEF_TYPE_ARC_UNBRIDGED_CAST
ARC's unbridged-cast placeholder type.
@ PREDEF_TYPE_USHORT_FRACT_ID
The 'unsigned short _Fract' type.
@ PREDEF_TYPE_SAT_ULONG_FRACT_ID
The '_Sat unsigned long _Fract' type.
@ PREDEF_TYPE_BOOL_ID
The 'bool' or '_Bool' type.
@ PREDEF_TYPE_SAT_LONG_ACCUM_ID
The '_Sat long _Accum' type.
@ PREDEF_TYPE_SAT_LONG_FRACT_ID
The '_Sat long _Fract' type.
@ PREDEF_TYPE_SAT_SHORT_FRACT_ID
The '_Sat short _Fract' type.
@ PREDEF_TYPE_CHAR_U_ID
The 'char' type, when it is unsigned.
@ PREDEF_TYPE_RESERVE_ID_ID
OpenCL reserve_id type.
@ PREDEF_TYPE_SAT_ACCUM_ID
The '_Sat _Accum' type.
@ PREDEF_TYPE_BUILTIN_FN
The placeholder type for builtin functions.
@ PREDEF_TYPE_SHORT_ACCUM_ID
The 'short _Accum' type.
@ PREDEF_TYPE_FLOAT_ID
The 'float' type.
@ PREDEF_TYPE_QUEUE_ID
OpenCL queue type.
@ PREDEF_TYPE_INT_ID
The (signed) 'int' type.
@ PREDEF_TYPE_OBJC_SEL
The ObjC 'SEL' type.
@ PREDEF_TYPE_BFLOAT16_ID
The '__bf16' type.
@ PREDEF_TYPE_WCHAR_ID
The C++ 'wchar_t' type.
@ PREDEF_TYPE_UCHAR_ID
The 'unsigned char' type.
@ PREDEF_TYPE_UACCUM_ID
The 'unsigned _Accum' type.
@ PREDEF_TYPE_SCHAR_ID
The 'signed char' type.
@ PREDEF_TYPE_CHAR_S_ID
The 'char' type, when it is signed.
@ PREDEF_TYPE_NULLPTR_ID
The type of 'nullptr'.
@ PREDEF_TYPE_ULONG_FRACT_ID
The 'unsigned long _Fract' type.
@ PREDEF_TYPE_FLOAT16_ID
The '_Float16' type.
@ PREDEF_TYPE_UINT_ID
The 'unsigned int' type.
@ PREDEF_TYPE_FLOAT128_ID
The '__float128' type.
@ PREDEF_TYPE_OBJC_ID
The ObjC 'id' type.
@ PREDEF_TYPE_CHAR16_ID
The C++ 'char16_t' type.
@ PREDEF_TYPE_ARRAY_SECTION
The placeholder type for an array section.
@ PREDEF_TYPE_ULONGLONG_ID
The 'unsigned long long' type.
@ PREDEF_TYPE_SAT_UFRACT_ID
The '_Sat unsigned _Fract' type.
@ PREDEF_TYPE_USHORT_ID
The 'unsigned short' type.
@ PREDEF_TYPE_SHORT_ID
The (signed) 'short' type.
@ PREDEF_TYPE_OMP_ARRAY_SHAPING
The placeholder type for OpenMP array shaping operation.
@ PREDEF_TYPE_DEPENDENT_ID
The placeholder type for dependent types.
@ PREDEF_TYPE_LONGDOUBLE_ID
The 'long double' type.
@ PREDEF_TYPE_DOUBLE_ID
The 'double' type.
@ PREDEF_TYPE_UINT128_ID
The '__uint128_t' type.
@ PREDEF_TYPE_HALF_ID
The OpenCL 'half' / ARM NEON __fp16 type.
@ PREDEF_TYPE_VOID_ID
The void type.
@ PREDEF_TYPE_SAT_USHORT_FRACT_ID
The '_Sat unsigned short _Fract' type.
@ PREDEF_TYPE_ACCUM_ID
The '_Accum' type.
@ PREDEF_TYPE_SAT_FRACT_ID
The '_Sat _Fract' type.
@ PREDEF_TYPE_NULL_ID
The NULL type.
@ PREDEF_TYPE_USHORT_ACCUM_ID
The 'unsigned short _Accum' type.
@ PREDEF_TYPE_CHAR8_ID
The C++ 'char8_t' type.
@ PREDEF_TYPE_UFRACT_ID
The 'unsigned _Fract' type.
@ PREDEF_TYPE_OVERLOAD_ID
The placeholder type for overloaded function sets.
@ PREDEF_TYPE_INCOMPLETE_MATRIX_IDX
A placeholder type for incomplete matrix index operations.
@ PREDEF_TYPE_UNRESOLVED_TEMPLATE
The placeholder type for unresolved templates.
@ PREDEF_TYPE_SAT_USHORT_ACCUM_ID
The '_Sat unsigned short _Accum' type.
@ PREDEF_TYPE_LONG_ID
The (signed) 'long' type.
@ PREDEF_TYPE_SAT_ULONG_ACCUM_ID
The '_Sat unsigned long _Accum' type.
@ PREDEF_TYPE_LONG_FRACT_ID
The 'long _Fract' type.
@ PREDEF_TYPE_UNKNOWN_ANY
The 'unknown any' placeholder type.
@ PREDEF_TYPE_OMP_ITERATOR
The placeholder type for OpenMP iterator expression.
@ PREDEF_TYPE_PSEUDO_OBJECT
The pseudo-object placeholder type.
@ PREDEF_TYPE_OBJC_CLASS
The ObjC 'Class' type.
@ PREDEF_TYPE_ULONG_ID
The 'unsigned long' type.
@ PREDEF_TYPE_SAT_UACCUM_ID
The '_Sat unsigned _Accum' type.
@ PREDEF_TYPE_CLK_EVENT_ID
OpenCL clk event type.
@ PREDEF_TYPE_EVENT_ID
OpenCL event type.
@ PREDEF_TYPE_ULONG_ACCUM_ID
The 'unsigned long _Accum' type.
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
@ CTOR_INITIALIZER_MEMBER
@ CTOR_INITIALIZER_DELEGATING
@ CTOR_INITIALIZER_INDIRECT_MEMBER
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ TYPE_EXT_QUAL
An ExtQualType record.
@ SPECIAL_TYPE_OBJC_SEL_REDEFINITION
Objective-C "SEL" redefinition type.
@ SPECIAL_TYPE_UCONTEXT_T
C ucontext_t typedef type.
@ SPECIAL_TYPE_JMP_BUF
C jmp_buf typedef type.
@ SPECIAL_TYPE_FILE
C FILE typedef type.
@ SPECIAL_TYPE_SIGJMP_BUF
C sigjmp_buf typedef type.
@ SPECIAL_TYPE_OBJC_CLASS_REDEFINITION
Objective-C "Class" redefinition type.
@ SPECIAL_TYPE_CF_CONSTANT_STRING
CFConstantString type.
@ SPECIAL_TYPE_OBJC_ID_REDEFINITION
Objective-C "id" redefinition type.
Defines the clang::TargetInfo interface.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
internal::Matcher< T > findAll(const internal::Matcher< T > &Matcher)
Matches if the node or any descendant matches.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
llvm::OnDiskChainedHashTable< ASTSelectorLookupTrait > ASTSelectorLookupTable
The on-disk hash table used for the global method pool.
llvm::OnDiskChainedHashTable< HeaderFileInfoTrait > HeaderFileInfoLookupTable
The on-disk hash table used for known header files.
llvm::OnDiskIterableChainedHashTable< ASTIdentifierLookupTrait > ASTIdentifierLookupTable
The on-disk hash table used to contain information about all of the identifiers in the program.
GlobalDeclID LazySpecializationInfo
@ EXTENSION_METADATA
Metadata describing this particular extension.
@ SUBMODULE_EXCLUDED_HEADER
Specifies a header that has been explicitly excluded from this submodule.
@ SUBMODULE_TOPHEADER
Specifies a top-level header that falls into this (sub)module.
@ SUBMODULE_PRIVATE_TEXTUAL_HEADER
Specifies a header that is private to this submodule but must be textually included.
@ SUBMODULE_HEADER
Specifies a header that falls into this (sub)module.
@ SUBMODULE_EXPORT_AS
Specifies the name of the module that will eventually re-export the entities in this module.
@ SUBMODULE_UMBRELLA_DIR
Specifies an umbrella directory.
@ SUBMODULE_UMBRELLA_HEADER
Specifies the umbrella header used to create this module, if any.
@ SUBMODULE_METADATA
Metadata for submodules as a whole.
@ SUBMODULE_REQUIRES
Specifies a required feature.
@ SUBMODULE_PRIVATE_HEADER
Specifies a header that is private to this submodule.
@ SUBMODULE_IMPORTS
Specifies the submodules that are imported by this submodule.
@ SUBMODULE_CONFLICT
Specifies a conflict with another module.
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_DEFINITION
Defines the major attributes of a submodule, including its name and parent.
@ SUBMODULE_LINK_LIBRARY
Specifies a library or framework to link against.
@ SUBMODULE_CONFIG_MACRO
Specifies a configuration macro for this module.
@ SUBMODULE_EXPORTS
Specifies the submodules that are re-exported from this submodule.
@ SUBMODULE_TEXTUAL_HEADER
Specifies a header that is part of the module but must be textually included.
@ SUBMODULE_AFFECTING_MODULES
Specifies affecting modules that were not imported.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
OptionsRecordTypes
Record types that occur within the options block inside the control block.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ CODEGEN_OPTIONS
Record code for the codegen options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
CommentRecordTypes
Record types used within a comments block.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
@ SM_SLOC_FILE_ENTRY
Describes a source location entry (SLocEntry) for a file.
@ SM_SLOC_BUFFER_BLOB_COMPRESSED
Describes a zlib-compressed blob that contains the data for a buffer entry.
@ SM_SLOC_BUFFER_ENTRY
Describes a source location entry (SLocEntry) for a buffer.
@ SM_SLOC_BUFFER_BLOB
Describes a blob that contains the data for a buffer entry.
@ SM_SLOC_EXPANSION_ENTRY
Describes a source location entry (SLocEntry) for a macro expansion.
const unsigned int NUM_PREDEF_SELECTOR_IDS
The number of predefined selector IDs.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
PreprocessorRecordTypes
Record types used within a preprocessor block.
@ PP_TOKEN
Describes one token.
@ PP_MACRO_FUNCTION_LIKE
A function-like macro definition.
@ PP_MACRO_OBJECT_LIKE
An object-like macro definition.
@ PP_MACRO_DIRECTIVE_HISTORY
The macro directives history for a particular identifier.
@ PP_MODULE_MACRO
A macro directive exported by a module.
ControlRecordTypes
Record types that occur within the control block.
@ MODULE_MAP_FILE
Record code for the module map file that was used to build this AST file.
@ MODULE_DIRECTORY
Record code for the module build directory.
@ ORIGINAL_FILE_ID
Record code for file ID of the file or buffer that was used to generate the AST file.
@ MODULE_NAME
Record code for the module name.
@ ORIGINAL_FILE
Record code for the original file that was used to generate the AST file, including both its file ID ...
@ IMPORT
Record code for another AST file imported by this AST file.
@ INPUT_FILE_OFFSETS
Offsets into the input-files block where input files reside.
@ METADATA
AST file metadata, including the AST file version number and information about the compiler used to b...
UnhashedControlBlockRecordTypes
Record codes for the unhashed control block.
@ DIAGNOSTIC_OPTIONS
Record code for the diagnostic options table.
@ HEADER_SEARCH_ENTRY_USAGE
Record code for the indices of used header search entries.
@ AST_BLOCK_HASH
Record code for the content hash of the AST block.
@ DIAG_PRAGMA_MAPPINGS
Record code for #pragma diagnostic mappings.
@ SIGNATURE
Record code for the signature that identifiers this AST file.
@ HEADER_SEARCH_PATHS
Record code for the headers search paths.
@ VFS_USAGE
Record code for the indices of used VFSs.
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.
uint32_t MacroID
An ID number that refers to a macro in an AST file.
PreprocessorDetailRecordTypes
Record types used within a preprocessor detail block.
@ PPD_INCLUSION_DIRECTIVE
Describes an inclusion directive within the preprocessing record.
@ PPD_MACRO_EXPANSION
Describes a macro expansion within the preprocessing record.
@ PPD_MACRO_DEFINITION
Describes a macro definition within the preprocessing record.
ModuleKind
Specifies the kind of module that has been loaded.
@ MK_PCH
File is a PCH file treated as such.
@ MK_Preamble
File is a PCH file treated as the preamble.
@ MK_MainFile
File is a PCH file treated as the actual main file.
@ MK_ExplicitModule
File is an explicitly-loaded module.
@ MK_ImplicitModule
File is an implicitly-loaded module.
@ MK_PrebuiltModule
File is from a prebuilt module path.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
const unsigned int NUM_PREDEF_MACRO_IDS
The number of predefined macro IDs.
ASTRecordTypes
Record types that occur within the AST block itself.
@ DECL_UPDATE_OFFSETS
Record for offsets of DECL_UPDATES records for declarations that were modified after being deserializ...
@ STATISTICS
Record code for the extra statistics we gather while generating an AST file.
@ FLOAT_CONTROL_PRAGMA_OPTIONS
Record code for #pragma float_control options.
@ KNOWN_NAMESPACES
Record code for the set of known namespaces, which are used for typo correction.
@ SPECIAL_TYPES
Record code for the set of non-builtin, special types.
@ PENDING_IMPLICIT_INSTANTIATIONS
Record code for pending implicit instantiations.
@ CXX_ADDED_TEMPLATE_SPECIALIZATION
@ TYPE_OFFSET
Record code for the offsets of each type.
@ DELEGATING_CTORS
The list of delegating constructor declarations.
@ PP_ASSUME_NONNULL_LOC
ID 66 used to be the list of included files.
@ EXT_VECTOR_DECLS
Record code for the set of ext_vector type names.
@ OPENCL_EXTENSIONS
Record code for enabled OpenCL extensions.
@ FP_PRAGMA_OPTIONS
Record code for floating point #pragma options.
@ PP_UNSAFE_BUFFER_USAGE
Record code for #pragma clang unsafe_buffer_usage begin/end.
@ CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION
@ DECLS_WITH_EFFECTS_TO_VERIFY
Record code for Sema's vector of functions/blocks with effects to be verified.
@ VTABLE_USES
Record code for the array of VTable uses.
@ LATE_PARSED_TEMPLATE
Record code for late parsed template functions.
@ DECLS_TO_CHECK_FOR_DEFERRED_DIAGS
Record code for the Decls to be checked for deferred diags.
@ DECL_OFFSET
Record code for the offsets of each decl.
@ SOURCE_MANAGER_LINE_TABLE
Record code for the source manager line table information, which stores information about #line direc...
@ PP_COUNTER_VALUE
The value of the next COUNTER to dispense.
@ DELETE_EXPRS_TO_ANALYZE
Delete expressions that will be analyzed later.
@ RELATED_DECLS_MAP
Record code for related declarations that have to be deserialized together from the same module.
@ UPDATE_VISIBLE
Record code for an update to a decl context's lookup table.
@ CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH
Number of unmatched pragma clang cuda_force_host_device begin directives we've seen.
@ MACRO_OFFSET
Record code for the table of offsets of each macro ID.
@ PPD_ENTITIES_OFFSETS
Record code for the table of offsets to entries in the preprocessing record.
@ 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.
uint32_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
unsigned ComputeHash(Selector Sel)
TypeID LocalTypeID
Same with TypeID except that the LocalTypeID is only meaningful with the corresponding ModuleFile.
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isa(CodeGen::Address addr)
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
OpenMPDefaultClauseVariableCategory
OpenMP variable-category for 'default' clause.
OpenMPDefaultmapClauseModifier
OpenMP modifiers for 'defaultmap' clause.
OpenMPOrderClauseModifier
OpenMP modifiers for 'order' clause.
std::vector< std::string > Macros
A list of macros of the form <definition>=<expansion> .
@ Success
Annotation was successful.
std::pair< FileID, unsigned > FileIDAndOffset
OpenMPAtClauseKind
OpenMP attributes for 'at' clause.
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
OpenACCClauseKind
Represents the kind of an OpenACC clause.
@ Auto
'auto' clause, allowed on 'loop' directives.
@ Bind
'bind' clause, allowed on routine constructs.
@ Gang
'gang' clause, allowed on 'loop' and Combined constructs.
@ Wait
'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ PCopyOut
'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ PresentOrCreate
'create' clause alias 'present_or_create'.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ NoHost
'nohost' clause, allowed on 'routine' directives.
@ PresentOrCopy
'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Invalid
Represents an invalid clause, for the purposes of parsing.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Copy
'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ DeviceType
'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ Shortloop
'shortloop' is represented in the ACC.td file, but isn't present in the standard.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
OpenMPScheduleClauseModifier
OpenMP modifiers for 'schedule' clause.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
OpenMPDynGroupprivateClauseFallbackModifier
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
PredefinedDeclIDs
Predefined declaration IDs.
@ PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID
The internal '__NSConstantString' tag type.
@ PREDEF_DECL_TRANSLATION_UNIT_ID
The translation unit.
@ PREDEF_DECL_OBJC_CLASS_ID
The Objective-C 'Class' type.
@ PREDEF_DECL_BUILTIN_MS_GUID_ID
The predeclared '_GUID' struct.
@ PREDEF_DECL_BUILTIN_MS_TYPE_INFO_TAG_ID
The predeclared 'type_info' struct.
@ PREDEF_DECL_OBJC_INSTANCETYPE_ID
The internal 'instancetype' typedef.
@ PREDEF_DECL_OBJC_PROTOCOL_ID
The Objective-C 'Protocol' type.
@ PREDEF_DECL_UNSIGNED_INT_128_ID
The unsigned 128-bit integer type.
@ PREDEF_DECL_OBJC_SEL_ID
The Objective-C 'SEL' type.
@ NUM_PREDEF_DECL_IDS
The number of declaration IDs that are predefined.
@ PREDEF_DECL_INT_128_ID
The signed 128-bit integer type.
@ PREDEF_DECL_VA_LIST_TAG
The internal '__va_list_tag' struct, if any.
@ PREDEF_DECL_BUILTIN_MS_VA_LIST_ID
The internal '__builtin_ms_va_list' typedef.
@ PREDEF_DECL_CF_CONSTANT_STRING_ID
The internal '__NSConstantString' typedef.
@ PREDEF_DECL_NULL_ID
The NULL declaration.
@ PREDEF_DECL_BUILTIN_VA_LIST_ID
The internal '__builtin_va_list' typedef.
@ PREDEF_DECL_EXTERN_C_CONTEXT_ID
The extern "C" context.
@ PREDEF_DECL_OBJC_ID_ID
The Objective-C 'id' type.
@ Property
The type of a property.
@ Result
The result type of a method or function.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
const FunctionProtoType * T
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ Template
We are parsing a template declaration.
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
@ Type
The name was classified as a type.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
TypeSpecifierWidth
Specifies the width of a type, e.g., short, long, or long long.
OpenMPMotionModifierKind
OpenMP modifier kind for 'to' or 'from' clause.
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
TypeSpecifierSign
Specifies the signedness of a type, e.g., signed or unsigned.
OpenMPDynGroupprivateClauseModifier
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ None
Perform validation, don't disable it.
@ PCH
Disable validation for a precompiled header and the modules it depends on.
@ Module
Disable validation for module files.
bool shouldSkipCheckingODR(const Decl *D)
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
OpenMPNumThreadsClauseModifier
OpenMPAtomicDefaultMemOrderClauseKind
OpenMP attributes for 'atomic_default_mem_order' clause.
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
OpenMPDeviceClauseModifier
OpenMP modifiers for 'device' clause.
OpenMPMapModifierKind
OpenMP modifier kind for 'map' clause.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
OpenMPOrderClauseKind
OpenMP attributes for 'order' clause.
OpenMPScheduleClauseKind
OpenMP attributes for 'schedule' clause.
OpenMPThreadsetKind
OpenMP modifiers for 'threadset' clause.
UnsignedOrNone getPrimaryModuleHash(const Module *M)
Calculate a hash value for the primary module name of the given module.
OpenMPMapClauseKind
OpenMP mapping kind for 'map' clause.
The signature of a module, which is a hash of the AST content.
static constexpr size_t size
static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)
static ASTFileSignature createDummy()
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setInfo(const DeclarationNameLoc &Info)
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
A simple structure that captures a vtable use for the purposes of the ExternalSemaSource.
ExceptionSpecInfo ExceptionSpec
static LineEntry get(unsigned Offs, unsigned Line, int Filename, SrcMgr::CharacteristicKind FileKind, unsigned IncludeOffset)
A conflict between two modules.
Module * Other
The module that this module conflicts with.
std::string Message
The message provided to the user when there is a conflict.
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponentLists
Number of component lists.
unsigned NumVars
Number of expressions listed.
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumComponents
Total number of expression components.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
Expr * AllocatorTraits
Allocator traits.
Expr * Allocator
Allocator.
a linked list of methods with the same selector name but different signatures.
ObjCMethodList * getNext() const
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
NestedNameSpecifierLoc QualifierLoc
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
SanitizerMask Mask
Bitmask of enabled sanitizers.
Helper class that saves the current stream position and then restores it when destroyed.
PragmaMsStackAction Action
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Location information for a TemplateArgument.
Describes the categories of an Objective-C class.
void insert(GlobalDeclID ID)
void insert(LazySpecializationInfo Info)