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() &&
2231 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2233 PreprocessingRecord::PPEntityID PPID =
2234 PPRec.getPPEntityID(Index,
true);
2236 PPRec.getPreprocessedEntity(PPID));
2238 PPRec.RegisterMacroDefinition(
Macro, PPDef);
2249 if (MacroTokens.empty()) {
2250 Error(
"unexpected number of macro tokens for a macro in AST file");
2256 MacroTokens = MacroTokens.drop_front();
2267 ReadModuleOffsetMap(M);
2269 unsigned ModuleFileIndex = LocalID >> 32;
2270 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2273 assert(MF &&
"malformed identifier ID encoding?");
2275 if (!ModuleFileIndex) {
2284HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
2287 return FileMgr.getOptionalFileRef(Key.Filename);
2291 return FileMgr.getOptionalFileRef(*Resolved);
2295 uint8_t buf[
sizeof(ikey.
Size) +
sizeof(ikey.
ModTime)];
2298 return llvm::xxh3_64bits(buf);
2319 return FEA && FEA == FEB;
2322std::pair<unsigned, unsigned>
2329 using namespace llvm::support;
2332 ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2334 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2343 using namespace llvm::support;
2345 const unsigned char *End = d + DataLen;
2347 unsigned Flags = *d++;
2350 bool Included = (Flags >> 6) & 0x01;
2352 if ((FE = getFile(key)))
2355 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2358 HFI.
isImport |= (Flags >> 5) & 0x01;
2360 HFI.
DirInfo = (Flags >> 1) & 0x07;
2362 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2364 assert((End - d) % 4 == 0 &&
2365 "Wrong data length in HeaderFileInfo deserialization");
2367 uint32_t LocalSMID =
2368 endian::readNext<uint32_t, llvm::endianness::little>(d);
2374 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2375 Module *Mod = Reader.getSubmodule(GlobalSMID);
2377 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2379 if (FE || (FE = getFile(key))) {
2382 ModMap.
addHeader(Mod, H, HeaderRole,
true);
2394 uint32_t MacroDirectivesOffset) {
2395 assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
2396 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2403 for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
2404 BitstreamCursor &MacroCursor = I.MacroCursor;
2407 if (MacroCursor.getBitcodeBytes().empty())
2410 BitstreamCursor Cursor = MacroCursor;
2411 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2412 Error(std::move(Err));
2420 Error(MaybeE.takeError());
2423 llvm::BitstreamEntry E = MaybeE.get();
2426 case llvm::BitstreamEntry::SubBlock:
2427 case llvm::BitstreamEntry::Error:
2428 Error(
"malformed block record in AST file");
2430 case llvm::BitstreamEntry::EndBlock:
2433 case llvm::BitstreamEntry::Record: {
2437 Error(MaybeRecord.takeError());
2440 switch (MaybeRecord.get()) {
2467 class IdentifierLookupVisitor {
2470 unsigned PriorGeneration;
2471 unsigned &NumIdentifierLookups;
2472 unsigned &NumIdentifierLookupHits;
2476 IdentifierLookupVisitor(StringRef Name,
unsigned PriorGeneration,
2477 unsigned &NumIdentifierLookups,
2478 unsigned &NumIdentifierLookupHits)
2480 PriorGeneration(PriorGeneration),
2481 NumIdentifierLookups(NumIdentifierLookups),
2482 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2496 ++NumIdentifierLookups;
2497 ASTIdentifierLookupTable::iterator Pos =
2498 IdTable->find_hashed(Name, NameHash, &Trait);
2499 if (Pos == IdTable->end())
2505 ++NumIdentifierLookupHits;
2507 if (Trait.hasMoreInformationInDependencies()) {
2516 IdentifierInfo *getIdentifierInfo()
const {
return Found; }
2525 unsigned PriorGeneration = 0;
2527 PriorGeneration = IdentifierGeneration[&II];
2534 if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
2539 IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
2540 NumIdentifierLookups,
2541 NumIdentifierLookupHits);
2542 ModuleMgr.visit(Visitor, HitsPtr);
2559 uint64_t ModuleFileIndex =
Record[Idx++] << 32;
2560 uint64_t LocalIndex =
Record[Idx++];
2565 const PendingMacroInfo &PMInfo) {
2570 if (llvm::Error Err =
2572 Error(std::move(Err));
2576 struct ModuleMacroRecord {
2589 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2591 Error(MaybeEntry.takeError());
2594 llvm::BitstreamEntry Entry = MaybeEntry.get();
2596 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2597 Error(
"malformed block record in AST file");
2604 Error(MaybePP.takeError());
2612 ModuleMacros.push_back(ModuleMacroRecord());
2613 auto &Info = ModuleMacros.back();
2617 for (
int I = Idx, N =
Record.size(); I != N; ++I)
2623 Error(
"malformed block record in AST file");
2634 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2636 for (
auto &MMR : ModuleMacros) {
2638 for (
unsigned ModID : MMR.Overrides) {
2640 auto *
Macro = PP.getModuleMacro(Mod, II);
2641 assert(
Macro &&
"missing definition for overridden macro");
2642 Overrides.push_back(
Macro);
2645 bool Inserted =
false;
2647 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2658 unsigned Idx = 0, N =
Record.size();
2666 MD = PP.AllocateDefMacroDirective(MI, Loc);
2670 MD = PP.AllocateUndefMacroDirective(Loc);
2673 bool isPublic =
Record[Idx++];
2674 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2686 PP.setLoadedMacroDirective(II, Earliest, Latest);
2689bool ASTReader::shouldDisableValidationForFile(
2712static std::pair<StringRef, StringRef>
2714 const StringRef InputBlob) {
2715 uint16_t AsRequestedLength =
Record[7];
2716 return {InputBlob.substr(0, AsRequestedLength),
2717 InputBlob.substr(AsRequestedLength)};
2731 SavedStreamPosition SavedPosition(Cursor);
2735 consumeError(std::move(Err));
2738 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
2741 consumeError(MaybeCode.takeError());
2743 unsigned Code = MaybeCode.get();
2747 if (Expected<unsigned> Maybe =
Cursor.readRecord(Code,
Record, &Blob))
2749 "invalid record type for input file");
2752 consumeError(
Maybe.takeError());
2755 assert(
Record[0] == ID &&
"Bogus stored ID or offset");
2763 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2767 ? UnresolvedFilenameAsRequested
2768 : UnresolvedFilename;
2770 Expected<llvm::BitstreamEntry> MaybeEntry =
Cursor.advance();
2772 consumeError(MaybeEntry.takeError());
2773 llvm::BitstreamEntry Entry = MaybeEntry.get();
2774 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2775 "expected record type for input file hash");
2778 if (Expected<unsigned> Maybe =
Cursor.readRecord(Entry.ID,
Record))
2780 "invalid record type for input file hash");
2783 consumeError(
Maybe.takeError());
2808 SavedStreamPosition SavedPosition(Cursor);
2812 consumeError(std::move(Err));
2827 const HeaderSearchOptions &HSOpts =
2828 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2841 if ((Overridden || Transient || SkipChecks) && !
File)
2846 std::string ErrorStr =
"could not find file '";
2847 ErrorStr += *Filename;
2848 ErrorStr +=
"' referenced by AST file '";
2862 SourceManager &
SM = getSourceManager();
2864 if ((!Overridden && !Transient) && !SkipChecks &&
2865 SM.isFileOverridden(*
File)) {
2867 Error(diag::err_fe_pch_file_overridden, *Filename);
2879 enum ModificationKind {
2885 std::optional<int64_t> Old = std::nullopt;
2886 std::optional<int64_t>
New = std::nullopt;
2888 auto HasInputContentChanged = [&](Change OriginalChange) {
2889 assert(ValidateASTInputFilesContent &&
2890 "We should only check the content of the inputs with "
2891 "ValidateASTInputFilesContent enabled.");
2893 if (StoredContentHash == 0)
2894 return OriginalChange;
2897 if (!MemBuffOrError) {
2899 return OriginalChange;
2900 std::string ErrorStr =
"could not get buffer for file '";
2901 ErrorStr +=
File->getName();
2904 return OriginalChange;
2907 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2908 if (StoredContentHash ==
static_cast<uint64_t>(ContentHash))
2909 return Change{Change::None};
2911 return Change{Change::Content};
2913 auto HasInputFileChanged = [&]() {
2914 if (StoredSize !=
File->getSize())
2915 return Change{Change::Size, StoredSize,
File->getSize()};
2916 if (!shouldDisableValidationForFile(F) && StoredTime &&
2917 StoredTime !=
File->getModificationTime()) {
2918 Change MTimeChange = {Change::ModTime, StoredTime,
2919 File->getModificationTime()};
2923 if (ValidateASTInputFilesContent)
2924 return HasInputContentChanged(MTimeChange);
2928 return Change{Change::None};
2931 bool IsOutOfDate =
false;
2932 auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
2938 FileChange = HasInputContentChanged(FileChange);
2944 if (!StoredTime && ValidateASTInputFilesContent &&
2945 FileChange.Kind == Change::None)
2946 FileChange = HasInputContentChanged(FileChange);
2949 if (!Overridden && FileChange.Kind != Change::None) {
2952 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2953 while (!ImportStack.back()->ImportedBy.empty())
2954 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2957 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
2958 Diag(diag::err_fe_ast_file_modified)
2960 << TopLevelASTFileName << FileChange.Kind
2961 << (FileChange.Old && FileChange.New)
2962 << llvm::itostr(FileChange.Old.value_or(0))
2963 << llvm::itostr(FileChange.New.value_or(0));
2966 if (ImportStack.size() > 1) {
2967 Diag(diag::note_ast_file_required_by)
2968 << *Filename << ImportStack[0]->FileName;
2969 for (
unsigned I = 1; I < ImportStack.size(); ++I)
2970 Diag(diag::note_ast_file_required_by)
2971 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
2974 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
2989ASTReader::TemporarilyOwnedStringRef
2995ASTReader::TemporarilyOwnedStringRef
2998 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
3000 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3001 Path ==
"<built-in>" || Path ==
"<command line>")
3005 llvm::sys::path::append(Buf, Prefix, Path);
3006 StringRef ResolvedPath{Buf.data(), Buf.size()};
3007 return {ResolvedPath, Buf};
3020 return ResolvedPath->str();
3035 llvm_unreachable(
"unknown ASTReadResult");
3039 BitstreamCursor &Stream, StringRef Filename,
3040 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3041 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3044 consumeError(std::move(Err));
3052 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3055 consumeError(MaybeEntry.takeError());
3058 llvm::BitstreamEntry Entry = MaybeEntry.get();
3060 switch (Entry.Kind) {
3061 case llvm::BitstreamEntry::Error:
3062 case llvm::BitstreamEntry::SubBlock:
3065 case llvm::BitstreamEntry::EndBlock:
3068 case llvm::BitstreamEntry::Record:
3075 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3076 if (!MaybeRecordType) {
3078 consumeError(MaybeRecordType.takeError());
3083 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3084 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3085 AllowCompatibleConfigurationMismatch))
3086 Result = ConfigurationMismatch;
3091 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3092 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3093 AllowCompatibleConfigurationMismatch))
3094 Result = ConfigurationMismatch;
3099 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3100 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3101 AllowCompatibleConfigurationMismatch))
3102 Result = ConfigurationMismatch;
3107 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3108 if (!AllowCompatibleConfigurationMismatch &&
3109 ParseFileSystemOptions(
Record, Complain, Listener))
3110 Result = ConfigurationMismatch;
3115 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3116 if (!AllowCompatibleConfigurationMismatch &&
3117 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3118 Result = ConfigurationMismatch;
3123 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3124 if (!AllowCompatibleConfigurationMismatch &&
3125 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3126 SuggestedPredefines))
3127 Result = ConfigurationMismatch;
3135 SmallVectorImpl<ImportedModule> &Loaded,
3137 unsigned ClientLoadCapabilities) {
3138 BitstreamCursor &Stream = F.
Stream;
3141 Error(std::move(Err));
3151 bool HasReadUnhashedControlBlock =
false;
3152 auto readUnhashedControlBlockOnce = [&]() {
3153 if (!HasReadUnhashedControlBlock) {
3154 HasReadUnhashedControlBlock =
true;
3155 if (ASTReadResult
Result =
3156 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3162 bool DisableValidation = shouldDisableValidationForFile(F);
3166 unsigned NumInputs = 0;
3167 unsigned NumUserInputs = 0;
3168 StringRef BaseDirectoryAsWritten;
3170 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3172 Error(MaybeEntry.takeError());
3175 llvm::BitstreamEntry Entry = MaybeEntry.get();
3177 switch (Entry.Kind) {
3178 case llvm::BitstreamEntry::Error:
3179 Error(
"malformed block record in AST file");
3181 case llvm::BitstreamEntry::EndBlock: {
3184 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3188 const HeaderSearchOptions &HSOpts =
3189 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3196 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3202 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3206 N = ForceValidateUserInputs ? NumUserInputs : 0;
3209 Diag(diag::remark_module_validation)
3212 for (
unsigned I = 0; I < N; ++I) {
3213 InputFile IF = getInputFile(F, I+1, Complain);
3225 for (
unsigned I = 0; I < N; ++I) {
3226 bool IsSystem = I >= NumUserInputs;
3228 auto FilenameAsRequested = ResolveImportedPath(
3231 *FilenameAsRequested, IsSystem, FI.
Overridden,
3239 case llvm::BitstreamEntry::SubBlock:
3243 if (llvm::Error Err = Stream.SkipBlock()) {
3244 Error(std::move(Err));
3248 Error(
"malformed block record in AST file");
3258 if (Listener && !ImportedBy) {
3264 bool AllowCompatibleConfigurationMismatch =
3268 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3269 AllowCompatibleConfigurationMismatch, *Listener,
3270 SuggestedPredefines);
3272 Error(
"malformed block record in AST file");
3276 if (DisableValidation ||
3277 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3285 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3286 Error(std::move(Err));
3292 if (llvm::Error Err = Stream.SkipBlock()) {
3293 Error(std::move(Err));
3299 case llvm::BitstreamEntry::Record:
3307 Expected<unsigned> MaybeRecordType =
3308 Stream.readRecord(Entry.ID,
Record, &Blob);
3309 if (!MaybeRecordType) {
3310 Error(MaybeRecordType.takeError());
3316 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3318 : diag::err_ast_file_version_too_new)
3323 bool hasErrors =
Record[7];
3324 if (hasErrors && !DisableValidation) {
3327 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3328 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3331 if (!AllowASTWithCompilerErrors) {
3332 Diag(diag::err_ast_file_with_compiler_errors)
3338 Diags.ErrorOccurred =
true;
3339 Diags.UncompilableErrorOccurred =
true;
3340 Diags.UnrecoverableErrorOccurred =
true;
3353 StringRef ASTBranch = Blob;
3354 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3355 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3356 Diag(diag::err_ast_file_different_branch)
3368 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3378 auto [ImportLoc, ImportModuleFileIndex] =
3379 ReadUntranslatedSourceLocation(
Record[Idx++]);
3381 assert(ImportModuleFileIndex == 0);
3383 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3385 bool IsImportingStdCXXModule =
Record[Idx++];
3387 off_t StoredSize = 0;
3388 time_t StoredModTime = 0;
3389 ASTFileSignature StoredSignature;
3390 std::string ImportedFile;
3391 std::string StoredFile;
3392 bool IgnoreImportedByNote =
false;
3401 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3402 ImportedName, !IsImportingStdCXXModule);
3404 if (IsImportingStdCXXModule && ImportedFile.empty()) {
3405 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3409 if (!IsImportingStdCXXModule) {
3410 StoredSize = (off_t)
Record[Idx++];
3411 StoredModTime = (time_t)
Record[Idx++];
3415 SignatureBytes.end());
3420 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3421 if (ImportedFile.empty()) {
3422 ImportedFile = StoredFile;
3423 }
else if (!getDiags().isIgnored(
3424 diag::warn_module_file_mapping_mismatch,
3425 CurrentImportLoc)) {
3426 auto ImportedFileRef =
3427 PP.getFileManager().getOptionalFileRef(ImportedFile);
3428 auto StoredFileRef =
3429 PP.getFileManager().getOptionalFileRef(StoredFile);
3430 if ((ImportedFileRef && StoredFileRef) &&
3431 (*ImportedFileRef != *StoredFileRef)) {
3432 Diag(diag::warn_module_file_mapping_mismatch)
3433 << ImportedFile << StoredFile;
3434 Diag(diag::note_module_file_imported_by)
3436 IgnoreImportedByNote =
true;
3443 unsigned Capabilities = ClientLoadCapabilities;
3444 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3445 Capabilities &= ~ARR_Missing;
3448 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3449 Loaded, StoredSize, StoredModTime,
3450 StoredSignature, Capabilities);
3455 if (IsImportingStdCXXModule) {
3456 if (
const auto *Imported =
3457 getModuleManager().lookupByFileName(ImportedFile);
3458 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3459 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3465 bool recompilingFinalized =
Result == OutOfDate &&
3466 (Capabilities & ARR_OutOfDate) &&
3469 .getInMemoryModuleCache()
3471 if (!IgnoreImportedByNote &&
3473 Diag(diag::note_module_file_imported_by)
3477 case Failure:
return Failure;
3480 case OutOfDate:
return OutOfDate;
3482 case ConfigurationMismatch:
return ConfigurationMismatch;
3483 case HadErrors:
return HadErrors;
3502 Diag(diag::remark_module_import)
3504 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3510 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3518 BaseDirectoryAsWritten = Blob;
3520 "MODULE_DIRECTORY found before MODULE_NAME");
3522 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3526 Module *M = PP.getHeaderSearchInfo().lookupModule(
3533 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3536 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3537 if (!BuildDir || *BuildDir != M->
Directory) {
3538 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3539 Diag(diag::err_imported_module_relocated)
3550 if (ASTReadResult
Result =
3551 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3557 NumUserInputs =
Record[1];
3559 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3568llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3569 unsigned ClientLoadCapabilities) {
3570 BitstreamCursor &Stream = F.
Stream;
3572 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3579 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3581 return MaybeEntry.takeError();
3582 llvm::BitstreamEntry Entry = MaybeEntry.get();
3584 switch (Entry.Kind) {
3585 case llvm::BitstreamEntry::Error:
3586 return llvm::createStringError(
3587 std::errc::illegal_byte_sequence,
3588 "error at end of module block in AST file");
3589 case llvm::BitstreamEntry::EndBlock:
3595 if (ASTContext *Ctx = ContextObj) {
3596 DeclContext *DC = Ctx->getTranslationUnitDecl();
3601 return llvm::Error::success();
3602 case llvm::BitstreamEntry::SubBlock:
3610 if (llvm::Error Err = Stream.SkipBlock())
3612 if (llvm::Error Err = ReadBlockAbbrevs(
3619 if (!PP.getExternalSource())
3620 PP.setExternalSource(
this);
3622 if (llvm::Error Err = Stream.SkipBlock())
3624 if (llvm::Error Err =
3633 if (llvm::Error Err = Stream.SkipBlock()) {
3642 if (!PP.getPreprocessingRecord())
3643 PP.createPreprocessingRecord();
3644 if (!PP.getPreprocessingRecord()->getExternalSource())
3645 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3649 if (llvm::Error Err = ReadSourceManagerBlock(F))
3654 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3659 BitstreamCursor
C = Stream;
3661 if (llvm::Error Err = Stream.SkipBlock())
3665 CommentsCursors.push_back(std::make_pair(
C, &F));
3670 if (llvm::Error Err = Stream.SkipBlock())
3676 case llvm::BitstreamEntry::Record:
3684 Expected<unsigned> MaybeRecordType =
3685 Stream.readRecord(Entry.ID,
Record, &Blob);
3686 if (!MaybeRecordType)
3687 return MaybeRecordType.takeError();
3692 switch (RecordType) {
3713 switch (RecordType) {
3719 return llvm::createStringError(
3720 std::errc::illegal_byte_sequence,
3721 "duplicate TYPE_OFFSET record in AST file");
3734 return llvm::createStringError(
3735 std::errc::illegal_byte_sequence,
3736 "duplicate DECL_OFFSET record in AST file");
3748 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3749 LexicalContents Contents(
3751 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3752 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3759 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3760 auto *
Data = (
const unsigned char*)Blob.data();
3761 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3764 if (Decl *D = GetExistingDecl(ID))
3765 PendingUpdateRecords.push_back(
3766 PendingUpdateRecord(ID, D,
false));
3772 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3773 auto *
Data = (
const unsigned char *)Blob.data();
3774 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3777 if (Decl *D = GetExistingDecl(ID))
3778 PendingUpdateRecords.push_back(
3779 PendingUpdateRecord(ID, D,
false));
3787 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3788 auto *
Data = (
const unsigned char *)Blob.data();
3789 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3792 if (Decl *D = GetExistingDecl(ID))
3793 PendingUpdateRecords.push_back(
3794 PendingUpdateRecord(ID, D,
false));
3800 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3801 auto *
Data = (
const unsigned char *)Blob.data();
3802 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3805 if (Decl *D = GetExistingDecl(ID))
3806 PendingUpdateRecords.push_back(
3807 PendingUpdateRecord(ID, D,
false));
3813 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3814 auto *
Data = (
const unsigned char *)Blob.data();
3815 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3818 if (Decl *D = GetExistingDecl(ID))
3819 PendingUpdateRecords.push_back(
3820 PendingUpdateRecord(ID, D,
false));
3826 reinterpret_cast<const unsigned char *
>(Blob.data());
3832 ASTIdentifierLookupTrait(*
this, F));
3834 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
3840 return llvm::createStringError(
3841 std::errc::illegal_byte_sequence,
3842 "duplicate IDENTIFIER_OFFSET record in AST file");
3848 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3860 for (
unsigned I = 0, N =
Record.size(); I != N; )
3861 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3868 getContext().getLangOpts().BuildingPCHWithObjectFile)
3869 for (
unsigned I = 0, N =
Record.size(); I != N; )
3870 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3874 if (SpecialTypes.empty()) {
3875 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
3876 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
3883 if (SpecialTypes.size() !=
Record.size())
3884 return llvm::createStringError(std::errc::illegal_byte_sequence,
3885 "invalid special-types record");
3887 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
3889 if (!SpecialTypes[I])
3890 SpecialTypes[I] =
ID;
3897 TotalNumStatements +=
Record[0];
3898 TotalNumMacros +=
Record[1];
3899 TotalLexicalDeclContexts +=
Record[2];
3900 TotalVisibleDeclContexts +=
Record[3];
3901 TotalModuleLocalVisibleDeclContexts +=
Record[4];
3902 TotalTULocalVisibleDeclContexts +=
Record[5];
3906 for (
unsigned I = 0, N =
Record.size(); I != N; )
3907 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
3911 for (
unsigned I = 0, N =
Record.size(); I != N; )
3912 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
3916 if (
Record.size() % 3 != 0)
3917 return llvm::createStringError(std::errc::illegal_byte_sequence,
3918 "invalid weak identifiers record");
3922 WeakUndeclaredIdentifiers.clear();
3925 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
3926 WeakUndeclaredIdentifiers.push_back(
3927 getGlobalIdentifierID(F,
Record[I++]));
3928 WeakUndeclaredIdentifiers.push_back(
3929 getGlobalIdentifierID(F,
Record[I++]));
3930 WeakUndeclaredIdentifiers.push_back(
3931 ReadSourceLocation(F,
Record, I).getRawEncoding());
3938 unsigned LocalBaseSelectorID =
Record[1];
3944 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3949 std::make_pair(LocalBaseSelectorID,
3961 = ASTSelectorLookupTable::Create(
3964 ASTSelectorLookupTrait(*
this, F));
3965 TotalNumMethodPoolEntries +=
Record[1];
3970 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
3971 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3973 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
3982 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
3983 ReadSourceLocation(F,
Record, Idx));
3989 SmallVector<SourceLocation, 64> SrcLocs;
3991 while (Idx <
Record.size())
3992 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
3993 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4000 unsigned Idx = 0, End =
Record.size() - 1;
4001 bool ReachedEOFWhileSkipping =
Record[Idx++];
4002 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4003 if (ReachedEOFWhileSkipping) {
4004 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4005 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4006 bool FoundNonSkipPortion =
Record[Idx++];
4007 bool FoundElse =
Record[Idx++];
4008 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4009 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4010 FoundElse, ElseLoc);
4012 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4014 auto Loc = ReadSourceLocation(F,
Record, Idx);
4015 bool WasSkipping =
Record[Idx++];
4016 bool FoundNonSkip =
Record[Idx++];
4017 bool FoundElse =
Record[Idx++];
4018 ConditionalStack.push_back(
4019 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4021 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4026 if (!
Record.empty() && Listener)
4044 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4045 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4046 return llvm::createStringError(std::errc::invalid_argument,
4047 "ran out of source locations");
4052 unsigned RangeStart =
4054 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4059 GlobalSLocOffsetMap.insert(
4061 - SLocSpaceSize,&F));
4072 ParseLineTable(F,
Record);
4076 for (
unsigned I = 0, N =
Record.size(); I != N; )
4077 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4081 if (
Record.size() % 3 != 0)
4082 return llvm::createStringError(std::errc::illegal_byte_sequence,
4083 "Invalid VTABLE_USES record");
4090 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4091 VTableUses.push_back(
4092 {ReadDeclID(F,
Record, Idx),
4093 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4100 if (
Record.size() % 2 != 0)
4101 return llvm::createStringError(
4102 std::errc::illegal_byte_sequence,
4103 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4108 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4109 PendingInstantiations.push_back(
4110 {ReadDeclID(F,
Record, I),
4111 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4118 return llvm::createStringError(std::errc::illegal_byte_sequence,
4119 "Invalid SEMA_DECL_REFS block");
4120 for (
unsigned I = 0, N =
Record.size(); I != N; )
4121 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4129 unsigned StartingID;
4130 if (!PP.getPreprocessingRecord())
4131 PP.createPreprocessingRecord();
4132 if (!PP.getPreprocessingRecord()->getExternalSource())
4133 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4135 = PP.getPreprocessingRecord()
4142 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4153 if (!PP.getPreprocessingRecord())
4154 PP.createPreprocessingRecord();
4155 if (!PP.getPreprocessingRecord()->getExternalSource())
4156 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4161 GlobalSkippedRangeMap.insert(
4167 if (
Record.size() % 2 != 0)
4168 return llvm::createStringError(
4169 std::errc::illegal_byte_sequence,
4170 "invalid DECL_UPDATE_OFFSETS block in AST file");
4171 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4172 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4173 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4177 if (Decl *D = GetExistingDecl(ID))
4178 PendingUpdateRecords.push_back(
4179 PendingUpdateRecord(ID, D,
false));
4184 if (
Record.size() % 5 != 0)
4185 return llvm::createStringError(
4186 std::errc::illegal_byte_sequence,
4187 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4189 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4190 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4193 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4196 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4199 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4202 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4205 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4207 DelayedNamespaceOffsetMap[
ID] = {
4208 {VisibleOffset, TULocalOffset, ModuleLocalOffset}, LexicalOffset};
4210 assert(!GetExistingDecl(ID) &&
4211 "We shouldn't load the namespace in the front of delayed "
4212 "namespace lexical and visible block");
4218 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4219 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4220 auto &RelatedDecls = RelatedDeclsMap[
ID];
4221 unsigned NN =
Record[I++];
4222 RelatedDecls.reserve(NN);
4223 for (
unsigned II = 0; II < NN; II++)
4224 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4230 return llvm::createStringError(
4231 std::errc::illegal_byte_sequence,
4232 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4245 CUDASpecialDeclRefs.clear();
4246 for (
unsigned I = 0, N =
Record.size(); I != N; )
4247 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4257 HeaderFileInfoTrait(*
this, F));
4259 PP.getHeaderSearchInfo().SetExternalSource(
this);
4260 if (!PP.getHeaderSearchInfo().getExternalLookup())
4261 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4267 FPPragmaOptions.swap(
Record);
4271 for (
unsigned I = 0, N =
Record.size(); I != N; )
4272 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4276 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4277 auto Name = ReadString(
Record, I);
4278 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4279 OptInfo.Supported =
Record[I++] != 0;
4280 OptInfo.Enabled =
Record[I++] != 0;
4281 OptInfo.WithPragma =
Record[I++] != 0;
4282 OptInfo.Avail =
Record[I++];
4283 OptInfo.Core =
Record[I++];
4284 OptInfo.Opt =
Record[I++];
4289 for (
unsigned I = 0, N =
Record.size(); I != N; )
4290 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4294 for (
unsigned I = 0, N =
Record.size(); I != N; )
4295 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4299 if (
Record.size() % 2 != 0)
4300 return llvm::createStringError(std::errc::illegal_byte_sequence,
4301 "invalid undefined-but-used record");
4302 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4303 UndefinedButUsed.push_back(
4304 {ReadDeclID(F,
Record, I),
4305 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4310 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4311 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4313 DelayedDeleteExprs.push_back(Count);
4314 for (uint64_t
C = 0;
C < Count; ++
C) {
4315 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4316 bool IsArrayForm =
Record[I++] == 1;
4317 DelayedDeleteExprs.push_back(IsArrayForm);
4324 getContext().getLangOpts().BuildingPCHWithObjectFile)
4325 for (
unsigned I = 0, N =
Record.size(); I != N;)
4326 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4334 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4335 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4336 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4338 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4339 if (DeserializationListener)
4340 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4348 return llvm::createStringError(
4349 std::errc::illegal_byte_sequence,
4350 "duplicate MACRO_OFFSET record in AST file");
4362 LateParsedTemplates.emplace_back(
4363 std::piecewise_construct, std::forward_as_tuple(&F),
4369 return llvm::createStringError(std::errc::illegal_byte_sequence,
4370 "invalid pragma optimize record");
4371 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4376 return llvm::createStringError(std::errc::illegal_byte_sequence,
4377 "invalid pragma ms_struct record");
4378 PragmaMSStructState =
Record[0];
4383 return llvm::createStringError(
4384 std::errc::illegal_byte_sequence,
4385 "invalid pragma pointers to members record");
4386 PragmaMSPointersToMembersState =
Record[0];
4387 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4391 for (
unsigned I = 0, N =
Record.size(); I != N; )
4392 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4397 return llvm::createStringError(std::errc::illegal_byte_sequence,
4398 "invalid cuda pragma options record");
4399 ForceHostDeviceDepth =
Record[0];
4404 return llvm::createStringError(std::errc::illegal_byte_sequence,
4405 "invalid pragma pack record");
4406 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4407 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4408 unsigned NumStackEntries =
Record[2];
4411 PragmaAlignPackStack.clear();
4412 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4413 PragmaAlignPackStackEntry Entry;
4414 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4415 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4416 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4417 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4418 Entry.SlotLabel = PragmaAlignPackStrings.back();
4419 PragmaAlignPackStack.push_back(Entry);
4426 return llvm::createStringError(std::errc::illegal_byte_sequence,
4427 "invalid pragma float control record");
4429 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4430 unsigned NumStackEntries =
Record[2];
4433 FpPragmaStack.clear();
4434 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4435 FpPragmaStackEntry Entry;
4437 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4438 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4439 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4440 Entry.SlotLabel = FpPragmaStrings.back();
4441 FpPragmaStack.push_back(Entry);
4447 for (
unsigned I = 0, N =
Record.size(); I != N; )
4448 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4454void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4467 assert(ImportedModuleVector.empty());
4469 while (
Data < DataEnd) {
4473 using namespace llvm::support;
4475 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4476 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4477 StringRef Name = StringRef((
const char*)
Data, Len);
4481 ? ModuleMgr.lookupByModuleName(Name)
4482 : ModuleMgr.lookupByFileName(Name));
4484 std::string Msg =
"refers to unknown module, cannot find ";
4485 Msg.append(std::string(Name));
4490 ImportedModuleVector.push_back(OM);
4493 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4495 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4498 RemapBuilder &Remap) {
4499 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4501 Remap.insert(std::make_pair(Offset,
4502 static_cast<int>(BaseOffset - Offset)));
4513 unsigned ClientLoadCapabilities) {
4522 "MODULE_NAME should come before MODULE_MAP_FILE");
4523 if (PP.getPreprocessorOpts().ModulesCheckRelocated &&
4529 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4531 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4533 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
4536 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4537 if (
auto ASTFE = M ? M->
getASTFile() : std::nullopt) {
4540 << ASTFE->getName();
4544 Diag(diag::err_imported_module_not_found)
4551 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4552 Diag(diag::note_imported_by_pch_module_not_found)
4559 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4563 if (!StoredModMap || *StoredModMap != ModMap) {
4564 assert(ModMap &&
"found module is missing module map file");
4566 "top-level import should be verified");
4568 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4569 Diag(diag::err_imported_module_modmap_changed)
4576 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4578 std::string Filename = ReadPath(F,
Record, Idx);
4581 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4582 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4585 AdditionalStoredMaps.insert(*SF);
4590 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4591 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4594 if (!AdditionalStoredMaps.erase(ModMap)) {
4595 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4596 Diag(diag::err_module_different_modmap)
4605 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4606 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4607 Diag(diag::err_module_different_modmap)
4621 SemaObjC::GlobalMethodPool::iterator Known =
4627 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4628 : Known->second.second;
4632 if (List->getMethod() == Method) {
4640 if (List->getNext())
4641 List->setMethod(List->getNext()->getMethod());
4643 List->setMethod(Method);
4649 for (
Decl *D : Names) {
4653 if (wasHidden && SemaObj) {
4666 Stack.push_back(Mod);
4667 while (!Stack.empty()) {
4668 Mod = Stack.pop_back_val();
4670 if (NameVisibility <= Mod->NameVisibility) {
4686 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4687 if (Hidden != HiddenNamesMap.end()) {
4688 auto HiddenNames = std::move(*Hidden);
4689 HiddenNamesMap.erase(Hidden);
4691 assert(!HiddenNamesMap.contains(Mod) &&
4692 "making names visible added hidden names");
4699 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4701 if (Visited.insert(Exported).second)
4702 Stack.push_back(Exported);
4720 PendingMergedDefinitionsToDeduplicate.insert(Def);
4729 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4730 !PP.getLangOpts().Modules)
4734 TriedLoadingGlobalIndex =
true;
4735 StringRef ModuleCachePath
4737 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4739 if (llvm::Error Err = std::move(
Result.second)) {
4741 consumeError(std::move(Err));
4745 GlobalIndex.reset(
Result.first);
4746 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4751 return PP.getLangOpts().Modules && UseGlobalIndex &&
4763 consumeError(MaybeEntry.takeError());
4766 llvm::BitstreamEntry Entry = MaybeEntry.get();
4768 switch (Entry.Kind) {
4769 case llvm::BitstreamEntry::Error:
4770 case llvm::BitstreamEntry::EndBlock:
4773 case llvm::BitstreamEntry::Record:
4779 consumeError(Skipped.takeError());
4783 case llvm::BitstreamEntry::SubBlock:
4784 if (Entry.ID == BlockID) {
4785 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4787 consumeError(std::move(Err));
4794 if (llvm::Error Err = Cursor.SkipBlock()) {
4796 consumeError(std::move(Err));
4805 unsigned ClientLoadCapabilities,
4807 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
4811 CurrentDeserializingModuleKind,
Type);
4817 unsigned PreviousGeneration = 0;
4821 unsigned NumModules = ModuleMgr.size();
4826 ClientLoadCapabilities)) {
4827 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4831 GlobalIndex.reset();
4832 ModuleMgr.setGlobalIndex(
nullptr);
4836 if (NewLoadedModuleFile && !Loaded.empty())
4837 *NewLoadedModuleFile = Loaded.back().Mod;
4848 for (ImportedModule &M : Loaded) {
4850 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
4853 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4854 Error(std::move(Err));
4860 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
4866 if (llvm::Error Err = ReadExtensionBlock(F)) {
4867 Error(std::move(Err));
4880 for (ImportedModule &M : Loaded) {
4896 if (!PP.getLangOpts().CPlusPlus) {
4903 auto It = PP.getIdentifierTable().find(Key);
4904 if (It == PP.getIdentifierTable().end())
4913 II = &PP.getIdentifierTable().getOwn(Key);
4931 for (
auto &Id : PP.getIdentifierTable())
4932 Id.second->setOutOfDate(
true);
4935 for (
const auto &Sel : SelectorGeneration)
4936 SelectorOutOfDate[Sel.first] =
true;
4940 for (ImportedModule &M : Loaded) {
4943 ModuleMgr.moduleFileAccepted(&F);
4956 for (
unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4957 UnresolvedModuleRef &
Unresolved = UnresolvedModuleRefs[I];
4962 case UnresolvedModuleRef::Conflict:
4965 Conflict.
Other = ResolvedMod;
4967 Unresolved.Mod->Conflicts.push_back(Conflict);
4971 case UnresolvedModuleRef::Import:
4976 case UnresolvedModuleRef::Affecting:
4978 Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
4981 case UnresolvedModuleRef::Export:
4988 UnresolvedModuleRefs.clear();
5000 if (DeserializationListener)
5001 DeserializationListener->ReaderInitialized(
this);
5003 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5018 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5019 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5020 ObjCClassesLoaded[I], PreviousGeneration);
5025 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5030 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5031 ImportedModule &M = Loaded[I];
5049 if (!Stream.canSkipToPos(4))
5050 return llvm::createStringError(
5051 std::errc::illegal_byte_sequence,
5052 "file too small to contain precompiled file magic");
5053 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5056 return llvm::createStringError(
5057 std::errc::illegal_byte_sequence,
5058 "file doesn't start with precompiled file magic");
5060 return Res.takeError();
5061 return llvm::Error::success();
5076 llvm_unreachable(
"unknown module kind");
5080ASTReader::ReadASTCore(StringRef
FileName,
5082 SourceLocation ImportLoc,
5084 SmallVectorImpl<ImportedModule> &Loaded,
5085 off_t ExpectedSize, time_t ExpectedModTime,
5086 ASTFileSignature ExpectedSignature,
5087 unsigned ClientLoadCapabilities) {
5089 std::string ErrorStr;
5091 = ModuleMgr.addModule(
FileName,
Type, ImportLoc, ImportedBy,
5092 getGeneration(), ExpectedSize, ExpectedModTime,
5096 switch (AddResult) {
5098 Diag(diag::remark_module_import)
5100 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5110 if (ClientLoadCapabilities & ARR_Missing)
5114 Diag(diag::err_ast_file_not_found)
5122 if (ClientLoadCapabilities & ARR_OutOfDate)
5126 Diag(diag::err_ast_file_out_of_date)
5132 assert(M &&
"Missing module file");
5134 bool ShouldFinalizePCM =
false;
5135 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
5136 auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
5137 if (ShouldFinalizePCM)
5143 BitstreamCursor &Stream = F.Stream;
5144 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5145 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5149 Diag(diag::err_ast_file_invalid)
5155 bool HaveReadControlBlock =
false;
5157 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5159 Error(MaybeEntry.takeError());
5162 llvm::BitstreamEntry Entry = MaybeEntry.get();
5164 switch (Entry.Kind) {
5165 case llvm::BitstreamEntry::Error:
5166 case llvm::BitstreamEntry::Record:
5167 case llvm::BitstreamEntry::EndBlock:
5168 Error(
"invalid record at top-level of AST file");
5171 case llvm::BitstreamEntry::SubBlock:
5177 HaveReadControlBlock =
true;
5178 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5186 F.ModuleName.empty()) {
5188 if (
Result != OutOfDate ||
5189 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
5195 case Failure:
return Failure;
5196 case Missing:
return Missing;
5197 case OutOfDate:
return OutOfDate;
5199 case ConfigurationMismatch:
return ConfigurationMismatch;
5200 case HadErrors:
return HadErrors;
5205 if (!HaveReadControlBlock) {
5206 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
5207 Diag(diag::err_ast_file_version_too_old)
5213 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
5214 ShouldFinalizePCM =
true;
5218 if (llvm::Error Err = Stream.SkipBlock()) {
5219 Error(std::move(Err));
5226 llvm_unreachable(
"unexpected break; expected return");
5230ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5231 unsigned ClientLoadCapabilities) {
5232 const HeaderSearchOptions &HSOpts =
5233 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5234 bool AllowCompatibleConfigurationMismatch =
5236 bool DisableValidation = shouldDisableValidationForFile(F);
5238 ASTReadResult
Result = readUnhashedControlBlockImpl(
5240 AllowCompatibleConfigurationMismatch, Listener.get(),
5245 if (DisableValidation || WasImportedBy ||
5246 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5250 Error(
"malformed block record in AST file");
5273 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5275 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5284 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5285 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5286 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5288 BitstreamCursor Stream(StreamData);
5293 consumeError(std::move(Err));
5305 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5308 consumeError(MaybeEntry.takeError());
5311 llvm::BitstreamEntry Entry = MaybeEntry.get();
5313 switch (Entry.Kind) {
5314 case llvm::BitstreamEntry::Error:
5315 case llvm::BitstreamEntry::SubBlock:
5318 case llvm::BitstreamEntry::EndBlock:
5321 case llvm::BitstreamEntry::Record:
5329 Expected<unsigned> MaybeRecordType =
5330 Stream.readRecord(Entry.ID,
Record, &Blob);
5331 if (!MaybeRecordType) {
5340 "Dummy AST file signature not backpatched in ASTWriter.");
5347 "Dummy AST block hash not backpatched in ASTWriter.");
5351 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5352 if (Listener && ValidateDiagnosticOptions &&
5353 !AllowCompatibleConfigurationMismatch &&
5354 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5359 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5360 if (Listener && !AllowCompatibleConfigurationMismatch &&
5361 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5362 Result = ConfigurationMismatch;
5391 if (
Record.size() < 4)
return true;
5396 unsigned BlockNameLen =
Record[2];
5397 unsigned UserInfoLen =
Record[3];
5399 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5401 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5402 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5403 Blob.data() + BlockNameLen + UserInfoLen);
5407llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5408 BitstreamCursor &Stream = F.
Stream;
5412 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5414 return MaybeEntry.takeError();
5415 llvm::BitstreamEntry Entry = MaybeEntry.get();
5417 switch (Entry.Kind) {
5418 case llvm::BitstreamEntry::SubBlock:
5419 if (llvm::Error Err = Stream.SkipBlock())
5422 case llvm::BitstreamEntry::EndBlock:
5423 return llvm::Error::success();
5424 case llvm::BitstreamEntry::Error:
5425 return llvm::createStringError(std::errc::illegal_byte_sequence,
5426 "malformed block record in AST file");
5427 case llvm::BitstreamEntry::Record:
5433 Expected<unsigned> MaybeRecCode =
5434 Stream.readRecord(Entry.ID,
Record, &Blob);
5436 return MaybeRecCode.takeError();
5437 switch (MaybeRecCode.get()) {
5439 ModuleFileExtensionMetadata Metadata;
5441 return llvm::createStringError(
5442 std::errc::illegal_byte_sequence,
5443 "malformed EXTENSION_METADATA in AST file");
5446 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5447 if (Known == ModuleFileExtensions.end())
break;
5450 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5460 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5464 assert(ContextObj &&
"no context to initialize");
5468 if (DeserializationListener)
5469 DeserializationListener->DeclRead(
5471 Context.getTranslationUnitDecl());
5479 if (!Context.CFConstantStringTypeDecl)
5480 Context.setCFConstantStringType(
GetType(String));
5485 if (FileType.isNull()) {
5486 Error(
"FILE type is NULL");
5490 if (!Context.FILEDecl) {
5492 Context.setFILEDecl(
Typedef->getDecl());
5494 const TagType *Tag = FileType->getAs<TagType>();
5496 Error(
"Invalid FILE type in AST file");
5499 Context.setFILEDecl(Tag->getDecl());
5506 if (Jmp_bufType.
isNull()) {
5507 Error(
"jmp_buf type is NULL");
5511 if (!Context.jmp_bufDecl) {
5513 Context.setjmp_bufDecl(
Typedef->getDecl());
5515 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5517 Error(
"Invalid jmp_buf type in AST file");
5520 Context.setjmp_bufDecl(Tag->getDecl());
5527 if (Sigjmp_bufType.
isNull()) {
5528 Error(
"sigjmp_buf type is NULL");
5532 if (!Context.sigjmp_bufDecl) {
5534 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5536 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5537 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5538 Context.setsigjmp_bufDecl(Tag->getDecl());
5544 if (Context.ObjCIdRedefinitionType.isNull())
5545 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5548 if (
TypeID ObjCClassRedef =
5550 if (Context.ObjCClassRedefinitionType.isNull())
5551 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5554 if (
TypeID ObjCSelRedef =
5556 if (Context.ObjCSelRedefinitionType.isNull())
5557 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5562 if (Ucontext_tType.
isNull()) {
5563 Error(
"ucontext_t type is NULL");
5567 if (!Context.ucontext_tDecl) {
5569 Context.setucontext_tDecl(
Typedef->getDecl());
5571 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5572 assert(Tag &&
"Invalid ucontext_t type in AST file");
5573 Context.setucontext_tDecl(Tag->getDecl());
5582 if (!CUDASpecialDeclRefs.empty()) {
5583 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5584 Context.setcudaConfigureCallDecl(
5585 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5586 Context.setcudaGetParameterBufferDecl(
5587 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5588 Context.setcudaLaunchDeviceDecl(
5589 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5594 for (
auto &Import : PendingImportedModules) {
5598 if (Import.ImportLoc.isValid())
5599 PP.makeModuleVisible(Imported, Import.ImportLoc);
5606 PendingImportedModulesSema.append(PendingImportedModules);
5607 PendingImportedModules.clear();
5617 BitstreamCursor Stream(
PCH);
5620 consumeError(std::move(Err));
5632 Stream.advanceSkippingSubblocks();
5635 consumeError(MaybeEntry.takeError());
5638 llvm::BitstreamEntry Entry = MaybeEntry.get();
5640 if (Entry.Kind != llvm::BitstreamEntry::Record)
5648 consumeError(MaybeRecord.takeError());
5654 "Dummy AST file signature not backpatched in ASTWriter.");
5664 const std::string &ASTFileName,
FileManager &FileMgr,
5667 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5672 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5673 << ASTFileName << Buffer.getError().message();
5674 return std::string();
5678 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5682 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5683 return std::string();
5688 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5689 return std::string();
5696 Stream.advanceSkippingSubblocks();
5699 consumeError(MaybeEntry.takeError());
5700 return std::string();
5702 llvm::BitstreamEntry Entry = MaybeEntry.get();
5704 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5705 return std::string();
5707 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5708 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5709 return std::string();
5717 consumeError(MaybeRecord.takeError());
5718 return std::string();
5732 std::string ExistingModuleCachePath;
5734 bool StrictOptionMatches;
5737 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5742 bool StrictOptionMatches)
5743 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5744 ExistingTargetOpts(ExistingTargetOpts),
5745 ExistingPPOpts(ExistingPPOpts),
5746 ExistingModuleCachePath(ExistingModuleCachePath),
FileMgr(
FileMgr),
5747 StrictOptionMatches(StrictOptionMatches) {}
5749 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5750 StringRef ModuleFilename,
bool Complain,
5751 bool AllowCompatibleDifferences)
override {
5753 nullptr, AllowCompatibleDifferences);
5756 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5757 StringRef ModuleFilename,
bool Complain,
5758 bool AllowCompatibleDifferences)
override {
5760 nullptr, AllowCompatibleDifferences);
5763 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5764 StringRef ModuleFilename,
bool Complain,
5765 bool AllowCompatibleDifferences)
override {
5767 nullptr, AllowCompatibleDifferences);
5770 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5771 StringRef ModuleFilename,
5772 StringRef SpecificModuleCachePath,
5773 bool Complain)
override {
5775 SpecificModuleCachePath,
5776 ExistingModuleCachePath, ModuleFilename,
5777 nullptr, ExistingLangOpts, ExistingPPOpts);
5780 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5781 StringRef ModuleFilename,
bool ReadMacros,
5783 std::string &SuggestedPredefines)
override {
5785 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5786 FileMgr, SuggestedPredefines, ExistingLangOpts,
5798 unsigned ClientLoadCapabilities) {
5800 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5801 llvm::MemoryBuffer *Buffer =
5811 Filename ==
"-" ? FileMgr.getSTDIN() : FileMgr.getFileRef(Filename);
5813 llvm::consumeError(Entry.takeError());
5816 auto BufferOrErr = FileMgr.getBufferForFile(*Entry);
5819 OwnedBuffer = std::move(*BufferOrErr);
5820 Buffer = OwnedBuffer.get();
5824 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
5825 BitstreamCursor Stream(Bytes);
5829 consumeError(std::move(Err));
5837 bool NeedsInputFiles = Listener.needsInputFileVisitation();
5838 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5839 bool NeedsImports = Listener.needsImportVisitation();
5840 BitstreamCursor InputFilesCursor;
5841 uint64_t InputFilesOffsetBase = 0;
5844 std::string ModuleDir;
5845 bool DoneWithControlBlock =
false;
5847 PathBuf.reserve(256);
5852 AdditionalPathBuf.reserve(256);
5853 while (!DoneWithControlBlock) {
5857 consumeError(MaybeEntry.takeError());
5860 llvm::BitstreamEntry Entry = MaybeEntry.get();
5862 switch (Entry.Kind) {
5863 case llvm::BitstreamEntry::SubBlock: {
5866 std::string IgnoredSuggestedPredefines;
5867 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
5869 Listener, IgnoredSuggestedPredefines) !=
Success)
5875 InputFilesCursor = Stream;
5876 if (llvm::Error Err = Stream.SkipBlock()) {
5878 consumeError(std::move(Err));
5881 if (NeedsInputFiles &&
5884 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
5888 if (llvm::Error Err = Stream.SkipBlock()) {
5890 consumeError(std::move(Err));
5899 case llvm::BitstreamEntry::EndBlock:
5900 DoneWithControlBlock =
true;
5903 case llvm::BitstreamEntry::Error:
5906 case llvm::BitstreamEntry::Record:
5910 if (DoneWithControlBlock)
break;
5915 Stream.readRecord(Entry.ID,
Record, &Blob);
5916 if (!MaybeRecCode) {
5924 if (Listener.ReadFullVersionInformation(Blob))
5928 Listener.ReadModuleName(Blob);
5931 ModuleDir = std::string(Blob);
5937 Listener.ReadModuleMapFile(*Path);
5941 if (!NeedsInputFiles)
5944 unsigned NumInputFiles =
Record[0];
5945 unsigned NumUserFiles =
Record[1];
5946 const llvm::support::unaligned_uint64_t *InputFileOffs =
5947 (
const llvm::support::unaligned_uint64_t *)Blob.data();
5948 for (
unsigned I = 0; I != NumInputFiles; ++I) {
5950 bool isSystemFile = I >= NumUserFiles;
5952 if (isSystemFile && !NeedsSystemInputFiles)
5955 BitstreamCursor &Cursor = InputFilesCursor;
5957 if (llvm::Error Err =
5958 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
5960 consumeError(std::move(Err));
5966 consumeError(MaybeCode.takeError());
5968 unsigned Code = MaybeCode.get();
5972 bool shouldContinue =
false;
5974 Cursor.readRecord(Code,
Record, &Blob);
5975 if (!MaybeRecordType) {
5977 consumeError(MaybeRecordType.takeError());
5983 bool Overridden =
static_cast<bool>(
Record[3]);
5984 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
5987 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
5989 if (UnresolvedFilename.empty())
5990 Filename = *FilenameAsRequestedBuf;
5993 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
5994 Filename = *FilenameBuf;
5996 shouldContinue = Listener.visitInputFileAsRequested(
5997 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6001 if (!shouldContinue)
6022 bool IsStandardCXXModule =
Record[Idx++];
6026 if (IsStandardCXXModule) {
6027 Listener.visitImport(ModuleName,
"");
6038 Listener.visitImport(ModuleName, *Filename);
6049 if (FindModuleFileExtensions) {
6050 BitstreamCursor SavedStream = Stream;
6052 bool DoneWithExtensionBlock =
false;
6053 while (!DoneWithExtensionBlock) {
6059 llvm::BitstreamEntry Entry = MaybeEntry.get();
6061 switch (Entry.Kind) {
6062 case llvm::BitstreamEntry::SubBlock:
6063 if (llvm::Error Err = Stream.SkipBlock()) {
6065 consumeError(std::move(Err));
6070 case llvm::BitstreamEntry::EndBlock:
6071 DoneWithExtensionBlock =
true;
6074 case llvm::BitstreamEntry::Error:
6077 case llvm::BitstreamEntry::Record:
6084 Stream.readRecord(Entry.ID,
Record, &Blob);
6085 if (!MaybeRecCode) {
6089 switch (MaybeRecCode.get()) {
6095 Listener.readModuleFileExtension(Metadata);
6101 Stream = std::move(SavedStream);
6105 if (readUnhashedControlBlockImpl(
6106 nullptr, Bytes, Filename, ClientLoadCapabilities,
6108 ValidateDiagnosticOptions) !=
Success)
6119 bool RequireStrictOptionMatches) {
6120 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts,
6121 ExistingModuleCachePath, FileMgr,
6122 RequireStrictOptionMatches);
6128llvm::Error ASTReader::ReadSubmoduleBlock(
ModuleFile &F,
6129 unsigned ClientLoadCapabilities) {
6134 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6139 auto CreateModule = !KnowsTopLevelModule
6144 Module *CurrentModule =
nullptr;
6148 F.
Stream.advanceSkippingSubblocks();
6150 return MaybeEntry.takeError();
6151 llvm::BitstreamEntry Entry = MaybeEntry.get();
6153 switch (Entry.Kind) {
6154 case llvm::BitstreamEntry::SubBlock:
6155 case llvm::BitstreamEntry::Error:
6156 return llvm::createStringError(std::errc::illegal_byte_sequence,
6157 "malformed block record in AST file");
6158 case llvm::BitstreamEntry::EndBlock:
6159 return llvm::Error::success();
6160 case llvm::BitstreamEntry::Record:
6170 return MaybeKind.takeError();
6171 unsigned Kind = MaybeKind.get();
6174 return llvm::createStringError(
6175 std::errc::illegal_byte_sequence,
6176 "submodule metadata record should be at beginning of block");
6191 return llvm::createStringError(std::errc::illegal_byte_sequence,
6192 "malformed module definition");
6194 StringRef Name = Blob;
6201 bool IsFramework =
Record[Idx++];
6202 bool IsExplicit =
Record[Idx++];
6203 bool IsSystem =
Record[Idx++];
6204 bool IsExternC =
Record[Idx++];
6205 bool InferSubmodules =
Record[Idx++];
6206 bool InferExplicitSubmodules =
Record[Idx++];
6207 bool InferExportWildcard =
Record[Idx++];
6208 bool ConfigMacrosExhaustive =
Record[Idx++];
6209 bool ModuleMapIsPrivate =
Record[Idx++];
6210 bool NamedModuleHasInit =
Record[Idx++];
6212 Module *ParentModule =
nullptr;
6214 ParentModule = getSubmodule(Parent);
6216 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6217 IsFramework, IsExplicit);
6220 if (GlobalIndex >= SubmodulesLoaded.size() ||
6221 SubmodulesLoaded[GlobalIndex])
6222 return llvm::createStringError(std::errc::invalid_argument,
6223 "too many submodules");
6225 if (!ParentModule) {
6228 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6230 assert(CurFile != F.
File &&
"ModuleManager did not de-duplicate");
6232 Diag(diag::err_module_file_conflict)
6236 auto CurModMapFile =
6239 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6240 Diag(diag::note_module_file_conflict)
6241 << CurModMapFile->getName() << ModMapFile->getName();
6243 return llvm::make_error<AlreadyReportedDiagnosticError>();
6262 if (InferredAllowedBy.
isValid())
6272 if (DeserializationListener)
6273 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6275 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6300 auto Filename = ResolveImportedPath(PathBuf, Blob, F);
6301 if (
auto Umbrella = PP.getFileManager().getOptionalFileRef(*Filename)) {
6329 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6336 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6338 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6350 unsigned LocalBaseSubmoduleID =
Record[1];
6354 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
6359 std::make_pair(LocalBaseSubmoduleID,
6368 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6380 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6392 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6409 PP.getTargetInfo());
6415 Module::LinkLibrary(std::string(Blob),
Record[0]));
6439 SmallVector<GlobalDeclID, 16> Inits;
6440 for (
unsigned I = 0; I <
Record.size(); )
6441 Inits.push_back(ReadDeclID(F,
Record, I));
6442 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
6462bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6463 StringRef ModuleFilename,
bool Complain,
6464 ASTReaderListener &Listener,
6465 bool AllowCompatibleDifferences) {
6466 LangOptions LangOpts;
6468#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6469 LangOpts.Name = Record[Idx++];
6470#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6471 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6472#include "clang/Basic/LangOptions.def"
6473#define SANITIZER(NAME, ID) \
6474 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6475#include "clang/Basic/Sanitizers.def"
6477 for (
unsigned N =
Record[Idx++]; N; --N)
6481 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6482 LangOpts.
ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6487 for (
unsigned N =
Record[Idx++]; N; --N) {
6489 ReadString(
Record, Idx));
6494 for (
unsigned N =
Record[Idx++]; N; --N) {
6501 AllowCompatibleDifferences);
6504bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6505 StringRef ModuleFilename,
bool Complain,
6506 ASTReaderListener &Listener,
6507 bool AllowCompatibleDifferences) {
6509 CodeGenOptions CGOpts;
6511#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6512 if constexpr (CK::Compatibility != CK::Benign) \
6513 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6514#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6515 if constexpr (CK::Compatibility != CK::Benign) \
6516 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6517#define DEBUGOPT(Name, Bits, Default, Compatibility)
6518#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6519#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6520#include "clang/Basic/CodeGenOptions.def"
6523 AllowCompatibleDifferences);
6526bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6527 StringRef ModuleFilename,
bool Complain,
6528 ASTReaderListener &Listener,
6529 bool AllowCompatibleDifferences) {
6531 TargetOptions TargetOpts;
6533 TargetOpts.
CPU = ReadString(
Record, Idx);
6535 TargetOpts.
ABI = ReadString(
Record, Idx);
6536 for (
unsigned N =
Record[Idx++]; N; --N) {
6539 for (
unsigned N =
Record[Idx++]; N; --N) {
6544 AllowCompatibleDifferences);
6547bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6548 StringRef ModuleFilename,
bool Complain,
6549 ASTReaderListener &Listener) {
6550 DiagnosticOptions DiagOpts;
6552#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6553#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6554 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6555#include "clang/Basic/DiagnosticOptions.def"
6557 for (
unsigned N =
Record[Idx++]; N; --N)
6559 for (
unsigned N =
Record[Idx++]; N; --N)
6565bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6566 ASTReaderListener &Listener) {
6567 FileSystemOptions FSOpts;
6573bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6574 StringRef ModuleFilename,
6576 ASTReaderListener &Listener) {
6577 HeaderSearchOptions HSOpts;
6592 std::string SpecificModuleCachePath = ReadString(
Record, Idx);
6595 SpecificModuleCachePath, Complain);
6598bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6599 ASTReaderListener &Listener) {
6600 HeaderSearchOptions HSOpts;
6604 for (
unsigned N =
Record[Idx++]; N; --N) {
6605 std::string Path = ReadString(
Record, Idx);
6608 bool IsFramework =
Record[Idx++];
6609 bool IgnoreSysRoot =
Record[Idx++];
6610 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6615 for (
unsigned N =
Record[Idx++]; N; --N) {
6616 std::string Prefix = ReadString(
Record, Idx);
6617 bool IsSystemHeader =
Record[Idx++];
6622 for (
unsigned N =
Record[Idx++]; N; --N) {
6623 std::string VFSOverlayFile = ReadString(
Record, Idx);
6630bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6631 StringRef ModuleFilename,
6633 ASTReaderListener &Listener,
6634 std::string &SuggestedPredefines) {
6635 PreprocessorOptions PPOpts;
6639 bool ReadMacros =
Record[Idx++];
6641 for (
unsigned N =
Record[Idx++]; N; --N) {
6643 bool IsUndef =
Record[Idx++];
6644 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6649 for (
unsigned N =
Record[Idx++]; N; --N) {
6654 for (
unsigned N =
Record[Idx++]; N; --N) {
6663 SuggestedPredefines.clear();
6665 Complain, SuggestedPredefines);
6668std::pair<ModuleFile *, unsigned>
6669ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6670 GlobalPreprocessedEntityMapType::iterator
6671 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6672 assert(I != GlobalPreprocessedEntityMap.end() &&
6673 "Corrupted global preprocessed entity map");
6676 return std::make_pair(M, LocalIndex);
6679llvm::iterator_range<PreprocessingRecord::iterator>
6680ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6681 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6685 return llvm::make_range(PreprocessingRecord::iterator(),
6686 PreprocessingRecord::iterator());
6689bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6690 unsigned int ClientLoadCapabilities) {
6691 return ClientLoadCapabilities & ARR_OutOfDate &&
6694 .getInMemoryModuleCache()
6695 .isPCMFinal(ModuleFileName);
6698llvm::iterator_range<ASTReader::ModuleDeclIterator>
6700 return llvm::make_range(
6707 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6708 assert(I != GlobalSkippedRangeMap.end() &&
6709 "Corrupted global skipped range map");
6712 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6716 assert(Range.isValid());
6722 unsigned ModuleFileIndex = ID >> 32;
6723 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
6724 assert(getModuleManager().size() > ModuleFileIndex - 1);
6725 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6727 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6732 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6734 unsigned LocalIndex = PPInfo.second;
6739 if (!PP.getPreprocessingRecord()) {
6740 Error(
"no preprocessing record");
6747 Error(std::move(Err));
6754 Error(MaybeEntry.takeError());
6757 llvm::BitstreamEntry Entry = MaybeEntry.get();
6759 if (Entry.Kind != llvm::BitstreamEntry::Record)
6770 if (!MaybeRecType) {
6771 Error(MaybeRecType.takeError());
6776 bool isBuiltin =
Record[0];
6784 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
6804 if (DeserializationListener)
6805 DeserializationListener->MacroDefinitionRead(PPID, MD);
6811 const char *FullFileNameStart = Blob.data() +
Record[0];
6812 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
6814 if (!FullFileName.empty())
6815 File = PP.getFileManager().getOptionalFileRef(FullFileName);
6822 StringRef(Blob.data(),
Record[0]),
6830 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
6839unsigned ASTReader::findNextPreprocessedEntity(
6840 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
6842 for (GlobalSLocOffsetMapType::const_iterator
6843 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6849 return getTotalNumPreprocessedEntities();
6854struct PPEntityComp {
6855 const ASTReader &Reader;
6858 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6860 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
6861 SourceLocation LHS = getLoc(L);
6862 SourceLocation RHS = getLoc(R);
6866 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
6867 SourceLocation LHS = getLoc(L);
6871 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
6872 SourceLocation RHS = getLoc(R);
6876 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
6883unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
6884 bool EndsAfter)
const {
6885 if (SourceMgr.isLocalSourceLocation(Loc))
6886 return getTotalNumPreprocessedEntities();
6888 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
6889 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6890 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
6891 "Corrupted global sloc offset map");
6893 if (SLocMapI->second->NumPreprocessedEntities == 0)
6894 return findNextPreprocessedEntity(SLocMapI);
6905 pp_iterator
First = pp_begin;
6909 PPI = std::upper_bound(pp_begin, pp_end, Loc,
6910 PPEntityComp(*
this, M));
6919 std::advance(PPI,
Half);
6920 if (SourceMgr.isBeforeInTranslationUnit(
6921 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
6924 Count = Count -
Half - 1;
6931 return findNextPreprocessedEntity(SLocMapI);
6938std::pair<unsigned, unsigned>
6940 if (Range.isInvalid())
6941 return std::make_pair(0,0);
6942 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
6944 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
6945 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
6946 return std::make_pair(BeginID, EndID);
6956 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6958 unsigned LocalIndex = PPInfo.second;
6965 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
6974 class HeaderFileInfoVisitor {
6976 std::optional<HeaderFileInfo> HFI;
6979 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
6988 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
6989 if (Pos == Table->end())
6996 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7002 HeaderFileInfoVisitor Visitor(FE);
7003 ModuleMgr.visit(Visitor);
7004 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7011 using DiagState = DiagnosticsEngine::DiagState;
7022 auto ReadDiagState = [&](
const DiagState &BasedOn,
7023 bool IncludeNonPragmaStates) {
7024 unsigned BackrefID =
Record[Idx++];
7026 return DiagStates[BackrefID - 1];
7029 Diag.DiagStates.push_back(BasedOn);
7030 DiagState *NewState = &
Diag.DiagStates.back();
7031 DiagStates.push_back(NewState);
7032 unsigned Size =
Record[Idx++];
7033 assert(Idx + Size * 2 <=
Record.size() &&
7034 "Invalid data, not enough diag/map pairs");
7036 unsigned DiagID =
Record[Idx++];
7039 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7052 Mapping = NewMapping;
7058 DiagState *FirstState;
7063 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7064 DiagStates.push_back(FirstState);
7068 "Invalid data, unexpected backref in initial state");
7070 assert(Idx <
Record.size() &&
7071 "Invalid data, not enough state change pairs in initial state");
7076 unsigned Flags =
Record[Idx++];
7077 DiagState Initial(*
Diag.getDiagnosticIDs());
7078 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7079 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7080 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7081 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7082 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7084 FirstState = ReadDiagState(Initial,
true);
7092 .StateTransitions.push_back({FirstState, 0});
7097 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7101 unsigned NumLocations =
Record[Idx++];
7102 while (NumLocations--) {
7103 assert(Idx <
Record.size() &&
7104 "Invalid data, missing pragma diagnostic states");
7106 assert(FID.
isValid() &&
"invalid FileID for transition");
7107 unsigned Transitions =
Record[Idx++];
7113 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7114 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7115 for (
unsigned I = 0; I != Transitions; ++I) {
7116 unsigned Offset =
Record[Idx++];
7117 auto *State = ReadDiagState(*FirstState,
false);
7118 F.StateTransitions.push_back({State, Offset});
7123 assert(Idx <
Record.size() &&
7124 "Invalid data, missing final pragma diagnostic state");
7126 auto *CurState = ReadDiagState(*FirstState,
false);
7129 Diag.DiagStatesByLoc.CurDiagState = CurState;
7130 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7135 auto &
T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7137 T.push_back({CurState, 0});
7139 T[0].State = CurState;
7148ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7149 auto [M, Index] = translateTypeIDToIndex(ID);
7156#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7157 case TYPE_##CODE_ID: return Type::CLASS_ID;
7158#include "clang/Serialization/TypeBitCodes.def"
7160 return std::nullopt;
7170QualType ASTReader::readTypeRecord(
TypeID ID) {
7171 assert(ContextObj &&
"reading type with no AST context");
7172 ASTContext &Context = *ContextObj;
7173 RecordLocation Loc = TypeCursorForIndex(ID);
7174 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7178 SavedStreamPosition SavedPosition(DeclsCursor);
7180 ReadingKindTracker ReadingKind(Read_Type, *
this);
7183 Deserializing AType(
this);
7185 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7186 Error(std::move(Err));
7189 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7191 Error(RawCode.takeError());
7195 ASTRecordReader
Record(*
this, *Loc.F);
7196 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7198 Error(Code.takeError());
7202 QualType baseType =
Record.readQualType();
7203 Qualifiers quals =
Record.readQualifiers();
7209 Error(
"Unexpected code for type");
7213 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7214 return TypeReader.read(*maybeClass);
7222 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7223 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7226 return Reader.readTypeSourceInfo();
7230 return Reader.readNestedNameSpecifierLoc();
7234 return Reader.readAttr();
7243#define ABSTRACT_TYPELOC(CLASS, PARENT)
7244#define TYPELOC(CLASS, PARENT) \
7245 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7246#include "clang/AST/TypeLocNodes.def"
7255void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7259void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7269void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7273void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7277void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7281void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7285void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7289void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7293void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7297void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7301void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7305void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7313 if (Reader.readBool())
7320 VisitArrayTypeLoc(TL);
7324 VisitArrayTypeLoc(TL);
7327void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7328 VisitArrayTypeLoc(TL);
7331void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7332 DependentSizedArrayTypeLoc TL) {
7333 VisitArrayTypeLoc(TL);
7336void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7337 DependentAddressSpaceTypeLoc TL) {
7344void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7345 DependentSizedExtVectorTypeLoc TL) {
7349void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7353void TypeLocReader::VisitDependentVectorTypeLoc(
7354 DependentVectorTypeLoc TL) {
7358void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7362void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7369void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7370 DependentSizedMatrixTypeLoc TL) {
7383 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7389 VisitFunctionTypeLoc(TL);
7393 VisitFunctionTypeLoc(TL);
7396void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7397 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7398 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7399 SourceLocation NameLoc = readSourceLocation();
7400 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7403void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7404 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7405 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7406 SourceLocation NameLoc = readSourceLocation();
7407 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7410void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7411 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7412 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7413 SourceLocation NameLoc = readSourceLocation();
7414 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7417void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7423void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7430void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7435void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7439void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7453 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7458void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7460 if (Reader.readBool())
7462 if (Reader.readBool())
7466void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7480 VisitTagTypeLoc(TL);
7484 VisitTagTypeLoc(TL);
7487void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7489void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7493void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7497void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7501void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7502 HLSLAttributedResourceTypeLoc TL) {
7506void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7510void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7514void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7515 SubstTemplateTypeParmTypeLoc TL) {
7519void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7520 SubstTemplateTypeParmPackTypeLoc TL) {
7524void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7525 SubstBuiltinTemplatePackTypeLoc TL) {
7529void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7530 TemplateSpecializationTypeLoc TL) {
7531 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7532 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7533 SourceLocation TemplateKeywordLoc = readSourceLocation();
7534 SourceLocation NameLoc = readSourceLocation();
7535 SourceLocation LAngleLoc = readSourceLocation();
7536 SourceLocation RAngleLoc = readSourceLocation();
7537 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7538 LAngleLoc, RAngleLoc);
7539 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7540 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7541 Args[I] = Reader.readTemplateArgumentLocInfo(
7542 TL.
getTypePtr()->template_arguments()[I].getKind());
7545void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7550void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7556void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7560void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7565void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7574void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7586void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7590void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7596void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7600void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7604void TypeLocReader::VisitDependentBitIntTypeLoc(
7605 clang::DependentBitIntTypeLoc TL) {
7609void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7643std::pair<ModuleFile *, unsigned>
7646 "Predefined type shouldn't be in TypesLoaded");
7648 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7650 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7651 assert(OwningModuleFile &&
7652 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7654 return {OwningModuleFile,
7659 assert(ContextObj &&
"reading type with no AST context");
7670 llvm_unreachable(
"Invalid predefined type");
7686 T = Context.UnsignedCharTy;
7689 T = Context.UnsignedShortTy;
7692 T = Context.UnsignedIntTy;
7695 T = Context.UnsignedLongTy;
7698 T = Context.UnsignedLongLongTy;
7701 T = Context.UnsignedInt128Ty;
7704 T = Context.SignedCharTy;
7707 T = Context.WCharTy;
7710 T = Context.ShortTy;
7719 T = Context.LongLongTy;
7722 T = Context.Int128Ty;
7725 T = Context.BFloat16Ty;
7731 T = Context.FloatTy;
7734 T = Context.DoubleTy;
7737 T = Context.LongDoubleTy;
7740 T = Context.ShortAccumTy;
7743 T = Context.AccumTy;
7746 T = Context.LongAccumTy;
7749 T = Context.UnsignedShortAccumTy;
7752 T = Context.UnsignedAccumTy;
7755 T = Context.UnsignedLongAccumTy;
7758 T = Context.ShortFractTy;
7761 T = Context.FractTy;
7764 T = Context.LongFractTy;
7767 T = Context.UnsignedShortFractTy;
7770 T = Context.UnsignedFractTy;
7773 T = Context.UnsignedLongFractTy;
7776 T = Context.SatShortAccumTy;
7779 T = Context.SatAccumTy;
7782 T = Context.SatLongAccumTy;
7785 T = Context.SatUnsignedShortAccumTy;
7788 T = Context.SatUnsignedAccumTy;
7791 T = Context.SatUnsignedLongAccumTy;
7794 T = Context.SatShortFractTy;
7797 T = Context.SatFractTy;
7800 T = Context.SatLongFractTy;
7803 T = Context.SatUnsignedShortFractTy;
7806 T = Context.SatUnsignedFractTy;
7809 T = Context.SatUnsignedLongFractTy;
7812 T = Context.Float16Ty;
7815 T = Context.Float128Ty;
7818 T = Context.Ibm128Ty;
7821 T = Context.OverloadTy;
7824 T = Context.UnresolvedTemplateTy;
7827 T = Context.BoundMemberTy;
7830 T = Context.PseudoObjectTy;
7833 T = Context.DependentTy;
7836 T = Context.UnknownAnyTy;
7839 T = Context.NullPtrTy;
7842 T = Context.Char8Ty;
7845 T = Context.Char16Ty;
7848 T = Context.Char32Ty;
7851 T = Context.ObjCBuiltinIdTy;
7854 T = Context.ObjCBuiltinClassTy;
7857 T = Context.ObjCBuiltinSelTy;
7859#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7860 case PREDEF_TYPE_##Id##_ID: \
7861 T = Context.SingletonId; \
7863#include "clang/Basic/OpenCLImageTypes.def"
7864#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7865 case PREDEF_TYPE_##Id##_ID: \
7866 T = Context.Id##Ty; \
7868#include "clang/Basic/OpenCLExtensionTypes.def"
7870 T = Context.OCLSamplerTy;
7873 T = Context.OCLEventTy;
7876 T = Context.OCLClkEventTy;
7879 T = Context.OCLQueueTy;
7882 T = Context.OCLReserveIDTy;
7885 T = Context.getAutoDeductType();
7888 T = Context.getAutoRRefDeductType();
7891 T = Context.ARCUnbridgedCastTy;
7894 T = Context.BuiltinFnTy;
7897 T = Context.IncompleteMatrixIdxTy;
7900 T = Context.ArraySectionTy;
7903 T = Context.OMPArrayShapingTy;
7906 T = Context.OMPIteratorTy;
7908#define SVE_TYPE(Name, Id, SingletonId) \
7909 case PREDEF_TYPE_##Id##_ID: \
7910 T = Context.SingletonId; \
7912#include "clang/Basic/AArch64ACLETypes.def"
7913#define PPC_VECTOR_TYPE(Name, Id, Size) \
7914 case PREDEF_TYPE_##Id##_ID: \
7915 T = Context.Id##Ty; \
7917#include "clang/Basic/PPCTypes.def"
7918#define RVV_TYPE(Name, Id, SingletonId) \
7919 case PREDEF_TYPE_##Id##_ID: \
7920 T = Context.SingletonId; \
7922#include "clang/Basic/RISCVVTypes.def"
7923#define WASM_TYPE(Name, Id, SingletonId) \
7924 case PREDEF_TYPE_##Id##_ID: \
7925 T = Context.SingletonId; \
7927#include "clang/Basic/WebAssemblyReferenceTypes.def"
7928#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
7929 case PREDEF_TYPE_##Id##_ID: \
7930 T = Context.SingletonId; \
7932#include "clang/Basic/AMDGPUTypes.def"
7933#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
7934 case PREDEF_TYPE_##Id##_ID: \
7935 T = Context.SingletonId; \
7937#include "clang/Basic/HLSLIntangibleTypes.def"
7940 assert(!
T.isNull() &&
"Unknown predefined type");
7941 return T.withFastQualifiers(FastQuals);
7944 unsigned Index = translateTypeIDToIndex(ID).second;
7946 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
7947 if (TypesLoaded[Index].isNull()) {
7948 TypesLoaded[Index] = readTypeRecord(ID);
7949 if (TypesLoaded[Index].isNull())
7952 TypesLoaded[Index]->setFromAST();
7953 if (DeserializationListener)
7955 TypesLoaded[Index]);
7958 return TypesLoaded[Index].withFastQualifiers(FastQuals);
7971 ReadModuleOffsetMap(F);
7974 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
7976 if (ModuleFileIndex == 0)
7981 ModuleFileIndex = MF.
Index + 1;
7982 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8001 TemplateNameLoc, EllipsisLoc);
8012 llvm_unreachable(
"unexpected template argument loc");
8029 unsigned NumArgsAsWritten =
readInt();
8030 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8044 if (NumCurrentElementsDeserializing) {
8049 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8072 auto *II = Name.getAsIdentifierInfo();
8073 assert(II &&
"non-identifier name in C?");
8074 if (II->isOutOfDate())
8091 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8092 Template = CTSD->getSpecializedTemplate();
8093 Args = CTSD->getTemplateArgs().asArray();
8094 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8095 Template = VTSD->getSpecializedTemplate();
8096 Args = VTSD->getTemplateArgs().asArray();
8097 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8098 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8100 Args = FD->getTemplateSpecializationArgs()->asArray();
8108 Template->loadLazySpecializationsImpl();
8110 Template->loadLazySpecializationsImpl(Args);
8116 RecordLocation Loc = getLocalBitOffset(Offset);
8119 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8120 Error(std::move(Err));
8123 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8128 Error(MaybeCode.takeError());
8131 unsigned Code = MaybeCode.get();
8135 if (!MaybeRecCode) {
8136 Error(MaybeRecCode.takeError());
8140 Error(
"malformed AST file: missing C++ ctor initializers");
8144 return Record.readCXXCtorInitializers();
8148 assert(ContextObj &&
"reading base specifiers with no AST context");
8151 RecordLocation Loc = getLocalBitOffset(Offset);
8154 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8155 Error(std::move(Err));
8158 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8163 Error(MaybeCode.takeError());
8166 unsigned Code = MaybeCode.get();
8170 if (!MaybeRecCode) {
8171 Error(MaybeCode.takeError());
8174 unsigned RecCode = MaybeRecCode.get();
8177 Error(
"malformed AST file: missing C++ base specifiers");
8181 unsigned NumBases =
Record.readInt();
8184 for (
unsigned I = 0; I != NumBases; ++I)
8185 Bases[I] =
Record.readCXXBaseSpecifier();
8198 ReadModuleOffsetMap(F);
8201 OwningModuleFileIndex == 0
8205 if (OwningModuleFileIndex == 0)
8208 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8217 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8218 return M.
Index == ModuleFileIndex - 1;
8226 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8227 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8247 DeclCursorForID(ID, Loc);
8252 assert(ContextObj &&
"reading predefined decl without AST context");
8254 Decl *NewLoaded =
nullptr;
8260 return Context.getTranslationUnitDecl();
8263 if (Context.ObjCIdDecl)
8264 return Context.ObjCIdDecl;
8265 NewLoaded = Context.getObjCIdDecl();
8269 if (Context.ObjCSelDecl)
8270 return Context.ObjCSelDecl;
8271 NewLoaded = Context.getObjCSelDecl();
8275 if (Context.ObjCClassDecl)
8276 return Context.ObjCClassDecl;
8277 NewLoaded = Context.getObjCClassDecl();
8281 if (Context.ObjCProtocolClassDecl)
8282 return Context.ObjCProtocolClassDecl;
8283 NewLoaded = Context.getObjCProtocolDecl();
8287 if (Context.Int128Decl)
8288 return Context.Int128Decl;
8289 NewLoaded = Context.getInt128Decl();
8293 if (Context.UInt128Decl)
8294 return Context.UInt128Decl;
8295 NewLoaded = Context.getUInt128Decl();
8299 if (Context.ObjCInstanceTypeDecl)
8300 return Context.ObjCInstanceTypeDecl;
8301 NewLoaded = Context.getObjCInstanceTypeDecl();
8305 if (Context.BuiltinVaListDecl)
8306 return Context.BuiltinVaListDecl;
8307 NewLoaded = Context.getBuiltinVaListDecl();
8311 if (Context.VaListTagDecl)
8312 return Context.VaListTagDecl;
8313 NewLoaded = Context.getVaListTagDecl();
8317 if (Context.BuiltinMSVaListDecl)
8318 return Context.BuiltinMSVaListDecl;
8319 NewLoaded = Context.getBuiltinMSVaListDecl();
8324 return Context.getMSGuidTagDecl();
8327 if (Context.ExternCContext)
8328 return Context.ExternCContext;
8329 NewLoaded = Context.getExternCContextDecl();
8333 if (Context.CFConstantStringTypeDecl)
8334 return Context.CFConstantStringTypeDecl;
8335 NewLoaded = Context.getCFConstantStringDecl();
8339 if (Context.CFConstantStringTagDecl)
8340 return Context.CFConstantStringTagDecl;
8341 NewLoaded = Context.getCFConstantStringTagDecl();
8345 return Context.getMSTypeInfoTagDecl();
8347#define BuiltinTemplate(BTName) \
8348 case PREDEF_DECL##BTName##_ID: \
8349 if (Context.Decl##BTName) \
8350 return Context.Decl##BTName; \
8351 NewLoaded = Context.get##BTName##Decl(); \
8353#include "clang/Basic/BuiltinTemplates.inc"
8356 llvm_unreachable(
"Invalid decl ID");
8360 assert(NewLoaded &&
"Failed to load predefined decl?");
8362 if (DeserializationListener)
8363 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8368unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8369 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8370 if (!OwningModuleFile) {
8379 assert(ContextObj &&
"reading decl with no AST context");
8388 Merged.push_back(ID);
8393 unsigned Index = translateGlobalDeclIDToIndex(ID);
8395 if (Index >= DeclsLoaded.size()) {
8396 assert(0 &&
"declaration ID out-of-range for AST file");
8397 Error(
"declaration ID out-of-range for AST file");
8401 return DeclsLoaded[Index];
8408 unsigned Index = translateGlobalDeclIDToIndex(ID);
8410 if (Index >= DeclsLoaded.size()) {
8411 assert(0 &&
"declaration ID out-of-range for AST file");
8412 Error(
"declaration ID out-of-range for AST file");
8416 if (!DeclsLoaded[Index]) {
8418 if (DeserializationListener)
8419 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8422 return DeclsLoaded[Index];
8431 ReadModuleOffsetMap(M);
8441 uint64_t OrignalModuleFileIndex = 0;
8444 OrignalModuleFileIndex = I + 1;
8448 if (!OrignalModuleFileIndex)
8456 if (Idx >=
Record.size()) {
8457 Error(
"Corrupted AST file");
8474 RecordLocation Loc = getLocalBitOffset(Offset);
8475 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8476 Error(std::move(Err));
8479 assert(NumCurrentElementsDeserializing == 0 &&
8480 "should not be called while already deserializing");
8482 return ReadStmtFromStream(*Loc.F);
8485bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8489 auto It = SpecLookups.find(D);
8490 if (It == SpecLookups.end())
8496 It->second.Table.findAll();
8500 SpecLookups.erase(It);
8502 bool NewSpecsFound =
false;
8503 Deserializing LookupResults(
this);
8504 for (
auto &Info : Infos) {
8505 if (GetExistingDecl(Info))
8507 NewSpecsFound =
true;
8511 return NewSpecsFound;
8518 bool NewSpecsFound =
8519 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8521 return NewSpecsFound;
8523 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8524 return NewSpecsFound;
8527bool ASTReader::LoadExternalSpecializationsImpl(
8528 SpecLookupTableTy &SpecLookups,
const Decl *D,
8532 auto It = SpecLookups.find(D);
8533 if (It == SpecLookups.end())
8536 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8538 llvm::raw_string_ostream OS(Name);
8540 ND->getNameForDiagnostic(OS, ND->getASTContext().getPrintingPolicy(),
8545 Deserializing LookupResults(
this);
8550 It->second.Table.find(HashValue);
8552 bool NewSpecsFound =
false;
8553 for (
auto &Info : Infos) {
8554 if (GetExistingDecl(Info))
8556 NewSpecsFound =
true;
8560 return NewSpecsFound;
8567 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8568 PartialSpecializationsLookups, D, TemplateArgs);
8570 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8572 return NewDeclsFound;
8580 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8581 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8582 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8584 if (!IsKindWeWant(K))
8587 auto ID = (
DeclID) + LexicalDecls[I + 1];
8592 if (PredefsVisited[ID])
8595 PredefsVisited[ID] =
true;
8599 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8607 for (
const auto &Lexical : TULexicalDecls)
8608 Visit(Lexical.first, Lexical.second);
8610 auto I = LexicalDecls.find(DC);
8611 if (I != LexicalDecls.end())
8612 Visit(I->second.first, I->second.second);
8615 ++NumLexicalDeclContextsRead;
8620class UnalignedDeclIDComp {
8626 : Reader(Reader), Mod(M) {}
8635 SourceLocation RHS = getLocation(R);
8640 SourceLocation LHS = getLocation(L);
8654 unsigned Offset,
unsigned Length,
8658 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8659 if (I == FileDeclIDs.end())
8662 FileDeclsInfo &DInfo = I->second;
8663 if (DInfo.Decls.empty())
8667 BeginLoc =
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
8670 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8672 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8673 if (BeginIt != DInfo.Decls.begin())
8679 while (BeginIt != DInfo.Decls.begin() &&
8682 ->isTopLevelDeclInObjCContainer())
8686 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8687 if (EndIt != DInfo.Decls.end())
8700 "DeclContext has no visible decls in storage");
8708 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8712 Decls.push_back(ND);
8720 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8721 ++NumVisibleDeclContextsRead;
8722 Find(It->second.Table, Name);
8725 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8726 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8727 ++NumModuleLocalVisibleDeclContexts;
8728 Find(It->second.Table, std::make_pair(Name, NamedModule));
8731 if (
auto *NamedModule =
8732 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8734 FindModuleLocalLookup(NamedModule);
8739 if (ContextObj && ContextObj->getCurrentNamedModule())
8740 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8742 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8743 ++NumTULocalVisibleDeclContexts;
8744 Find(It->second.Table, Name);
8748 return !Decls.empty();
8757 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
8758 auto It = LookupTables.find(DC);
8759 if (It == LookupTables.end())
8772 findAll(Lookups, NumVisibleDeclContextsRead);
8773 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8774 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8776 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
8779 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
8784 auto I = Lookups.find(Primary);
8785 return I == Lookups.end() ?
nullptr : &I->second;
8790 auto I = ModuleLocalLookups.find(Primary);
8791 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
8796 auto I = TULocalLookups.find(Primary);
8797 return I == TULocalLookups.end() ?
nullptr : &I->second;
8804 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
8805 auto I = LookupTable.find(D);
8806 return I == LookupTable.end() ?
nullptr : &I->second;
8811 return PartialSpecializationsLookups.contains(D) ||
8812 SpecializationsLookups.contains(D);
8821 assert(ImplD && Consumer);
8823 for (
auto *I : ImplD->
methods())
8829void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
8830 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
8833 Consumer->HandleInterestingDecl(DeclGroupRef(D));
8836void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
8837 Consumer->HandleVTable(RD);
8841 this->Consumer = Consumer;
8844 PassInterestingDeclsToConsumer();
8846 if (DeserializationListener)
8847 DeserializationListener->ReaderInitialized(
this);
8851 std::fprintf(
stderr,
"*** AST File Statistics:\n");
8853 unsigned NumTypesLoaded =
8854 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
8855 unsigned NumDeclsLoaded =
8856 DeclsLoaded.size() -
8857 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
8858 unsigned NumIdentifiersLoaded =
8859 IdentifiersLoaded.size() -
8861 unsigned NumMacrosLoaded =
8862 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
8863 unsigned NumSelectorsLoaded =
8864 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
8867 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
8868 NumSLocEntriesRead, TotalNumSLocEntries,
8869 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
8870 if (!TypesLoaded.empty())
8871 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
8872 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
8873 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
8874 if (!DeclsLoaded.empty())
8875 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
8876 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
8877 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
8878 if (!IdentifiersLoaded.empty())
8879 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
8880 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
8881 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
8882 if (!MacrosLoaded.empty())
8883 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
8884 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
8885 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
8886 if (!SelectorsLoaded.empty())
8887 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
8888 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
8889 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
8890 if (TotalNumStatements)
8891 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
8892 NumStatementsRead, TotalNumStatements,
8893 ((
float)NumStatementsRead/TotalNumStatements * 100));
8895 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
8896 NumMacrosRead, TotalNumMacros,
8897 ((
float)NumMacrosRead/TotalNumMacros * 100));
8898 if (TotalLexicalDeclContexts)
8899 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
8900 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
8901 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
8903 if (TotalVisibleDeclContexts)
8904 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
8905 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
8906 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
8908 if (TotalModuleLocalVisibleDeclContexts)
8910 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
8911 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
8912 ((
float)NumModuleLocalVisibleDeclContexts /
8913 TotalModuleLocalVisibleDeclContexts * 100));
8914 if (TotalTULocalVisibleDeclContexts)
8915 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
8916 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
8917 ((
float)NumTULocalVisibleDeclContexts /
8918 TotalTULocalVisibleDeclContexts * 100));
8919 if (TotalNumMethodPoolEntries)
8920 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
8921 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
8922 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
8924 if (NumMethodPoolLookups)
8925 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
8926 NumMethodPoolHits, NumMethodPoolLookups,
8927 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
8928 if (NumMethodPoolTableLookups)
8929 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
8930 NumMethodPoolTableHits, NumMethodPoolTableLookups,
8931 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
8933 if (NumIdentifierLookupHits)
8935 " %u / %u identifier table lookups succeeded (%f%%)\n",
8936 NumIdentifierLookupHits, NumIdentifierLookups,
8937 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
8940 std::fprintf(
stderr,
"\n");
8941 GlobalIndex->printStats();
8944 std::fprintf(
stderr,
"\n");
8946 std::fprintf(
stderr,
"\n");
8949template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
8950LLVM_DUMP_METHOD
static void
8953 InitialCapacity> &Map) {
8954 if (Map.begin() == Map.end())
8959 llvm::errs() << Name <<
":\n";
8960 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
8962 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
8967 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
8969 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
8973 GlobalPreprocessedEntityMap);
8975 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
8984 if (llvm::MemoryBuffer *buf = I.Buffer) {
8985 size_t bytes = buf->getBufferSize();
8986 switch (buf->getBufferKind()) {
8987 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
8990 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9011 if (!FPPragmaOptions.empty()) {
9012 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9015 SemaObj->CurFPFeatures =
9021 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9022 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9023 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9024 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9026 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9028 DeclsWithEffectsToVerify.clear();
9030 SemaObj->OpenCLFeatures = OpenCLExtensions;
9036 assert(SemaObj &&
"no Sema to update");
9040 if (!SemaDeclRefs.empty()) {
9041 assert(SemaDeclRefs.size() % 3 == 0);
9042 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9043 if (!SemaObj->StdNamespace)
9044 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9045 if (!SemaObj->StdBadAlloc)
9046 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9047 if (!SemaObj->StdAlignValT)
9048 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9050 SemaDeclRefs.clear();
9055 if(OptimizeOffPragmaLocation.isValid())
9056 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9057 if (PragmaMSStructState != -1)
9059 if (PointersToMembersPragmaLocation.isValid()) {
9060 SemaObj->ActOnPragmaMSPointersToMembers(
9062 PragmaMSPointersToMembersState,
9063 PointersToMembersPragmaLocation);
9065 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9067 if (PragmaAlignPackCurrentValue) {
9071 bool DropFirst =
false;
9072 if (!PragmaAlignPackStack.empty() &&
9073 PragmaAlignPackStack.front().Location.isInvalid()) {
9074 assert(PragmaAlignPackStack.front().Value ==
9075 SemaObj->AlignPackStack.DefaultValue &&
9076 "Expected a default alignment value");
9077 SemaObj->AlignPackStack.Stack.emplace_back(
9078 PragmaAlignPackStack.front().SlotLabel,
9079 SemaObj->AlignPackStack.CurrentValue,
9080 SemaObj->AlignPackStack.CurrentPragmaLocation,
9081 PragmaAlignPackStack.front().PushLocation);
9084 for (
const auto &Entry :
9085 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9086 SemaObj->AlignPackStack.Stack.emplace_back(
9087 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9089 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9090 assert(*PragmaAlignPackCurrentValue ==
9091 SemaObj->AlignPackStack.DefaultValue &&
9092 "Expected a default align and pack value");
9095 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9096 SemaObj->AlignPackStack.CurrentPragmaLocation =
9097 PragmaAlignPackCurrentLocation;
9100 if (FpPragmaCurrentValue) {
9104 bool DropFirst =
false;
9105 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9106 assert(FpPragmaStack.front().Value ==
9107 SemaObj->FpPragmaStack.DefaultValue &&
9108 "Expected a default pragma float_control value");
9109 SemaObj->FpPragmaStack.Stack.emplace_back(
9110 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9111 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9112 FpPragmaStack.front().PushLocation);
9115 for (
const auto &Entry :
9117 SemaObj->FpPragmaStack.Stack.emplace_back(
9118 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9119 if (FpPragmaCurrentLocation.isInvalid()) {
9120 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9121 "Expected a default pragma float_control value");
9124 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9125 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9130 for (
auto &Import : PendingImportedModulesSema) {
9131 if (Import.ImportLoc.isInvalid())
9134 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9137 PendingImportedModulesSema.clear();
9144 IdentifierLookupVisitor Visitor(Name, 0,
9145 NumIdentifierLookups,
9146 NumIdentifierLookupHits);
9152 if (PP.getLangOpts().CPlusPlus) {
9153 for (
auto *F : ModuleMgr.pch_modules())
9162 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9167 ModuleMgr.visit(Visitor, HitsPtr);
9189 ASTIdentifierLookupTable::key_iterator Current;
9193 ASTIdentifierLookupTable::key_iterator End;
9200 bool SkipModules =
false);
9202 StringRef
Next()
override;
9209 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9213 while (Current == End) {
9225 Current = IdTable->key_begin();
9226 End = IdTable->key_end();
9231 StringRef
Result = *Current;
9240 std::unique_ptr<IdentifierIterator> Current;
9241 std::unique_ptr<IdentifierIterator> Queued;
9244 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9245 std::unique_ptr<IdentifierIterator> Second)
9246 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9248 StringRef
Next()
override {
9252 StringRef result = Current->Next();
9253 if (!result.empty())
9258 std::swap(Current, Queued);
9267 std::unique_ptr<IdentifierIterator> ReaderIter(
9269 std::unique_ptr<IdentifierIterator> ModulesIter(
9270 GlobalIndex->createIdentifierIterator());
9271 return new ChainedIdentifierIterator(std::move(ReaderIter),
9272 std::move(ModulesIter));
9284 unsigned PriorGeneration;
9285 unsigned InstanceBits = 0;
9286 unsigned FactoryBits = 0;
9287 bool InstanceHasMoreThanOneDecl =
false;
9288 bool FactoryHasMoreThanOneDecl =
false;
9294 unsigned PriorGeneration)
9295 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9305 ++Reader.NumMethodPoolTableLookups;
9308 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9309 if (Pos == PoolTable->end())
9312 ++Reader.NumMethodPoolTableHits;
9313 ++Reader.NumSelectorsRead;
9317 ++Reader.NumMethodPoolEntriesRead;
9319 if (Reader.DeserializationListener)
9320 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9325 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9326 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9327 InstanceBits =
Data.InstanceBits;
9328 FactoryBits =
Data.FactoryBits;
9329 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9330 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9336 return InstanceMethods;
9341 return FactoryMethods;
9348 return InstanceHasMoreThanOneDecl;
9366 unsigned &Generation = SelectorGeneration[Sel];
9367 unsigned PriorGeneration = Generation;
9369 SelectorOutOfDate[Sel] =
false;
9372 ++NumMethodPoolLookups;
9374 ModuleMgr.visit(Visitor);
9380 ++NumMethodPoolHits;
9401 if (SelectorOutOfDate[Sel])
9409 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9411 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9412 Namespaces.push_back(Namespace);
9417 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9418 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9419 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9422 Undefined.insert(std::make_pair(D, Loc));
9424 UndefinedButUsed.clear();
9430 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9433 uint64_t Count = DelayedDeleteExprs[Idx++];
9434 for (uint64_t
C = 0;
C < Count; ++
C) {
9437 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9438 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9445 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9446 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9448 TentativeDefs.push_back(Var);
9450 TentativeDefinitions.clear();
9455 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9457 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9461 UnusedFileScopedDecls.clear();
9466 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9468 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9472 DelegatingCtorDecls.clear();
9476 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9478 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9482 ExtVectorDecls.clear();
9487 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9490 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9494 UnusedLocalTypedefNameCandidates.clear();
9499 for (
auto I : DeclsToCheckForDeferredDiags) {
9500 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9504 DeclsToCheckForDeferredDiags.clear();
9509 if (ReferencedSelectorsData.empty())
9514 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9516 while (I < DataSize) {
9520 Sels.push_back(std::make_pair(Sel, SelLoc));
9522 ReferencedSelectorsData.clear();
9527 if (WeakUndeclaredIdentifiers.empty())
9530 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9538 WeakIDs.push_back(std::make_pair(WeakId, WI));
9540 WeakUndeclaredIdentifiers.clear();
9544 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9546 VTableUse &TableInfo = VTableUses[Idx++];
9547 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9550 VTables.push_back(VT);
9558 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9559 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9563 Pending.push_back(std::make_pair(D, Loc));
9565 PendingInstantiations.clear();
9569 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9571 for (
auto &LPT : LateParsedTemplates) {
9574 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9578 auto LT = std::make_unique<LateParsedTemplate>();
9579 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9583 assert(F &&
"No module");
9585 unsigned TokN = LateParsed[Idx++];
9586 LT->Toks.reserve(TokN);
9587 for (
unsigned T = 0;
T < TokN; ++
T)
9588 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9590 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9594 LateParsedTemplates.clear();
9606 if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9607 Iter != LambdaDeclarationsForMerging.end() &&
9608 Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
9617 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9626 assert(ID &&
"Non-zero identifier ID required");
9627 unsigned Index = translateIdentifierIDToIndex(ID).second;
9628 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9629 IdentifiersLoaded[Index] = II;
9630 if (DeserializationListener)
9631 DeserializationListener->IdentifierRead(ID, II);
9653 if (NumCurrentElementsDeserializing && !Decls) {
9654 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9658 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9671 Decls->push_back(D);
9678 pushExternalDeclIntoScope(D, II);
9682std::pair<ModuleFile *, unsigned>
9683ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9685 return {
nullptr, 0};
9687 unsigned ModuleFileIndex = ID >> 32;
9688 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9690 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9702 if (IdentifiersLoaded.empty()) {
9703 Error(
"no identifier table in AST file");
9707 auto [M, Index] = translateIdentifierIDToIndex(ID);
9708 if (!IdentifiersLoaded[Index]) {
9709 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9712 const unsigned char *
Data =
9718 auto &II = PP.getIdentifierTable().get(Key);
9719 IdentifiersLoaded[Index] = &II;
9722 if (DeserializationListener)
9723 DeserializationListener->IdentifierRead(ID, &II);
9726 return IdentifiersLoaded[Index];
9738 ReadModuleOffsetMap(M);
9740 unsigned ModuleFileIndex = LocalID >> 32;
9741 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9744 assert(MF &&
"malformed identifier ID encoding?");
9746 if (!ModuleFileIndex)
9752std::pair<ModuleFile *, unsigned>
9753ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
9755 return {
nullptr, 0};
9757 unsigned ModuleFileIndex = ID >> 32;
9758 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
9762 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
9771 if (MacrosLoaded.empty()) {
9772 Error(
"no macro table in AST file");
9776 auto [M, Index] = translateMacroIDToIndex(ID);
9777 if (!MacrosLoaded[Index]) {
9778 assert(M !=
nullptr &&
"Untranslated Macro ID?");
9784 if (DeserializationListener)
9785 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
9788 return MacrosLoaded[Index];
9796 ReadModuleOffsetMap(M);
9798 unsigned ModuleFileIndex = LocalID >> 32;
9799 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
9802 assert(MF &&
"malformed identifier ID encoding?");
9804 if (!ModuleFileIndex) {
9809 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
9818 ReadModuleOffsetMap(M);
9823 &&
"Invalid index into submodule index remap");
9825 return LocalID + I->second;
9830 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
9834 if (GlobalID > SubmodulesLoaded.size()) {
9835 Error(
"submodule ID out of range in AST file");
9850 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
9853 int IndexFromEnd =
static_cast<int>(ID >> 1);
9854 assert(IndexFromEnd &&
"got reference to unknown module file");
9871 auto I = llvm::find(PCHModules, M);
9872 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
9873 return std::distance(I, PCHModules.end()) << 1;
9882 const auto &PCHChain = ModuleMgr.pch_modules();
9883 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
9884 ModuleFile &MF = ModuleMgr.getPrimaryModule();
9888 llvm::sys::path::parent_path(MF.
FileName),
9891 return std::nullopt;
9895 auto I = DefinitionSource.find(FD);
9896 if (I == DefinitionSource.end())
9902 return ThisDeclarationWasADefinitionSet.contains(FD);
9913 if (ID > SelectorsLoaded.size()) {
9914 Error(
"selector ID out of range in AST file");
9918 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
9921 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
9925 SelectorsLoaded[ID - 1] =
9927 if (DeserializationListener)
9928 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
9931 return SelectorsLoaded[ID - 1];
9949 ReadModuleOffsetMap(M);
9954 &&
"Invalid index into selector index remap");
9956 return LocalID + I->second;
9987 NameInfo.
setName(readDeclarationName());
10001 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10002 assert(Op.isValid());
10008 unsigned NumTPLists =
readInt();
10013 for (
unsigned i = 0; i != NumTPLists; ++i)
10024 unsigned NumParams =
readInt();
10026 Params.reserve(NumParams);
10027 while (NumParams--)
10030 bool HasRequiresClause =
readBool();
10031 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10034 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10035 return TemplateParams;
10040 bool Canonicalize) {
10041 unsigned NumTemplateArgs =
readInt();
10042 TemplArgs.reserve(NumTemplateArgs);
10043 while (NumTemplateArgs--)
10049 unsigned NumDecls =
readInt();
10051 while (NumDecls--) {
10063 bool inheritConstructors =
readBool();
10069 Result.setInheritConstructors(inheritConstructors);
10076 unsigned NumInitializers =
readInt();
10077 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10079 for (
unsigned i = 0; i != NumInitializers; ++i) {
10081 bool IsBaseVirtual =
false;
10112 BOMInit =
new (Context)
10114 RParenLoc, MemberOrEllipsisLoc);
10116 BOMInit =
new (Context)
10119 BOMInit =
new (Context)
10123 BOMInit =
new (Context)
10125 LParenLoc,
Init, RParenLoc);
10128 unsigned SourceOrder =
readInt();
10132 CtorInitializers[i] = BOMInit;
10135 return CtorInitializers;
10143 for (
unsigned I = 0; I != N; ++I) {
10144 auto Kind = readNestedNameSpecifierKind();
10149 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10158 Builder.Make(Context,
T->getTypeLoc(), ColonColonLoc);
10164 Builder.MakeGlobal(Context, ColonColonLoc);
10171 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10176 llvm_unreachable(
"unexpected null nested name specifier");
10191 const StringRef Blob) {
10192 unsigned Count =
Record[0];
10193 const char *Byte = Blob.data();
10194 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10195 for (
unsigned I = 0; I < Count; ++Byte)
10196 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10197 if (*Byte & (1 << Bit))
10204 return llvm::APFloat(Sem,
readAPInt());
10209 unsigned Len =
Record[Idx++];
10217 unsigned Len =
Record[Idx++];
10218 StringRef
Result = Blob.substr(0, Len);
10219 Blob = Blob.substr(Len);
10243 unsigned Major =
Record[Idx++];
10244 unsigned Minor =
Record[Idx++];
10245 unsigned Subminor =
Record[Idx++];
10247 return VersionTuple(Major);
10249 return VersionTuple(Major, Minor - 1);
10250 return VersionTuple(Major, Minor - 1, Subminor - 1);
10261 return Diag(CurrentImportLoc, DiagID);
10265 return Diags.Report(Loc, DiagID);
10269 llvm::function_ref<
void()> Fn) {
10272 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10276 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10282 return PP.getIdentifierTable();
10288 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10289 "Already have a SwitchCase with this ID");
10290 (*CurrSwitchCaseStmts)[ID] = SC;
10295 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10296 return (*CurrSwitchCaseStmts)[ID];
10300 CurrSwitchCaseStmts->clear();
10305 std::vector<RawComment *> Comments;
10312 BitstreamCursor &Cursor = I->first;
10319 Cursor.advanceSkippingSubblocks(
10320 BitstreamCursor::AF_DontPopBlockAtEnd);
10322 Error(MaybeEntry.takeError());
10325 llvm::BitstreamEntry Entry = MaybeEntry.get();
10327 switch (Entry.Kind) {
10328 case llvm::BitstreamEntry::SubBlock:
10329 case llvm::BitstreamEntry::Error:
10330 Error(
"malformed block record in AST file");
10332 case llvm::BitstreamEntry::EndBlock:
10334 case llvm::BitstreamEntry::Record:
10342 if (!MaybeComment) {
10343 Error(MaybeComment.takeError());
10352 bool IsTrailingComment =
Record[Idx++];
10353 bool IsAlmostTrailingComment =
Record[Idx++];
10354 Comments.push_back(
new (Context)
RawComment(
10355 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10365 if (Loc.first.isValid())
10366 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10379 assert(NumUserInputs <= NumInputs);
10380 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10381 for (
unsigned I = 0; I < N; ++I) {
10382 bool IsSystem = I >= NumUserInputs;
10384 Visitor(IFI, IsSystem);
10389 bool IncludeSystem,
bool Complain,
10391 bool isSystem)> Visitor) {
10394 assert(NumUserInputs <= NumInputs);
10395 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10396 for (
unsigned I = 0; I < N; ++I) {
10397 bool IsSystem = I >= NumUserInputs;
10398 InputFile IF = getInputFile(MF, I+1, Complain);
10399 Visitor(IF, IsSystem);
10407 for (
unsigned I = 0; I < NumInputs; ++I) {
10410 if (
auto FE = getInputFile(MF, I + 1).getFile())
10415void ASTReader::finishPendingActions() {
10416 while (!PendingIdentifierInfos.empty() ||
10417 !PendingDeducedFunctionTypes.empty() ||
10418 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10419 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10420 !PendingUpdateRecords.empty() ||
10421 !PendingObjCExtensionIvarRedeclarations.empty()) {
10424 using TopLevelDeclsMap =
10425 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10426 TopLevelDeclsMap TopLevelDecls;
10428 while (!PendingIdentifierInfos.empty()) {
10431 std::move(PendingIdentifierInfos.back().second);
10432 PendingIdentifierInfos.pop_back();
10439 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10440 auto *FD = PendingDeducedFunctionTypes[I].first;
10441 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10443 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10446 if (DT->isDeduced()) {
10447 PendingDeducedTypeUpdates.insert(
10448 {FD->getCanonicalDecl(), FD->getReturnType()});
10455 PendingUndeducedFunctionDecls.push_back(FD);
10459 PendingDeducedFunctionTypes.clear();
10463 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10464 auto *VD = PendingDeducedVarTypes[I].first;
10465 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10467 PendingDeducedVarTypes.clear();
10470 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10471 loadPendingDeclChain(PendingDeclChains[I].first,
10472 PendingDeclChains[I].second);
10473 PendingDeclChains.clear();
10476 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10477 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10478 IdentifierInfo *II = TLD->first;
10479 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10485 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10486 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10487 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10488 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10490 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10492 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10493 if (!Info.M->isModule())
10497 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10499 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10500 if (Info.M->isModule())
10504 PendingMacroIDs.clear();
10508 while (!PendingDeclContextInfos.empty()) {
10509 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10510 PendingDeclContextInfos.pop_front();
10513 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10517 while (!PendingUpdateRecords.empty()) {
10518 auto Update = PendingUpdateRecords.pop_back_val();
10519 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10520 loadDeclUpdateRecords(
Update);
10523 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10524 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10525 auto DuplicateIvars =
10526 PendingObjCExtensionIvarRedeclarations.back().second;
10528 StructuralEquivalenceContext Ctx(
10529 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10530 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10534 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10536 for (
auto IvarPair : DuplicateIvars) {
10537 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10539 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10545 ExtensionsPair.first->setInvalidDecl();
10546 ExtensionsPair.second->getClassInterface()
10548 ->setIvarList(
nullptr);
10550 for (
auto IvarPair : DuplicateIvars) {
10551 Diag(IvarPair.first->getLocation(),
10552 diag::err_duplicate_ivar_declaration)
10553 << IvarPair.first->getIdentifier();
10554 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10557 PendingObjCExtensionIvarRedeclarations.pop_back();
10563 assert(PendingFakeDefinitionData.empty() &&
10564 "faked up a class definition but never saw the real one");
10570 for (Decl *D : PendingDefinitions) {
10571 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10572 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10573 for (
auto *R = getMostRecentExistingDecl(RD); R;
10574 R = R->getPreviousDecl()) {
10577 "declaration thinks it's the definition but it isn't");
10585 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10590 for (
auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10596 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10597 for (
auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10604 for (
auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10607 PendingDefinitions.clear();
10609 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10610 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10611 if (
auto *VD = dyn_cast<VarDecl>(D))
10612 return VD->isThisDeclarationADefinition() ||
10613 VD->isThisDeclarationADemotedDefinition();
10615 if (
auto *TD = dyn_cast<TagDecl>(D))
10616 return TD->isThisDeclarationADefinition() ||
10617 TD->isThisDeclarationADemotedDefinition();
10619 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10620 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10622 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10623 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10630 return hasDefinitionImpl(D, hasDefinitionImpl);
10646 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10652 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10653 PBEnd = PendingBodies.end();
10654 PB != PBEnd; ++PB) {
10655 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10657 const FunctionDecl *Defn =
nullptr;
10658 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10659 FD->setLazyBody(PB->second);
10661 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10664 if (!FD->isLateTemplateParsed() &&
10665 !NonConstDefn->isLateTemplateParsed() &&
10670 FD->getODRHash() != NonConstDefn->getODRHash()) {
10672 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10673 }
else if (FD->getLexicalParent()->isFileContext() &&
10674 NonConstDefn->getLexicalParent()->isFileContext()) {
10678 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10689 PendingBodies.clear();
10692 for (
auto [RD, MD] : PendingAddedClassMembers) {
10693 RD->addedMember(MD);
10695 PendingAddedClassMembers.clear();
10698 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10700 PendingMergedDefinitionsToDeduplicate.clear();
10704 for (Decl *D : PendingIncompleteDeclChains)
10705 markIncompleteDeclChain(D);
10706 PendingIncompleteDeclChains.clear();
10708 assert(PendingIdentifierInfos.empty() &&
10709 "Should be empty at the end of finishPendingActions");
10710 assert(PendingDeducedFunctionTypes.empty() &&
10711 "Should be empty at the end of finishPendingActions");
10712 assert(PendingDeducedVarTypes.empty() &&
10713 "Should be empty at the end of finishPendingActions");
10714 assert(PendingDeclChains.empty() &&
10715 "Should be empty at the end of finishPendingActions");
10716 assert(PendingMacroIDs.empty() &&
10717 "Should be empty at the end of finishPendingActions");
10718 assert(PendingDeclContextInfos.empty() &&
10719 "Should be empty at the end of finishPendingActions");
10720 assert(PendingUpdateRecords.empty() &&
10721 "Should be empty at the end of finishPendingActions");
10722 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10723 "Should be empty at the end of finishPendingActions");
10724 assert(PendingFakeDefinitionData.empty() &&
10725 "Should be empty at the end of finishPendingActions");
10726 assert(PendingDefinitions.empty() &&
10727 "Should be empty at the end of finishPendingActions");
10728 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10729 "Should be empty at the end of finishPendingActions");
10730 assert(PendingBodies.empty() &&
10731 "Should be empty at the end of finishPendingActions");
10732 assert(PendingAddedClassMembers.empty() &&
10733 "Should be empty at the end of finishPendingActions");
10734 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10735 "Should be empty at the end of finishPendingActions");
10736 assert(PendingIncompleteDeclChains.empty() &&
10737 "Should be empty at the end of finishPendingActions");
10740void ASTReader::diagnoseOdrViolations() {
10741 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10742 PendingRecordOdrMergeFailures.empty() &&
10743 PendingFunctionOdrMergeFailures.empty() &&
10744 PendingEnumOdrMergeFailures.empty() &&
10745 PendingObjCInterfaceOdrMergeFailures.empty() &&
10746 PendingObjCProtocolOdrMergeFailures.empty())
10753 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10754 PendingOdrMergeFailures.clear();
10755 for (
auto &Merge : OdrMergeFailures) {
10756 Merge.first->buildLookup();
10757 Merge.first->decls_begin();
10758 Merge.first->bases_begin();
10759 Merge.first->vbases_begin();
10760 for (
auto &RecordPair : Merge.second) {
10761 auto *RD = RecordPair.first;
10769 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
10770 PendingRecordOdrMergeFailures.clear();
10771 for (
auto &Merge : RecordOdrMergeFailures) {
10772 Merge.first->decls_begin();
10773 for (
auto &D : Merge.second)
10778 auto ObjCInterfaceOdrMergeFailures =
10779 std::move(PendingObjCInterfaceOdrMergeFailures);
10780 PendingObjCInterfaceOdrMergeFailures.clear();
10781 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
10782 Merge.first->decls_begin();
10783 for (
auto &InterfacePair : Merge.second)
10784 InterfacePair.first->decls_begin();
10788 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
10789 PendingFunctionOdrMergeFailures.clear();
10790 for (
auto &Merge : FunctionOdrMergeFailures) {
10791 Merge.first->buildLookup();
10792 Merge.first->decls_begin();
10793 Merge.first->getBody();
10794 for (
auto &FD : Merge.second) {
10802 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
10803 PendingEnumOdrMergeFailures.clear();
10804 for (
auto &Merge : EnumOdrMergeFailures) {
10805 Merge.first->decls_begin();
10806 for (
auto &
Enum : Merge.second) {
10807 Enum->decls_begin();
10812 auto ObjCProtocolOdrMergeFailures =
10813 std::move(PendingObjCProtocolOdrMergeFailures);
10814 PendingObjCProtocolOdrMergeFailures.clear();
10815 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
10816 Merge.first->decls_begin();
10817 for (
auto &ProtocolPair : Merge.second)
10818 ProtocolPair.first->decls_begin();
10827 while (!PendingOdrMergeChecks.empty()) {
10828 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
10839 bool Found =
false;
10842 for (
auto *RI : D->
redecls()) {
10843 if (RI->getLexicalDeclContext() == CanonDef) {
10857 llvm::SmallVector<const NamedDecl*, 4> Candidates;
10858 for (
auto *CanonMember : CanonDef->
decls()) {
10859 if (CanonMember->getCanonicalDecl() == DCanon) {
10868 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
10870 Candidates.push_back(ND);
10883 std::string CanonDefModule =
10888 << CanonDef << CanonDefModule.empty() << CanonDefModule;
10890 if (Candidates.empty())
10892 diag::note_module_odr_violation_no_possible_decls) << D;
10894 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
10895 Diag(Candidates[I]->getLocation(),
10896 diag::note_module_odr_violation_possible_decl)
10900 DiagnosedOdrMergeFailures.insert(CanonDef);
10904 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
10905 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
10906 ObjCInterfaceOdrMergeFailures.empty() &&
10907 ObjCProtocolOdrMergeFailures.empty())
10910 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
10914 for (
auto &Merge : OdrMergeFailures) {
10917 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10920 bool Diagnosed =
false;
10921 CXXRecordDecl *FirstRecord = Merge.first;
10922 for (
auto &RecordPair : Merge.second) {
10923 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
10924 RecordPair.second)) {
10937 Diag(Merge.first->getLocation(),
10938 diag::err_module_odr_violation_different_instantiations)
10945 for (
auto &Merge : RecordOdrMergeFailures) {
10948 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10951 RecordDecl *FirstRecord = Merge.first;
10952 bool Diagnosed =
false;
10953 for (
auto *SecondRecord : Merge.second) {
10954 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
10960 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
10964 for (
auto &Merge : FunctionOdrMergeFailures) {
10965 FunctionDecl *FirstFunction = Merge.first;
10966 bool Diagnosed =
false;
10967 for (
auto &SecondFunction : Merge.second) {
10968 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
10974 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
10978 for (
auto &Merge : EnumOdrMergeFailures) {
10981 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10984 EnumDecl *FirstEnum = Merge.first;
10985 bool Diagnosed =
false;
10986 for (
auto &SecondEnum : Merge.second) {
10987 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
10993 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
10996 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
10999 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11002 bool Diagnosed =
false;
11003 ObjCInterfaceDecl *FirstID = Merge.first;
11004 for (
auto &InterfacePair : Merge.second) {
11005 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11006 InterfacePair.second)) {
11012 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11015 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11018 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11021 ObjCProtocolDecl *FirstProtocol = Merge.first;
11022 bool Diagnosed =
false;
11023 for (
auto &ProtocolPair : Merge.second) {
11024 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11025 ProtocolPair.second)) {
11031 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11036 if (llvm::Timer *
T = ReadTimer.get();
11037 ++NumCurrentElementsDeserializing == 1 &&
T)
11038 ReadTimeRegion.emplace(
T);
11042 assert(NumCurrentElementsDeserializing &&
11043 "FinishedDeserializing not paired with StartedDeserializing");
11044 if (NumCurrentElementsDeserializing == 1) {
11047 finishPendingActions();
11049 --NumCurrentElementsDeserializing;
11051 if (NumCurrentElementsDeserializing == 0) {
11055 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11063 while (!PendingExceptionSpecUpdates.empty() ||
11064 !PendingDeducedTypeUpdates.empty() ||
11065 !PendingUndeducedFunctionDecls.empty()) {
11066 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11067 PendingExceptionSpecUpdates.clear();
11068 for (
auto Update : ESUpdates) {
11069 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11072 if (
auto *Listener =
getContext().getASTMutationListener())
11074 for (
auto *Redecl :
Update.second->redecls())
11078 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11079 PendingDeducedTypeUpdates.clear();
11080 for (
auto Update : DTUpdates) {
11081 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11088 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11089 PendingUndeducedFunctionDecls.clear();
11093 (void)UndeducedFD->getMostRecentDecl();
11096 ReadTimeRegion.reset();
11098 diagnoseOdrViolations();
11104 PassInterestingDeclsToConsumer();
11111 auto It = PendingFakeLookupResults.find(II);
11112 if (It != PendingFakeLookupResults.end()) {
11113 for (
auto *ND : It->second)
11118 It->second.clear();
11122 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11123 SemaObj->TUScope->AddDecl(D);
11124 }
else if (SemaObj->TUScope) {
11128 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11129 SemaObj->TUScope->AddDecl(D);
11137 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11138 StringRef isysroot,
11140 bool AllowASTWithCompilerErrors,
11141 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11142 bool ForceValidateUserInputs,
11143 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11144 std::unique_ptr<llvm::Timer> ReadTimer)
11149 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11150 StackHandler(Diags), PP(PP), ContextObj(Context),
11151 CodeGenOpts(CodeGenOpts),
11153 PP.getHeaderSearchInfo()),
11154 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11155 DisableValidationKind(DisableValidationKind),
11156 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11157 AllowConfigurationMismatch(AllowConfigurationMismatch),
11158 ValidateSystemInputs(ValidateSystemInputs),
11159 ForceValidateUserInputs(ForceValidateUserInputs),
11160 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11161 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11162 SourceMgr.setExternalSLocEntrySource(
this);
11164 PathBuf.reserve(256);
11166 for (
const auto &Ext : Extensions) {
11167 auto BlockName = Ext->getExtensionMetadata().BlockName;
11168 auto Known = ModuleFileExtensions.find(BlockName);
11169 if (Known != ModuleFileExtensions.end()) {
11170 Diags.Report(diag::warn_duplicate_module_file_extension)
11175 ModuleFileExtensions.insert({BlockName, Ext});
11180 if (OwnsDeserializationListener)
11181 delete DeserializationListener;
11185 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11189 unsigned AbbrevID) {
11192 return Cursor.readRecord(AbbrevID, Record);
11208 : Record(Record), Context(Record.getContext()) {}
11209#define GEN_CLANG_CLAUSE_CLASS
11210#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11211#include "llvm/Frontend/OpenMP/OMP.inc"
11225 switch (llvm::omp::Clause(Record.readInt())) {
11226 case llvm::omp::OMPC_if:
11229 case llvm::omp::OMPC_final:
11232 case llvm::omp::OMPC_num_threads:
11235 case llvm::omp::OMPC_safelen:
11238 case llvm::omp::OMPC_simdlen:
11241 case llvm::omp::OMPC_sizes: {
11242 unsigned NumSizes = Record.readInt();
11246 case llvm::omp::OMPC_permutation: {
11247 unsigned NumLoops = Record.readInt();
11251 case llvm::omp::OMPC_full:
11254 case llvm::omp::OMPC_partial:
11257 case llvm::omp::OMPC_looprange:
11260 case llvm::omp::OMPC_allocator:
11263 case llvm::omp::OMPC_collapse:
11266 case llvm::omp::OMPC_default:
11269 case llvm::omp::OMPC_proc_bind:
11272 case llvm::omp::OMPC_schedule:
11275 case llvm::omp::OMPC_ordered:
11278 case llvm::omp::OMPC_nowait:
11281 case llvm::omp::OMPC_untied:
11284 case llvm::omp::OMPC_mergeable:
11287 case llvm::omp::OMPC_threadset:
11290 case llvm::omp::OMPC_read:
11293 case llvm::omp::OMPC_write:
11296 case llvm::omp::OMPC_update:
11299 case llvm::omp::OMPC_capture:
11302 case llvm::omp::OMPC_compare:
11305 case llvm::omp::OMPC_fail:
11308 case llvm::omp::OMPC_seq_cst:
11311 case llvm::omp::OMPC_acq_rel:
11314 case llvm::omp::OMPC_absent: {
11315 unsigned NumKinds = Record.readInt();
11319 case llvm::omp::OMPC_holds:
11322 case llvm::omp::OMPC_contains: {
11323 unsigned NumKinds = Record.readInt();
11327 case llvm::omp::OMPC_no_openmp:
11330 case llvm::omp::OMPC_no_openmp_routines:
11333 case llvm::omp::OMPC_no_openmp_constructs:
11336 case llvm::omp::OMPC_no_parallelism:
11339 case llvm::omp::OMPC_acquire:
11342 case llvm::omp::OMPC_release:
11345 case llvm::omp::OMPC_relaxed:
11348 case llvm::omp::OMPC_weak:
11351 case llvm::omp::OMPC_threads:
11354 case llvm::omp::OMPC_simd:
11357 case llvm::omp::OMPC_nogroup:
11360 case llvm::omp::OMPC_unified_address:
11363 case llvm::omp::OMPC_unified_shared_memory:
11366 case llvm::omp::OMPC_reverse_offload:
11369 case llvm::omp::OMPC_dynamic_allocators:
11372 case llvm::omp::OMPC_atomic_default_mem_order:
11375 case llvm::omp::OMPC_self_maps:
11378 case llvm::omp::OMPC_at:
11381 case llvm::omp::OMPC_severity:
11384 case llvm::omp::OMPC_message:
11387 case llvm::omp::OMPC_private:
11390 case llvm::omp::OMPC_firstprivate:
11393 case llvm::omp::OMPC_lastprivate:
11396 case llvm::omp::OMPC_shared:
11399 case llvm::omp::OMPC_reduction: {
11400 unsigned N = Record.readInt();
11405 case llvm::omp::OMPC_task_reduction:
11408 case llvm::omp::OMPC_in_reduction:
11411 case llvm::omp::OMPC_linear:
11414 case llvm::omp::OMPC_aligned:
11417 case llvm::omp::OMPC_copyin:
11420 case llvm::omp::OMPC_copyprivate:
11423 case llvm::omp::OMPC_flush:
11426 case llvm::omp::OMPC_depobj:
11429 case llvm::omp::OMPC_depend: {
11430 unsigned NumVars = Record.readInt();
11431 unsigned NumLoops = Record.readInt();
11435 case llvm::omp::OMPC_device:
11438 case llvm::omp::OMPC_map: {
11440 Sizes.
NumVars = Record.readInt();
11447 case llvm::omp::OMPC_num_teams:
11450 case llvm::omp::OMPC_thread_limit:
11453 case llvm::omp::OMPC_priority:
11456 case llvm::omp::OMPC_grainsize:
11459 case llvm::omp::OMPC_num_tasks:
11462 case llvm::omp::OMPC_hint:
11465 case llvm::omp::OMPC_dist_schedule:
11468 case llvm::omp::OMPC_defaultmap:
11471 case llvm::omp::OMPC_to: {
11473 Sizes.
NumVars = Record.readInt();
11480 case llvm::omp::OMPC_from: {
11482 Sizes.
NumVars = Record.readInt();
11489 case llvm::omp::OMPC_use_device_ptr: {
11491 Sizes.
NumVars = Record.readInt();
11498 case llvm::omp::OMPC_use_device_addr: {
11500 Sizes.
NumVars = Record.readInt();
11507 case llvm::omp::OMPC_is_device_ptr: {
11509 Sizes.
NumVars = Record.readInt();
11516 case llvm::omp::OMPC_has_device_addr: {
11518 Sizes.
NumVars = Record.readInt();
11525 case llvm::omp::OMPC_allocate:
11528 case llvm::omp::OMPC_nontemporal:
11531 case llvm::omp::OMPC_inclusive:
11534 case llvm::omp::OMPC_exclusive:
11537 case llvm::omp::OMPC_order:
11540 case llvm::omp::OMPC_init:
11543 case llvm::omp::OMPC_use:
11546 case llvm::omp::OMPC_destroy:
11549 case llvm::omp::OMPC_novariants:
11552 case llvm::omp::OMPC_nocontext:
11555 case llvm::omp::OMPC_detach:
11558 case llvm::omp::OMPC_uses_allocators:
11561 case llvm::omp::OMPC_affinity:
11564 case llvm::omp::OMPC_filter:
11567 case llvm::omp::OMPC_bind:
11570 case llvm::omp::OMPC_align:
11573 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11576 case llvm::omp::OMPC_dyn_groupprivate:
11579 case llvm::omp::OMPC_doacross: {
11580 unsigned NumVars = Record.readInt();
11581 unsigned NumLoops = Record.readInt();
11585 case llvm::omp::OMPC_ompx_attribute:
11588 case llvm::omp::OMPC_ompx_bare:
11591#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11592 case llvm::omp::Enum: \
11594#include "llvm/Frontend/OpenMP/OMPKinds.def"
11598 assert(
C &&
"Unknown OMPClause type");
11601 C->setLocStart(Record.readSourceLocation());
11602 C->setLocEnd(Record.readSourceLocation());
11608 C->setPreInitStmt(Record.readSubStmt(),
11614 C->setPostUpdateExpr(Record.readSubExpr());
11617void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11620 C->setNameModifierLoc(
Record.readSourceLocation());
11621 C->setColonLoc(
Record.readSourceLocation());
11622 C->setCondition(
Record.readSubExpr());
11623 C->setLParenLoc(
Record.readSourceLocation());
11628 C->setCondition(
Record.readSubExpr());
11629 C->setLParenLoc(
Record.readSourceLocation());
11635 C->setNumThreads(Record.readSubExpr());
11636 C->setModifierLoc(Record.readSourceLocation());
11637 C->setLParenLoc(Record.readSourceLocation());
11641 C->setSafelen(Record.readSubExpr());
11642 C->setLParenLoc(Record.readSourceLocation());
11646 C->setSimdlen(Record.readSubExpr());
11647 C->setLParenLoc(Record.readSourceLocation());
11651 for (Expr *&E :
C->getSizesRefs())
11652 E = Record.readSubExpr();
11653 C->setLParenLoc(Record.readSourceLocation());
11657 for (Expr *&E :
C->getArgsRefs())
11658 E = Record.readSubExpr();
11659 C->setLParenLoc(Record.readSourceLocation());
11665 C->setFactor(Record.readSubExpr());
11666 C->setLParenLoc(Record.readSourceLocation());
11670 C->setFirst(Record.readSubExpr());
11671 C->setCount(Record.readSubExpr());
11672 C->setLParenLoc(Record.readSourceLocation());
11673 C->setFirstLoc(Record.readSourceLocation());
11674 C->setCountLoc(Record.readSourceLocation());
11678 C->setAllocator(Record.readExpr());
11679 C->setLParenLoc(Record.readSourceLocation());
11683 C->setNumForLoops(Record.readSubExpr());
11684 C->setLParenLoc(Record.readSourceLocation());
11688 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11689 C->setLParenLoc(Record.readSourceLocation());
11690 C->setDefaultKindKwLoc(Record.readSourceLocation());
11691 C->setDefaultVariableCategory(
11693 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11699 C->setLParenLoc(Record.readSourceLocation());
11700 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11701 C->setThreadsetKindLoc(ThreadsetKindLoc);
11704 C->setThreadsetKind(TKind);
11708 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11709 C->setLParenLoc(Record.readSourceLocation());
11710 C->setProcBindKindKwLoc(Record.readSourceLocation());
11715 C->setScheduleKind(
11717 C->setFirstScheduleModifier(
11719 C->setSecondScheduleModifier(
11721 C->setChunkSize(Record.readSubExpr());
11722 C->setLParenLoc(Record.readSourceLocation());
11723 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11724 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11725 C->setScheduleKindLoc(Record.readSourceLocation());
11726 C->setCommaLoc(Record.readSourceLocation());
11730 C->setNumForLoops(Record.readSubExpr());
11731 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11732 C->setLoopNumIterations(I, Record.readSubExpr());
11733 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11734 C->setLoopCounter(I, Record.readSubExpr());
11735 C->setLParenLoc(Record.readSourceLocation());
11739 C->setEventHandler(Record.readSubExpr());
11740 C->setLParenLoc(Record.readSourceLocation());
11744 C->setCondition(Record.readSubExpr());
11745 C->setLParenLoc(Record.readSourceLocation());
11752void OMPClauseReader::VisitOMPReadClause(
OMPReadClause *) {}
11757 if (
C->isExtended()) {
11758 C->setLParenLoc(Record.readSourceLocation());
11759 C->setArgumentLoc(Record.readSourceLocation());
11771 C->setLParenLoc(Record.readSourceLocation());
11772 SourceLocation FailParameterLoc = Record.readSourceLocation();
11773 C->setFailParameterLoc(FailParameterLoc);
11775 C->setFailParameter(CKind);
11779 unsigned Count =
C->getDirectiveKinds().size();
11780 C->setLParenLoc(Record.readSourceLocation());
11781 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11782 DKVec.reserve(Count);
11783 for (
unsigned I = 0; I < Count; I++) {
11786 C->setDirectiveKinds(DKVec);
11790 C->setExpr(Record.readExpr());
11791 C->setLParenLoc(Record.readSourceLocation());
11795 unsigned Count =
C->getDirectiveKinds().size();
11796 C->setLParenLoc(Record.readSourceLocation());
11797 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11798 DKVec.reserve(Count);
11799 for (
unsigned I = 0; I < Count; I++) {
11802 C->setDirectiveKinds(DKVec);
11807void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
11810void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
11825void OMPClauseReader::VisitOMPWeakClause(
OMPWeakClause *) {}
11829void OMPClauseReader::VisitOMPSIMDClause(
OMPSIMDClause *) {}
11834 unsigned NumVars =
C->varlist_size();
11835 SmallVector<Expr *, 16> Vars;
11836 Vars.reserve(NumVars);
11837 for (
unsigned I = 0; I != NumVars; ++I)
11838 Vars.push_back(Record.readSubExpr());
11839 C->setVarRefs(Vars);
11840 C->setIsTarget(Record.readBool());
11841 C->setIsTargetSync(Record.readBool());
11842 C->setLParenLoc(Record.readSourceLocation());
11843 C->setVarLoc(Record.readSourceLocation());
11847 C->setInteropVar(Record.readSubExpr());
11848 C->setLParenLoc(Record.readSourceLocation());
11849 C->setVarLoc(Record.readSourceLocation());
11853 C->setInteropVar(Record.readSubExpr());
11854 C->setLParenLoc(Record.readSourceLocation());
11855 C->setVarLoc(Record.readSourceLocation());
11860 C->setCondition(Record.readSubExpr());
11861 C->setLParenLoc(Record.readSourceLocation());
11866 C->setCondition(Record.readSubExpr());
11867 C->setLParenLoc(Record.readSourceLocation());
11872void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
11881void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
11883 C->setAtomicDefaultMemOrderKind(
11885 C->setLParenLoc(Record.readSourceLocation());
11886 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
11891void OMPClauseReader::VisitOMPAtClause(
OMPAtClause *
C) {
11893 C->setLParenLoc(Record.readSourceLocation());
11894 C->setAtKindKwLoc(Record.readSourceLocation());
11899 C->setLParenLoc(Record.readSourceLocation());
11900 C->setSeverityKindKwLoc(Record.readSourceLocation());
11905 C->setMessageString(Record.readSubExpr());
11906 C->setLParenLoc(Record.readSourceLocation());
11910 C->setLParenLoc(Record.readSourceLocation());
11911 unsigned NumVars =
C->varlist_size();
11912 SmallVector<Expr *, 16> Vars;
11913 Vars.reserve(NumVars);
11914 for (
unsigned i = 0; i != NumVars; ++i)
11915 Vars.push_back(Record.readSubExpr());
11916 C->setVarRefs(Vars);
11918 for (
unsigned i = 0; i != NumVars; ++i)
11919 Vars.push_back(Record.readSubExpr());
11920 C->setPrivateCopies(Vars);
11925 C->setLParenLoc(Record.readSourceLocation());
11926 unsigned NumVars =
C->varlist_size();
11927 SmallVector<Expr *, 16> Vars;
11928 Vars.reserve(NumVars);
11929 for (
unsigned i = 0; i != NumVars; ++i)
11930 Vars.push_back(Record.readSubExpr());
11931 C->setVarRefs(Vars);
11933 for (
unsigned i = 0; i != NumVars; ++i)
11934 Vars.push_back(Record.readSubExpr());
11935 C->setPrivateCopies(Vars);
11937 for (
unsigned i = 0; i != NumVars; ++i)
11938 Vars.push_back(Record.readSubExpr());
11944 C->setLParenLoc(Record.readSourceLocation());
11946 C->setKindLoc(Record.readSourceLocation());
11947 C->setColonLoc(Record.readSourceLocation());
11948 unsigned NumVars =
C->varlist_size();
11949 SmallVector<Expr *, 16> Vars;
11950 Vars.reserve(NumVars);
11951 for (
unsigned i = 0; i != NumVars; ++i)
11952 Vars.push_back(Record.readSubExpr());
11953 C->setVarRefs(Vars);
11955 for (
unsigned i = 0; i != NumVars; ++i)
11956 Vars.push_back(Record.readSubExpr());
11957 C->setPrivateCopies(Vars);
11959 for (
unsigned i = 0; i != NumVars; ++i)
11960 Vars.push_back(Record.readSubExpr());
11961 C->setSourceExprs(Vars);
11963 for (
unsigned i = 0; i != NumVars; ++i)
11964 Vars.push_back(Record.readSubExpr());
11965 C->setDestinationExprs(Vars);
11967 for (
unsigned i = 0; i != NumVars; ++i)
11968 Vars.push_back(Record.readSubExpr());
11969 C->setAssignmentOps(Vars);
11973 C->setLParenLoc(Record.readSourceLocation());
11974 unsigned NumVars =
C->varlist_size();
11975 SmallVector<Expr *, 16> Vars;
11976 Vars.reserve(NumVars);
11977 for (
unsigned i = 0; i != NumVars; ++i)
11978 Vars.push_back(Record.readSubExpr());
11979 C->setVarRefs(Vars);
11984 C->setLParenLoc(Record.readSourceLocation());
11985 C->setModifierLoc(Record.readSourceLocation());
11986 C->setColonLoc(Record.readSourceLocation());
11987 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
11988 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
11989 C->setQualifierLoc(NNSL);
11990 C->setNameInfo(DNI);
11992 unsigned NumVars =
C->varlist_size();
11993 SmallVector<Expr *, 16> Vars;
11994 Vars.reserve(NumVars);
11995 for (
unsigned i = 0; i != NumVars; ++i)
11996 Vars.push_back(Record.readSubExpr());
11997 C->setVarRefs(Vars);
11999 for (
unsigned i = 0; i != NumVars; ++i)
12000 Vars.push_back(Record.readSubExpr());
12001 C->setPrivates(Vars);
12003 for (
unsigned i = 0; i != NumVars; ++i)
12004 Vars.push_back(Record.readSubExpr());
12005 C->setLHSExprs(Vars);
12007 for (
unsigned i = 0; i != NumVars; ++i)
12008 Vars.push_back(Record.readSubExpr());
12009 C->setRHSExprs(Vars);
12011 for (
unsigned i = 0; i != NumVars; ++i)
12012 Vars.push_back(Record.readSubExpr());
12013 C->setReductionOps(Vars);
12014 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12016 for (
unsigned i = 0; i != NumVars; ++i)
12017 Vars.push_back(Record.readSubExpr());
12018 C->setInscanCopyOps(Vars);
12020 for (
unsigned i = 0; i != NumVars; ++i)
12021 Vars.push_back(Record.readSubExpr());
12022 C->setInscanCopyArrayTemps(Vars);
12024 for (
unsigned i = 0; i != NumVars; ++i)
12025 Vars.push_back(Record.readSubExpr());
12026 C->setInscanCopyArrayElems(Vars);
12028 unsigned NumFlags = Record.readInt();
12029 SmallVector<bool, 16> Flags;
12030 Flags.reserve(NumFlags);
12031 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12032 Flags.push_back(Record.readInt());
12033 C->setPrivateVariableReductionFlags(Flags);
12038 C->setLParenLoc(Record.readSourceLocation());
12039 C->setColonLoc(Record.readSourceLocation());
12040 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12041 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12042 C->setQualifierLoc(NNSL);
12043 C->setNameInfo(DNI);
12045 unsigned NumVars =
C->varlist_size();
12046 SmallVector<Expr *, 16> Vars;
12047 Vars.reserve(NumVars);
12048 for (
unsigned I = 0; I != NumVars; ++I)
12049 Vars.push_back(Record.readSubExpr());
12050 C->setVarRefs(Vars);
12052 for (
unsigned I = 0; I != NumVars; ++I)
12053 Vars.push_back(Record.readSubExpr());
12054 C->setPrivates(Vars);
12056 for (
unsigned I = 0; I != NumVars; ++I)
12057 Vars.push_back(Record.readSubExpr());
12058 C->setLHSExprs(Vars);
12060 for (
unsigned I = 0; I != NumVars; ++I)
12061 Vars.push_back(Record.readSubExpr());
12062 C->setRHSExprs(Vars);
12064 for (
unsigned I = 0; I != NumVars; ++I)
12065 Vars.push_back(Record.readSubExpr());
12066 C->setReductionOps(Vars);
12071 C->setLParenLoc(Record.readSourceLocation());
12072 C->setColonLoc(Record.readSourceLocation());
12073 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12074 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12075 C->setQualifierLoc(NNSL);
12076 C->setNameInfo(DNI);
12078 unsigned NumVars =
C->varlist_size();
12079 SmallVector<Expr *, 16> Vars;
12080 Vars.reserve(NumVars);
12081 for (
unsigned I = 0; I != NumVars; ++I)
12082 Vars.push_back(Record.readSubExpr());
12083 C->setVarRefs(Vars);
12085 for (
unsigned I = 0; I != NumVars; ++I)
12086 Vars.push_back(Record.readSubExpr());
12087 C->setPrivates(Vars);
12089 for (
unsigned I = 0; I != NumVars; ++I)
12090 Vars.push_back(Record.readSubExpr());
12091 C->setLHSExprs(Vars);
12093 for (
unsigned I = 0; I != NumVars; ++I)
12094 Vars.push_back(Record.readSubExpr());
12095 C->setRHSExprs(Vars);
12097 for (
unsigned I = 0; I != NumVars; ++I)
12098 Vars.push_back(Record.readSubExpr());
12099 C->setReductionOps(Vars);
12101 for (
unsigned I = 0; I != NumVars; ++I)
12102 Vars.push_back(Record.readSubExpr());
12103 C->setTaskgroupDescriptors(Vars);
12108 C->setLParenLoc(Record.readSourceLocation());
12109 C->setColonLoc(Record.readSourceLocation());
12111 C->setModifierLoc(Record.readSourceLocation());
12112 unsigned NumVars =
C->varlist_size();
12113 SmallVector<Expr *, 16> Vars;
12114 Vars.reserve(NumVars);
12115 for (
unsigned i = 0; i != NumVars; ++i)
12116 Vars.push_back(Record.readSubExpr());
12117 C->setVarRefs(Vars);
12119 for (
unsigned i = 0; i != NumVars; ++i)
12120 Vars.push_back(Record.readSubExpr());
12121 C->setPrivates(Vars);
12123 for (
unsigned i = 0; i != NumVars; ++i)
12124 Vars.push_back(Record.readSubExpr());
12127 for (
unsigned i = 0; i != NumVars; ++i)
12128 Vars.push_back(Record.readSubExpr());
12129 C->setUpdates(Vars);
12131 for (
unsigned i = 0; i != NumVars; ++i)
12132 Vars.push_back(Record.readSubExpr());
12133 C->setFinals(Vars);
12134 C->setStep(Record.readSubExpr());
12135 C->setCalcStep(Record.readSubExpr());
12137 for (
unsigned I = 0; I != NumVars + 1; ++I)
12138 Vars.push_back(Record.readSubExpr());
12139 C->setUsedExprs(Vars);
12143 C->setLParenLoc(Record.readSourceLocation());
12144 C->setColonLoc(Record.readSourceLocation());
12145 unsigned NumVars =
C->varlist_size();
12146 SmallVector<Expr *, 16> Vars;
12147 Vars.reserve(NumVars);
12148 for (
unsigned i = 0; i != NumVars; ++i)
12149 Vars.push_back(Record.readSubExpr());
12150 C->setVarRefs(Vars);
12151 C->setAlignment(Record.readSubExpr());
12155 C->setLParenLoc(Record.readSourceLocation());
12156 unsigned NumVars =
C->varlist_size();
12157 SmallVector<Expr *, 16> Exprs;
12158 Exprs.reserve(NumVars);
12159 for (
unsigned i = 0; i != NumVars; ++i)
12160 Exprs.push_back(Record.readSubExpr());
12161 C->setVarRefs(Exprs);
12163 for (
unsigned i = 0; i != NumVars; ++i)
12164 Exprs.push_back(Record.readSubExpr());
12165 C->setSourceExprs(Exprs);
12167 for (
unsigned i = 0; i != NumVars; ++i)
12168 Exprs.push_back(Record.readSubExpr());
12169 C->setDestinationExprs(Exprs);
12171 for (
unsigned i = 0; i != NumVars; ++i)
12172 Exprs.push_back(Record.readSubExpr());
12173 C->setAssignmentOps(Exprs);
12177 C->setLParenLoc(Record.readSourceLocation());
12178 unsigned NumVars =
C->varlist_size();
12179 SmallVector<Expr *, 16> Exprs;
12180 Exprs.reserve(NumVars);
12181 for (
unsigned i = 0; i != NumVars; ++i)
12182 Exprs.push_back(Record.readSubExpr());
12183 C->setVarRefs(Exprs);
12185 for (
unsigned i = 0; i != NumVars; ++i)
12186 Exprs.push_back(Record.readSubExpr());
12187 C->setSourceExprs(Exprs);
12189 for (
unsigned i = 0; i != NumVars; ++i)
12190 Exprs.push_back(Record.readSubExpr());
12191 C->setDestinationExprs(Exprs);
12193 for (
unsigned i = 0; i != NumVars; ++i)
12194 Exprs.push_back(Record.readSubExpr());
12195 C->setAssignmentOps(Exprs);
12199 C->setLParenLoc(Record.readSourceLocation());
12200 unsigned NumVars =
C->varlist_size();
12201 SmallVector<Expr *, 16> Vars;
12202 Vars.reserve(NumVars);
12203 for (
unsigned i = 0; i != NumVars; ++i)
12204 Vars.push_back(Record.readSubExpr());
12205 C->setVarRefs(Vars);
12209 C->setDepobj(Record.readSubExpr());
12210 C->setLParenLoc(Record.readSourceLocation());
12214 C->setLParenLoc(Record.readSourceLocation());
12215 C->setModifier(Record.readSubExpr());
12216 C->setDependencyKind(
12218 C->setDependencyLoc(Record.readSourceLocation());
12219 C->setColonLoc(Record.readSourceLocation());
12220 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12221 unsigned NumVars =
C->varlist_size();
12222 SmallVector<Expr *, 16> Vars;
12223 Vars.reserve(NumVars);
12224 for (
unsigned I = 0; I != NumVars; ++I)
12225 Vars.push_back(Record.readSubExpr());
12226 C->setVarRefs(Vars);
12227 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12228 C->setLoopData(I, Record.readSubExpr());
12234 C->setDevice(Record.readSubExpr());
12235 C->setModifierLoc(Record.readSourceLocation());
12236 C->setLParenLoc(Record.readSourceLocation());
12240 C->setLParenLoc(Record.readSourceLocation());
12241 bool HasIteratorModifier =
false;
12243 C->setMapTypeModifier(
12245 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12246 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12247 HasIteratorModifier =
true;
12249 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12250 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12253 C->setMapLoc(Record.readSourceLocation());
12254 C->setColonLoc(Record.readSourceLocation());
12255 auto NumVars =
C->varlist_size();
12256 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12257 auto TotalLists =
C->getTotalComponentListNum();
12258 auto TotalComponents =
C->getTotalComponentsNum();
12260 SmallVector<Expr *, 16> Vars;
12261 Vars.reserve(NumVars);
12262 for (
unsigned i = 0; i != NumVars; ++i)
12263 Vars.push_back(Record.readExpr());
12264 C->setVarRefs(Vars);
12266 SmallVector<Expr *, 16> UDMappers;
12267 UDMappers.reserve(NumVars);
12268 for (
unsigned I = 0; I < NumVars; ++I)
12269 UDMappers.push_back(Record.readExpr());
12270 C->setUDMapperRefs(UDMappers);
12272 if (HasIteratorModifier)
12273 C->setIteratorModifier(Record.readExpr());
12275 SmallVector<ValueDecl *, 16> Decls;
12276 Decls.reserve(UniqueDecls);
12277 for (
unsigned i = 0; i < UniqueDecls; ++i)
12278 Decls.push_back(Record.readDeclAs<ValueDecl>());
12279 C->setUniqueDecls(Decls);
12281 SmallVector<unsigned, 16> ListsPerDecl;
12282 ListsPerDecl.reserve(UniqueDecls);
12283 for (
unsigned i = 0; i < UniqueDecls; ++i)
12284 ListsPerDecl.push_back(Record.readInt());
12285 C->setDeclNumLists(ListsPerDecl);
12287 SmallVector<unsigned, 32> ListSizes;
12288 ListSizes.reserve(TotalLists);
12289 for (
unsigned i = 0; i < TotalLists; ++i)
12290 ListSizes.push_back(Record.readInt());
12291 C->setComponentListSizes(ListSizes);
12293 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12294 Components.reserve(TotalComponents);
12295 for (
unsigned i = 0; i < TotalComponents; ++i) {
12296 Expr *AssociatedExprPr = Record.readExpr();
12297 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12298 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12301 C->setComponents(Components, ListSizes);
12307 C->setLParenLoc(Record.readSourceLocation());
12308 C->setColonLoc(Record.readSourceLocation());
12309 C->setAllocator(Record.readSubExpr());
12310 C->setAlignment(Record.readSubExpr());
12311 unsigned NumVars =
C->varlist_size();
12312 SmallVector<Expr *, 16> Vars;
12313 Vars.reserve(NumVars);
12314 for (
unsigned i = 0; i != NumVars; ++i)
12315 Vars.push_back(Record.readSubExpr());
12316 C->setVarRefs(Vars);
12321 C->setLParenLoc(Record.readSourceLocation());
12322 unsigned NumVars =
C->varlist_size();
12323 SmallVector<Expr *, 16> Vars;
12324 Vars.reserve(NumVars);
12325 for (
unsigned I = 0; I != NumVars; ++I)
12326 Vars.push_back(Record.readSubExpr());
12327 C->setVarRefs(Vars);
12332 C->setLParenLoc(Record.readSourceLocation());
12333 unsigned NumVars =
C->varlist_size();
12334 SmallVector<Expr *, 16> Vars;
12335 Vars.reserve(NumVars);
12336 for (
unsigned I = 0; I != NumVars; ++I)
12337 Vars.push_back(Record.readSubExpr());
12338 C->setVarRefs(Vars);
12343 C->setPriority(Record.readSubExpr());
12344 C->setLParenLoc(Record.readSourceLocation());
12350 C->setGrainsize(Record.readSubExpr());
12351 C->setModifierLoc(Record.readSourceLocation());
12352 C->setLParenLoc(Record.readSourceLocation());
12358 C->setNumTasks(Record.readSubExpr());
12359 C->setModifierLoc(Record.readSourceLocation());
12360 C->setLParenLoc(Record.readSourceLocation());
12364 C->setHint(Record.readSubExpr());
12365 C->setLParenLoc(Record.readSourceLocation());
12370 C->setDistScheduleKind(
12372 C->setChunkSize(Record.readSubExpr());
12373 C->setLParenLoc(Record.readSourceLocation());
12374 C->setDistScheduleKindLoc(Record.readSourceLocation());
12375 C->setCommaLoc(Record.readSourceLocation());
12379 C->setDefaultmapKind(
12381 C->setDefaultmapModifier(
12383 C->setLParenLoc(Record.readSourceLocation());
12384 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12385 C->setDefaultmapKindLoc(Record.readSourceLocation());
12388void OMPClauseReader::VisitOMPToClause(
OMPToClause *
C) {
12389 C->setLParenLoc(Record.readSourceLocation());
12391 C->setMotionModifier(
12393 C->setMotionModifierLoc(I, Record.readSourceLocation());
12394 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12395 C->setIteratorModifier(Record.readExpr());
12397 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12398 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12399 C->setColonLoc(Record.readSourceLocation());
12400 auto NumVars =
C->varlist_size();
12401 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12402 auto TotalLists =
C->getTotalComponentListNum();
12403 auto TotalComponents =
C->getTotalComponentsNum();
12405 SmallVector<Expr *, 16> Vars;
12406 Vars.reserve(NumVars);
12407 for (
unsigned i = 0; i != NumVars; ++i)
12408 Vars.push_back(Record.readSubExpr());
12409 C->setVarRefs(Vars);
12411 SmallVector<Expr *, 16> UDMappers;
12412 UDMappers.reserve(NumVars);
12413 for (
unsigned I = 0; I < NumVars; ++I)
12414 UDMappers.push_back(Record.readSubExpr());
12415 C->setUDMapperRefs(UDMappers);
12417 SmallVector<ValueDecl *, 16> Decls;
12418 Decls.reserve(UniqueDecls);
12419 for (
unsigned i = 0; i < UniqueDecls; ++i)
12420 Decls.push_back(Record.readDeclAs<ValueDecl>());
12421 C->setUniqueDecls(Decls);
12423 SmallVector<unsigned, 16> ListsPerDecl;
12424 ListsPerDecl.reserve(UniqueDecls);
12425 for (
unsigned i = 0; i < UniqueDecls; ++i)
12426 ListsPerDecl.push_back(Record.readInt());
12427 C->setDeclNumLists(ListsPerDecl);
12429 SmallVector<unsigned, 32> ListSizes;
12430 ListSizes.reserve(TotalLists);
12431 for (
unsigned i = 0; i < TotalLists; ++i)
12432 ListSizes.push_back(Record.readInt());
12433 C->setComponentListSizes(ListSizes);
12435 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12436 Components.reserve(TotalComponents);
12437 for (
unsigned i = 0; i < TotalComponents; ++i) {
12438 Expr *AssociatedExprPr = Record.readSubExpr();
12439 bool IsNonContiguous = Record.readBool();
12440 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12441 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12443 C->setComponents(Components, ListSizes);
12447 C->setLParenLoc(Record.readSourceLocation());
12449 C->setMotionModifier(
12451 C->setMotionModifierLoc(I, Record.readSourceLocation());
12452 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12453 C->setIteratorModifier(Record.readExpr());
12455 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12456 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12457 C->setColonLoc(Record.readSourceLocation());
12458 auto NumVars =
C->varlist_size();
12459 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12460 auto TotalLists =
C->getTotalComponentListNum();
12461 auto TotalComponents =
C->getTotalComponentsNum();
12463 SmallVector<Expr *, 16> Vars;
12464 Vars.reserve(NumVars);
12465 for (
unsigned i = 0; i != NumVars; ++i)
12466 Vars.push_back(Record.readSubExpr());
12467 C->setVarRefs(Vars);
12469 SmallVector<Expr *, 16> UDMappers;
12470 UDMappers.reserve(NumVars);
12471 for (
unsigned I = 0; I < NumVars; ++I)
12472 UDMappers.push_back(Record.readSubExpr());
12473 C->setUDMapperRefs(UDMappers);
12475 SmallVector<ValueDecl *, 16> Decls;
12476 Decls.reserve(UniqueDecls);
12477 for (
unsigned i = 0; i < UniqueDecls; ++i)
12478 Decls.push_back(Record.readDeclAs<ValueDecl>());
12479 C->setUniqueDecls(Decls);
12481 SmallVector<unsigned, 16> ListsPerDecl;
12482 ListsPerDecl.reserve(UniqueDecls);
12483 for (
unsigned i = 0; i < UniqueDecls; ++i)
12484 ListsPerDecl.push_back(Record.readInt());
12485 C->setDeclNumLists(ListsPerDecl);
12487 SmallVector<unsigned, 32> ListSizes;
12488 ListSizes.reserve(TotalLists);
12489 for (
unsigned i = 0; i < TotalLists; ++i)
12490 ListSizes.push_back(Record.readInt());
12491 C->setComponentListSizes(ListSizes);
12493 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12494 Components.reserve(TotalComponents);
12495 for (
unsigned i = 0; i < TotalComponents; ++i) {
12496 Expr *AssociatedExprPr = Record.readSubExpr();
12497 bool IsNonContiguous = Record.readBool();
12498 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12499 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12501 C->setComponents(Components, ListSizes);
12505 C->setLParenLoc(Record.readSourceLocation());
12506 auto NumVars =
C->varlist_size();
12507 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12508 auto TotalLists =
C->getTotalComponentListNum();
12509 auto TotalComponents =
C->getTotalComponentsNum();
12511 SmallVector<Expr *, 16> Vars;
12512 Vars.reserve(NumVars);
12513 for (
unsigned i = 0; i != NumVars; ++i)
12514 Vars.push_back(Record.readSubExpr());
12515 C->setVarRefs(Vars);
12517 for (
unsigned i = 0; i != NumVars; ++i)
12518 Vars.push_back(Record.readSubExpr());
12519 C->setPrivateCopies(Vars);
12521 for (
unsigned i = 0; i != NumVars; ++i)
12522 Vars.push_back(Record.readSubExpr());
12525 SmallVector<ValueDecl *, 16> Decls;
12526 Decls.reserve(UniqueDecls);
12527 for (
unsigned i = 0; i < UniqueDecls; ++i)
12528 Decls.push_back(Record.readDeclAs<ValueDecl>());
12529 C->setUniqueDecls(Decls);
12531 SmallVector<unsigned, 16> ListsPerDecl;
12532 ListsPerDecl.reserve(UniqueDecls);
12533 for (
unsigned i = 0; i < UniqueDecls; ++i)
12534 ListsPerDecl.push_back(Record.readInt());
12535 C->setDeclNumLists(ListsPerDecl);
12537 SmallVector<unsigned, 32> ListSizes;
12538 ListSizes.reserve(TotalLists);
12539 for (
unsigned i = 0; i < TotalLists; ++i)
12540 ListSizes.push_back(Record.readInt());
12541 C->setComponentListSizes(ListSizes);
12543 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12544 Components.reserve(TotalComponents);
12545 for (
unsigned i = 0; i < TotalComponents; ++i) {
12546 auto *AssociatedExprPr = Record.readSubExpr();
12547 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12548 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12551 C->setComponents(Components, ListSizes);
12555 C->setLParenLoc(Record.readSourceLocation());
12556 auto NumVars =
C->varlist_size();
12557 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12558 auto TotalLists =
C->getTotalComponentListNum();
12559 auto TotalComponents =
C->getTotalComponentsNum();
12561 SmallVector<Expr *, 16> Vars;
12562 Vars.reserve(NumVars);
12563 for (
unsigned i = 0; i != NumVars; ++i)
12564 Vars.push_back(Record.readSubExpr());
12565 C->setVarRefs(Vars);
12567 SmallVector<ValueDecl *, 16> Decls;
12568 Decls.reserve(UniqueDecls);
12569 for (
unsigned i = 0; i < UniqueDecls; ++i)
12570 Decls.push_back(Record.readDeclAs<ValueDecl>());
12571 C->setUniqueDecls(Decls);
12573 SmallVector<unsigned, 16> ListsPerDecl;
12574 ListsPerDecl.reserve(UniqueDecls);
12575 for (
unsigned i = 0; i < UniqueDecls; ++i)
12576 ListsPerDecl.push_back(Record.readInt());
12577 C->setDeclNumLists(ListsPerDecl);
12579 SmallVector<unsigned, 32> ListSizes;
12580 ListSizes.reserve(TotalLists);
12581 for (
unsigned i = 0; i < TotalLists; ++i)
12582 ListSizes.push_back(Record.readInt());
12583 C->setComponentListSizes(ListSizes);
12585 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12586 Components.reserve(TotalComponents);
12587 for (
unsigned i = 0; i < TotalComponents; ++i) {
12588 Expr *AssociatedExpr = Record.readSubExpr();
12589 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12590 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12593 C->setComponents(Components, ListSizes);
12597 C->setLParenLoc(Record.readSourceLocation());
12598 auto NumVars =
C->varlist_size();
12599 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12600 auto TotalLists =
C->getTotalComponentListNum();
12601 auto TotalComponents =
C->getTotalComponentsNum();
12603 SmallVector<Expr *, 16> Vars;
12604 Vars.reserve(NumVars);
12605 for (
unsigned i = 0; i != NumVars; ++i)
12606 Vars.push_back(Record.readSubExpr());
12607 C->setVarRefs(Vars);
12610 SmallVector<ValueDecl *, 16> Decls;
12611 Decls.reserve(UniqueDecls);
12612 for (
unsigned i = 0; i < UniqueDecls; ++i)
12613 Decls.push_back(Record.readDeclAs<ValueDecl>());
12614 C->setUniqueDecls(Decls);
12616 SmallVector<unsigned, 16> ListsPerDecl;
12617 ListsPerDecl.reserve(UniqueDecls);
12618 for (
unsigned i = 0; i < UniqueDecls; ++i)
12619 ListsPerDecl.push_back(Record.readInt());
12620 C->setDeclNumLists(ListsPerDecl);
12622 SmallVector<unsigned, 32> ListSizes;
12623 ListSizes.reserve(TotalLists);
12624 for (
unsigned i = 0; i < TotalLists; ++i)
12625 ListSizes.push_back(Record.readInt());
12626 C->setComponentListSizes(ListSizes);
12628 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12629 Components.reserve(TotalComponents);
12630 for (
unsigned i = 0; i < TotalComponents; ++i) {
12631 Expr *AssociatedExpr = Record.readSubExpr();
12632 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12633 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12636 C->setComponents(Components, ListSizes);
12640 C->setLParenLoc(Record.readSourceLocation());
12641 auto NumVars =
C->varlist_size();
12642 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12643 auto TotalLists =
C->getTotalComponentListNum();
12644 auto TotalComponents =
C->getTotalComponentsNum();
12646 SmallVector<Expr *, 16> Vars;
12647 Vars.reserve(NumVars);
12648 for (
unsigned I = 0; I != NumVars; ++I)
12649 Vars.push_back(Record.readSubExpr());
12650 C->setVarRefs(Vars);
12653 SmallVector<ValueDecl *, 16> Decls;
12654 Decls.reserve(UniqueDecls);
12655 for (
unsigned I = 0; I < UniqueDecls; ++I)
12656 Decls.push_back(Record.readDeclAs<ValueDecl>());
12657 C->setUniqueDecls(Decls);
12659 SmallVector<unsigned, 16> ListsPerDecl;
12660 ListsPerDecl.reserve(UniqueDecls);
12661 for (
unsigned I = 0; I < UniqueDecls; ++I)
12662 ListsPerDecl.push_back(Record.readInt());
12663 C->setDeclNumLists(ListsPerDecl);
12665 SmallVector<unsigned, 32> ListSizes;
12666 ListSizes.reserve(TotalLists);
12667 for (
unsigned i = 0; i < TotalLists; ++i)
12668 ListSizes.push_back(Record.readInt());
12669 C->setComponentListSizes(ListSizes);
12671 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12672 Components.reserve(TotalComponents);
12673 for (
unsigned I = 0; I < TotalComponents; ++I) {
12674 Expr *AssociatedExpr = Record.readSubExpr();
12675 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12676 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12679 C->setComponents(Components, ListSizes);
12683 C->setLParenLoc(Record.readSourceLocation());
12684 unsigned NumVars =
C->varlist_size();
12685 SmallVector<Expr *, 16> Vars;
12686 Vars.reserve(NumVars);
12687 for (
unsigned i = 0; i != NumVars; ++i)
12688 Vars.push_back(Record.readSubExpr());
12689 C->setVarRefs(Vars);
12691 Vars.reserve(NumVars);
12692 for (
unsigned i = 0; i != NumVars; ++i)
12693 Vars.push_back(Record.readSubExpr());
12694 C->setPrivateRefs(Vars);
12698 C->setLParenLoc(Record.readSourceLocation());
12699 unsigned NumVars =
C->varlist_size();
12700 SmallVector<Expr *, 16> Vars;
12701 Vars.reserve(NumVars);
12702 for (
unsigned i = 0; i != NumVars; ++i)
12703 Vars.push_back(Record.readSubExpr());
12704 C->setVarRefs(Vars);
12708 C->setLParenLoc(Record.readSourceLocation());
12709 unsigned NumVars =
C->varlist_size();
12710 SmallVector<Expr *, 16> Vars;
12711 Vars.reserve(NumVars);
12712 for (
unsigned i = 0; i != NumVars; ++i)
12713 Vars.push_back(Record.readSubExpr());
12714 C->setVarRefs(Vars);
12718 C->setLParenLoc(Record.readSourceLocation());
12719 unsigned NumOfAllocators =
C->getNumberOfAllocators();
12720 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
12721 Data.reserve(NumOfAllocators);
12722 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
12723 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
12726 D.
LParenLoc = Record.readSourceLocation();
12727 D.
RParenLoc = Record.readSourceLocation();
12729 C->setAllocatorsData(
Data);
12733 C->setLParenLoc(Record.readSourceLocation());
12734 C->setModifier(Record.readSubExpr());
12735 C->setColonLoc(Record.readSourceLocation());
12736 unsigned NumOfLocators =
C->varlist_size();
12737 SmallVector<Expr *, 4> Locators;
12738 Locators.reserve(NumOfLocators);
12739 for (
unsigned I = 0; I != NumOfLocators; ++I)
12740 Locators.push_back(Record.readSubExpr());
12741 C->setVarRefs(Locators);
12747 C->setLParenLoc(Record.readSourceLocation());
12748 C->setKindKwLoc(Record.readSourceLocation());
12749 C->setModifierKwLoc(Record.readSourceLocation());
12754 C->setThreadID(Record.readSubExpr());
12755 C->setLParenLoc(Record.readSourceLocation());
12760 C->setLParenLoc(Record.readSourceLocation());
12761 C->setBindKindLoc(Record.readSourceLocation());
12765 C->setAlignment(Record.readExpr());
12766 C->setLParenLoc(Record.readSourceLocation());
12771 C->setSize(Record.readSubExpr());
12772 C->setLParenLoc(Record.readSourceLocation());
12775void OMPClauseReader::VisitOMPDynGroupprivateClause(
12778 C->setDynGroupprivateModifier(
12780 C->setDynGroupprivateFallbackModifier(
12782 C->setSize(Record.readSubExpr());
12783 C->setLParenLoc(Record.readSourceLocation());
12784 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
12785 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
12789 C->setLParenLoc(Record.readSourceLocation());
12790 C->setDependenceType(
12792 C->setDependenceLoc(Record.readSourceLocation());
12793 C->setColonLoc(Record.readSourceLocation());
12794 unsigned NumVars =
C->varlist_size();
12795 SmallVector<Expr *, 16> Vars;
12796 Vars.reserve(NumVars);
12797 for (
unsigned I = 0; I != NumVars; ++I)
12798 Vars.push_back(Record.readSubExpr());
12799 C->setVarRefs(Vars);
12800 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12801 C->setLoopData(I, Record.readSubExpr());
12806 Record.readAttributes(Attrs);
12807 C->setAttrs(Attrs);
12808 C->setLocStart(Record.readSourceLocation());
12809 C->setLParenLoc(Record.readSourceLocation());
12810 C->setLocEnd(Record.readSourceLocation());
12823 Selector.ScoreOrCondition =
nullptr;
12825 Selector.ScoreOrCondition = readExprRef();
12837 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
12842 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
12844 Data->setClauses(Clauses);
12845 if (
Data->hasAssociatedStmt())
12847 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
12852 unsigned NumVars =
readInt();
12854 for (
unsigned I = 0; I < NumVars; ++I)
12860 unsigned NumExprs =
readInt();
12862 for (
unsigned I = 0; I < NumExprs; ++I)
12872 switch (ClauseKind) {
12887 bool isConditionExprClause =
readBool();
12888 if (isConditionExprClause) {
12893 unsigned NumVars =
readInt();
12895 for (
unsigned I = 0; I < NumVars; ++I)
12902 unsigned NumClauses =
readInt();
12904 for (
unsigned I = 0; I < NumClauses; ++I)
12938 for (
unsigned I = 0; I < VarList.size(); ++I) {
12941 RecipeList.push_back({Alloca});
12945 VarList, RecipeList, EndLoc);
12963 for (
unsigned I = 0; I < VarList.size(); ++I) {
12967 RecipeList.push_back({Recipe, RecipeTemp});
12971 VarList, RecipeList, EndLoc);
13022 LParenLoc, ModList, VarList, EndLoc);
13031 LParenLoc, ModList, VarList, EndLoc);
13040 LParenLoc, ModList, VarList, EndLoc);
13049 LParenLoc, ModList, VarList, EndLoc);
13055 AsyncExpr, EndLoc);
13063 DevNumExpr, QueuesLoc, QueueIdExprs,
13070 unsigned NumArchs =
readInt();
13072 for (
unsigned I = 0; I < NumArchs; ++I) {
13075 Archs.emplace_back(Loc, Ident);
13079 LParenLoc, Archs, EndLoc);
13087 for (
unsigned I = 0; I < VarList.size(); ++I) {
13091 3 *
sizeof(
int *));
13094 unsigned NumCombiners =
readInt();
13095 for (
unsigned I = 0; I < NumCombiners; ++I) {
13100 Combiners.push_back({LHS, RHS, Op});
13103 RecipeList.push_back({Recipe, Combiners});
13107 VarList, RecipeList, EndLoc);
13126 HasForce, LoopCount, EndLoc);
13130 unsigned NumClauses =
readInt();
13132 for (
unsigned I = 0; I < NumClauses; ++I)
13135 SizeExprs, EndLoc);
13139 unsigned NumExprs =
readInt();
13142 for (
unsigned I = 0; I < NumExprs; ++I) {
13148 GangKinds, Exprs, EndLoc);
13154 WorkerExpr, EndLoc);
13160 VectorExpr, EndLoc);
13172 LParenLoc, VarList, EndLoc);
13186 llvm_unreachable(
"Clause serialization not yet implemented");
13188 llvm_unreachable(
"Invalid Clause Kind");
13193 for (
unsigned I = 0; I < Clauses.size(); ++I)
13198 unsigned NumVars =
readInt();
13199 A->Clauses.resize(NumVars);
13206 llvm::FoldingSetNodeID ID;
13207 ID.AddString(PrimaryModuleName);
13208 return ID.computeStableHash();
13213 return std::nullopt;
13216 return std::nullopt;
13219 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.
serialization::MacroID ReadMacroID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a macro ID from the given position in a record in the given module.
GlobalDeclID ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a declaration ID from the given position in a record in the given module.
llvm::Expected< SourceLocation::UIntTy > readSLocOffset(ModuleFile *F, unsigned Index)
Try to read the offset of the SLocEntry at the given index in the given module file.
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
friend class PCHValidator
friend class serialization::ReadMethodPoolVisitor
void CompleteRedeclChain(const Decl *D) override
If any redeclarations of D have been imported since it was last checked, this digs out those redeclar...
SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile, SourceLocation Loc) const
Translate a source location from another module file's source location space into ours.
static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID, uint64_t *StartOfBlockOffset=nullptr)
ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the specified cursor.
void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II)
std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range) override
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
IdentifierInfo * get(StringRef Name) override
Retrieve the IdentifierInfo for the named identifier.
IdentifierInfo * getLocalIdentifier(ModuleFile &M, uint64_t LocalID)
void visitInputFiles(serialization::ModuleFile &MF, bool IncludeSystem, bool Complain, llvm::function_ref< void(const serialization::InputFile &IF, bool isSystem)> Visitor)
Visit all the input files of the given module file.
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
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 ...
serialization::MacroID getGlobalMacroID(ModuleFile &M, serialization::MacroID LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
FileManager & getFileManager() const
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::ModuleFile ModuleFile
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, serialization::PreprocessedEntityID LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
void setKWLoc(SourceLocation Loc)
Attr - This represents one attribute.
void setAttr(const Attr *A)
void setConceptReference(ConceptReference *CR)
void setRParenLoc(SourceLocation Loc)
void setCaretLoc(SourceLocation Loc)
void setWrittenTypeSpec(TypeSpecifierType written)
bool needsExtraLocalData() const
void setModeAttr(bool written)
void setBuiltinLoc(SourceLocation Loc)
void setWrittenWidthSpec(TypeSpecifierWidth written)
void setWrittenSignSpec(TypeSpecifierSign written)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
void setSourceOrder(int Pos)
Set the source order of this initializer.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
unsigned getLambdaIndexInContext() const
Retrieve the index of this lambda within the context declaration returned by getLambdaContextDecl().
base_class_iterator bases_begin()
base_class_iterator vbases_begin()
Represents a C++ temporary.
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule) override
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind) override
This is called for each AST file loaded.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A reference to a concept and its template args, as it appears in the code.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
A map from continuous integer ranges to some value, with a very specialized interface.
void insertOrReplace(const value_type &Val)
typename Representation::iterator iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool hasExternalVisibleStorage() const
Whether this DeclContext has external storage containing additional declarations that are visible in ...
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void setMustBuildLookupTable()
Mark that there are external lexical declarations that we need to include in our lookup table (and th...
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
bool isDeclInLexicalTraversal(const Decl *D) const
Determine whether the given declaration is stored in the list of declarations lexically within this c...
decl_iterator decls_begin() const
unsigned getModuleFileIndex() const
DeclID getRawValue() const
unsigned getLocalDeclIndex() const
uint64_t DeclID
An ID number that refers to a declaration in an AST file.
Decl - This represents one declaration (or definition), e.g.
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.
int SLocEntryBaseID
The base ID in the source manager's view of this module.
serialization::IdentifierID BaseIdentifierID
Base identifier ID for identifiers local to this module.
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
const unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
uint64_t SLocEntryOffsetsBase
Base file offset for the offsets in SLocEntryOffsets.
llvm::BitstreamCursor InputFilesCursor
The cursor to the start of the input-files block.
std::vector< InputFile > InputFilesLoaded
The input files that have been loaded from this AST file.
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
llvm::SetVector< ModuleFile * > ImportedBy
List of modules which depend on this module.
const char * HeaderFileInfoTableData
Actual data for the on-disk hash table of header file information.
SourceLocation ImportLoc
The source location where this module was first imported.
const serialization::unaligned_decl_id_t * FileSortedDecls
Array of file-level DeclIDs sorted by file.
const uint32_t * SLocEntryOffsets
Offsets for all of the source location entries in the AST file.
llvm::BitstreamCursor MacroCursor
The cursor to the start of the preprocessor block, which stores all of the macro definitions.
FileID OriginalSourceFileID
The file ID for the original source file that was used to build this AST file.
FileEntryRef File
The file entry for the module file.
std::string ActualOriginalSourceFileName
The actual original source file name that was used to build this AST file.
uint64_t PreprocessorDetailStartOffset
The offset of the start of the preprocessor detail cursor.
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
unsigned LocalNumSubmodules
The number of submodules in this module.
SourceLocation FirstLoc
The first source location in this module.
ASTFileSignature ASTBlockHash
The signature of the AST block of the module file, this can be used to unique module files based on A...
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
std::string OriginalSourceFileName
The original source file name that was used to build the primary AST file, which may have been modifi...
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
bool HasTimestamps
Whether timestamps are included in this module file.
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
unsigned NumPreprocessedEntities
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
unsigned NumFileSortedDecls
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
unsigned Index
The index of this module in the list of modules.
unsigned NumUserInputFiles
llvm::BitstreamCursor Stream
The main bitstream cursor for the main block.
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
uint64_t SizeInBits
The size of this file, in bits.
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
bool StandardCXXModule
Whether this module file is a standard C++ module.
unsigned LocalNumTypes
The number of types in this AST file.
StringRef ModuleOffsetMap
The module offset map data for this file.
const PPSkippedRange * PreprocessedSkippedRangeOffsets
std::string FileName
The file name of the module file.
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
std::string ModuleMapPath
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
unsigned LocalNumMacros
The number of macros in this AST file.
unsigned NumPreprocessedSkippedRanges
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
unsigned Generation
The generation of which this module file is a part.
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
ContinuousRangeMap< uint32_t, int, 2 > SubmoduleRemap
Remapping table for submodule IDs in this module.
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
unsigned LocalNumSelectors
The number of selectors new to this file.
ModuleKind Kind
The type of this module.
std::string ModuleName
The name of the module.
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
std::string BaseDirectory
The base directory of the module.
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Manages the set of modules loaded by an AST reader.
AddModuleResult
The result of attempting to add a new module.
@ Missing
The module file is missing.
@ OutOfDate
The module file is out-of-date.
@ NewlyLoaded
The module file was just loaded in response to this call.
@ AlreadyLoaded
The module file had already been loaded.
llvm::iterator_range< SmallVectorImpl< ModuleFile * >::const_iterator > pch_modules() const
A range covering the PCH and preamble module files loaded.
ModuleReverseIterator rbegin()
Reverse iterator to traverse all loaded modules.
unsigned size() const
Number of modules loaded.
Source range/offset of a preprocessed entity.
uint32_t getOffset() const
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
Source range of a skipped preprocessor region.
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
unsigned getFactoryBits() const
ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, unsigned PriorGeneration)
ArrayRef< ObjCMethodDecl * > getInstanceMethods() const
Retrieve the instance methods found by this visitor.
ArrayRef< ObjCMethodDecl * > getFactoryMethods() const
Retrieve the instance methods found by this visitor.
bool instanceHasMoreThanOneDecl() const
bool operator()(ModuleFile &M)
bool factoryHasMoreThanOneDecl() const
unsigned getInstanceBits() const
static TypeIdx fromTypeID(TypeID ID)
32 aligned uint64_t in the AST file.
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
void ReadDataIntoImpl(const unsigned char *d, unsigned DataLen, data_type_builder &Val)
file_type ReadFileRef(const unsigned char *&d)
DeclarationNameKey ReadKeyBase(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
DeclarationNameKey internal_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(const internal_key_type &a)
StringRef internal_key_type
static internal_key_type ReadKey(const unsigned char *d, unsigned n)
Class that performs lookup for an identifier stored in an AST file.
IdentifierID ReadIdentifierID(const unsigned char *d)
data_type ReadData(const internal_key_type &k, const unsigned char *d, unsigned DataLen)
Class that performs lookup for a selector's entries in the global method pool stored in an AST file.
internal_key_type ReadKey(const unsigned char *d, unsigned)
data_type ReadData(Selector, const unsigned char *d, unsigned DataLen)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(Selector Sel)
external_key_type internal_key_type
Class that performs lookup to specialized decls.
file_type ReadFileRef(const unsigned char *&d)
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
unsigned internal_key_type
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
std::pair< DeclarationName, const Module * > external_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
std::pair< DeclarationNameKey, unsigned > internal_key_type
internal_key_type ReadKey(const unsigned char *d, unsigned)
static hash_value_type ComputeHash(const internal_key_type &Key)
static internal_key_type GetInternalKey(const external_key_type &Key)
PredefinedTypeIDs
Predefined type IDs.
CtorInitializerType
The different kinds of data that can occur in a CtorInitializer.
const unsigned NUM_PREDEF_TYPE_IDS
The number of predefined type IDs that are reserved for the PREDEF_TYPE_* constants.
const unsigned NumSpecialTypeIDs
The number of special type IDs.
TypeCode
Record codes for each kind of type.
@ PREDEF_TYPE_LONG_ACCUM_ID
The 'long _Accum' type.
@ PREDEF_TYPE_SAMPLER_ID
OpenCL sampler type.
@ PREDEF_TYPE_INT128_ID
The '__int128_t' type.
@ PREDEF_TYPE_CHAR32_ID
The C++ 'char32_t' type.
@ PREDEF_TYPE_SAT_SHORT_ACCUM_ID
The '_Sat short _Accum' type.
@ PREDEF_TYPE_IBM128_ID
The '__ibm128' type.
@ PREDEF_TYPE_SHORT_FRACT_ID
The 'short _Fract' type.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_BOUND_MEMBER
The placeholder type for bound member functions.
@ PREDEF_TYPE_LONGLONG_ID
The (signed) 'long long' type.
@ PREDEF_TYPE_FRACT_ID
The '_Fract' type.
@ PREDEF_TYPE_ARC_UNBRIDGED_CAST
ARC's unbridged-cast placeholder type.
@ PREDEF_TYPE_USHORT_FRACT_ID
The 'unsigned short _Fract' type.
@ PREDEF_TYPE_SAT_ULONG_FRACT_ID
The '_Sat unsigned long _Fract' type.
@ PREDEF_TYPE_BOOL_ID
The 'bool' or '_Bool' type.
@ PREDEF_TYPE_SAT_LONG_ACCUM_ID
The '_Sat long _Accum' type.
@ PREDEF_TYPE_SAT_LONG_FRACT_ID
The '_Sat long _Fract' type.
@ PREDEF_TYPE_SAT_SHORT_FRACT_ID
The '_Sat short _Fract' type.
@ PREDEF_TYPE_CHAR_U_ID
The 'char' type, when it is unsigned.
@ PREDEF_TYPE_RESERVE_ID_ID
OpenCL reserve_id type.
@ PREDEF_TYPE_SAT_ACCUM_ID
The '_Sat _Accum' type.
@ PREDEF_TYPE_BUILTIN_FN
The placeholder type for builtin functions.
@ PREDEF_TYPE_SHORT_ACCUM_ID
The 'short _Accum' type.
@ PREDEF_TYPE_FLOAT_ID
The 'float' type.
@ PREDEF_TYPE_QUEUE_ID
OpenCL queue type.
@ PREDEF_TYPE_INT_ID
The (signed) 'int' type.
@ PREDEF_TYPE_OBJC_SEL
The ObjC 'SEL' type.
@ PREDEF_TYPE_BFLOAT16_ID
The '__bf16' type.
@ PREDEF_TYPE_WCHAR_ID
The C++ 'wchar_t' type.
@ PREDEF_TYPE_UCHAR_ID
The 'unsigned char' type.
@ PREDEF_TYPE_UACCUM_ID
The 'unsigned _Accum' type.
@ PREDEF_TYPE_SCHAR_ID
The 'signed char' type.
@ PREDEF_TYPE_CHAR_S_ID
The 'char' type, when it is signed.
@ PREDEF_TYPE_NULLPTR_ID
The type of 'nullptr'.
@ PREDEF_TYPE_ULONG_FRACT_ID
The 'unsigned long _Fract' type.
@ PREDEF_TYPE_FLOAT16_ID
The '_Float16' type.
@ PREDEF_TYPE_UINT_ID
The 'unsigned int' type.
@ PREDEF_TYPE_FLOAT128_ID
The '__float128' type.
@ PREDEF_TYPE_OBJC_ID
The ObjC 'id' type.
@ PREDEF_TYPE_CHAR16_ID
The C++ 'char16_t' type.
@ PREDEF_TYPE_ARRAY_SECTION
The placeholder type for an array section.
@ PREDEF_TYPE_ULONGLONG_ID
The 'unsigned long long' type.
@ PREDEF_TYPE_SAT_UFRACT_ID
The '_Sat unsigned _Fract' type.
@ PREDEF_TYPE_USHORT_ID
The 'unsigned short' type.
@ PREDEF_TYPE_SHORT_ID
The (signed) 'short' type.
@ PREDEF_TYPE_OMP_ARRAY_SHAPING
The placeholder type for OpenMP array shaping operation.
@ PREDEF_TYPE_DEPENDENT_ID
The placeholder type for dependent types.
@ PREDEF_TYPE_LONGDOUBLE_ID
The 'long double' type.
@ PREDEF_TYPE_DOUBLE_ID
The 'double' type.
@ PREDEF_TYPE_UINT128_ID
The '__uint128_t' type.
@ PREDEF_TYPE_HALF_ID
The OpenCL 'half' / ARM NEON __fp16 type.
@ PREDEF_TYPE_VOID_ID
The void type.
@ PREDEF_TYPE_SAT_USHORT_FRACT_ID
The '_Sat unsigned short _Fract' type.
@ PREDEF_TYPE_ACCUM_ID
The '_Accum' type.
@ PREDEF_TYPE_SAT_FRACT_ID
The '_Sat _Fract' type.
@ PREDEF_TYPE_NULL_ID
The NULL type.
@ PREDEF_TYPE_USHORT_ACCUM_ID
The 'unsigned short _Accum' type.
@ PREDEF_TYPE_CHAR8_ID
The C++ 'char8_t' type.
@ PREDEF_TYPE_UFRACT_ID
The 'unsigned _Fract' type.
@ PREDEF_TYPE_OVERLOAD_ID
The placeholder type for overloaded function sets.
@ PREDEF_TYPE_INCOMPLETE_MATRIX_IDX
A placeholder type for incomplete matrix index operations.
@ PREDEF_TYPE_UNRESOLVED_TEMPLATE
The placeholder type for unresolved templates.
@ PREDEF_TYPE_SAT_USHORT_ACCUM_ID
The '_Sat unsigned short _Accum' type.
@ PREDEF_TYPE_LONG_ID
The (signed) 'long' type.
@ PREDEF_TYPE_SAT_ULONG_ACCUM_ID
The '_Sat unsigned long _Accum' type.
@ PREDEF_TYPE_LONG_FRACT_ID
The 'long _Fract' type.
@ PREDEF_TYPE_UNKNOWN_ANY
The 'unknown any' placeholder type.
@ PREDEF_TYPE_OMP_ITERATOR
The placeholder type for OpenMP iterator expression.
@ PREDEF_TYPE_PSEUDO_OBJECT
The pseudo-object placeholder type.
@ PREDEF_TYPE_OBJC_CLASS
The ObjC 'Class' type.
@ PREDEF_TYPE_ULONG_ID
The 'unsigned long' type.
@ PREDEF_TYPE_SAT_UACCUM_ID
The '_Sat unsigned _Accum' type.
@ PREDEF_TYPE_CLK_EVENT_ID
OpenCL clk event type.
@ PREDEF_TYPE_EVENT_ID
OpenCL event type.
@ PREDEF_TYPE_ULONG_ACCUM_ID
The 'unsigned long _Accum' type.
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
@ CTOR_INITIALIZER_MEMBER
@ CTOR_INITIALIZER_DELEGATING
@ CTOR_INITIALIZER_INDIRECT_MEMBER
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ TYPE_EXT_QUAL
An ExtQualType record.
@ SPECIAL_TYPE_OBJC_SEL_REDEFINITION
Objective-C "SEL" redefinition type.
@ SPECIAL_TYPE_UCONTEXT_T
C ucontext_t typedef type.
@ SPECIAL_TYPE_JMP_BUF
C jmp_buf typedef type.
@ SPECIAL_TYPE_FILE
C FILE typedef type.
@ SPECIAL_TYPE_SIGJMP_BUF
C sigjmp_buf typedef type.
@ SPECIAL_TYPE_OBJC_CLASS_REDEFINITION
Objective-C "Class" redefinition type.
@ SPECIAL_TYPE_CF_CONSTANT_STRING
CFConstantString type.
@ SPECIAL_TYPE_OBJC_ID_REDEFINITION
Objective-C "id" redefinition type.
Defines the clang::TargetInfo interface.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
internal::Matcher< T > findAll(const internal::Matcher< T > &Matcher)
Matches if the node or any descendant matches.
@ ModuleFile
The module file (.pcm). Required.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
llvm::OnDiskChainedHashTable< ASTSelectorLookupTrait > ASTSelectorLookupTable
The on-disk hash table used for the global method pool.
llvm::OnDiskChainedHashTable< HeaderFileInfoTrait > HeaderFileInfoLookupTable
The on-disk hash table used for known header files.
llvm::OnDiskIterableChainedHashTable< ASTIdentifierLookupTrait > ASTIdentifierLookupTable
The on-disk hash table used to contain information about all of the identifiers in the program.
GlobalDeclID LazySpecializationInfo
@ EXTENSION_METADATA
Metadata describing this particular extension.
@ SUBMODULE_EXCLUDED_HEADER
Specifies a header that has been explicitly excluded from this submodule.
@ SUBMODULE_TOPHEADER
Specifies a top-level header that falls into this (sub)module.
@ SUBMODULE_PRIVATE_TEXTUAL_HEADER
Specifies a header that is private to this submodule but must be textually included.
@ SUBMODULE_HEADER
Specifies a header that falls into this (sub)module.
@ SUBMODULE_EXPORT_AS
Specifies the name of the module that will eventually re-export the entities in this module.
@ SUBMODULE_UMBRELLA_DIR
Specifies an umbrella directory.
@ SUBMODULE_UMBRELLA_HEADER
Specifies the umbrella header used to create this module, if any.
@ SUBMODULE_METADATA
Metadata for submodules as a whole.
@ SUBMODULE_REQUIRES
Specifies a required feature.
@ SUBMODULE_PRIVATE_HEADER
Specifies a header that is private to this submodule.
@ SUBMODULE_IMPORTS
Specifies the submodules that are imported by this submodule.
@ SUBMODULE_CONFLICT
Specifies a conflict with another module.
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_DEFINITION
Defines the major attributes of a submodule, including its name and parent.
@ SUBMODULE_LINK_LIBRARY
Specifies a library or framework to link against.
@ SUBMODULE_CONFIG_MACRO
Specifies a configuration macro for this module.
@ SUBMODULE_EXPORTS
Specifies the submodules that are re-exported from this submodule.
@ SUBMODULE_TEXTUAL_HEADER
Specifies a header that is part of the module but must be textually included.
@ SUBMODULE_AFFECTING_MODULES
Specifies affecting modules that were not imported.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
OptionsRecordTypes
Record types that occur within the options block inside the control block.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ CODEGEN_OPTIONS
Record code for the codegen options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
CommentRecordTypes
Record types used within a comments block.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
@ SM_SLOC_FILE_ENTRY
Describes a source location entry (SLocEntry) for a file.
@ SM_SLOC_BUFFER_BLOB_COMPRESSED
Describes a zlib-compressed blob that contains the data for a buffer entry.
@ SM_SLOC_BUFFER_ENTRY
Describes a source location entry (SLocEntry) for a buffer.
@ SM_SLOC_BUFFER_BLOB
Describes a blob that contains the data for a buffer entry.
@ SM_SLOC_EXPANSION_ENTRY
Describes a source location entry (SLocEntry) for a macro expansion.
const unsigned int NUM_PREDEF_SELECTOR_IDS
The number of predefined selector IDs.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
uint64_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
PreprocessorRecordTypes
Record types used within a preprocessor block.
@ PP_TOKEN
Describes one token.
@ PP_MACRO_FUNCTION_LIKE
A function-like macro definition.
@ PP_MACRO_OBJECT_LIKE
An object-like macro definition.
@ PP_MACRO_DIRECTIVE_HISTORY
The macro directives history for a particular identifier.
@ PP_MODULE_MACRO
A macro directive exported by a module.
ControlRecordTypes
Record types that occur within the control block.
@ MODULE_MAP_FILE
Record code for the module map file that was used to build this AST file.
@ MODULE_DIRECTORY
Record code for the module build directory.
@ ORIGINAL_FILE_ID
Record code for file ID of the file or buffer that was used to generate the AST file.
@ MODULE_NAME
Record code for the module name.
@ ORIGINAL_FILE
Record code for the original file that was used to generate the AST file, including both its file ID ...
@ IMPORT
Record code for another AST file imported by this AST file.
@ INPUT_FILE_OFFSETS
Offsets into the input-files block where input files reside.
@ METADATA
AST file metadata, including the AST file version number and information about the compiler used to b...
UnhashedControlBlockRecordTypes
Record codes for the unhashed control block.
@ DIAGNOSTIC_OPTIONS
Record code for the diagnostic options table.
@ HEADER_SEARCH_ENTRY_USAGE
Record code for the indices of used header search entries.
@ AST_BLOCK_HASH
Record code for the content hash of the AST block.
@ DIAG_PRAGMA_MAPPINGS
Record code for #pragma diagnostic mappings.
@ SIGNATURE
Record code for the signature that identifiers this AST file.
@ HEADER_SEARCH_PATHS
Record code for the headers search paths.
@ VFS_USAGE
Record code for the indices of used VFSs.
uint64_t MacroID
An ID number that refers to a macro in an AST file.
InputFileRecordTypes
Record types that occur within the input-files block inside the control block.
@ INPUT_FILE_HASH
The input file content hash.
@ INPUT_FILE
An input file.
uint64_t TypeID
An ID number that refers to a type in an AST file.
PreprocessorDetailRecordTypes
Record types used within a preprocessor detail block.
@ PPD_INCLUSION_DIRECTIVE
Describes an inclusion directive within the preprocessing record.
@ PPD_MACRO_EXPANSION
Describes a macro expansion within the preprocessing record.
@ PPD_MACRO_DEFINITION
Describes a macro definition within the preprocessing record.
ModuleKind
Specifies the kind of module that has been loaded.
@ MK_PCH
File is a PCH file treated as such.
@ MK_Preamble
File is a PCH file treated as the preamble.
@ MK_MainFile
File is a PCH file treated as the actual main file.
@ MK_ExplicitModule
File is an explicitly-loaded module.
@ MK_ImplicitModule
File is an implicitly-loaded module.
@ MK_PrebuiltModule
File is from a prebuilt module path.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
const unsigned int NUM_PREDEF_MACRO_IDS
The number of predefined macro IDs.
ASTRecordTypes
Record types that occur within the AST block itself.
@ DECL_UPDATE_OFFSETS
Record for offsets of DECL_UPDATES records for declarations that were modified after being deserializ...
@ STATISTICS
Record code for the extra statistics we gather while generating an AST file.
@ FLOAT_CONTROL_PRAGMA_OPTIONS
Record code for #pragma float_control options.
@ KNOWN_NAMESPACES
Record code for the set of known namespaces, which are used for typo correction.
@ SPECIAL_TYPES
Record code for the set of non-builtin, special types.
@ PENDING_IMPLICIT_INSTANTIATIONS
Record code for pending implicit instantiations.
@ CXX_ADDED_TEMPLATE_SPECIALIZATION
@ TYPE_OFFSET
Record code for the offsets of each type.
@ DELEGATING_CTORS
The list of delegating constructor declarations.
@ PP_ASSUME_NONNULL_LOC
ID 66 used to be the list of included files.
@ EXT_VECTOR_DECLS
Record code for the set of ext_vector type names.
@ OPENCL_EXTENSIONS
Record code for enabled OpenCL extensions.
@ FP_PRAGMA_OPTIONS
Record code for floating point #pragma options.
@ PP_UNSAFE_BUFFER_USAGE
Record code for #pragma clang unsafe_buffer_usage begin/end.
@ CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION
@ DECLS_WITH_EFFECTS_TO_VERIFY
Record code for Sema's vector of functions/blocks with effects to be verified.
@ VTABLE_USES
Record code for the array of VTable uses.
@ LATE_PARSED_TEMPLATE
Record code for late parsed template functions.
@ DECLS_TO_CHECK_FOR_DEFERRED_DIAGS
Record code for the Decls to be checked for deferred diags.
@ DECL_OFFSET
Record code for the offsets of each decl.
@ SOURCE_MANAGER_LINE_TABLE
Record code for the source manager line table information, which stores information about #line direc...
@ PP_COUNTER_VALUE
The value of the next COUNTER to dispense.
@ DELETE_EXPRS_TO_ANALYZE
Delete expressions that will be analyzed later.
@ RELATED_DECLS_MAP
Record code for related declarations that have to be deserialized together from the same module.
@ UPDATE_VISIBLE
Record code for an update to a decl context's lookup table.
@ CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH
Number of unmatched pragma clang cuda_force_host_device begin directives we've seen.
@ MACRO_OFFSET
Record code for the table of offsets of each macro ID.
@ PPD_ENTITIES_OFFSETS
Record code for the table of offsets to entries in the preprocessing record.
@ VTABLES_TO_EMIT
Record code for vtables to emit.
@ UPDATE_MODULE_LOCAL_VISIBLE
@ IDENTIFIER_OFFSET
Record code for the table of offsets of each identifier ID.
@ OBJC_CATEGORIES
Record code for the array of Objective-C categories (including extensions).
@ METHOD_POOL
Record code for the Objective-C method pool,.
@ DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD
Record code for lexical and visible block for delayed namespace in reduced BMI.
@ PP_CONDITIONAL_STACK
The stack of open ifs/ifdefs recorded in a preamble.
@ REFERENCED_SELECTOR_POOL
Record code for referenced selector pool.
@ SOURCE_LOCATION_OFFSETS
Record code for the table of offsets into the block of source-location information.
@ WEAK_UNDECLARED_IDENTIFIERS
Record code for weak undeclared identifiers.
@ UNDEFINED_BUT_USED
Record code for undefined but used functions and variables that need a definition in this TU.
@ FILE_SORTED_DECLS
Record code for a file sorted array of DeclIDs in a module.
@ MSSTRUCT_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
@ TENTATIVE_DEFINITIONS
Record code for the array of tentative definitions.
@ UPDATE_TU_LOCAL_VISIBLE
@ UNUSED_FILESCOPED_DECLS
Record code for the array of unused file scoped decls.
@ ALIGN_PACK_PRAGMA_OPTIONS
Record code for #pragma align/pack options.
@ IMPORTED_MODULES
Record code for an array of all of the (sub)modules that were imported by the AST file.
@ SELECTOR_OFFSETS
Record code for the table of offsets into the Objective-C method pool.
@ UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES
Record code for potentially unused local typedef names.
@ EAGERLY_DESERIALIZED_DECLS
Record code for the array of eagerly deserialized decls.
@ INTERESTING_IDENTIFIERS
A list of "interesting" identifiers.
@ HEADER_SEARCH_TABLE
Record code for header search information.
@ OBJC_CATEGORIES_MAP
Record code for map of Objective-C class definition IDs to the ObjC categories in a module that are a...
@ CUDA_SPECIAL_DECL_REFS
Record code for special CUDA declarations.
@ TU_UPDATE_LEXICAL
Record code for an update to the TU's lexically contained declarations.
@ PPD_SKIPPED_RANGES
A table of skipped ranges within the preprocessing record.
@ IDENTIFIER_TABLE
Record code for the identifier table.
@ SEMA_DECL_REFS
Record code for declarations that Sema keeps references of.
@ OPTIMIZE_PRAGMA_OPTIONS
Record code for #pragma optimize options.
@ MODULE_OFFSET_MAP
Record code for the remapping information used to relate loaded modules to the various offsets and ID...
@ POINTERS_TO_MEMBERS_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
unsigned ComputeHash(Selector Sel)
TypeID LocalTypeID
Same with TypeID except that the LocalTypeID is only meaningful with the corresponding ModuleFile.
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isa(CodeGen::Address addr)
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
OpenMPDefaultClauseVariableCategory
OpenMP variable-category for 'default' clause.
OpenMPDefaultmapClauseModifier
OpenMP modifiers for 'defaultmap' clause.
OpenMPOrderClauseModifier
OpenMP modifiers for 'order' clause.
std::vector< std::string > Macros
A list of macros of the form <definition>=<expansion> .
@ Success
Annotation was successful.
std::pair< FileID, unsigned > FileIDAndOffset
OpenMPAtClauseKind
OpenMP attributes for 'at' clause.
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
OpenACCClauseKind
Represents the kind of an OpenACC clause.
@ Auto
'auto' clause, allowed on 'loop' directives.
@ Bind
'bind' clause, allowed on routine constructs.
@ Gang
'gang' clause, allowed on 'loop' and Combined constructs.
@ Wait
'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ PCopyOut
'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ PresentOrCreate
'create' clause alias 'present_or_create'.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ NoHost
'nohost' clause, allowed on 'routine' directives.
@ PresentOrCopy
'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Invalid
Represents an invalid clause, for the purposes of parsing.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Copy
'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ DeviceType
'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ Shortloop
'shortloop' is represented in the ACC.td file, but isn't present in the standard.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
OpenMPScheduleClauseModifier
OpenMP modifiers for 'schedule' clause.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
OpenMPDynGroupprivateClauseFallbackModifier
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
PredefinedDeclIDs
Predefined declaration IDs.
@ PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID
The internal '__NSConstantString' tag type.
@ PREDEF_DECL_TRANSLATION_UNIT_ID
The translation unit.
@ PREDEF_DECL_OBJC_CLASS_ID
The Objective-C 'Class' type.
@ PREDEF_DECL_BUILTIN_MS_GUID_ID
The predeclared '_GUID' struct.
@ PREDEF_DECL_BUILTIN_MS_TYPE_INFO_TAG_ID
The predeclared 'type_info' struct.
@ PREDEF_DECL_OBJC_INSTANCETYPE_ID
The internal 'instancetype' typedef.
@ PREDEF_DECL_OBJC_PROTOCOL_ID
The Objective-C 'Protocol' type.
@ PREDEF_DECL_UNSIGNED_INT_128_ID
The unsigned 128-bit integer type.
@ PREDEF_DECL_OBJC_SEL_ID
The Objective-C 'SEL' type.
@ NUM_PREDEF_DECL_IDS
The number of declaration IDs that are predefined.
@ PREDEF_DECL_INT_128_ID
The signed 128-bit integer type.
@ PREDEF_DECL_VA_LIST_TAG
The internal '__va_list_tag' struct, if any.
@ PREDEF_DECL_BUILTIN_MS_VA_LIST_ID
The internal '__builtin_ms_va_list' typedef.
@ PREDEF_DECL_CF_CONSTANT_STRING_ID
The internal '__NSConstantString' typedef.
@ PREDEF_DECL_NULL_ID
The NULL declaration.
@ PREDEF_DECL_BUILTIN_VA_LIST_ID
The internal '__builtin_va_list' typedef.
@ PREDEF_DECL_EXTERN_C_CONTEXT_ID
The extern "C" context.
@ PREDEF_DECL_OBJC_ID_ID
The Objective-C 'id' type.
@ Property
The type of a property.
@ Result
The result type of a method or function.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
const FunctionProtoType * T
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ Template
We are parsing a template declaration.
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
@ Type
The name was classified as a type.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
TypeSpecifierWidth
Specifies the width of a type, e.g., short, long, or long long.
OpenMPMotionModifierKind
OpenMP modifier kind for 'to' or 'from' clause.
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
TypeSpecifierSign
Specifies the signedness of a type, e.g., signed or unsigned.
OpenMPDynGroupprivateClauseModifier
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ None
Perform validation, don't disable it.
@ PCH
Disable validation for a precompiled header and the modules it depends on.
@ Module
Disable validation for module files.
bool shouldSkipCheckingODR(const Decl *D)
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
OpenMPNumThreadsClauseModifier
OpenMPAtomicDefaultMemOrderClauseKind
OpenMP attributes for 'atomic_default_mem_order' clause.
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
OpenMPDeviceClauseModifier
OpenMP modifiers for 'device' clause.
OpenMPMapModifierKind
OpenMP modifier kind for 'map' clause.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
OpenMPOrderClauseKind
OpenMP attributes for 'order' clause.
OpenMPScheduleClauseKind
OpenMP attributes for 'schedule' clause.
OpenMPThreadsetKind
OpenMP modifiers for 'threadset' clause.
UnsignedOrNone getPrimaryModuleHash(const Module *M)
Calculate a hash value for the primary module name of the given module.
OpenMPMapClauseKind
OpenMP mapping kind for 'map' clause.
__LIBC_ATTRS FILE * stderr
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)