96#include "llvm/ADT/APFloat.h"
97#include "llvm/ADT/APInt.h"
98#include "llvm/ADT/ArrayRef.h"
99#include "llvm/ADT/DenseMap.h"
100#include "llvm/ADT/FoldingSet.h"
101#include "llvm/ADT/IntrusiveRefCntPtr.h"
102#include "llvm/ADT/STLExtras.h"
103#include "llvm/ADT/ScopeExit.h"
104#include "llvm/ADT/Sequence.h"
105#include "llvm/ADT/SmallPtrSet.h"
106#include "llvm/ADT/SmallVector.h"
107#include "llvm/ADT/StringExtras.h"
108#include "llvm/ADT/StringMap.h"
109#include "llvm/ADT/StringRef.h"
110#include "llvm/ADT/iterator_range.h"
111#include "llvm/Bitstream/BitstreamReader.h"
112#include "llvm/Support/Compiler.h"
113#include "llvm/Support/Compression.h"
114#include "llvm/Support/DJB.h"
115#include "llvm/Support/Endian.h"
116#include "llvm/Support/Error.h"
117#include "llvm/Support/ErrorHandling.h"
118#include "llvm/Support/LEB128.h"
119#include "llvm/Support/MemoryBuffer.h"
120#include "llvm/Support/Path.h"
121#include "llvm/Support/SaveAndRestore.h"
122#include "llvm/Support/TimeProfiler.h"
123#include "llvm/Support/Timer.h"
124#include "llvm/Support/VersionTuple.h"
125#include "llvm/Support/raw_ostream.h"
126#include "llvm/TargetParser/Triple.h"
139#include <system_error>
144using namespace clang;
147using llvm::BitstreamCursor;
155 return First->ReadFullVersionInformation(FullVersion) ||
156 Second->ReadFullVersionInformation(FullVersion);
160 First->ReadModuleName(ModuleName);
161 Second->ReadModuleName(ModuleName);
165 First->ReadModuleMapFile(ModuleMapPath);
166 Second->ReadModuleMapFile(ModuleMapPath);
170 const LangOptions &LangOpts, StringRef ModuleFilename,
bool Complain,
171 bool AllowCompatibleDifferences) {
172 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
173 AllowCompatibleDifferences) ||
174 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
175 AllowCompatibleDifferences);
179 const CodeGenOptions &CGOpts, StringRef ModuleFilename,
bool Complain,
180 bool AllowCompatibleDifferences) {
181 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
182 AllowCompatibleDifferences) ||
183 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
184 AllowCompatibleDifferences);
188 const TargetOptions &TargetOpts, StringRef ModuleFilename,
bool Complain,
189 bool AllowCompatibleDifferences) {
190 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
191 AllowCompatibleDifferences) ||
192 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
193 AllowCompatibleDifferences);
198 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
199 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
205 return First->ReadFileSystemOptions(FSOpts, Complain) ||
206 Second->ReadFileSystemOptions(FSOpts, Complain);
211 StringRef SpecificModuleCachePath,
bool Complain) {
212 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
213 SpecificModuleCachePath, Complain) ||
214 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
215 SpecificModuleCachePath, Complain);
220 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
221 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
222 Complain, SuggestedPredefines) ||
223 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
224 Complain, SuggestedPredefines);
229 First->ReadCounter(M,
Value);
230 Second->ReadCounter(M,
Value);
234 return First->needsInputFileVisitation() ||
235 Second->needsInputFileVisitation();
239 return First->needsSystemInputFileVisitation() ||
240 Second->needsSystemInputFileVisitation();
245 First->visitModuleFile(Filename, Kind);
246 Second->visitModuleFile(Filename, Kind);
252 bool isExplicitModule) {
253 bool Continue =
false;
254 if (First->needsInputFileVisitation() &&
255 (!isSystem || First->needsSystemInputFileVisitation()))
256 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
258 if (Second->needsInputFileVisitation() &&
259 (!isSystem || Second->needsSystemInputFileVisitation()))
260 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
267 First->readModuleFileExtension(Metadata);
268 Second->readModuleFileExtension(Metadata);
287 StringRef ModuleFilename,
289 bool AllowCompatibleDifferences =
true) {
293#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
294 if constexpr (CK::Compatibility != CK::Benign) { \
295 if ((CK::Compatibility == CK::NotCompatible) || \
296 (CK::Compatibility == CK::Compatible && \
297 !AllowCompatibleDifferences)) { \
298 if (ExistingLangOpts.Name != LangOpts.Name) { \
301 Diags->Report(diag::err_ast_file_langopt_mismatch) \
302 << Description << LangOpts.Name << ExistingLangOpts.Name \
305 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
306 << Description << ModuleFilename; \
313#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
314 if constexpr (CK::Compatibility != CK::Benign) { \
315 if ((CK::Compatibility == CK::NotCompatible) || \
316 (CK::Compatibility == CK::Compatible && \
317 !AllowCompatibleDifferences)) { \
318 if (ExistingLangOpts.Name != LangOpts.Name) { \
320 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
321 << Description << ModuleFilename; \
327#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
328 if constexpr (CK::Compatibility != CK::Benign) { \
329 if ((CK::Compatibility == CK::NotCompatible) || \
330 (CK::Compatibility == CK::Compatible && \
331 !AllowCompatibleDifferences)) { \
332 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
334 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
335 << Description << ModuleFilename; \
341#include "clang/Basic/LangOptions.def"
345 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
346 <<
"module features" << ModuleFilename;
352 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
353 <<
"target Objective-C runtime" << ModuleFilename;
360 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
361 <<
"block command names" << ModuleFilename;
369 if (!AllowCompatibleDifferences) {
373 ExistingSanitizers.
clear(ModularSanitizers);
374 ImportedSanitizers.
clear(ModularSanitizers);
375 if (ExistingSanitizers.
Mask != ImportedSanitizers.
Mask) {
376 const std::string Flag =
"-fsanitize=";
378#define SANITIZER(NAME, ID) \
380 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
381 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
382 if (InExistingModule != InImportedModule) \
383 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
384 << InExistingModule << ModuleFilename << (Flag + NAME); \
386#include "clang/Basic/Sanitizers.def"
397 StringRef ModuleFilename,
399 bool AllowCompatibleDifferences =
true) {
403#define CODEGENOPT(Name, Bits, Default, Compatibility) \
404 if constexpr (CK::Compatibility != CK::Benign) { \
405 if ((CK::Compatibility == CK::NotCompatible) || \
406 (CK::Compatibility == CK::Compatible && \
407 !AllowCompatibleDifferences)) { \
408 if (ExistingCGOpts.Name != CGOpts.Name) { \
411 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
412 << #Name << CGOpts.Name << ExistingCGOpts.Name \
415 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
416 << #Name << ModuleFilename; \
423#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
424 if constexpr (CK::Compatibility != CK::Benign) { \
425 if ((CK::Compatibility == CK::NotCompatible) || \
426 (CK::Compatibility == CK::Compatible && \
427 !AllowCompatibleDifferences)) { \
428 if (ExistingCGOpts.Name != CGOpts.Name) { \
430 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
431 << #Name << ModuleFilename; \
436#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
437 if constexpr (CK::Compatibility != CK::Benign) { \
438 if ((CK::Compatibility == CK::NotCompatible) || \
439 (CK::Compatibility == CK::Compatible && \
440 !AllowCompatibleDifferences)) { \
441 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
443 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
444 << #Name << ModuleFilename; \
449#define DEBUGOPT(Name, Bits, Default, Compatibility)
450#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
451#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
452#include "clang/Basic/CodeGenOptions.def"
465 StringRef ModuleFilename,
467 bool AllowCompatibleDifferences =
true) {
468#define CHECK_TARGET_OPT(Field, Name) \
469 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
471 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
472 << ModuleFilename << Name << TargetOpts.Field \
473 << ExistingTargetOpts.Field; \
484 if (!AllowCompatibleDifferences) {
489#undef CHECK_TARGET_OPT
497 llvm::sort(ExistingFeatures);
498 llvm::sort(ReadFeatures);
504 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
505 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
506 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
507 ExistingFeatures.begin(), ExistingFeatures.end(),
508 std::back_inserter(UnmatchedReadFeatures));
512 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
516 for (StringRef
Feature : UnmatchedReadFeatures)
517 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
518 <<
false << ModuleFilename <<
Feature;
519 for (StringRef
Feature : UnmatchedExistingFeatures)
520 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
521 <<
true << ModuleFilename <<
Feature;
524 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
528 StringRef ModuleFilename,
bool Complain,
529 bool AllowCompatibleDifferences) {
530 const LangOptions &ExistingLangOpts = PP.getLangOpts();
532 Complain ? &Reader.Diags :
nullptr,
533 AllowCompatibleDifferences);
537 StringRef ModuleFilename,
bool Complain,
538 bool AllowCompatibleDifferences) {
541 Complain ? &Reader.Diags :
nullptr,
542 AllowCompatibleDifferences);
546 StringRef ModuleFilename,
bool Complain,
547 bool AllowCompatibleDifferences) {
548 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
550 Complain ? &Reader.Diags :
nullptr,
551 AllowCompatibleDifferences);
556using MacroDefinitionsMap =
557 llvm::StringMap<std::pair<StringRef,
bool >>;
566 bool empty()
const {
return Decls.empty(); }
568 bool insert(NamedDecl *ND) {
569 auto [_, Inserted] =
Found.insert(ND);
576using DeclsMap = llvm::DenseMap<DeclarationName, DeclsSet>;
582 StringRef ModuleFilename,
592 for (
auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
601 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
603 ->getWarningOptionForDiag(DiagID)
623 StringRef ModuleFilename,
bool IsSystem,
624 bool SystemHeaderWarningsInModule,
633 !SystemHeaderWarningsInModule) {
635 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
636 <<
"-Wsystem-headers" << ModuleFilename;
643 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
644 <<
"-Werror" << ModuleFilename;
651 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
652 <<
"-Weverything -Werror" << ModuleFilename;
659 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
660 <<
"-pedantic-errors" << ModuleFilename;
685 assert(!ModuleName.empty() &&
"diagnostic options read before module name");
689 assert(M &&
"missing module");
694 StringRef ModuleFilename,
698 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
702 PP.getFileManager().getVirtualFileSystem(),
706 assert(ModuleMgr.
size() >= 1 &&
"what ASTFile is this then");
712 Module *Importer = PP.getCurrentModule();
715 bool SystemHeaderWarningsInModule =
722 TopM->
IsSystem, SystemHeaderWarningsInModule,
730 MacroDefinitionsMap &
Macros,
732 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
734 bool IsUndef = PPOpts.
Macros[I].second;
736 std::pair<StringRef, StringRef> MacroPair =
Macro.split(
'=');
737 StringRef MacroName = MacroPair.first;
738 StringRef MacroBody = MacroPair.second;
742 auto [It, Inserted] =
Macros.try_emplace(MacroName);
743 if (MacroNames && Inserted)
744 MacroNames->push_back(MacroName);
746 It->second = std::make_pair(
"",
true);
751 if (MacroName.size() ==
Macro.size())
755 StringRef::size_type End = MacroBody.find_first_of(
"\n\r");
756 MacroBody = MacroBody.substr(0, End);
759 auto [It, Inserted] =
Macros.try_emplace(MacroName);
760 if (MacroNames && Inserted)
761 MacroNames->push_back(MacroName);
762 It->second = std::make_pair(MacroBody,
false);
786 std::string &SuggestedPredefines,
const LangOptions &LangOpts,
790 MacroDefinitionsMap ASTFileMacros;
792 MacroDefinitionsMap ExistingMacros;
795 &ExistingMacroNames);
799 SuggestedPredefines +=
"# 1 \"<command line>\" 1\n";
801 for (
unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
803 StringRef MacroName = ExistingMacroNames[I];
804 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
807 llvm::StringMap<std::pair<StringRef,
bool >>
::iterator Known =
808 ASTFileMacros.find(MacroName);
814 Diags->
Report(diag::err_ast_file_macro_def_undef)
815 << MacroName <<
true << ModuleFilename;
823 if (Existing.second) {
824 SuggestedPredefines +=
"#undef ";
825 SuggestedPredefines += MacroName.str();
826 SuggestedPredefines +=
'\n';
828 SuggestedPredefines +=
"#define ";
829 SuggestedPredefines += MacroName.str();
830 SuggestedPredefines +=
' ';
831 SuggestedPredefines += Existing.first.str();
832 SuggestedPredefines +=
'\n';
839 if (Existing.second != Known->second.second) {
841 Diags->
Report(diag::err_ast_file_macro_def_undef)
842 << MacroName << Known->second.second << ModuleFilename;
849 if (Existing.second || Existing.first == Known->second.first) {
850 ASTFileMacros.erase(Known);
856 Diags->
Report(diag::err_ast_file_macro_def_conflict)
857 << MacroName << Known->second.first << Existing.first
864 SuggestedPredefines +=
"# 1 \"<built-in>\" 2\n";
869 for (
const auto &MacroName : ASTFileMacros.keys()) {
871 Diags->
Report(diag::err_ast_file_macro_def_undef)
872 << MacroName <<
false << ModuleFilename;
883 Diags->
Report(diag::err_ast_file_undef)
890 if (LangOpts.Modules &&
894 Diags->
Report(diag::err_ast_file_pp_detailed_record)
901 for (
unsigned I = 0, N = ExistingPPOpts.
Includes.size(); I != N; ++I) {
908 SuggestedPredefines +=
"#include \"";
909 SuggestedPredefines +=
File;
910 SuggestedPredefines +=
"\"\n";
920 SuggestedPredefines +=
"#include \"";
921 SuggestedPredefines +=
File;
922 SuggestedPredefines +=
"\"\n";
925 for (
unsigned I = 0, N = ExistingPPOpts.
MacroIncludes.size(); I != N; ++I) {
930 SuggestedPredefines +=
"#__include_macros \"";
931 SuggestedPredefines +=
File;
932 SuggestedPredefines +=
"\"\n##\n";
939 StringRef ModuleFilename,
940 bool ReadMacros,
bool Complain,
941 std::string &SuggestedPredefines) {
945 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
946 Complain ? &Reader.Diags :
nullptr, PP.getFileManager(),
947 SuggestedPredefines, PP.getLangOpts());
952 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
954 ModuleFilename, ReadMacros,
nullptr,
955 PP.getFileManager(), SuggestedPredefines,
964 StringRef SpecificModuleCachePath,
965 StringRef ExistingModuleCachePath,
966 StringRef ModuleFilename,
971 SpecificModuleCachePath == ExistingModuleCachePath)
974 VFS.equivalent(SpecificModuleCachePath, ExistingModuleCachePath);
975 if (EqualOrErr && *EqualOrErr)
978 Diags->
Report(diag::err_ast_file_modulecache_mismatch)
979 << SpecificModuleCachePath << ExistingModuleCachePath << ModuleFilename;
984 StringRef ModuleFilename,
985 StringRef SpecificModuleCachePath,
988 Reader.getFileManager().getVirtualFileSystem(), SpecificModuleCachePath,
989 PP.getHeaderSearchInfo().getModuleCachePath(), ModuleFilename,
990 Complain ? &Reader.Diags :
nullptr, PP.getLangOpts(),
991 PP.getPreprocessorOpts());
995 PP.setCounterValue(
Value);
1003 unsigned Length = 0;
1004 const char *
Error =
nullptr;
1006 uint64_t Val = llvm::decodeULEB128(P, &Length,
nullptr, &
Error);
1008 llvm::report_fatal_error(
Error);
1014static std::pair<unsigned, unsigned>
1017 if ((
unsigned)KeyLen != KeyLen)
1018 llvm::report_fatal_error(
"key too large");
1021 if ((
unsigned)DataLen != DataLen)
1022 llvm::report_fatal_error(
"data too large");
1024 return std::make_pair(KeyLen, DataLen);
1028 bool TakeOwnership) {
1029 DeserializationListener = Listener;
1030 OwnsDeserializationListener = TakeOwnership;
1041 Reader.ReadModuleOffsetMap(MF);
1043 unsigned ModuleFileIndex =
ID.getModuleFileIndex();
1044 unsigned LocalDeclID =
ID.getLocalDeclIndex();
1050 assert(OwningModuleFile);
1054 if (!ModuleFileIndex)
1057 assert(LocalDeclID < LocalNumDecls);
1065 unsigned ModuleFileIndex,
unsigned LocalDeclID) {
1070std::pair<unsigned, unsigned>
1077 using namespace llvm::support;
1080 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1082 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1089 Args.push_back(FirstII);
1090 for (
unsigned I = 1; I != N; ++I)
1091 Args.push_back(Reader.getLocalIdentifier(
1092 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1100 using namespace llvm::support;
1104 Result.ID = Reader.getGlobalSelectorID(
1105 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1106 unsigned FullInstanceBits =
1107 endian::readNext<uint16_t, llvm::endianness::little>(d);
1108 unsigned FullFactoryBits =
1109 endian::readNext<uint16_t, llvm::endianness::little>(d);
1110 Result.InstanceBits = FullInstanceBits & 0x3;
1111 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1112 Result.FactoryBits = FullFactoryBits & 0x3;
1113 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1114 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1115 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1118 for (
unsigned I = 0; I != NumInstanceMethods; ++I) {
1122 endian::readNext<DeclID, llvm::endianness::little>(d))))
1127 for (
unsigned I = 0; I != NumFactoryMethods; ++I) {
1131 endian::readNext<DeclID, llvm::endianness::little>(d))))
1139 return llvm::djbHash(a);
1142std::pair<unsigned, unsigned>
1149 assert(n >= 2 && d[n-1] ==
'\0');
1150 return StringRef((
const char*) d, n-1);
1156 bool IsInteresting =
1167 bool Value = Bits & 0x1;
1173 using namespace llvm::support;
1176 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1177 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1190 const unsigned char* d,
1192 using namespace llvm::support;
1195 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1196 bool IsInteresting = RawID & 0x01;
1206 II = &Reader.getIdentifierTable().getOwn(k);
1209 bool IsModule = Reader.getPreprocessor().getCurrentModule() !=
nullptr;
1211 Reader.markIdentifierUpToDate(II);
1213 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1214 if (!IsInteresting) {
1217 Reader.SetIdentifierInfo(ID, II);
1221 unsigned ObjCOrBuiltinID =
1222 endian::readNext<uint16_t, llvm::endianness::little>(d);
1223 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1224 bool CPlusPlusOperatorKeyword =
readBit(Bits);
1225 bool HasRevertedTokenIDToIdentifier =
readBit(Bits);
1226 bool Poisoned =
readBit(Bits);
1227 bool ExtensionToken =
readBit(Bits);
1228 bool HasMacroDefinition =
readBit(Bits);
1230 assert(Bits == 0 &&
"Extra bits in the identifier?");
1231 DataLen -=
sizeof(uint16_t) * 2;
1235 if (HasRevertedTokenIDToIdentifier && II->
getTokenID() != tok::identifier)
1240 "Incorrect extension token flag");
1241 (void)ExtensionToken;
1245 "Incorrect C++ operator keyword flag");
1246 (void)CPlusPlusOperatorKeyword;
1250 if (HasMacroDefinition) {
1251 uint32_t MacroDirectivesOffset =
1252 endian::readNext<uint32_t, llvm::endianness::little>(d);
1255 if (MacroDirectivesOffset)
1256 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1258 hasMacroDefinitionInDependencies =
true;
1261 Reader.SetIdentifierInfo(ID, II);
1267 for (; DataLen > 0; DataLen -=
sizeof(
DeclID))
1268 DeclIDs.push_back(Reader.getGlobalDeclID(
1271 endian::readNext<DeclID, llvm::endianness::little>(d))));
1272 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1279 : Kind(Name.getNameKind()) {
1309 llvm::FoldingSetNodeID ID;
1310 ID.AddInteger(Kind);
1333 return ID.computeStableHash();
1338 using namespace llvm::support;
1340 uint32_t ModuleFileID =
1341 endian::readNext<uint32_t, llvm::endianness::little>(d);
1342 return Reader.getLocalModuleFile(
F, ModuleFileID);
1345std::pair<unsigned, unsigned>
1352 using namespace llvm::support;
1361 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1368 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1392 using namespace llvm::support;
1394 for (
unsigned NumDecls = DataLen /
sizeof(
DeclID); NumDecls; --NumDecls) {
1396 Reader,
F, endian::readNext<DeclID, llvm::endianness::little>(d));
1402 const unsigned char *d,
1410 llvm::FoldingSetNodeID ID;
1411 ID.AddInteger(Key.first.getHash());
1412 ID.AddInteger(Key.second);
1413 return ID.computeStableHash();
1424 return {Name, *ModuleHash};
1430 unsigned PrimaryModuleHash =
1431 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1432 return {Name, PrimaryModuleHash};
1436 const unsigned char *d,
1444 using namespace llvm::support;
1446 uint32_t ModuleFileID =
1447 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1448 return Reader.getLocalModuleFile(F, ModuleFileID);
1453 using namespace llvm::support;
1454 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1457std::pair<unsigned, unsigned>
1463 const unsigned char *d,
1466 using namespace llvm::support;
1468 for (
unsigned NumDecls =
1470 NumDecls; --NumDecls) {
1473 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1474 Val.
insert(Reader.getGlobalDeclID(F, LocalID));
1478bool ASTReader::ReadLexicalDeclContextStorage(
ModuleFile &M,
1479 BitstreamCursor &Cursor,
1482 assert(Offset != 0);
1485 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1486 Error(std::move(Err));
1494 Error(MaybeCode.takeError());
1497 unsigned Code = MaybeCode.get();
1500 if (!MaybeRecCode) {
1501 Error(MaybeRecCode.takeError());
1504 unsigned RecCode = MaybeRecCode.get();
1506 Error(
"Expected lexical block");
1511 "expected a TU_UPDATE_LEXICAL record for TU");
1516 auto &Lex = LexicalDecls[DC];
1518 Lex = std::make_pair(
1521 Blob.size() /
sizeof(
DeclID)));
1527bool ASTReader::ReadVisibleDeclContextStorage(
1528 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1529 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1530 assert(Offset != 0);
1532 SavedStreamPosition SavedPosition(Cursor);
1533 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1534 Error(std::move(Err));
1540 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1542 Error(MaybeCode.takeError());
1545 unsigned Code = MaybeCode.get();
1547 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1548 if (!MaybeRecCode) {
1549 Error(MaybeRecCode.takeError());
1552 unsigned RecCode = MaybeRecCode.get();
1553 switch (VisibleKind) {
1554 case VisibleDeclContextStorageKind::GenerallyVisible:
1556 Error(
"Expected visible lookup table block");
1560 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1562 Error(
"Expected module local visible lookup table block");
1566 case VisibleDeclContextStorageKind::TULocalVisible:
1568 Error(
"Expected TU local lookup table block");
1576 auto *
Data = (
const unsigned char*)Blob.data();
1577 switch (VisibleKind) {
1578 case VisibleDeclContextStorageKind::GenerallyVisible:
1579 PendingVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1581 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1582 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1584 case VisibleDeclContextStorageKind::TULocalVisible:
1586 TULocalUpdates[
ID].push_back(UpdateData{&M,
Data});
1592void ASTReader::AddSpecializations(
const Decl *D,
const unsigned char *
Data,
1596 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1597 SpecLookups[D].Table.add(&M,
Data,
1601bool ASTReader::ReadSpecializations(
ModuleFile &M, BitstreamCursor &Cursor,
1602 uint64_t Offset, Decl *D,
bool IsPartial) {
1603 assert(Offset != 0);
1605 SavedStreamPosition SavedPosition(Cursor);
1606 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1607 Error(std::move(Err));
1613 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1615 Error(MaybeCode.takeError());
1618 unsigned Code = MaybeCode.get();
1620 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1621 if (!MaybeRecCode) {
1622 Error(MaybeRecCode.takeError());
1625 unsigned RecCode = MaybeRecCode.get();
1628 Error(
"Expected decl specs block");
1632 auto *
Data = (
const unsigned char *)Blob.data();
1633 AddSpecializations(D,
Data, M, IsPartial);
1637void ASTReader::Error(StringRef Msg)
const {
1638 Error(diag::err_fe_ast_file_malformed, Msg);
1639 if (PP.getLangOpts().Modules &&
1640 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
1641 Diag(diag::note_module_cache_path)
1642 << PP.getHeaderSearchInfo().getModuleCachePath();
1646void ASTReader::Error(
unsigned DiagID, StringRef Arg1, StringRef Arg2,
1647 StringRef Arg3)
const {
1648 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1652struct AlreadyReportedDiagnosticError
1653 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1656 void log(raw_ostream &OS)
const override {
1657 llvm_unreachable(
"reporting an already-reported diagnostic error");
1660 std::error_code convertToErrorCode()
const override {
1661 return llvm::inconvertibleErrorCode();
1665char AlreadyReportedDiagnosticError::ID = 0;
1668void ASTReader::Error(llvm::Error &&Err)
const {
1670 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1671 [&](llvm::ErrorInfoBase &E) {
return Error(E.message()); });
1681 LineTableInfo &LineTable = SourceMgr.getLineTable();
1684 std::map<int, int> FileIDs;
1686 for (
unsigned I = 0;
Record[Idx]; ++I) {
1688 auto Filename = ReadPath(F,
Record, Idx);
1694 std::vector<LineEntry> Entries;
1695 while (Idx <
Record.size()) {
1696 FileID FID = ReadFileID(F,
Record, Idx);
1699 unsigned NumEntries =
Record[Idx++];
1700 assert(NumEntries &&
"no line entries for file ID");
1702 Entries.reserve(NumEntries);
1703 for (
unsigned I = 0; I != NumEntries; ++I) {
1704 unsigned FileOffset =
Record[Idx++];
1705 unsigned LineNo =
Record[Idx++];
1706 int FilenameID = FileIDs[
Record[Idx++]];
1709 unsigned IncludeOffset =
Record[Idx++];
1711 FileKind, IncludeOffset));
1718llvm::Error ASTReader::ReadSourceManagerBlock(
ModuleFile &F) {
1719 using namespace SrcMgr;
1727 SLocEntryCursor = F.
Stream;
1730 if (llvm::Error Err = F.
Stream.SkipBlock())
1740 Expected<llvm::BitstreamEntry> MaybeE =
1741 SLocEntryCursor.advanceSkippingSubblocks();
1743 return MaybeE.takeError();
1744 llvm::BitstreamEntry E = MaybeE.get();
1747 case llvm::BitstreamEntry::SubBlock:
1748 case llvm::BitstreamEntry::Error:
1749 return llvm::createStringError(std::errc::illegal_byte_sequence,
1750 "malformed block record in AST file");
1751 case llvm::BitstreamEntry::EndBlock:
1752 return llvm::Error::success();
1753 case llvm::BitstreamEntry::Record:
1761 Expected<unsigned> MaybeRecord =
1762 SLocEntryCursor.readRecord(E.ID,
Record, &Blob);
1764 return MaybeRecord.takeError();
1765 switch (MaybeRecord.get()) {
1773 return llvm::Error::success();
1778llvm::Expected<SourceLocation::UIntTy>
1784 return std::move(Err);
1788 return MaybeEntry.takeError();
1790 llvm::BitstreamEntry Entry = MaybeEntry.get();
1791 if (Entry.Kind != llvm::BitstreamEntry::Record)
1792 return llvm::createStringError(
1793 std::errc::illegal_byte_sequence,
1794 "incorrectly-formatted source location entry in AST file");
1800 return MaybeSLOC.takeError();
1802 switch (MaybeSLOC.get()) {
1804 return llvm::createStringError(
1805 std::errc::illegal_byte_sequence,
1806 "incorrectly-formatted source location entry in AST file");
1816 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1817 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1818 "Corrupted global sloc offset map");
1823 auto It = llvm::upper_bound(
1826 int ID = F->SLocEntryBaseID + LocalIndex;
1827 std::size_t Index = -ID - 2;
1828 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1829 assert(!SourceMgr.SLocEntryLoaded[Index]);
1830 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1831 if (!MaybeEntryOffset) {
1832 Error(MaybeEntryOffset.takeError());
1836 SourceMgr.LoadedSLocEntryTable[Index] =
1837 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1838 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1840 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1856 Error(
"source location entry ID out-of-range for AST file");
1862 auto ReadBuffer = [
this](
1863 BitstreamCursor &SLocEntryCursor,
1864 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1869 Error(MaybeCode.takeError());
1872 unsigned Code = MaybeCode.get();
1875 SLocEntryCursor.readRecord(Code,
Record, &Blob);
1876 if (!MaybeRecCode) {
1877 Error(MaybeRecCode.takeError());
1880 unsigned RecCode = MaybeRecCode.get();
1885 const llvm::compression::Format F =
1886 Blob.size() > 0 && Blob.data()[0] == 0x78
1887 ? llvm::compression::Format::Zlib
1888 : llvm::compression::Format::Zstd;
1889 if (
const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1894 if (llvm::Error E = llvm::compression::decompress(
1895 F, llvm::arrayRefFromStringRef(Blob), Decompressed,
Record[0])) {
1896 Error(
"could not decompress embedded file contents: " +
1897 llvm::toString(std::move(E)));
1900 return llvm::MemoryBuffer::getMemBufferCopy(
1901 llvm::toStringRef(Decompressed), Name);
1903 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name,
true);
1905 Error(
"AST record has invalid code");
1910 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1914 Error(std::move(Err));
1921 ++NumSLocEntriesRead;
1924 Error(MaybeEntry.takeError());
1927 llvm::BitstreamEntry Entry = MaybeEntry.get();
1929 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1930 Error(
"incorrectly-formatted source location entry in AST file");
1937 SLocEntryCursor.readRecord(Entry.ID,
Record, &Blob);
1939 Error(MaybeSLOC.takeError());
1942 switch (MaybeSLOC.get()) {
1944 Error(
"incorrectly-formatted source location entry in AST file");
1950 unsigned InputID =
Record[4];
1951 InputFile IF = getInputFile(*F, InputID);
1964 IncludeLoc = getImportLocation(F);
1968 FileID FID = SourceMgr.createFileID(*
File, IncludeLoc, FileCharacter, ID,
1971 FileInfo.NumCreatedFIDs =
Record[5];
1975 unsigned NumFileDecls =
Record[7];
1976 if (NumFileDecls && ContextObj) {
1978 assert(F->
FileSortedDecls &&
"FILE_SORTED_DECLS not encountered yet ?");
1984 SourceMgr.getOrCreateContentCache(*
File, isSystem(FileCharacter));
1988 auto Buffer = ReadBuffer(SLocEntryCursor,
File->getName());
1991 SourceMgr.overrideFileContents(*
File, std::move(Buffer));
1998 const char *Name = Blob.data();
1999 unsigned Offset =
Record[0];
2004 IncludeLoc = getImportLocation(F);
2007 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2010 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2011 BaseOffset + Offset, IncludeLoc);
2013 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2014 FileInfo.setHasLineDirectives();
2023 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2038 Error(
"source location entry ID out-of-range for AST file");
2043 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2061 assert(SourceMgr.getMainFileID().isValid() &&
"missing main file");
2062 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2072 uint64_t *StartOfBlockOffset) {
2073 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2076 if (StartOfBlockOffset)
2077 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2080 uint64_t Offset = Cursor.GetCurrentBitNo();
2083 return MaybeCode.takeError();
2084 unsigned Code = MaybeCode.get();
2087 if (Code != llvm::bitc::DEFINE_ABBREV) {
2088 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2090 return llvm::Error::success();
2092 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2105 if (
Tok.isAnnotation()) {
2107 switch (
Tok.getKind()) {
2108 case tok::annot_pragma_loop_hint: {
2112 unsigned NumTokens =
Record[Idx++];
2114 Toks.reserve(NumTokens);
2115 for (
unsigned I = 0; I < NumTokens; ++I)
2117 Info->Toks =
llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2118 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2121 case tok::annot_pragma_pack: {
2126 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2128 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2132 case tok::annot_pragma_openmp:
2133 case tok::annot_pragma_openmp_end:
2134 case tok::annot_pragma_unused:
2135 case tok::annot_pragma_openacc:
2136 case tok::annot_pragma_openacc_end:
2137 case tok::annot_repl_input_end:
2140 llvm_unreachable(
"missing deserialization code for annotation token");
2145 Tok.setIdentifierInfo(II);
2157 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2159 consumeError(std::move(Err));
2171 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2173 Stream.advanceSkippingSubblocks(Flags);
2175 Error(MaybeEntry.takeError());
2178 llvm::BitstreamEntry Entry = MaybeEntry.get();
2180 switch (Entry.Kind) {
2181 case llvm::BitstreamEntry::SubBlock:
2182 case llvm::BitstreamEntry::Error:
2183 Error(
"malformed block record in AST file");
2185 case llvm::BitstreamEntry::EndBlock:
2187 case llvm::BitstreamEntry::Record:
2198 Error(MaybeRecType.takeError());
2214 unsigned NextIndex = 1;
2216 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2221 PP.getPreprocessorAllocator());
2224 bool isC99VarArgs =
Record[NextIndex++];
2225 bool isGNUVarArgs =
Record[NextIndex++];
2226 bool hasCommaPasting =
Record[NextIndex++];
2227 MacroParams.clear();
2228 unsigned NumArgs =
Record[NextIndex++];
2229 for (
unsigned i = 0; i != NumArgs; ++i)
2244 if (NextIndex + 1 ==
Record.size() && PP.getPreprocessingRecord() &&
2249 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2251 PreprocessingRecord::PPEntityID PPID =
2252 PPRec.getPPEntityID(Index,
true);
2254 PPRec.getPreprocessedEntity(PPID));
2256 PPRec.RegisterMacroDefinition(
Macro, PPDef);
2267 if (MacroTokens.empty()) {
2268 Error(
"unexpected number of macro tokens for a macro in AST file");
2274 MacroTokens = MacroTokens.drop_front();
2285 ReadModuleOffsetMap(M);
2287 unsigned ModuleFileIndex = LocalID >> 32;
2288 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2291 assert(MF &&
"malformed identifier ID encoding?");
2293 if (!ModuleFileIndex) {
2302HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
2305 return FileMgr.getOptionalFileRef(Key.Filename);
2309 return FileMgr.getOptionalFileRef(*Resolved);
2313 uint8_t buf[
sizeof(ikey.
Size) +
sizeof(ikey.
ModTime)];
2316 return llvm::xxh3_64bits(buf);
2337 return FEA && FEA == FEB;
2340std::pair<unsigned, unsigned>
2347 using namespace llvm::support;
2350 ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2352 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2361 using namespace llvm::support;
2363 const unsigned char *End = d + DataLen;
2365 unsigned Flags = *d++;
2368 bool Included = (Flags >> 6) & 0x01;
2370 if ((FE = getFile(key)))
2373 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2376 HFI.
isImport |= (Flags >> 5) & 0x01;
2378 HFI.
DirInfo = (Flags >> 1) & 0x07;
2380 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2382 assert((End - d) % 4 == 0 &&
2383 "Wrong data length in HeaderFileInfo deserialization");
2385 uint32_t LocalSMID =
2386 endian::readNext<uint32_t, llvm::endianness::little>(d);
2392 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2393 Module *Mod = Reader.getSubmodule(GlobalSMID);
2395 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2397 if (FE || (FE = getFile(key))) {
2400 ModMap.
addHeader(Mod, H, HeaderRole,
true);
2412 uint32_t MacroDirectivesOffset) {
2413 assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
2414 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2421 for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
2422 BitstreamCursor &MacroCursor = I.MacroCursor;
2425 if (MacroCursor.getBitcodeBytes().empty())
2428 BitstreamCursor Cursor = MacroCursor;
2429 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2430 Error(std::move(Err));
2438 Error(MaybeE.takeError());
2441 llvm::BitstreamEntry E = MaybeE.get();
2444 case llvm::BitstreamEntry::SubBlock:
2445 case llvm::BitstreamEntry::Error:
2446 Error(
"malformed block record in AST file");
2448 case llvm::BitstreamEntry::EndBlock:
2451 case llvm::BitstreamEntry::Record: {
2455 Error(MaybeRecord.takeError());
2458 switch (MaybeRecord.get()) {
2485 class IdentifierLookupVisitor {
2488 unsigned PriorGeneration;
2489 unsigned &NumIdentifierLookups;
2490 unsigned &NumIdentifierLookupHits;
2494 IdentifierLookupVisitor(StringRef Name,
unsigned PriorGeneration,
2495 unsigned &NumIdentifierLookups,
2496 unsigned &NumIdentifierLookupHits)
2498 PriorGeneration(PriorGeneration),
2499 NumIdentifierLookups(NumIdentifierLookups),
2500 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2514 ++NumIdentifierLookups;
2515 ASTIdentifierLookupTable::iterator Pos =
2516 IdTable->find_hashed(Name, NameHash, &Trait);
2517 if (Pos == IdTable->end())
2523 ++NumIdentifierLookupHits;
2525 if (Trait.hasMoreInformationInDependencies()) {
2534 IdentifierInfo *getIdentifierInfo()
const {
return Found; }
2543 unsigned PriorGeneration = 0;
2545 PriorGeneration = IdentifierGeneration[&II];
2552 if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
2557 IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
2558 NumIdentifierLookups,
2559 NumIdentifierLookupHits);
2560 ModuleMgr.visit(Visitor, HitsPtr);
2577 uint64_t ModuleFileIndex =
Record[Idx++] << 32;
2578 uint64_t LocalIndex =
Record[Idx++];
2583 const PendingMacroInfo &PMInfo) {
2588 if (llvm::Error Err =
2590 Error(std::move(Err));
2594 struct ModuleMacroRecord {
2607 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2609 Error(MaybeEntry.takeError());
2612 llvm::BitstreamEntry Entry = MaybeEntry.get();
2614 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2615 Error(
"malformed block record in AST file");
2622 Error(MaybePP.takeError());
2630 ModuleMacros.push_back(ModuleMacroRecord());
2631 auto &Info = ModuleMacros.back();
2635 for (
int I = Idx, N =
Record.size(); I != N; ++I)
2641 Error(
"malformed block record in AST file");
2652 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2654 for (
auto &MMR : ModuleMacros) {
2656 for (
unsigned ModID : MMR.Overrides) {
2658 auto *
Macro = PP.getModuleMacro(Mod, II);
2659 assert(
Macro &&
"missing definition for overridden macro");
2660 Overrides.push_back(
Macro);
2663 bool Inserted =
false;
2665 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2676 unsigned Idx = 0, N =
Record.size();
2684 MD = PP.AllocateDefMacroDirective(MI, Loc);
2688 MD = PP.AllocateUndefMacroDirective(Loc);
2691 bool isPublic =
Record[Idx++];
2692 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2704 PP.setLoadedMacroDirective(II, Earliest, Latest);
2707bool ASTReader::shouldDisableValidationForFile(
2730static std::pair<StringRef, StringRef>
2732 const StringRef InputBlob) {
2733 uint16_t AsRequestedLength =
Record[7];
2734 return {InputBlob.substr(0, AsRequestedLength),
2735 InputBlob.substr(AsRequestedLength)};
2749 SavedStreamPosition SavedPosition(Cursor);
2753 consumeError(std::move(Err));
2756 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
2759 consumeError(MaybeCode.takeError());
2761 unsigned Code = MaybeCode.get();
2765 if (Expected<unsigned> Maybe =
Cursor.readRecord(Code,
Record, &Blob))
2767 "invalid record type for input file");
2770 consumeError(
Maybe.takeError());
2773 assert(
Record[0] == ID &&
"Bogus stored ID or offset");
2781 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2785 ? UnresolvedFilenameAsRequested
2786 : UnresolvedFilename;
2788 Expected<llvm::BitstreamEntry> MaybeEntry =
Cursor.advance();
2790 consumeError(MaybeEntry.takeError());
2791 llvm::BitstreamEntry Entry = MaybeEntry.get();
2792 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2793 "expected record type for input file hash");
2796 if (Expected<unsigned> Maybe =
Cursor.readRecord(Entry.ID,
Record))
2798 "invalid record type for input file hash");
2801 consumeError(
Maybe.takeError());
2826 SavedStreamPosition SavedPosition(Cursor);
2830 consumeError(std::move(Err));
2845 const HeaderSearchOptions &HSOpts =
2846 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2859 if ((Overridden || Transient || SkipChecks) && !
File)
2864 std::string ErrorStr =
"could not find file '";
2865 ErrorStr += *Filename;
2866 ErrorStr +=
"' referenced by AST file '";
2880 SourceManager &
SM = getSourceManager();
2882 if ((!Overridden && !Transient) && !SkipChecks &&
2883 SM.isFileOverridden(*
File)) {
2885 Error(diag::err_fe_pch_file_overridden, *Filename);
2897 enum ModificationKind {
2903 std::optional<int64_t> Old = std::nullopt;
2904 std::optional<int64_t>
New = std::nullopt;
2906 auto HasInputContentChanged = [&](Change OriginalChange) {
2907 assert(ValidateASTInputFilesContent &&
2908 "We should only check the content of the inputs with "
2909 "ValidateASTInputFilesContent enabled.");
2911 if (StoredContentHash == 0)
2912 return OriginalChange;
2915 if (!MemBuffOrError) {
2917 return OriginalChange;
2918 std::string ErrorStr =
"could not get buffer for file '";
2919 ErrorStr +=
File->getName();
2922 return OriginalChange;
2925 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2926 if (StoredContentHash ==
static_cast<uint64_t>(ContentHash))
2927 return Change{Change::None};
2929 return Change{Change::Content};
2931 auto HasInputFileChanged = [&]() {
2932 if (StoredSize !=
File->getSize())
2933 return Change{Change::Size, StoredSize,
File->getSize()};
2934 if (!shouldDisableValidationForFile(F) && StoredTime &&
2935 StoredTime !=
File->getModificationTime()) {
2936 Change MTimeChange = {Change::ModTime, StoredTime,
2937 File->getModificationTime()};
2941 if (ValidateASTInputFilesContent)
2942 return HasInputContentChanged(MTimeChange);
2946 return Change{Change::None};
2949 bool IsOutOfDate =
false;
2950 auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
2956 FileChange = HasInputContentChanged(FileChange);
2962 if (!StoredTime && ValidateASTInputFilesContent &&
2963 FileChange.Kind == Change::None)
2964 FileChange = HasInputContentChanged(FileChange);
2967 if (!Overridden && FileChange.Kind != Change::None) {
2970 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2971 while (!ImportStack.back()->ImportedBy.empty())
2972 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2975 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
2976 Diag(diag::err_fe_ast_file_modified)
2978 << TopLevelASTFileName << FileChange.Kind
2979 << (FileChange.Old && FileChange.New)
2980 << llvm::itostr(FileChange.Old.value_or(0))
2981 << llvm::itostr(FileChange.New.value_or(0));
2984 if (ImportStack.size() > 1) {
2985 Diag(diag::note_ast_file_required_by)
2986 << *Filename << ImportStack[0]->FileName;
2987 for (
unsigned I = 1; I < ImportStack.size(); ++I)
2988 Diag(diag::note_ast_file_required_by)
2989 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
2992 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3007ASTReader::TemporarilyOwnedStringRef
3013ASTReader::TemporarilyOwnedStringRef
3016 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
3018 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3019 Path ==
"<built-in>" || Path ==
"<command line>")
3023 llvm::sys::path::append(Buf, Prefix, Path);
3024 StringRef ResolvedPath{Buf.data(), Buf.size()};
3025 return {ResolvedPath, Buf};
3038 return ResolvedPath->str();
3053 llvm_unreachable(
"unknown ASTReadResult");
3057 BitstreamCursor &Stream, StringRef Filename,
3058 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3059 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3062 consumeError(std::move(Err));
3070 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3073 consumeError(MaybeEntry.takeError());
3076 llvm::BitstreamEntry Entry = MaybeEntry.get();
3078 switch (Entry.Kind) {
3079 case llvm::BitstreamEntry::Error:
3080 case llvm::BitstreamEntry::SubBlock:
3083 case llvm::BitstreamEntry::EndBlock:
3086 case llvm::BitstreamEntry::Record:
3093 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3094 if (!MaybeRecordType) {
3096 consumeError(MaybeRecordType.takeError());
3101 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3102 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3103 AllowCompatibleConfigurationMismatch))
3104 Result = ConfigurationMismatch;
3109 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3110 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3111 AllowCompatibleConfigurationMismatch))
3112 Result = ConfigurationMismatch;
3117 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3118 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3119 AllowCompatibleConfigurationMismatch))
3120 Result = ConfigurationMismatch;
3125 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3126 if (!AllowCompatibleConfigurationMismatch &&
3127 ParseFileSystemOptions(
Record, Complain, Listener))
3128 Result = ConfigurationMismatch;
3133 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3134 if (!AllowCompatibleConfigurationMismatch &&
3135 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3136 Result = ConfigurationMismatch;
3141 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3142 if (!AllowCompatibleConfigurationMismatch &&
3143 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3144 SuggestedPredefines))
3145 Result = ConfigurationMismatch;
3153 SmallVectorImpl<ImportedModule> &Loaded,
3155 unsigned ClientLoadCapabilities) {
3156 BitstreamCursor &Stream = F.
Stream;
3159 Error(std::move(Err));
3169 bool HasReadUnhashedControlBlock =
false;
3170 auto readUnhashedControlBlockOnce = [&]() {
3171 if (!HasReadUnhashedControlBlock) {
3172 HasReadUnhashedControlBlock =
true;
3173 if (ASTReadResult
Result =
3174 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3180 bool DisableValidation = shouldDisableValidationForFile(F);
3184 unsigned NumInputs = 0;
3185 unsigned NumUserInputs = 0;
3186 StringRef BaseDirectoryAsWritten;
3188 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3190 Error(MaybeEntry.takeError());
3193 llvm::BitstreamEntry Entry = MaybeEntry.get();
3195 switch (Entry.Kind) {
3196 case llvm::BitstreamEntry::Error:
3197 Error(
"malformed block record in AST file");
3199 case llvm::BitstreamEntry::EndBlock: {
3202 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3206 const HeaderSearchOptions &HSOpts =
3207 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3214 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3220 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3224 N = ForceValidateUserInputs ? NumUserInputs : 0;
3227 Diag(diag::remark_module_validation)
3230 for (
unsigned I = 0; I < N; ++I) {
3231 InputFile IF = getInputFile(F, I+1, Complain);
3243 for (
unsigned I = 0; I < N; ++I) {
3244 bool IsSystem = I >= NumUserInputs;
3246 auto FilenameAsRequested = ResolveImportedPath(
3249 *FilenameAsRequested, IsSystem, FI.
Overridden,
3257 case llvm::BitstreamEntry::SubBlock:
3261 if (llvm::Error Err = Stream.SkipBlock()) {
3262 Error(std::move(Err));
3266 Error(
"malformed block record in AST file");
3276 if (Listener && !ImportedBy) {
3282 bool AllowCompatibleConfigurationMismatch =
3286 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3287 AllowCompatibleConfigurationMismatch, *Listener,
3288 SuggestedPredefines);
3290 Error(
"malformed block record in AST file");
3294 if (DisableValidation ||
3295 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3303 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3304 Error(std::move(Err));
3310 if (llvm::Error Err = Stream.SkipBlock()) {
3311 Error(std::move(Err));
3317 case llvm::BitstreamEntry::Record:
3325 Expected<unsigned> MaybeRecordType =
3326 Stream.readRecord(Entry.ID,
Record, &Blob);
3327 if (!MaybeRecordType) {
3328 Error(MaybeRecordType.takeError());
3334 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3336 : diag::err_ast_file_version_too_new)
3341 bool hasErrors =
Record[7];
3342 if (hasErrors && !DisableValidation) {
3345 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3346 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3349 if (!AllowASTWithCompilerErrors) {
3350 Diag(diag::err_ast_file_with_compiler_errors)
3356 Diags.ErrorOccurred =
true;
3357 Diags.UncompilableErrorOccurred =
true;
3358 Diags.UnrecoverableErrorOccurred =
true;
3371 StringRef ASTBranch = Blob;
3372 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3373 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3374 Diag(diag::err_ast_file_different_branch)
3386 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3396 auto [ImportLoc, ImportModuleFileIndex] =
3397 ReadUntranslatedSourceLocation(
Record[Idx++]);
3399 assert(ImportModuleFileIndex == 0);
3401 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3403 bool IsImportingStdCXXModule =
Record[Idx++];
3405 off_t StoredSize = 0;
3406 time_t StoredModTime = 0;
3407 ASTFileSignature StoredSignature;
3408 std::string ImportedFile;
3409 std::string StoredFile;
3410 bool IgnoreImportedByNote =
false;
3419 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3420 ImportedName, !IsImportingStdCXXModule);
3422 if (IsImportingStdCXXModule && ImportedFile.empty()) {
3423 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3427 if (!IsImportingStdCXXModule) {
3428 StoredSize = (off_t)
Record[Idx++];
3429 StoredModTime = (time_t)
Record[Idx++];
3433 SignatureBytes.end());
3438 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3439 if (ImportedFile.empty()) {
3440 ImportedFile = StoredFile;
3441 }
else if (!getDiags().isIgnored(
3442 diag::warn_module_file_mapping_mismatch,
3443 CurrentImportLoc)) {
3444 auto ImportedFileRef =
3445 PP.getFileManager().getOptionalFileRef(ImportedFile);
3446 auto StoredFileRef =
3447 PP.getFileManager().getOptionalFileRef(StoredFile);
3448 if ((ImportedFileRef && StoredFileRef) &&
3449 (*ImportedFileRef != *StoredFileRef)) {
3450 Diag(diag::warn_module_file_mapping_mismatch)
3451 << ImportedFile << StoredFile;
3452 Diag(diag::note_module_file_imported_by)
3454 IgnoreImportedByNote =
true;
3461 unsigned Capabilities = ClientLoadCapabilities;
3462 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3463 Capabilities &= ~ARR_Missing;
3466 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3467 Loaded, StoredSize, StoredModTime,
3468 StoredSignature, Capabilities);
3473 if (IsImportingStdCXXModule) {
3474 if (
const auto *Imported =
3475 getModuleManager().lookupByFileName(ImportedFile);
3476 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3477 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3483 bool recompilingFinalized =
Result == OutOfDate &&
3484 (Capabilities & ARR_OutOfDate) &&
3487 .getInMemoryModuleCache()
3489 if (!IgnoreImportedByNote &&
3491 Diag(diag::note_module_file_imported_by)
3495 case Failure:
return Failure;
3498 case OutOfDate:
return OutOfDate;
3500 case ConfigurationMismatch:
return ConfigurationMismatch;
3501 case HadErrors:
return HadErrors;
3520 Diag(diag::remark_module_import)
3522 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3528 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3536 BaseDirectoryAsWritten = Blob;
3538 "MODULE_DIRECTORY found before MODULE_NAME");
3540 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3544 Module *M = PP.getHeaderSearchInfo().lookupModule(
3551 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3554 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3555 if (!BuildDir || *BuildDir != M->
Directory) {
3556 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3557 Diag(diag::err_imported_module_relocated)
3568 if (ASTReadResult
Result =
3569 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3575 NumUserInputs =
Record[1];
3577 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3586llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3587 unsigned ClientLoadCapabilities) {
3588 BitstreamCursor &Stream = F.
Stream;
3590 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3597 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3599 return MaybeEntry.takeError();
3600 llvm::BitstreamEntry Entry = MaybeEntry.get();
3602 switch (Entry.Kind) {
3603 case llvm::BitstreamEntry::Error:
3604 return llvm::createStringError(
3605 std::errc::illegal_byte_sequence,
3606 "error at end of module block in AST file");
3607 case llvm::BitstreamEntry::EndBlock:
3613 if (ASTContext *Ctx = ContextObj) {
3614 DeclContext *DC = Ctx->getTranslationUnitDecl();
3619 return llvm::Error::success();
3620 case llvm::BitstreamEntry::SubBlock:
3628 if (llvm::Error Err = Stream.SkipBlock())
3630 if (llvm::Error Err = ReadBlockAbbrevs(
3637 if (!PP.getExternalSource())
3638 PP.setExternalSource(
this);
3640 if (llvm::Error Err = Stream.SkipBlock())
3642 if (llvm::Error Err =
3651 if (llvm::Error Err = Stream.SkipBlock()) {
3660 if (!PP.getPreprocessingRecord())
3661 PP.createPreprocessingRecord();
3662 if (!PP.getPreprocessingRecord()->getExternalSource())
3663 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3667 if (llvm::Error Err = ReadSourceManagerBlock(F))
3672 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3677 BitstreamCursor
C = Stream;
3679 if (llvm::Error Err = Stream.SkipBlock())
3683 CommentsCursors.push_back(std::make_pair(
C, &F));
3688 if (llvm::Error Err = Stream.SkipBlock())
3694 case llvm::BitstreamEntry::Record:
3702 Expected<unsigned> MaybeRecordType =
3703 Stream.readRecord(Entry.ID,
Record, &Blob);
3704 if (!MaybeRecordType)
3705 return MaybeRecordType.takeError();
3710 switch (RecordType) {
3731 switch (RecordType) {
3737 return llvm::createStringError(
3738 std::errc::illegal_byte_sequence,
3739 "duplicate TYPE_OFFSET record in AST file");
3752 return llvm::createStringError(
3753 std::errc::illegal_byte_sequence,
3754 "duplicate DECL_OFFSET record in AST file");
3766 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3767 LexicalContents Contents(
3769 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3770 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3777 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3778 auto *
Data = (
const unsigned char*)Blob.data();
3779 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3782 if (Decl *D = GetExistingDecl(ID))
3783 PendingUpdateRecords.push_back(
3784 PendingUpdateRecord(ID, D,
false));
3790 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3791 auto *
Data = (
const unsigned char *)Blob.data();
3792 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3795 if (Decl *D = GetExistingDecl(ID))
3796 PendingUpdateRecords.push_back(
3797 PendingUpdateRecord(ID, D,
false));
3805 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3806 auto *
Data = (
const unsigned char *)Blob.data();
3807 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3810 if (Decl *D = GetExistingDecl(ID))
3811 PendingUpdateRecords.push_back(
3812 PendingUpdateRecord(ID, D,
false));
3818 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3819 auto *
Data = (
const unsigned char *)Blob.data();
3820 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3823 if (Decl *D = GetExistingDecl(ID))
3824 PendingUpdateRecords.push_back(
3825 PendingUpdateRecord(ID, D,
false));
3831 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3832 auto *
Data = (
const unsigned char *)Blob.data();
3833 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3836 if (Decl *D = GetExistingDecl(ID))
3837 PendingUpdateRecords.push_back(
3838 PendingUpdateRecord(ID, D,
false));
3844 reinterpret_cast<const unsigned char *
>(Blob.data());
3850 ASTIdentifierLookupTrait(*
this, F));
3852 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
3858 return llvm::createStringError(
3859 std::errc::illegal_byte_sequence,
3860 "duplicate IDENTIFIER_OFFSET record in AST file");
3866 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3878 for (
unsigned I = 0, N =
Record.size(); I != N; )
3879 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3886 getContext().getLangOpts().BuildingPCHWithObjectFile)
3887 for (
unsigned I = 0, N =
Record.size(); I != N; )
3888 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3892 if (SpecialTypes.empty()) {
3893 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
3894 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
3901 if (SpecialTypes.size() !=
Record.size())
3902 return llvm::createStringError(std::errc::illegal_byte_sequence,
3903 "invalid special-types record");
3905 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
3907 if (!SpecialTypes[I])
3908 SpecialTypes[I] =
ID;
3915 TotalNumStatements +=
Record[0];
3916 TotalNumMacros +=
Record[1];
3917 TotalLexicalDeclContexts +=
Record[2];
3918 TotalVisibleDeclContexts +=
Record[3];
3919 TotalModuleLocalVisibleDeclContexts +=
Record[4];
3920 TotalTULocalVisibleDeclContexts +=
Record[5];
3924 for (
unsigned I = 0, N =
Record.size(); I != N; )
3925 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
3929 for (
unsigned I = 0, N =
Record.size(); I != N; )
3930 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
3934 if (
Record.size() % 3 != 0)
3935 return llvm::createStringError(std::errc::illegal_byte_sequence,
3936 "invalid weak identifiers record");
3940 WeakUndeclaredIdentifiers.clear();
3943 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
3944 WeakUndeclaredIdentifiers.push_back(
3945 getGlobalIdentifierID(F,
Record[I++]));
3946 WeakUndeclaredIdentifiers.push_back(
3947 getGlobalIdentifierID(F,
Record[I++]));
3948 WeakUndeclaredIdentifiers.push_back(
3949 ReadSourceLocation(F,
Record, I).getRawEncoding());
3956 unsigned LocalBaseSelectorID =
Record[1];
3962 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
3967 std::make_pair(LocalBaseSelectorID,
3979 = ASTSelectorLookupTable::Create(
3982 ASTSelectorLookupTrait(*
this, F));
3983 TotalNumMethodPoolEntries +=
Record[1];
3988 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
3989 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
3991 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
4000 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4001 ReadSourceLocation(F,
Record, Idx));
4007 SmallVector<SourceLocation, 64> SrcLocs;
4009 while (Idx <
Record.size())
4010 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
4011 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4018 unsigned Idx = 0, End =
Record.size() - 1;
4019 bool ReachedEOFWhileSkipping =
Record[Idx++];
4020 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4021 if (ReachedEOFWhileSkipping) {
4022 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4023 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4024 bool FoundNonSkipPortion =
Record[Idx++];
4025 bool FoundElse =
Record[Idx++];
4026 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4027 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4028 FoundElse, ElseLoc);
4030 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4032 auto Loc = ReadSourceLocation(F,
Record, Idx);
4033 bool WasSkipping =
Record[Idx++];
4034 bool FoundNonSkip =
Record[Idx++];
4035 bool FoundElse =
Record[Idx++];
4036 ConditionalStack.push_back(
4037 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4039 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4044 if (!
Record.empty() && Listener)
4062 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4063 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4064 return llvm::createStringError(std::errc::invalid_argument,
4065 "ran out of source locations");
4070 unsigned RangeStart =
4072 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4077 GlobalSLocOffsetMap.insert(
4079 - SLocSpaceSize,&F));
4090 ParseLineTable(F,
Record);
4094 for (
unsigned I = 0, N =
Record.size(); I != N; )
4095 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4099 if (
Record.size() % 3 != 0)
4100 return llvm::createStringError(std::errc::illegal_byte_sequence,
4101 "Invalid VTABLE_USES record");
4108 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4109 VTableUses.push_back(
4110 {ReadDeclID(F,
Record, Idx),
4111 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4118 if (
Record.size() % 2 != 0)
4119 return llvm::createStringError(
4120 std::errc::illegal_byte_sequence,
4121 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4126 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4127 PendingInstantiations.push_back(
4128 {ReadDeclID(F,
Record, I),
4129 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4136 return llvm::createStringError(std::errc::illegal_byte_sequence,
4137 "Invalid SEMA_DECL_REFS block");
4138 for (
unsigned I = 0, N =
Record.size(); I != N; )
4139 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4147 unsigned StartingID;
4148 if (!PP.getPreprocessingRecord())
4149 PP.createPreprocessingRecord();
4150 if (!PP.getPreprocessingRecord()->getExternalSource())
4151 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4153 = PP.getPreprocessingRecord()
4160 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4171 if (!PP.getPreprocessingRecord())
4172 PP.createPreprocessingRecord();
4173 if (!PP.getPreprocessingRecord()->getExternalSource())
4174 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4179 GlobalSkippedRangeMap.insert(
4185 if (
Record.size() % 2 != 0)
4186 return llvm::createStringError(
4187 std::errc::illegal_byte_sequence,
4188 "invalid DECL_UPDATE_OFFSETS block in AST file");
4189 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4190 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4191 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4195 if (Decl *D = GetExistingDecl(ID))
4196 PendingUpdateRecords.push_back(
4197 PendingUpdateRecord(ID, D,
false));
4202 if (
Record.size() % 5 != 0)
4203 return llvm::createStringError(
4204 std::errc::illegal_byte_sequence,
4205 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4207 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4208 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4211 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4214 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4217 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4220 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4223 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4225 DelayedNamespaceOffsetMap[
ID] = {
4226 {VisibleOffset, TULocalOffset, ModuleLocalOffset}, LexicalOffset};
4228 assert(!GetExistingDecl(ID) &&
4229 "We shouldn't load the namespace in the front of delayed "
4230 "namespace lexical and visible block");
4236 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4237 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4238 auto &RelatedDecls = RelatedDeclsMap[
ID];
4239 unsigned NN =
Record[I++];
4240 RelatedDecls.reserve(NN);
4241 for (
unsigned II = 0; II < NN; II++)
4242 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4248 return llvm::createStringError(
4249 std::errc::illegal_byte_sequence,
4250 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4263 CUDASpecialDeclRefs.clear();
4264 for (
unsigned I = 0, N =
Record.size(); I != N; )
4265 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4275 HeaderFileInfoTrait(*
this, F));
4277 PP.getHeaderSearchInfo().SetExternalSource(
this);
4278 if (!PP.getHeaderSearchInfo().getExternalLookup())
4279 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4285 FPPragmaOptions.swap(
Record);
4289 for (
unsigned I = 0, N =
Record.size(); I != N; )
4290 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4294 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4295 auto Name = ReadString(
Record, I);
4296 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4297 OptInfo.Supported =
Record[I++] != 0;
4298 OptInfo.Enabled =
Record[I++] != 0;
4299 OptInfo.WithPragma =
Record[I++] != 0;
4300 OptInfo.Avail =
Record[I++];
4301 OptInfo.Core =
Record[I++];
4302 OptInfo.Opt =
Record[I++];
4307 for (
unsigned I = 0, N =
Record.size(); I != N; )
4308 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4312 for (
unsigned I = 0, N =
Record.size(); I != N; )
4313 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4317 if (
Record.size() % 2 != 0)
4318 return llvm::createStringError(std::errc::illegal_byte_sequence,
4319 "invalid undefined-but-used record");
4320 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4321 UndefinedButUsed.push_back(
4322 {ReadDeclID(F,
Record, I),
4323 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4328 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4329 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4331 DelayedDeleteExprs.push_back(Count);
4332 for (uint64_t
C = 0;
C < Count; ++
C) {
4333 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4334 bool IsArrayForm =
Record[I++] == 1;
4335 DelayedDeleteExprs.push_back(IsArrayForm);
4342 getContext().getLangOpts().BuildingPCHWithObjectFile)
4343 for (
unsigned I = 0, N =
Record.size(); I != N;)
4344 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4352 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4353 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4354 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4356 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4357 if (DeserializationListener)
4358 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4366 return llvm::createStringError(
4367 std::errc::illegal_byte_sequence,
4368 "duplicate MACRO_OFFSET record in AST file");
4380 LateParsedTemplates.emplace_back(
4381 std::piecewise_construct, std::forward_as_tuple(&F),
4387 return llvm::createStringError(std::errc::illegal_byte_sequence,
4388 "invalid pragma optimize record");
4389 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4394 return llvm::createStringError(std::errc::illegal_byte_sequence,
4395 "invalid pragma ms_struct record");
4396 PragmaMSStructState =
Record[0];
4401 return llvm::createStringError(
4402 std::errc::illegal_byte_sequence,
4403 "invalid pragma pointers to members record");
4404 PragmaMSPointersToMembersState =
Record[0];
4405 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4409 for (
unsigned I = 0, N =
Record.size(); I != N; )
4410 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4415 return llvm::createStringError(std::errc::illegal_byte_sequence,
4416 "invalid cuda pragma options record");
4417 ForceHostDeviceDepth =
Record[0];
4422 return llvm::createStringError(std::errc::illegal_byte_sequence,
4423 "invalid pragma pack record");
4424 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4425 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4426 unsigned NumStackEntries =
Record[2];
4429 PragmaAlignPackStack.clear();
4430 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4431 PragmaAlignPackStackEntry Entry;
4432 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4433 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4434 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4435 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4436 Entry.SlotLabel = PragmaAlignPackStrings.back();
4437 PragmaAlignPackStack.push_back(Entry);
4444 return llvm::createStringError(std::errc::illegal_byte_sequence,
4445 "invalid pragma float control record");
4447 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4448 unsigned NumStackEntries =
Record[2];
4451 FpPragmaStack.clear();
4452 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4453 FpPragmaStackEntry Entry;
4455 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4456 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4457 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4458 Entry.SlotLabel = FpPragmaStrings.back();
4459 FpPragmaStack.push_back(Entry);
4465 for (
unsigned I = 0, N =
Record.size(); I != N; )
4466 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4470 unsigned NumRecords =
Record.front();
4472 if (
Record.size() - 1 != NumRecords)
4473 return llvm::createStringError(std::errc::illegal_byte_sequence,
4474 "invalid rvv intrinsic pragma record");
4476 if (RISCVVecIntrinsicPragma.empty())
4477 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4480 for (
unsigned i = 0; i < NumRecords; ++i)
4481 RISCVVecIntrinsicPragma[i] |=
Record[i + 1];
4488void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4501 assert(ImportedModuleVector.empty());
4503 while (
Data < DataEnd) {
4507 using namespace llvm::support;
4509 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4510 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4511 StringRef Name = StringRef((
const char*)
Data, Len);
4515 ? ModuleMgr.lookupByModuleName(Name)
4516 : ModuleMgr.lookupByFileName(Name));
4518 std::string Msg =
"refers to unknown module, cannot find ";
4519 Msg.append(std::string(Name));
4524 ImportedModuleVector.push_back(OM);
4527 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4529 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4532 RemapBuilder &Remap) {
4533 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4535 Remap.insert(std::make_pair(Offset,
4536 static_cast<int>(BaseOffset - Offset)));
4547 unsigned ClientLoadCapabilities) {
4556 "MODULE_NAME should come before MODULE_MAP_FILE");
4557 if (PP.getPreprocessorOpts().ModulesCheckRelocated &&
4563 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4565 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4567 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
4570 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4571 if (
auto ASTFE = M ? M->
getASTFile() : std::nullopt) {
4574 << ASTFE->getName();
4578 Diag(diag::err_imported_module_not_found)
4585 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4586 Diag(diag::note_imported_by_pch_module_not_found)
4593 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4597 if (!StoredModMap || *StoredModMap != ModMap) {
4598 assert(ModMap &&
"found module is missing module map file");
4600 "top-level import should be verified");
4602 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4603 Diag(diag::err_imported_module_modmap_changed)
4610 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4612 std::string Filename = ReadPath(F,
Record, Idx);
4615 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4616 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4619 AdditionalStoredMaps.insert(*SF);
4624 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4625 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4628 if (!AdditionalStoredMaps.erase(ModMap)) {
4629 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4630 Diag(diag::err_module_different_modmap)
4639 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4640 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4641 Diag(diag::err_module_different_modmap)
4655 SemaObjC::GlobalMethodPool::iterator Known =
4661 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4662 : Known->second.second;
4666 if (List->getMethod() == Method) {
4674 if (List->getNext())
4675 List->setMethod(List->getNext()->getMethod());
4677 List->setMethod(Method);
4683 for (
Decl *D : Names) {
4687 if (wasHidden && SemaObj) {
4700 Stack.push_back(Mod);
4701 while (!Stack.empty()) {
4702 Mod = Stack.pop_back_val();
4704 if (NameVisibility <= Mod->NameVisibility) {
4720 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4721 if (Hidden != HiddenNamesMap.end()) {
4722 auto HiddenNames = std::move(*Hidden);
4723 HiddenNamesMap.erase(Hidden);
4725 assert(!HiddenNamesMap.contains(Mod) &&
4726 "making names visible added hidden names");
4733 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4735 if (Visited.insert(Exported).second)
4736 Stack.push_back(Exported);
4754 PendingMergedDefinitionsToDeduplicate.insert(Def);
4763 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4764 !PP.getLangOpts().Modules)
4768 TriedLoadingGlobalIndex =
true;
4769 StringRef ModuleCachePath
4771 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4773 if (llvm::Error Err = std::move(
Result.second)) {
4775 consumeError(std::move(Err));
4779 GlobalIndex.reset(
Result.first);
4780 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4785 return PP.getLangOpts().Modules && UseGlobalIndex &&
4797 consumeError(MaybeEntry.takeError());
4800 llvm::BitstreamEntry Entry = MaybeEntry.get();
4802 switch (Entry.Kind) {
4803 case llvm::BitstreamEntry::Error:
4804 case llvm::BitstreamEntry::EndBlock:
4807 case llvm::BitstreamEntry::Record:
4813 consumeError(Skipped.takeError());
4817 case llvm::BitstreamEntry::SubBlock:
4818 if (Entry.ID == BlockID) {
4819 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4821 consumeError(std::move(Err));
4828 if (llvm::Error Err = Cursor.SkipBlock()) {
4830 consumeError(std::move(Err));
4839 unsigned ClientLoadCapabilities,
4841 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
4845 CurrentDeserializingModuleKind,
Type);
4851 unsigned PreviousGeneration = 0;
4855 unsigned NumModules = ModuleMgr.size();
4860 ClientLoadCapabilities)) {
4861 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4865 GlobalIndex.reset();
4866 ModuleMgr.setGlobalIndex(
nullptr);
4870 if (NewLoadedModuleFile && !Loaded.empty())
4871 *NewLoadedModuleFile = Loaded.back().Mod;
4882 for (ImportedModule &M : Loaded) {
4884 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
4887 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4888 Error(std::move(Err));
4894 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
4900 if (llvm::Error Err = ReadExtensionBlock(F)) {
4901 Error(std::move(Err));
4914 for (ImportedModule &M : Loaded) {
4930 if (!PP.getLangOpts().CPlusPlus) {
4937 auto It = PP.getIdentifierTable().find(Key);
4938 if (It == PP.getIdentifierTable().end())
4947 II = &PP.getIdentifierTable().getOwn(Key);
4965 for (
auto &Id : PP.getIdentifierTable())
4966 Id.second->setOutOfDate(
true);
4969 for (
const auto &Sel : SelectorGeneration)
4970 SelectorOutOfDate[Sel.first] =
true;
4974 for (ImportedModule &M : Loaded) {
4977 ModuleMgr.moduleFileAccepted(&F);
4990 for (
unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
4991 UnresolvedModuleRef &
Unresolved = UnresolvedModuleRefs[I];
4996 case UnresolvedModuleRef::Conflict:
4999 Conflict.
Other = ResolvedMod;
5001 Unresolved.Mod->Conflicts.push_back(Conflict);
5005 case UnresolvedModuleRef::Import:
5010 case UnresolvedModuleRef::Affecting:
5012 Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
5015 case UnresolvedModuleRef::Export:
5022 UnresolvedModuleRefs.clear();
5034 if (DeserializationListener)
5035 DeserializationListener->ReaderInitialized(
this);
5037 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5052 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5053 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5054 ObjCClassesLoaded[I], PreviousGeneration);
5059 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5064 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5065 ImportedModule &M = Loaded[I];
5083 if (!Stream.canSkipToPos(4))
5084 return llvm::createStringError(
5085 std::errc::illegal_byte_sequence,
5086 "file too small to contain precompiled file magic");
5087 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5090 return llvm::createStringError(
5091 std::errc::illegal_byte_sequence,
5092 "file doesn't start with precompiled file magic");
5094 return Res.takeError();
5095 return llvm::Error::success();
5110 llvm_unreachable(
"unknown module kind");
5114ASTReader::ReadASTCore(StringRef
FileName,
5116 SourceLocation ImportLoc,
5118 SmallVectorImpl<ImportedModule> &Loaded,
5119 off_t ExpectedSize, time_t ExpectedModTime,
5120 ASTFileSignature ExpectedSignature,
5121 unsigned ClientLoadCapabilities) {
5123 std::string ErrorStr;
5125 = ModuleMgr.addModule(
FileName,
Type, ImportLoc, ImportedBy,
5126 getGeneration(), ExpectedSize, ExpectedModTime,
5130 switch (AddResult) {
5132 Diag(diag::remark_module_import)
5134 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5144 if (ClientLoadCapabilities & ARR_Missing)
5148 Diag(diag::err_ast_file_not_found)
5156 if (ClientLoadCapabilities & ARR_OutOfDate)
5160 Diag(diag::err_ast_file_out_of_date)
5166 assert(M &&
"Missing module file");
5168 bool ShouldFinalizePCM =
false;
5169 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
5170 auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
5171 if (ShouldFinalizePCM)
5177 BitstreamCursor &Stream = F.Stream;
5178 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5179 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5183 Diag(diag::err_ast_file_invalid)
5189 bool HaveReadControlBlock =
false;
5191 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5193 Error(MaybeEntry.takeError());
5196 llvm::BitstreamEntry Entry = MaybeEntry.get();
5198 switch (Entry.Kind) {
5199 case llvm::BitstreamEntry::Error:
5200 case llvm::BitstreamEntry::Record:
5201 case llvm::BitstreamEntry::EndBlock:
5202 Error(
"invalid record at top-level of AST file");
5205 case llvm::BitstreamEntry::SubBlock:
5211 HaveReadControlBlock =
true;
5212 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5220 F.ModuleName.empty()) {
5222 if (
Result != OutOfDate ||
5223 (ClientLoadCapabilities & ARR_OutOfDate) == 0)
5229 case Failure:
return Failure;
5230 case Missing:
return Missing;
5231 case OutOfDate:
return OutOfDate;
5233 case ConfigurationMismatch:
return ConfigurationMismatch;
5234 case HadErrors:
return HadErrors;
5239 if (!HaveReadControlBlock) {
5240 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
5241 Diag(diag::err_ast_file_version_too_old)
5247 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
5248 ShouldFinalizePCM =
true;
5252 if (llvm::Error Err = Stream.SkipBlock()) {
5253 Error(std::move(Err));
5260 llvm_unreachable(
"unexpected break; expected return");
5264ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5265 unsigned ClientLoadCapabilities) {
5266 const HeaderSearchOptions &HSOpts =
5267 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5268 bool AllowCompatibleConfigurationMismatch =
5270 bool DisableValidation = shouldDisableValidationForFile(F);
5272 ASTReadResult
Result = readUnhashedControlBlockImpl(
5274 AllowCompatibleConfigurationMismatch, Listener.get(),
5279 if (DisableValidation || WasImportedBy ||
5280 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5284 Error(
"malformed block record in AST file");
5307 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5309 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5318 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5319 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5320 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5322 BitstreamCursor Stream(StreamData);
5327 consumeError(std::move(Err));
5339 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5342 consumeError(MaybeEntry.takeError());
5345 llvm::BitstreamEntry Entry = MaybeEntry.get();
5347 switch (Entry.Kind) {
5348 case llvm::BitstreamEntry::Error:
5349 case llvm::BitstreamEntry::SubBlock:
5352 case llvm::BitstreamEntry::EndBlock:
5355 case llvm::BitstreamEntry::Record:
5363 Expected<unsigned> MaybeRecordType =
5364 Stream.readRecord(Entry.ID,
Record, &Blob);
5365 if (!MaybeRecordType) {
5374 "Dummy AST file signature not backpatched in ASTWriter.");
5381 "Dummy AST block hash not backpatched in ASTWriter.");
5385 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5386 if (Listener && ValidateDiagnosticOptions &&
5387 !AllowCompatibleConfigurationMismatch &&
5388 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5393 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5394 if (Listener && !AllowCompatibleConfigurationMismatch &&
5395 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5396 Result = ConfigurationMismatch;
5425 if (
Record.size() < 4)
return true;
5430 unsigned BlockNameLen =
Record[2];
5431 unsigned UserInfoLen =
Record[3];
5433 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5435 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5436 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5437 Blob.data() + BlockNameLen + UserInfoLen);
5441llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5442 BitstreamCursor &Stream = F.
Stream;
5446 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5448 return MaybeEntry.takeError();
5449 llvm::BitstreamEntry Entry = MaybeEntry.get();
5451 switch (Entry.Kind) {
5452 case llvm::BitstreamEntry::SubBlock:
5453 if (llvm::Error Err = Stream.SkipBlock())
5456 case llvm::BitstreamEntry::EndBlock:
5457 return llvm::Error::success();
5458 case llvm::BitstreamEntry::Error:
5459 return llvm::createStringError(std::errc::illegal_byte_sequence,
5460 "malformed block record in AST file");
5461 case llvm::BitstreamEntry::Record:
5467 Expected<unsigned> MaybeRecCode =
5468 Stream.readRecord(Entry.ID,
Record, &Blob);
5470 return MaybeRecCode.takeError();
5471 switch (MaybeRecCode.get()) {
5473 ModuleFileExtensionMetadata Metadata;
5475 return llvm::createStringError(
5476 std::errc::illegal_byte_sequence,
5477 "malformed EXTENSION_METADATA in AST file");
5480 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5481 if (Known == ModuleFileExtensions.end())
break;
5484 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5494 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5498 assert(ContextObj &&
"no context to initialize");
5502 if (DeserializationListener)
5503 DeserializationListener->DeclRead(
5505 Context.getTranslationUnitDecl());
5513 if (!Context.CFConstantStringTypeDecl)
5514 Context.setCFConstantStringType(
GetType(String));
5519 if (FileType.isNull()) {
5520 Error(
"FILE type is NULL");
5524 if (!Context.FILEDecl) {
5526 Context.setFILEDecl(
Typedef->getDecl());
5528 const TagType *Tag = FileType->getAs<TagType>();
5530 Error(
"Invalid FILE type in AST file");
5533 Context.setFILEDecl(Tag->getDecl());
5540 if (Jmp_bufType.
isNull()) {
5541 Error(
"jmp_buf type is NULL");
5545 if (!Context.jmp_bufDecl) {
5547 Context.setjmp_bufDecl(
Typedef->getDecl());
5549 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5551 Error(
"Invalid jmp_buf type in AST file");
5554 Context.setjmp_bufDecl(Tag->getDecl());
5561 if (Sigjmp_bufType.
isNull()) {
5562 Error(
"sigjmp_buf type is NULL");
5566 if (!Context.sigjmp_bufDecl) {
5568 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5570 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5571 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5572 Context.setsigjmp_bufDecl(Tag->getDecl());
5578 if (Context.ObjCIdRedefinitionType.isNull())
5579 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5582 if (
TypeID ObjCClassRedef =
5584 if (Context.ObjCClassRedefinitionType.isNull())
5585 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5588 if (
TypeID ObjCSelRedef =
5590 if (Context.ObjCSelRedefinitionType.isNull())
5591 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5596 if (Ucontext_tType.
isNull()) {
5597 Error(
"ucontext_t type is NULL");
5601 if (!Context.ucontext_tDecl) {
5603 Context.setucontext_tDecl(
Typedef->getDecl());
5605 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5606 assert(Tag &&
"Invalid ucontext_t type in AST file");
5607 Context.setucontext_tDecl(Tag->getDecl());
5616 if (!CUDASpecialDeclRefs.empty()) {
5617 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5618 Context.setcudaConfigureCallDecl(
5619 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5620 Context.setcudaGetParameterBufferDecl(
5621 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5622 Context.setcudaLaunchDeviceDecl(
5623 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5628 for (
auto &Import : PendingImportedModules) {
5632 if (Import.ImportLoc.isValid())
5633 PP.makeModuleVisible(Imported, Import.ImportLoc);
5640 PendingImportedModulesSema.append(PendingImportedModules);
5641 PendingImportedModules.clear();
5651 BitstreamCursor Stream(
PCH);
5654 consumeError(std::move(Err));
5666 Stream.advanceSkippingSubblocks();
5669 consumeError(MaybeEntry.takeError());
5672 llvm::BitstreamEntry Entry = MaybeEntry.get();
5674 if (Entry.Kind != llvm::BitstreamEntry::Record)
5682 consumeError(MaybeRecord.takeError());
5688 "Dummy AST file signature not backpatched in ASTWriter.");
5698 const std::string &ASTFileName,
FileManager &FileMgr,
5701 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5706 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5707 << ASTFileName << Buffer.getError().message();
5708 return std::string();
5712 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5716 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5717 return std::string();
5722 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5723 return std::string();
5730 Stream.advanceSkippingSubblocks();
5733 consumeError(MaybeEntry.takeError());
5734 return std::string();
5736 llvm::BitstreamEntry Entry = MaybeEntry.get();
5738 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5739 return std::string();
5741 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5742 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5743 return std::string();
5751 consumeError(MaybeRecord.takeError());
5752 return std::string();
5766 std::string ExistingModuleCachePath;
5768 bool StrictOptionMatches;
5771 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5776 bool StrictOptionMatches)
5777 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5778 ExistingTargetOpts(ExistingTargetOpts),
5779 ExistingPPOpts(ExistingPPOpts),
5780 ExistingModuleCachePath(ExistingModuleCachePath),
FileMgr(
FileMgr),
5781 StrictOptionMatches(StrictOptionMatches) {}
5783 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5784 StringRef ModuleFilename,
bool Complain,
5785 bool AllowCompatibleDifferences)
override {
5787 nullptr, AllowCompatibleDifferences);
5790 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5791 StringRef ModuleFilename,
bool Complain,
5792 bool AllowCompatibleDifferences)
override {
5794 nullptr, AllowCompatibleDifferences);
5797 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5798 StringRef ModuleFilename,
bool Complain,
5799 bool AllowCompatibleDifferences)
override {
5801 nullptr, AllowCompatibleDifferences);
5804 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5805 StringRef ModuleFilename,
5806 StringRef SpecificModuleCachePath,
5807 bool Complain)
override {
5809 SpecificModuleCachePath,
5810 ExistingModuleCachePath, ModuleFilename,
5811 nullptr, ExistingLangOpts, ExistingPPOpts);
5814 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5815 StringRef ModuleFilename,
bool ReadMacros,
5817 std::string &SuggestedPredefines)
override {
5819 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5820 FileMgr, SuggestedPredefines, ExistingLangOpts,
5832 unsigned ClientLoadCapabilities) {
5834 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5835 llvm::MemoryBuffer *Buffer =
5845 Filename ==
"-" ? FileMgr.getSTDIN() : FileMgr.getFileRef(Filename);
5847 llvm::consumeError(Entry.takeError());
5850 auto BufferOrErr = FileMgr.getBufferForFile(*Entry);
5853 OwnedBuffer = std::move(*BufferOrErr);
5854 Buffer = OwnedBuffer.get();
5858 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
5859 BitstreamCursor Stream(Bytes);
5863 consumeError(std::move(Err));
5871 bool NeedsInputFiles = Listener.needsInputFileVisitation();
5872 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5873 bool NeedsImports = Listener.needsImportVisitation();
5874 BitstreamCursor InputFilesCursor;
5875 uint64_t InputFilesOffsetBase = 0;
5878 std::string ModuleDir;
5879 bool DoneWithControlBlock =
false;
5881 PathBuf.reserve(256);
5886 AdditionalPathBuf.reserve(256);
5887 while (!DoneWithControlBlock) {
5891 consumeError(MaybeEntry.takeError());
5894 llvm::BitstreamEntry Entry = MaybeEntry.get();
5896 switch (Entry.Kind) {
5897 case llvm::BitstreamEntry::SubBlock: {
5900 std::string IgnoredSuggestedPredefines;
5901 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
5903 Listener, IgnoredSuggestedPredefines) !=
Success)
5909 InputFilesCursor = Stream;
5910 if (llvm::Error Err = Stream.SkipBlock()) {
5912 consumeError(std::move(Err));
5915 if (NeedsInputFiles &&
5918 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
5922 if (llvm::Error Err = Stream.SkipBlock()) {
5924 consumeError(std::move(Err));
5933 case llvm::BitstreamEntry::EndBlock:
5934 DoneWithControlBlock =
true;
5937 case llvm::BitstreamEntry::Error:
5940 case llvm::BitstreamEntry::Record:
5944 if (DoneWithControlBlock)
break;
5949 Stream.readRecord(Entry.ID,
Record, &Blob);
5950 if (!MaybeRecCode) {
5958 if (Listener.ReadFullVersionInformation(Blob))
5962 Listener.ReadModuleName(Blob);
5965 ModuleDir = std::string(Blob);
5971 Listener.ReadModuleMapFile(*Path);
5975 if (!NeedsInputFiles)
5978 unsigned NumInputFiles =
Record[0];
5979 unsigned NumUserFiles =
Record[1];
5980 const llvm::support::unaligned_uint64_t *InputFileOffs =
5981 (
const llvm::support::unaligned_uint64_t *)Blob.data();
5982 for (
unsigned I = 0; I != NumInputFiles; ++I) {
5984 bool isSystemFile = I >= NumUserFiles;
5986 if (isSystemFile && !NeedsSystemInputFiles)
5989 BitstreamCursor &Cursor = InputFilesCursor;
5991 if (llvm::Error Err =
5992 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
5994 consumeError(std::move(Err));
6000 consumeError(MaybeCode.takeError());
6002 unsigned Code = MaybeCode.get();
6006 bool shouldContinue =
false;
6008 Cursor.readRecord(Code,
Record, &Blob);
6009 if (!MaybeRecordType) {
6011 consumeError(MaybeRecordType.takeError());
6017 bool Overridden =
static_cast<bool>(
Record[3]);
6018 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6021 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6023 if (UnresolvedFilename.empty())
6024 Filename = *FilenameAsRequestedBuf;
6027 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6028 Filename = *FilenameBuf;
6030 shouldContinue = Listener.visitInputFileAsRequested(
6031 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6035 if (!shouldContinue)
6056 bool IsStandardCXXModule =
Record[Idx++];
6060 if (IsStandardCXXModule) {
6061 Listener.visitImport(ModuleName,
"");
6072 Listener.visitImport(ModuleName, *Filename);
6083 if (FindModuleFileExtensions) {
6084 BitstreamCursor SavedStream = Stream;
6086 bool DoneWithExtensionBlock =
false;
6087 while (!DoneWithExtensionBlock) {
6093 llvm::BitstreamEntry Entry = MaybeEntry.get();
6095 switch (Entry.Kind) {
6096 case llvm::BitstreamEntry::SubBlock:
6097 if (llvm::Error Err = Stream.SkipBlock()) {
6099 consumeError(std::move(Err));
6104 case llvm::BitstreamEntry::EndBlock:
6105 DoneWithExtensionBlock =
true;
6108 case llvm::BitstreamEntry::Error:
6111 case llvm::BitstreamEntry::Record:
6118 Stream.readRecord(Entry.ID,
Record, &Blob);
6119 if (!MaybeRecCode) {
6123 switch (MaybeRecCode.get()) {
6129 Listener.readModuleFileExtension(Metadata);
6135 Stream = std::move(SavedStream);
6139 if (readUnhashedControlBlockImpl(
6140 nullptr, Bytes, Filename, ClientLoadCapabilities,
6142 ValidateDiagnosticOptions) !=
Success)
6153 bool RequireStrictOptionMatches) {
6154 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts,
6155 ExistingModuleCachePath, FileMgr,
6156 RequireStrictOptionMatches);
6162llvm::Error ASTReader::ReadSubmoduleBlock(
ModuleFile &F,
6163 unsigned ClientLoadCapabilities) {
6168 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6173 auto CreateModule = !KnowsTopLevelModule
6178 Module *CurrentModule =
nullptr;
6182 F.
Stream.advanceSkippingSubblocks();
6184 return MaybeEntry.takeError();
6185 llvm::BitstreamEntry Entry = MaybeEntry.get();
6187 switch (Entry.Kind) {
6188 case llvm::BitstreamEntry::SubBlock:
6189 case llvm::BitstreamEntry::Error:
6190 return llvm::createStringError(std::errc::illegal_byte_sequence,
6191 "malformed block record in AST file");
6192 case llvm::BitstreamEntry::EndBlock:
6193 return llvm::Error::success();
6194 case llvm::BitstreamEntry::Record:
6204 return MaybeKind.takeError();
6205 unsigned Kind = MaybeKind.get();
6208 return llvm::createStringError(
6209 std::errc::illegal_byte_sequence,
6210 "submodule metadata record should be at beginning of block");
6225 return llvm::createStringError(std::errc::illegal_byte_sequence,
6226 "malformed module definition");
6228 StringRef Name = Blob;
6235 bool IsFramework =
Record[Idx++];
6236 bool IsExplicit =
Record[Idx++];
6237 bool IsSystem =
Record[Idx++];
6238 bool IsExternC =
Record[Idx++];
6239 bool InferSubmodules =
Record[Idx++];
6240 bool InferExplicitSubmodules =
Record[Idx++];
6241 bool InferExportWildcard =
Record[Idx++];
6242 bool ConfigMacrosExhaustive =
Record[Idx++];
6243 bool ModuleMapIsPrivate =
Record[Idx++];
6244 bool NamedModuleHasInit =
Record[Idx++];
6246 Module *ParentModule =
nullptr;
6248 ParentModule = getSubmodule(Parent);
6250 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6251 IsFramework, IsExplicit);
6254 if (GlobalIndex >= SubmodulesLoaded.size() ||
6255 SubmodulesLoaded[GlobalIndex])
6256 return llvm::createStringError(std::errc::invalid_argument,
6257 "too many submodules");
6259 if (!ParentModule) {
6262 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6264 assert(CurFile != F.
File &&
"ModuleManager did not de-duplicate");
6266 Diag(diag::err_module_file_conflict)
6270 auto CurModMapFile =
6273 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6274 Diag(diag::note_module_file_conflict)
6275 << CurModMapFile->getName() << ModMapFile->getName();
6277 return llvm::make_error<AlreadyReportedDiagnosticError>();
6296 if (InferredAllowedBy.
isValid())
6306 if (DeserializationListener)
6307 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6309 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6334 auto Filename = ResolveImportedPath(PathBuf, Blob, F);
6335 if (
auto Umbrella = PP.getFileManager().getOptionalFileRef(*Filename)) {
6363 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6370 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6372 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6384 unsigned LocalBaseSubmoduleID =
Record[1];
6388 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
6393 std::make_pair(LocalBaseSubmoduleID,
6402 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6414 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6426 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6443 PP.getTargetInfo());
6449 Module::LinkLibrary(std::string(Blob),
Record[0]));
6473 SmallVector<GlobalDeclID, 16> Inits;
6474 for (
unsigned I = 0; I <
Record.size(); )
6475 Inits.push_back(ReadDeclID(F,
Record, I));
6476 ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
6496bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6497 StringRef ModuleFilename,
bool Complain,
6498 ASTReaderListener &Listener,
6499 bool AllowCompatibleDifferences) {
6500 LangOptions LangOpts;
6502#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6503 LangOpts.Name = Record[Idx++];
6504#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6505 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6506#include "clang/Basic/LangOptions.def"
6507#define SANITIZER(NAME, ID) \
6508 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6509#include "clang/Basic/Sanitizers.def"
6511 for (
unsigned N =
Record[Idx++]; N; --N)
6515 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6516 LangOpts.
ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6521 for (
unsigned N =
Record[Idx++]; N; --N) {
6523 ReadString(
Record, Idx));
6528 for (
unsigned N =
Record[Idx++]; N; --N) {
6535 AllowCompatibleDifferences);
6538bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6539 StringRef ModuleFilename,
bool Complain,
6540 ASTReaderListener &Listener,
6541 bool AllowCompatibleDifferences) {
6543 CodeGenOptions CGOpts;
6545#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6546 if constexpr (CK::Compatibility != CK::Benign) \
6547 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6548#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6549 if constexpr (CK::Compatibility != CK::Benign) \
6550 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6551#define DEBUGOPT(Name, Bits, Default, Compatibility)
6552#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6553#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6554#include "clang/Basic/CodeGenOptions.def"
6557 AllowCompatibleDifferences);
6560bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6561 StringRef ModuleFilename,
bool Complain,
6562 ASTReaderListener &Listener,
6563 bool AllowCompatibleDifferences) {
6565 TargetOptions TargetOpts;
6567 TargetOpts.
CPU = ReadString(
Record, Idx);
6569 TargetOpts.
ABI = ReadString(
Record, Idx);
6570 for (
unsigned N =
Record[Idx++]; N; --N) {
6573 for (
unsigned N =
Record[Idx++]; N; --N) {
6578 AllowCompatibleDifferences);
6581bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6582 StringRef ModuleFilename,
bool Complain,
6583 ASTReaderListener &Listener) {
6584 DiagnosticOptions DiagOpts;
6586#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6587#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6588 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6589#include "clang/Basic/DiagnosticOptions.def"
6591 for (
unsigned N =
Record[Idx++]; N; --N)
6593 for (
unsigned N =
Record[Idx++]; N; --N)
6599bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6600 ASTReaderListener &Listener) {
6601 FileSystemOptions FSOpts;
6607bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6608 StringRef ModuleFilename,
6610 ASTReaderListener &Listener) {
6611 HeaderSearchOptions HSOpts;
6626 std::string SpecificModuleCachePath = ReadString(
Record, Idx);
6629 SpecificModuleCachePath, Complain);
6632bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6633 ASTReaderListener &Listener) {
6634 HeaderSearchOptions HSOpts;
6638 for (
unsigned N =
Record[Idx++]; N; --N) {
6639 std::string Path = ReadString(
Record, Idx);
6642 bool IsFramework =
Record[Idx++];
6643 bool IgnoreSysRoot =
Record[Idx++];
6644 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6649 for (
unsigned N =
Record[Idx++]; N; --N) {
6650 std::string Prefix = ReadString(
Record, Idx);
6651 bool IsSystemHeader =
Record[Idx++];
6656 for (
unsigned N =
Record[Idx++]; N; --N) {
6657 std::string VFSOverlayFile = ReadString(
Record, Idx);
6664bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6665 StringRef ModuleFilename,
6667 ASTReaderListener &Listener,
6668 std::string &SuggestedPredefines) {
6669 PreprocessorOptions PPOpts;
6673 bool ReadMacros =
Record[Idx++];
6675 for (
unsigned N =
Record[Idx++]; N; --N) {
6677 bool IsUndef =
Record[Idx++];
6678 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6683 for (
unsigned N =
Record[Idx++]; N; --N) {
6688 for (
unsigned N =
Record[Idx++]; N; --N) {
6697 SuggestedPredefines.clear();
6699 Complain, SuggestedPredefines);
6702std::pair<ModuleFile *, unsigned>
6703ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6704 GlobalPreprocessedEntityMapType::iterator
6705 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6706 assert(I != GlobalPreprocessedEntityMap.end() &&
6707 "Corrupted global preprocessed entity map");
6710 return std::make_pair(M, LocalIndex);
6713llvm::iterator_range<PreprocessingRecord::iterator>
6714ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6715 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6719 return llvm::make_range(PreprocessingRecord::iterator(),
6720 PreprocessingRecord::iterator());
6723bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6724 unsigned int ClientLoadCapabilities) {
6725 return ClientLoadCapabilities & ARR_OutOfDate &&
6728 .getInMemoryModuleCache()
6729 .isPCMFinal(ModuleFileName);
6732llvm::iterator_range<ASTReader::ModuleDeclIterator>
6734 return llvm::make_range(
6741 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6742 assert(I != GlobalSkippedRangeMap.end() &&
6743 "Corrupted global skipped range map");
6746 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6750 assert(Range.isValid());
6756 unsigned ModuleFileIndex = ID >> 32;
6757 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
6758 assert(getModuleManager().size() > ModuleFileIndex - 1);
6759 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6761 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6766 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6768 unsigned LocalIndex = PPInfo.second;
6773 if (!PP.getPreprocessingRecord()) {
6774 Error(
"no preprocessing record");
6781 Error(std::move(Err));
6788 Error(MaybeEntry.takeError());
6791 llvm::BitstreamEntry Entry = MaybeEntry.get();
6793 if (Entry.Kind != llvm::BitstreamEntry::Record)
6804 if (!MaybeRecType) {
6805 Error(MaybeRecType.takeError());
6810 bool isBuiltin =
Record[0];
6818 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
6838 if (DeserializationListener)
6839 DeserializationListener->MacroDefinitionRead(PPID, MD);
6845 const char *FullFileNameStart = Blob.data() +
Record[0];
6846 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
6848 if (!FullFileName.empty())
6849 File = PP.getFileManager().getOptionalFileRef(FullFileName);
6856 StringRef(Blob.data(),
Record[0]),
6864 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
6873unsigned ASTReader::findNextPreprocessedEntity(
6874 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
6876 for (GlobalSLocOffsetMapType::const_iterator
6877 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
6883 return getTotalNumPreprocessedEntities();
6888struct PPEntityComp {
6889 const ASTReader &Reader;
6892 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
6894 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
6895 SourceLocation LHS = getLoc(L);
6896 SourceLocation RHS = getLoc(R);
6900 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
6901 SourceLocation LHS = getLoc(L);
6905 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
6906 SourceLocation RHS = getLoc(R);
6910 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
6917unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
6918 bool EndsAfter)
const {
6919 if (SourceMgr.isLocalSourceLocation(Loc))
6920 return getTotalNumPreprocessedEntities();
6922 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
6923 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6924 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
6925 "Corrupted global sloc offset map");
6927 if (SLocMapI->second->NumPreprocessedEntities == 0)
6928 return findNextPreprocessedEntity(SLocMapI);
6939 pp_iterator
First = pp_begin;
6943 PPI = std::upper_bound(pp_begin, pp_end, Loc,
6944 PPEntityComp(*
this, M));
6953 std::advance(PPI,
Half);
6954 if (SourceMgr.isBeforeInTranslationUnit(
6955 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
6958 Count = Count -
Half - 1;
6965 return findNextPreprocessedEntity(SLocMapI);
6972std::pair<unsigned, unsigned>
6974 if (Range.isInvalid())
6975 return std::make_pair(0,0);
6976 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
6978 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
6979 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
6980 return std::make_pair(BeginID, EndID);
6990 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6992 unsigned LocalIndex = PPInfo.second;
6999 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7008 class HeaderFileInfoVisitor {
7010 std::optional<HeaderFileInfo> HFI;
7013 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7022 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7023 if (Pos == Table->end())
7030 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7036 HeaderFileInfoVisitor Visitor(FE);
7037 ModuleMgr.visit(Visitor);
7038 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7045 using DiagState = DiagnosticsEngine::DiagState;
7056 auto ReadDiagState = [&](
const DiagState &BasedOn,
7057 bool IncludeNonPragmaStates) {
7058 unsigned BackrefID =
Record[Idx++];
7060 return DiagStates[BackrefID - 1];
7063 Diag.DiagStates.push_back(BasedOn);
7064 DiagState *NewState = &
Diag.DiagStates.back();
7065 DiagStates.push_back(NewState);
7066 unsigned Size =
Record[Idx++];
7067 assert(Idx + Size * 2 <=
Record.size() &&
7068 "Invalid data, not enough diag/map pairs");
7070 unsigned DiagID =
Record[Idx++];
7073 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7086 Mapping = NewMapping;
7092 DiagState *FirstState;
7097 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7098 DiagStates.push_back(FirstState);
7102 "Invalid data, unexpected backref in initial state");
7104 assert(Idx <
Record.size() &&
7105 "Invalid data, not enough state change pairs in initial state");
7110 unsigned Flags =
Record[Idx++];
7111 DiagState Initial(*
Diag.getDiagnosticIDs());
7112 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7113 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7114 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7115 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7116 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7118 FirstState = ReadDiagState(Initial,
true);
7126 .StateTransitions.push_back({FirstState, 0});
7131 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7135 unsigned NumLocations =
Record[Idx++];
7136 while (NumLocations--) {
7137 assert(Idx <
Record.size() &&
7138 "Invalid data, missing pragma diagnostic states");
7140 assert(FID.
isValid() &&
"invalid FileID for transition");
7141 unsigned Transitions =
Record[Idx++];
7147 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7148 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7149 for (
unsigned I = 0; I != Transitions; ++I) {
7150 unsigned Offset =
Record[Idx++];
7151 auto *State = ReadDiagState(*FirstState,
false);
7152 F.StateTransitions.push_back({State, Offset});
7157 assert(Idx <
Record.size() &&
7158 "Invalid data, missing final pragma diagnostic state");
7160 auto *CurState = ReadDiagState(*FirstState,
false);
7163 Diag.DiagStatesByLoc.CurDiagState = CurState;
7164 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7169 auto &
T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7171 T.push_back({CurState, 0});
7173 T[0].State = CurState;
7182ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7183 auto [M, Index] = translateTypeIDToIndex(ID);
7190#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7191 case TYPE_##CODE_ID: return Type::CLASS_ID;
7192#include "clang/Serialization/TypeBitCodes.def"
7194 return std::nullopt;
7204QualType ASTReader::readTypeRecord(
TypeID ID) {
7205 assert(ContextObj &&
"reading type with no AST context");
7206 ASTContext &Context = *ContextObj;
7207 RecordLocation Loc = TypeCursorForIndex(ID);
7208 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7212 SavedStreamPosition SavedPosition(DeclsCursor);
7214 ReadingKindTracker ReadingKind(Read_Type, *
this);
7217 Deserializing AType(
this);
7219 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7220 Error(std::move(Err));
7223 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7225 Error(RawCode.takeError());
7229 ASTRecordReader
Record(*
this, *Loc.F);
7230 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7232 Error(Code.takeError());
7236 QualType baseType =
Record.readQualType();
7237 Qualifiers quals =
Record.readQualifiers();
7243 Error(
"Unexpected code for type");
7247 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7248 return TypeReader.read(*maybeClass);
7256 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7257 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7260 return Reader.readTypeSourceInfo();
7264 return Reader.readNestedNameSpecifierLoc();
7268 return Reader.readAttr();
7277#define ABSTRACT_TYPELOC(CLASS, PARENT)
7278#define TYPELOC(CLASS, PARENT) \
7279 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7280#include "clang/AST/TypeLocNodes.def"
7289void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7293void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7303void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7307void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7311void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7315void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7319void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7323void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7327void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7331void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7335void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7339void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7347 if (Reader.readBool())
7354 VisitArrayTypeLoc(TL);
7358 VisitArrayTypeLoc(TL);
7361void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7362 VisitArrayTypeLoc(TL);
7365void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7366 DependentSizedArrayTypeLoc TL) {
7367 VisitArrayTypeLoc(TL);
7370void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7371 DependentAddressSpaceTypeLoc TL) {
7378void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7379 DependentSizedExtVectorTypeLoc TL) {
7383void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7387void TypeLocReader::VisitDependentVectorTypeLoc(
7388 DependentVectorTypeLoc TL) {
7392void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7396void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7403void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7404 DependentSizedMatrixTypeLoc TL) {
7417 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7423 VisitFunctionTypeLoc(TL);
7427 VisitFunctionTypeLoc(TL);
7430void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7431 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7432 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7433 SourceLocation NameLoc = readSourceLocation();
7434 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7437void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7438 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7439 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7440 SourceLocation NameLoc = readSourceLocation();
7441 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7444void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7445 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7446 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7447 SourceLocation NameLoc = readSourceLocation();
7448 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7451void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7457void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7464void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7469void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7473void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7487 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7492void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7494 if (Reader.readBool())
7496 if (Reader.readBool())
7500void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7514 VisitTagTypeLoc(TL);
7518 VisitTagTypeLoc(TL);
7521void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7523void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7527void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7531void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7535void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7536 HLSLAttributedResourceTypeLoc TL) {
7540void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7544void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7548void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7549 SubstTemplateTypeParmTypeLoc TL) {
7553void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7554 SubstTemplateTypeParmPackTypeLoc TL) {
7558void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7559 SubstBuiltinTemplatePackTypeLoc TL) {
7563void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7564 TemplateSpecializationTypeLoc TL) {
7565 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7566 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7567 SourceLocation TemplateKeywordLoc = readSourceLocation();
7568 SourceLocation NameLoc = readSourceLocation();
7569 SourceLocation LAngleLoc = readSourceLocation();
7570 SourceLocation RAngleLoc = readSourceLocation();
7571 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7572 LAngleLoc, RAngleLoc);
7573 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7574 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7575 Args[I] = Reader.readTemplateArgumentLocInfo(
7576 TL.
getTypePtr()->template_arguments()[I].getKind());
7579void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7584void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7590void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7594void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7599void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7608void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7620void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7624void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7630void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7634void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7638void TypeLocReader::VisitDependentBitIntTypeLoc(
7639 clang::DependentBitIntTypeLoc TL) {
7643void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7677std::pair<ModuleFile *, unsigned>
7680 "Predefined type shouldn't be in TypesLoaded");
7682 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7684 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7685 assert(OwningModuleFile &&
7686 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7688 return {OwningModuleFile,
7693 assert(ContextObj &&
"reading type with no AST context");
7704 llvm_unreachable(
"Invalid predefined type");
7720 T = Context.UnsignedCharTy;
7723 T = Context.UnsignedShortTy;
7726 T = Context.UnsignedIntTy;
7729 T = Context.UnsignedLongTy;
7732 T = Context.UnsignedLongLongTy;
7735 T = Context.UnsignedInt128Ty;
7738 T = Context.SignedCharTy;
7741 T = Context.WCharTy;
7744 T = Context.ShortTy;
7753 T = Context.LongLongTy;
7756 T = Context.Int128Ty;
7759 T = Context.BFloat16Ty;
7765 T = Context.FloatTy;
7768 T = Context.DoubleTy;
7771 T = Context.LongDoubleTy;
7774 T = Context.ShortAccumTy;
7777 T = Context.AccumTy;
7780 T = Context.LongAccumTy;
7783 T = Context.UnsignedShortAccumTy;
7786 T = Context.UnsignedAccumTy;
7789 T = Context.UnsignedLongAccumTy;
7792 T = Context.ShortFractTy;
7795 T = Context.FractTy;
7798 T = Context.LongFractTy;
7801 T = Context.UnsignedShortFractTy;
7804 T = Context.UnsignedFractTy;
7807 T = Context.UnsignedLongFractTy;
7810 T = Context.SatShortAccumTy;
7813 T = Context.SatAccumTy;
7816 T = Context.SatLongAccumTy;
7819 T = Context.SatUnsignedShortAccumTy;
7822 T = Context.SatUnsignedAccumTy;
7825 T = Context.SatUnsignedLongAccumTy;
7828 T = Context.SatShortFractTy;
7831 T = Context.SatFractTy;
7834 T = Context.SatLongFractTy;
7837 T = Context.SatUnsignedShortFractTy;
7840 T = Context.SatUnsignedFractTy;
7843 T = Context.SatUnsignedLongFractTy;
7846 T = Context.Float16Ty;
7849 T = Context.Float128Ty;
7852 T = Context.Ibm128Ty;
7855 T = Context.OverloadTy;
7858 T = Context.UnresolvedTemplateTy;
7861 T = Context.BoundMemberTy;
7864 T = Context.PseudoObjectTy;
7867 T = Context.DependentTy;
7870 T = Context.UnknownAnyTy;
7873 T = Context.NullPtrTy;
7876 T = Context.Char8Ty;
7879 T = Context.Char16Ty;
7882 T = Context.Char32Ty;
7885 T = Context.ObjCBuiltinIdTy;
7888 T = Context.ObjCBuiltinClassTy;
7891 T = Context.ObjCBuiltinSelTy;
7893#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
7894 case PREDEF_TYPE_##Id##_ID: \
7895 T = Context.SingletonId; \
7897#include "clang/Basic/OpenCLImageTypes.def"
7898#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
7899 case PREDEF_TYPE_##Id##_ID: \
7900 T = Context.Id##Ty; \
7902#include "clang/Basic/OpenCLExtensionTypes.def"
7904 T = Context.OCLSamplerTy;
7907 T = Context.OCLEventTy;
7910 T = Context.OCLClkEventTy;
7913 T = Context.OCLQueueTy;
7916 T = Context.OCLReserveIDTy;
7919 T = Context.getAutoDeductType();
7922 T = Context.getAutoRRefDeductType();
7925 T = Context.ARCUnbridgedCastTy;
7928 T = Context.BuiltinFnTy;
7931 T = Context.IncompleteMatrixIdxTy;
7934 T = Context.ArraySectionTy;
7937 T = Context.OMPArrayShapingTy;
7940 T = Context.OMPIteratorTy;
7942#define SVE_TYPE(Name, Id, SingletonId) \
7943 case PREDEF_TYPE_##Id##_ID: \
7944 T = Context.SingletonId; \
7946#include "clang/Basic/AArch64ACLETypes.def"
7947#define PPC_VECTOR_TYPE(Name, Id, Size) \
7948 case PREDEF_TYPE_##Id##_ID: \
7949 T = Context.Id##Ty; \
7951#include "clang/Basic/PPCTypes.def"
7952#define RVV_TYPE(Name, Id, SingletonId) \
7953 case PREDEF_TYPE_##Id##_ID: \
7954 T = Context.SingletonId; \
7956#include "clang/Basic/RISCVVTypes.def"
7957#define WASM_TYPE(Name, Id, SingletonId) \
7958 case PREDEF_TYPE_##Id##_ID: \
7959 T = Context.SingletonId; \
7961#include "clang/Basic/WebAssemblyReferenceTypes.def"
7962#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
7963 case PREDEF_TYPE_##Id##_ID: \
7964 T = Context.SingletonId; \
7966#include "clang/Basic/AMDGPUTypes.def"
7967#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
7968 case PREDEF_TYPE_##Id##_ID: \
7969 T = Context.SingletonId; \
7971#include "clang/Basic/HLSLIntangibleTypes.def"
7974 assert(!
T.isNull() &&
"Unknown predefined type");
7975 return T.withFastQualifiers(FastQuals);
7978 unsigned Index = translateTypeIDToIndex(ID).second;
7980 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
7981 if (TypesLoaded[Index].isNull()) {
7982 TypesLoaded[Index] = readTypeRecord(ID);
7983 if (TypesLoaded[Index].isNull())
7986 TypesLoaded[Index]->setFromAST();
7987 if (DeserializationListener)
7989 TypesLoaded[Index]);
7992 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8005 ReadModuleOffsetMap(F);
8008 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8010 if (ModuleFileIndex == 0)
8015 ModuleFileIndex = MF.
Index + 1;
8016 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8035 TemplateNameLoc, EllipsisLoc);
8046 llvm_unreachable(
"unexpected template argument loc");
8063 unsigned NumArgsAsWritten =
readInt();
8064 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8078 if (NumCurrentElementsDeserializing) {
8083 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8106 auto *II = Name.getAsIdentifierInfo();
8107 assert(II &&
"non-identifier name in C?");
8108 if (II->isOutOfDate())
8125 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8126 Template = CTSD->getSpecializedTemplate();
8127 Args = CTSD->getTemplateArgs().asArray();
8128 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8129 Template = VTSD->getSpecializedTemplate();
8130 Args = VTSD->getTemplateArgs().asArray();
8131 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8132 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8134 Args = FD->getTemplateSpecializationArgs()->asArray();
8142 Template->loadLazySpecializationsImpl();
8144 Template->loadLazySpecializationsImpl(Args);
8150 RecordLocation Loc = getLocalBitOffset(Offset);
8153 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8154 Error(std::move(Err));
8157 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8162 Error(MaybeCode.takeError());
8165 unsigned Code = MaybeCode.get();
8169 if (!MaybeRecCode) {
8170 Error(MaybeRecCode.takeError());
8174 Error(
"malformed AST file: missing C++ ctor initializers");
8178 return Record.readCXXCtorInitializers();
8182 assert(ContextObj &&
"reading base specifiers with no AST context");
8185 RecordLocation Loc = getLocalBitOffset(Offset);
8188 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8189 Error(std::move(Err));
8192 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8197 Error(MaybeCode.takeError());
8200 unsigned Code = MaybeCode.get();
8204 if (!MaybeRecCode) {
8205 Error(MaybeCode.takeError());
8208 unsigned RecCode = MaybeRecCode.get();
8211 Error(
"malformed AST file: missing C++ base specifiers");
8215 unsigned NumBases =
Record.readInt();
8218 for (
unsigned I = 0; I != NumBases; ++I)
8219 Bases[I] =
Record.readCXXBaseSpecifier();
8232 ReadModuleOffsetMap(F);
8235 OwningModuleFileIndex == 0
8239 if (OwningModuleFileIndex == 0)
8242 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8251 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8252 return M.
Index == ModuleFileIndex - 1;
8260 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8261 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8281 DeclCursorForID(ID, Loc);
8286 assert(ContextObj &&
"reading predefined decl without AST context");
8288 Decl *NewLoaded =
nullptr;
8294 return Context.getTranslationUnitDecl();
8297 if (Context.ObjCIdDecl)
8298 return Context.ObjCIdDecl;
8299 NewLoaded = Context.getObjCIdDecl();
8303 if (Context.ObjCSelDecl)
8304 return Context.ObjCSelDecl;
8305 NewLoaded = Context.getObjCSelDecl();
8309 if (Context.ObjCClassDecl)
8310 return Context.ObjCClassDecl;
8311 NewLoaded = Context.getObjCClassDecl();
8315 if (Context.ObjCProtocolClassDecl)
8316 return Context.ObjCProtocolClassDecl;
8317 NewLoaded = Context.getObjCProtocolDecl();
8321 if (Context.Int128Decl)
8322 return Context.Int128Decl;
8323 NewLoaded = Context.getInt128Decl();
8327 if (Context.UInt128Decl)
8328 return Context.UInt128Decl;
8329 NewLoaded = Context.getUInt128Decl();
8333 if (Context.ObjCInstanceTypeDecl)
8334 return Context.ObjCInstanceTypeDecl;
8335 NewLoaded = Context.getObjCInstanceTypeDecl();
8339 if (Context.BuiltinVaListDecl)
8340 return Context.BuiltinVaListDecl;
8341 NewLoaded = Context.getBuiltinVaListDecl();
8345 if (Context.VaListTagDecl)
8346 return Context.VaListTagDecl;
8347 NewLoaded = Context.getVaListTagDecl();
8351 if (Context.BuiltinMSVaListDecl)
8352 return Context.BuiltinMSVaListDecl;
8353 NewLoaded = Context.getBuiltinMSVaListDecl();
8358 return Context.getMSGuidTagDecl();
8361 if (Context.ExternCContext)
8362 return Context.ExternCContext;
8363 NewLoaded = Context.getExternCContextDecl();
8367 if (Context.CFConstantStringTypeDecl)
8368 return Context.CFConstantStringTypeDecl;
8369 NewLoaded = Context.getCFConstantStringDecl();
8373 if (Context.CFConstantStringTagDecl)
8374 return Context.CFConstantStringTagDecl;
8375 NewLoaded = Context.getCFConstantStringTagDecl();
8379 return Context.getMSTypeInfoTagDecl();
8381#define BuiltinTemplate(BTName) \
8382 case PREDEF_DECL##BTName##_ID: \
8383 if (Context.Decl##BTName) \
8384 return Context.Decl##BTName; \
8385 NewLoaded = Context.get##BTName##Decl(); \
8387#include "clang/Basic/BuiltinTemplates.inc"
8390 llvm_unreachable(
"Invalid decl ID");
8394 assert(NewLoaded &&
"Failed to load predefined decl?");
8396 if (DeserializationListener)
8397 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8402unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8403 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8404 if (!OwningModuleFile) {
8413 assert(ContextObj &&
"reading decl with no AST context");
8422 Merged.push_back(ID);
8427 unsigned Index = translateGlobalDeclIDToIndex(ID);
8429 if (Index >= DeclsLoaded.size()) {
8430 assert(0 &&
"declaration ID out-of-range for AST file");
8431 Error(
"declaration ID out-of-range for AST file");
8435 return DeclsLoaded[Index];
8442 unsigned Index = translateGlobalDeclIDToIndex(ID);
8444 if (Index >= DeclsLoaded.size()) {
8445 assert(0 &&
"declaration ID out-of-range for AST file");
8446 Error(
"declaration ID out-of-range for AST file");
8450 if (!DeclsLoaded[Index]) {
8452 if (DeserializationListener)
8453 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8456 return DeclsLoaded[Index];
8465 ReadModuleOffsetMap(M);
8475 uint64_t OrignalModuleFileIndex = 0;
8478 OrignalModuleFileIndex = I + 1;
8482 if (!OrignalModuleFileIndex)
8490 if (Idx >=
Record.size()) {
8491 Error(
"Corrupted AST file");
8508 RecordLocation Loc = getLocalBitOffset(Offset);
8509 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8510 Error(std::move(Err));
8513 assert(NumCurrentElementsDeserializing == 0 &&
8514 "should not be called while already deserializing");
8516 return ReadStmtFromStream(*Loc.F);
8519bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8523 auto It = SpecLookups.find(D);
8524 if (It == SpecLookups.end())
8530 It->second.Table.findAll();
8534 SpecLookups.erase(It);
8536 bool NewSpecsFound =
false;
8537 Deserializing LookupResults(
this);
8538 for (
auto &Info : Infos) {
8539 if (GetExistingDecl(Info))
8541 NewSpecsFound =
true;
8545 return NewSpecsFound;
8552 bool NewSpecsFound =
8553 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8555 return NewSpecsFound;
8557 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8558 return NewSpecsFound;
8561bool ASTReader::LoadExternalSpecializationsImpl(
8562 SpecLookupTableTy &SpecLookups,
const Decl *D,
8567 if (
auto It = SpecLookups.find(D); It != SpecLookups.end())
8568 LookupTable = &It->getSecond();
8574 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8576 llvm::raw_string_ostream OS(Name);
8583 Deserializing LookupResults(
this);
8588 LookupTable->
Table.find(HashValue);
8590 bool NewSpecsFound =
false;
8591 for (
auto &Info : Infos) {
8592 if (GetExistingDecl(Info))
8594 NewSpecsFound =
true;
8598 return NewSpecsFound;
8605 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8606 PartialSpecializationsLookups, D, TemplateArgs);
8608 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8610 return NewDeclsFound;
8618 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8619 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8620 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8622 if (!IsKindWeWant(K))
8625 auto ID = (
DeclID) + LexicalDecls[I + 1];
8630 if (PredefsVisited[ID])
8633 PredefsVisited[ID] =
true;
8637 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8645 for (
const auto &Lexical : TULexicalDecls)
8646 Visit(Lexical.first, Lexical.second);
8648 auto I = LexicalDecls.find(DC);
8649 if (I != LexicalDecls.end())
8650 Visit(I->second.first, I->second.second);
8653 ++NumLexicalDeclContextsRead;
8658class UnalignedDeclIDComp {
8664 : Reader(Reader), Mod(M) {}
8673 SourceLocation RHS = getLocation(R);
8678 SourceLocation LHS = getLocation(L);
8692 unsigned Offset,
unsigned Length,
8696 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8697 if (I == FileDeclIDs.end())
8700 FileDeclsInfo &DInfo = I->second;
8701 if (DInfo.Decls.empty())
8705 BeginLoc =
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
8708 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8710 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8711 if (BeginIt != DInfo.Decls.begin())
8717 while (BeginIt != DInfo.Decls.begin() &&
8720 ->isTopLevelDeclInObjCContainer())
8724 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8725 if (EndIt != DInfo.Decls.end())
8738 "DeclContext has no visible decls in storage");
8745 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8767 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8768 ++NumVisibleDeclContextsRead;
8769 Find(It->second.Table, Name);
8772 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8773 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8774 ++NumModuleLocalVisibleDeclContexts;
8775 Find(It->second.Table, std::make_pair(Name, NamedModule));
8778 if (
auto *NamedModule =
8779 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8781 FindModuleLocalLookup(NamedModule);
8786 if (ContextObj && ContextObj->getCurrentNamedModule())
8787 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8789 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8790 ++NumTULocalVisibleDeclContexts;
8791 Find(It->second.Table, Name);
8804 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
8805 auto It = LookupTables.find(DC);
8806 if (It == LookupTables.end())
8828 findAll(Lookups, NumVisibleDeclContextsRead);
8829 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8830 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8832 for (
auto &[Name, DS] : Decls)
8835 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
8840 auto I = Lookups.find(Primary);
8841 return I == Lookups.end() ?
nullptr : &I->second;
8846 auto I = ModuleLocalLookups.find(Primary);
8847 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
8852 auto I = TULocalLookups.find(Primary);
8853 return I == TULocalLookups.end() ?
nullptr : &I->second;
8860 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
8861 auto I = LookupTable.find(D);
8862 return I == LookupTable.end() ?
nullptr : &I->second;
8867 return PartialSpecializationsLookups.contains(D) ||
8868 SpecializationsLookups.contains(D);
8877 assert(ImplD && Consumer);
8879 for (
auto *I : ImplD->
methods())
8885void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
8886 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
8889 Consumer->HandleInterestingDecl(DeclGroupRef(D));
8892void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
8893 Consumer->HandleVTable(RD);
8897 this->Consumer = Consumer;
8900 PassInterestingDeclsToConsumer();
8902 if (DeserializationListener)
8903 DeserializationListener->ReaderInitialized(
this);
8907 std::fprintf(
stderr,
"*** AST File Statistics:\n");
8909 unsigned NumTypesLoaded =
8910 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
8911 unsigned NumDeclsLoaded =
8912 DeclsLoaded.size() -
8913 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
8914 unsigned NumIdentifiersLoaded =
8915 IdentifiersLoaded.size() -
8917 unsigned NumMacrosLoaded =
8918 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
8919 unsigned NumSelectorsLoaded =
8920 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
8923 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
8924 NumSLocEntriesRead, TotalNumSLocEntries,
8925 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
8926 if (!TypesLoaded.empty())
8927 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
8928 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
8929 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
8930 if (!DeclsLoaded.empty())
8931 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
8932 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
8933 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
8934 if (!IdentifiersLoaded.empty())
8935 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
8936 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
8937 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
8938 if (!MacrosLoaded.empty())
8939 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
8940 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
8941 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
8942 if (!SelectorsLoaded.empty())
8943 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
8944 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
8945 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
8946 if (TotalNumStatements)
8947 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
8948 NumStatementsRead, TotalNumStatements,
8949 ((
float)NumStatementsRead/TotalNumStatements * 100));
8951 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
8952 NumMacrosRead, TotalNumMacros,
8953 ((
float)NumMacrosRead/TotalNumMacros * 100));
8954 if (TotalLexicalDeclContexts)
8955 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
8956 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
8957 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
8959 if (TotalVisibleDeclContexts)
8960 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
8961 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
8962 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
8964 if (TotalModuleLocalVisibleDeclContexts)
8966 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
8967 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
8968 ((
float)NumModuleLocalVisibleDeclContexts /
8969 TotalModuleLocalVisibleDeclContexts * 100));
8970 if (TotalTULocalVisibleDeclContexts)
8971 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
8972 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
8973 ((
float)NumTULocalVisibleDeclContexts /
8974 TotalTULocalVisibleDeclContexts * 100));
8975 if (TotalNumMethodPoolEntries)
8976 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
8977 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
8978 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
8980 if (NumMethodPoolLookups)
8981 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
8982 NumMethodPoolHits, NumMethodPoolLookups,
8983 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
8984 if (NumMethodPoolTableLookups)
8985 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
8986 NumMethodPoolTableHits, NumMethodPoolTableLookups,
8987 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
8989 if (NumIdentifierLookupHits)
8991 " %u / %u identifier table lookups succeeded (%f%%)\n",
8992 NumIdentifierLookupHits, NumIdentifierLookups,
8993 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
8996 std::fprintf(
stderr,
"\n");
8997 GlobalIndex->printStats();
9000 std::fprintf(
stderr,
"\n");
9002 std::fprintf(
stderr,
"\n");
9005template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9006LLVM_DUMP_METHOD
static void
9009 InitialCapacity> &Map) {
9010 if (Map.begin() == Map.end())
9015 llvm::errs() << Name <<
":\n";
9016 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9018 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9023 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9025 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9029 GlobalPreprocessedEntityMap);
9031 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9040 if (llvm::MemoryBuffer *buf = I.Buffer) {
9041 size_t bytes = buf->getBufferSize();
9042 switch (buf->getBufferKind()) {
9043 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9046 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9067 if (!FPPragmaOptions.empty()) {
9068 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9071 SemaObj->CurFPFeatures =
9077 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9078 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9079 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9080 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9082 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9084 DeclsWithEffectsToVerify.clear();
9086 SemaObj->OpenCLFeatures = OpenCLExtensions;
9092 assert(SemaObj &&
"no Sema to update");
9096 if (!SemaDeclRefs.empty()) {
9097 assert(SemaDeclRefs.size() % 3 == 0);
9098 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9099 if (!SemaObj->StdNamespace)
9100 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9101 if (!SemaObj->StdBadAlloc)
9102 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9103 if (!SemaObj->StdAlignValT)
9104 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9106 SemaDeclRefs.clear();
9111 if(OptimizeOffPragmaLocation.isValid())
9112 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9113 if (PragmaMSStructState != -1)
9115 if (PointersToMembersPragmaLocation.isValid()) {
9116 SemaObj->ActOnPragmaMSPointersToMembers(
9118 PragmaMSPointersToMembersState,
9119 PointersToMembersPragmaLocation);
9121 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9122 if (!RISCVVecIntrinsicPragma.empty()) {
9123 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9124 "Wrong number of RISCVVecIntrinsicPragma");
9125 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9126 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9127 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9130 if (PragmaAlignPackCurrentValue) {
9134 bool DropFirst =
false;
9135 if (!PragmaAlignPackStack.empty() &&
9136 PragmaAlignPackStack.front().Location.isInvalid()) {
9137 assert(PragmaAlignPackStack.front().Value ==
9138 SemaObj->AlignPackStack.DefaultValue &&
9139 "Expected a default alignment value");
9140 SemaObj->AlignPackStack.Stack.emplace_back(
9141 PragmaAlignPackStack.front().SlotLabel,
9142 SemaObj->AlignPackStack.CurrentValue,
9143 SemaObj->AlignPackStack.CurrentPragmaLocation,
9144 PragmaAlignPackStack.front().PushLocation);
9147 for (
const auto &Entry :
9148 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9149 SemaObj->AlignPackStack.Stack.emplace_back(
9150 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9152 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9153 assert(*PragmaAlignPackCurrentValue ==
9154 SemaObj->AlignPackStack.DefaultValue &&
9155 "Expected a default align and pack value");
9158 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9159 SemaObj->AlignPackStack.CurrentPragmaLocation =
9160 PragmaAlignPackCurrentLocation;
9163 if (FpPragmaCurrentValue) {
9167 bool DropFirst =
false;
9168 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9169 assert(FpPragmaStack.front().Value ==
9170 SemaObj->FpPragmaStack.DefaultValue &&
9171 "Expected a default pragma float_control value");
9172 SemaObj->FpPragmaStack.Stack.emplace_back(
9173 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9174 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9175 FpPragmaStack.front().PushLocation);
9178 for (
const auto &Entry :
9180 SemaObj->FpPragmaStack.Stack.emplace_back(
9181 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9182 if (FpPragmaCurrentLocation.isInvalid()) {
9183 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9184 "Expected a default pragma float_control value");
9187 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9188 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9193 for (
auto &Import : PendingImportedModulesSema) {
9194 if (Import.ImportLoc.isInvalid())
9197 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9200 PendingImportedModulesSema.clear();
9207 IdentifierLookupVisitor Visitor(Name, 0,
9208 NumIdentifierLookups,
9209 NumIdentifierLookupHits);
9215 if (PP.getLangOpts().CPlusPlus) {
9216 for (
auto *F : ModuleMgr.pch_modules())
9225 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9230 ModuleMgr.visit(Visitor, HitsPtr);
9252 ASTIdentifierLookupTable::key_iterator Current;
9256 ASTIdentifierLookupTable::key_iterator End;
9263 bool SkipModules =
false);
9265 StringRef
Next()
override;
9272 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9276 while (Current == End) {
9288 Current = IdTable->key_begin();
9289 End = IdTable->key_end();
9294 StringRef
Result = *Current;
9303 std::unique_ptr<IdentifierIterator> Current;
9304 std::unique_ptr<IdentifierIterator> Queued;
9307 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9308 std::unique_ptr<IdentifierIterator> Second)
9309 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9311 StringRef
Next()
override {
9315 StringRef result = Current->Next();
9316 if (!result.empty())
9321 std::swap(Current, Queued);
9330 std::unique_ptr<IdentifierIterator> ReaderIter(
9332 std::unique_ptr<IdentifierIterator> ModulesIter(
9333 GlobalIndex->createIdentifierIterator());
9334 return new ChainedIdentifierIterator(std::move(ReaderIter),
9335 std::move(ModulesIter));
9347 unsigned PriorGeneration;
9348 unsigned InstanceBits = 0;
9349 unsigned FactoryBits = 0;
9350 bool InstanceHasMoreThanOneDecl =
false;
9351 bool FactoryHasMoreThanOneDecl =
false;
9357 unsigned PriorGeneration)
9358 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9368 ++Reader.NumMethodPoolTableLookups;
9371 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9372 if (Pos == PoolTable->end())
9375 ++Reader.NumMethodPoolTableHits;
9376 ++Reader.NumSelectorsRead;
9380 ++Reader.NumMethodPoolEntriesRead;
9382 if (Reader.DeserializationListener)
9383 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9388 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9389 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9390 InstanceBits =
Data.InstanceBits;
9391 FactoryBits =
Data.FactoryBits;
9392 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9393 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9399 return InstanceMethods;
9404 return FactoryMethods;
9411 return InstanceHasMoreThanOneDecl;
9429 unsigned &Generation = SelectorGeneration[Sel];
9430 unsigned PriorGeneration = Generation;
9432 SelectorOutOfDate[Sel] =
false;
9435 ++NumMethodPoolLookups;
9437 ModuleMgr.visit(Visitor);
9443 ++NumMethodPoolHits;
9464 if (SelectorOutOfDate[Sel])
9472 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9474 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9475 Namespaces.push_back(Namespace);
9480 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9481 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9482 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9485 Undefined.insert(std::make_pair(D, Loc));
9487 UndefinedButUsed.clear();
9493 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9496 uint64_t Count = DelayedDeleteExprs[Idx++];
9497 for (uint64_t
C = 0;
C < Count; ++
C) {
9500 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9501 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9508 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9509 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9511 TentativeDefs.push_back(Var);
9513 TentativeDefinitions.clear();
9518 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9520 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9524 UnusedFileScopedDecls.clear();
9529 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9531 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9535 DelegatingCtorDecls.clear();
9539 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9541 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9545 ExtVectorDecls.clear();
9550 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9553 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9557 UnusedLocalTypedefNameCandidates.clear();
9562 for (
auto I : DeclsToCheckForDeferredDiags) {
9563 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9567 DeclsToCheckForDeferredDiags.clear();
9572 if (ReferencedSelectorsData.empty())
9577 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9579 while (I < DataSize) {
9583 Sels.push_back(std::make_pair(Sel, SelLoc));
9585 ReferencedSelectorsData.clear();
9590 if (WeakUndeclaredIdentifiers.empty())
9593 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9601 WeakIDs.push_back(std::make_pair(WeakId, WI));
9603 WeakUndeclaredIdentifiers.clear();
9607 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9609 VTableUse &TableInfo = VTableUses[Idx++];
9610 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9613 VTables.push_back(VT);
9621 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9622 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9626 Pending.push_back(std::make_pair(D, Loc));
9628 PendingInstantiations.clear();
9632 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9634 for (
auto &LPT : LateParsedTemplates) {
9637 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9641 auto LT = std::make_unique<LateParsedTemplate>();
9642 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9646 assert(F &&
"No module");
9648 unsigned TokN = LateParsed[Idx++];
9649 LT->Toks.reserve(TokN);
9650 for (
unsigned T = 0;
T < TokN; ++
T)
9651 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9653 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9657 LateParsedTemplates.clear();
9669 if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9670 Iter != LambdaDeclarationsForMerging.end() &&
9671 Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
9680 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9689 assert(ID &&
"Non-zero identifier ID required");
9690 unsigned Index = translateIdentifierIDToIndex(ID).second;
9691 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9692 IdentifiersLoaded[Index] = II;
9693 if (DeserializationListener)
9694 DeserializationListener->IdentifierRead(ID, II);
9716 if (NumCurrentElementsDeserializing && !Decls) {
9717 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9721 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9734 Decls->push_back(D);
9741 pushExternalDeclIntoScope(D, II);
9745std::pair<ModuleFile *, unsigned>
9746ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9748 return {
nullptr, 0};
9750 unsigned ModuleFileIndex = ID >> 32;
9751 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9753 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9765 if (IdentifiersLoaded.empty()) {
9766 Error(
"no identifier table in AST file");
9770 auto [M, Index] = translateIdentifierIDToIndex(ID);
9771 if (!IdentifiersLoaded[Index]) {
9772 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9775 const unsigned char *
Data =
9781 auto &II = PP.getIdentifierTable().get(Key);
9782 IdentifiersLoaded[Index] = &II;
9785 if (DeserializationListener)
9786 DeserializationListener->IdentifierRead(ID, &II);
9789 return IdentifiersLoaded[Index];
9801 ReadModuleOffsetMap(M);
9803 unsigned ModuleFileIndex = LocalID >> 32;
9804 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9807 assert(MF &&
"malformed identifier ID encoding?");
9809 if (!ModuleFileIndex)
9815std::pair<ModuleFile *, unsigned>
9816ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
9818 return {
nullptr, 0};
9820 unsigned ModuleFileIndex = ID >> 32;
9821 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
9825 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
9834 if (MacrosLoaded.empty()) {
9835 Error(
"no macro table in AST file");
9839 auto [M, Index] = translateMacroIDToIndex(ID);
9840 if (!MacrosLoaded[Index]) {
9841 assert(M !=
nullptr &&
"Untranslated Macro ID?");
9847 if (DeserializationListener)
9848 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
9851 return MacrosLoaded[Index];
9859 ReadModuleOffsetMap(M);
9861 unsigned ModuleFileIndex = LocalID >> 32;
9862 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
9865 assert(MF &&
"malformed identifier ID encoding?");
9867 if (!ModuleFileIndex) {
9872 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
9881 ReadModuleOffsetMap(M);
9886 &&
"Invalid index into submodule index remap");
9888 return LocalID + I->second;
9893 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
9897 if (GlobalID > SubmodulesLoaded.size()) {
9898 Error(
"submodule ID out of range in AST file");
9913 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
9916 int IndexFromEnd =
static_cast<int>(ID >> 1);
9917 assert(IndexFromEnd &&
"got reference to unknown module file");
9934 auto I = llvm::find(PCHModules, M);
9935 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
9936 return std::distance(I, PCHModules.end()) << 1;
9945 const auto &PCHChain = ModuleMgr.pch_modules();
9946 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
9947 ModuleFile &MF = ModuleMgr.getPrimaryModule();
9951 llvm::sys::path::parent_path(MF.
FileName),
9954 return std::nullopt;
9958 auto I = DefinitionSource.find(FD);
9959 if (I == DefinitionSource.end())
9965 return ThisDeclarationWasADefinitionSet.contains(FD);
9976 if (ID > SelectorsLoaded.size()) {
9977 Error(
"selector ID out of range in AST file");
9981 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
9984 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
9988 SelectorsLoaded[ID - 1] =
9990 if (DeserializationListener)
9991 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
9994 return SelectorsLoaded[ID - 1];
10012 ReadModuleOffsetMap(M);
10017 &&
"Invalid index into selector index remap");
10019 return LocalID + I->second;
10050 NameInfo.
setName(readDeclarationName());
10064 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10065 assert(Op.isValid());
10071 unsigned NumTPLists =
readInt();
10076 for (
unsigned i = 0; i != NumTPLists; ++i)
10087 unsigned NumParams =
readInt();
10089 Params.reserve(NumParams);
10090 while (NumParams--)
10093 bool HasRequiresClause =
readBool();
10094 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10097 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10098 return TemplateParams;
10103 bool Canonicalize) {
10104 unsigned NumTemplateArgs =
readInt();
10105 TemplArgs.reserve(NumTemplateArgs);
10106 while (NumTemplateArgs--)
10112 unsigned NumDecls =
readInt();
10114 while (NumDecls--) {
10126 bool inheritConstructors =
readBool();
10132 Result.setInheritConstructors(inheritConstructors);
10139 unsigned NumInitializers =
readInt();
10140 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10142 for (
unsigned i = 0; i != NumInitializers; ++i) {
10144 bool IsBaseVirtual =
false;
10175 BOMInit =
new (Context)
10177 RParenLoc, MemberOrEllipsisLoc);
10179 BOMInit =
new (Context)
10182 BOMInit =
new (Context)
10186 BOMInit =
new (Context)
10188 LParenLoc,
Init, RParenLoc);
10191 unsigned SourceOrder =
readInt();
10195 CtorInitializers[i] = BOMInit;
10198 return CtorInitializers;
10206 for (
unsigned I = 0; I != N; ++I) {
10207 auto Kind = readNestedNameSpecifierKind();
10212 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10221 Builder.Make(Context,
T->getTypeLoc(), ColonColonLoc);
10227 Builder.MakeGlobal(Context, ColonColonLoc);
10234 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10239 llvm_unreachable(
"unexpected null nested name specifier");
10254 const StringRef Blob) {
10255 unsigned Count =
Record[0];
10256 const char *Byte = Blob.data();
10257 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10258 for (
unsigned I = 0; I < Count; ++Byte)
10259 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10260 if (*Byte & (1 << Bit))
10267 return llvm::APFloat(Sem,
readAPInt());
10272 unsigned Len =
Record[Idx++];
10280 unsigned Len =
Record[Idx++];
10281 StringRef
Result = Blob.substr(0, Len);
10282 Blob = Blob.substr(Len);
10306 unsigned Major =
Record[Idx++];
10307 unsigned Minor =
Record[Idx++];
10308 unsigned Subminor =
Record[Idx++];
10310 return VersionTuple(Major);
10312 return VersionTuple(Major, Minor - 1);
10313 return VersionTuple(Major, Minor - 1, Subminor - 1);
10324 return Diag(CurrentImportLoc, DiagID);
10328 return Diags.Report(Loc, DiagID);
10332 llvm::function_ref<
void()> Fn) {
10335 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10339 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10345 return PP.getIdentifierTable();
10351 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10352 "Already have a SwitchCase with this ID");
10353 (*CurrSwitchCaseStmts)[ID] = SC;
10358 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10359 return (*CurrSwitchCaseStmts)[ID];
10363 CurrSwitchCaseStmts->clear();
10368 std::vector<RawComment *> Comments;
10375 BitstreamCursor &Cursor = I->first;
10382 Cursor.advanceSkippingSubblocks(
10383 BitstreamCursor::AF_DontPopBlockAtEnd);
10385 Error(MaybeEntry.takeError());
10388 llvm::BitstreamEntry Entry = MaybeEntry.get();
10390 switch (Entry.Kind) {
10391 case llvm::BitstreamEntry::SubBlock:
10392 case llvm::BitstreamEntry::Error:
10393 Error(
"malformed block record in AST file");
10395 case llvm::BitstreamEntry::EndBlock:
10397 case llvm::BitstreamEntry::Record:
10405 if (!MaybeComment) {
10406 Error(MaybeComment.takeError());
10415 bool IsTrailingComment =
Record[Idx++];
10416 bool IsAlmostTrailingComment =
Record[Idx++];
10417 Comments.push_back(
new (Context)
RawComment(
10418 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10428 if (Loc.first.isValid())
10429 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10442 assert(NumUserInputs <= NumInputs);
10443 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10444 for (
unsigned I = 0; I < N; ++I) {
10445 bool IsSystem = I >= NumUserInputs;
10447 Visitor(IFI, IsSystem);
10452 bool IncludeSystem,
bool Complain,
10454 bool isSystem)> Visitor) {
10457 assert(NumUserInputs <= NumInputs);
10458 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10459 for (
unsigned I = 0; I < N; ++I) {
10460 bool IsSystem = I >= NumUserInputs;
10461 InputFile IF = getInputFile(MF, I+1, Complain);
10462 Visitor(IF, IsSystem);
10470 for (
unsigned I = 0; I < NumInputs; ++I) {
10473 if (
auto FE = getInputFile(MF, I + 1).getFile())
10478void ASTReader::finishPendingActions() {
10479 while (!PendingIdentifierInfos.empty() ||
10480 !PendingDeducedFunctionTypes.empty() ||
10481 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10482 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10483 !PendingUpdateRecords.empty() ||
10484 !PendingObjCExtensionIvarRedeclarations.empty()) {
10487 using TopLevelDeclsMap =
10488 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10489 TopLevelDeclsMap TopLevelDecls;
10491 while (!PendingIdentifierInfos.empty()) {
10494 std::move(PendingIdentifierInfos.back().second);
10495 PendingIdentifierInfos.pop_back();
10502 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10503 auto *FD = PendingDeducedFunctionTypes[I].first;
10504 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10506 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10509 if (DT->isDeduced()) {
10510 PendingDeducedTypeUpdates.insert(
10511 {FD->getCanonicalDecl(), FD->getReturnType()});
10518 PendingUndeducedFunctionDecls.push_back(FD);
10522 PendingDeducedFunctionTypes.clear();
10526 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10527 auto *VD = PendingDeducedVarTypes[I].first;
10528 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10530 PendingDeducedVarTypes.clear();
10533 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10534 loadPendingDeclChain(PendingDeclChains[I].first,
10535 PendingDeclChains[I].second);
10536 PendingDeclChains.clear();
10539 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10540 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10541 IdentifierInfo *II = TLD->first;
10542 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10548 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10549 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10550 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10551 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10553 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10555 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10556 if (!Info.M->isModule())
10560 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10562 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10563 if (Info.M->isModule())
10567 PendingMacroIDs.clear();
10571 while (!PendingDeclContextInfos.empty()) {
10572 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10573 PendingDeclContextInfos.pop_front();
10576 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10580 while (!PendingUpdateRecords.empty()) {
10581 auto Update = PendingUpdateRecords.pop_back_val();
10582 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10583 loadDeclUpdateRecords(
Update);
10586 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10587 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10588 auto DuplicateIvars =
10589 PendingObjCExtensionIvarRedeclarations.back().second;
10591 StructuralEquivalenceContext Ctx(
10592 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10593 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10597 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10599 for (
auto IvarPair : DuplicateIvars) {
10600 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10602 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10608 ExtensionsPair.first->setInvalidDecl();
10609 ExtensionsPair.second->getClassInterface()
10611 ->setIvarList(
nullptr);
10613 for (
auto IvarPair : DuplicateIvars) {
10614 Diag(IvarPair.first->getLocation(),
10615 diag::err_duplicate_ivar_declaration)
10616 << IvarPair.first->getIdentifier();
10617 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10620 PendingObjCExtensionIvarRedeclarations.pop_back();
10626 assert(PendingFakeDefinitionData.empty() &&
10627 "faked up a class definition but never saw the real one");
10633 for (Decl *D : PendingDefinitions) {
10634 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10635 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10636 for (
auto *R = getMostRecentExistingDecl(RD); R;
10637 R = R->getPreviousDecl()) {
10640 "declaration thinks it's the definition but it isn't");
10648 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10653 for (
auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
10659 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10660 for (
auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
10667 for (
auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
10670 PendingDefinitions.clear();
10672 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10673 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10674 if (
auto *VD = dyn_cast<VarDecl>(D))
10675 return VD->isThisDeclarationADefinition() ||
10676 VD->isThisDeclarationADemotedDefinition();
10678 if (
auto *TD = dyn_cast<TagDecl>(D))
10679 return TD->isThisDeclarationADefinition() ||
10680 TD->isThisDeclarationADemotedDefinition();
10682 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10683 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10685 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10686 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10693 return hasDefinitionImpl(D, hasDefinitionImpl);
10709 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10715 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10716 PBEnd = PendingBodies.end();
10717 PB != PBEnd; ++PB) {
10718 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10720 const FunctionDecl *Defn =
nullptr;
10721 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10722 FD->setLazyBody(PB->second);
10724 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10727 if (!FD->isLateTemplateParsed() &&
10728 !NonConstDefn->isLateTemplateParsed() &&
10733 FD->getODRHash() != NonConstDefn->getODRHash()) {
10735 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10736 }
else if (FD->getLexicalParent()->isFileContext() &&
10737 NonConstDefn->getLexicalParent()->isFileContext()) {
10741 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10752 PendingBodies.clear();
10755 for (
auto [RD, MD] : PendingAddedClassMembers) {
10756 RD->addedMember(MD);
10758 PendingAddedClassMembers.clear();
10761 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10763 PendingMergedDefinitionsToDeduplicate.clear();
10767 for (Decl *D : PendingIncompleteDeclChains)
10768 markIncompleteDeclChain(D);
10769 PendingIncompleteDeclChains.clear();
10771 assert(PendingIdentifierInfos.empty() &&
10772 "Should be empty at the end of finishPendingActions");
10773 assert(PendingDeducedFunctionTypes.empty() &&
10774 "Should be empty at the end of finishPendingActions");
10775 assert(PendingDeducedVarTypes.empty() &&
10776 "Should be empty at the end of finishPendingActions");
10777 assert(PendingDeclChains.empty() &&
10778 "Should be empty at the end of finishPendingActions");
10779 assert(PendingMacroIDs.empty() &&
10780 "Should be empty at the end of finishPendingActions");
10781 assert(PendingDeclContextInfos.empty() &&
10782 "Should be empty at the end of finishPendingActions");
10783 assert(PendingUpdateRecords.empty() &&
10784 "Should be empty at the end of finishPendingActions");
10785 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10786 "Should be empty at the end of finishPendingActions");
10787 assert(PendingFakeDefinitionData.empty() &&
10788 "Should be empty at the end of finishPendingActions");
10789 assert(PendingDefinitions.empty() &&
10790 "Should be empty at the end of finishPendingActions");
10791 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10792 "Should be empty at the end of finishPendingActions");
10793 assert(PendingBodies.empty() &&
10794 "Should be empty at the end of finishPendingActions");
10795 assert(PendingAddedClassMembers.empty() &&
10796 "Should be empty at the end of finishPendingActions");
10797 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10798 "Should be empty at the end of finishPendingActions");
10799 assert(PendingIncompleteDeclChains.empty() &&
10800 "Should be empty at the end of finishPendingActions");
10803void ASTReader::diagnoseOdrViolations() {
10804 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10805 PendingRecordOdrMergeFailures.empty() &&
10806 PendingFunctionOdrMergeFailures.empty() &&
10807 PendingEnumOdrMergeFailures.empty() &&
10808 PendingObjCInterfaceOdrMergeFailures.empty() &&
10809 PendingObjCProtocolOdrMergeFailures.empty())
10816 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10817 PendingOdrMergeFailures.clear();
10818 for (
auto &Merge : OdrMergeFailures) {
10819 Merge.first->buildLookup();
10820 Merge.first->decls_begin();
10821 Merge.first->bases_begin();
10822 Merge.first->vbases_begin();
10823 for (
auto &RecordPair : Merge.second) {
10824 auto *RD = RecordPair.first;
10832 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
10833 PendingRecordOdrMergeFailures.clear();
10834 for (
auto &Merge : RecordOdrMergeFailures) {
10835 Merge.first->decls_begin();
10836 for (
auto &D : Merge.second)
10841 auto ObjCInterfaceOdrMergeFailures =
10842 std::move(PendingObjCInterfaceOdrMergeFailures);
10843 PendingObjCInterfaceOdrMergeFailures.clear();
10844 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
10845 Merge.first->decls_begin();
10846 for (
auto &InterfacePair : Merge.second)
10847 InterfacePair.first->decls_begin();
10851 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
10852 PendingFunctionOdrMergeFailures.clear();
10853 for (
auto &Merge : FunctionOdrMergeFailures) {
10854 Merge.first->buildLookup();
10855 Merge.first->decls_begin();
10856 Merge.first->getBody();
10857 for (
auto &FD : Merge.second) {
10865 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
10866 PendingEnumOdrMergeFailures.clear();
10867 for (
auto &Merge : EnumOdrMergeFailures) {
10868 Merge.first->decls_begin();
10869 for (
auto &
Enum : Merge.second) {
10870 Enum->decls_begin();
10875 auto ObjCProtocolOdrMergeFailures =
10876 std::move(PendingObjCProtocolOdrMergeFailures);
10877 PendingObjCProtocolOdrMergeFailures.clear();
10878 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
10879 Merge.first->decls_begin();
10880 for (
auto &ProtocolPair : Merge.second)
10881 ProtocolPair.first->decls_begin();
10890 while (!PendingOdrMergeChecks.empty()) {
10891 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
10902 bool Found =
false;
10905 for (
auto *RI : D->
redecls()) {
10906 if (RI->getLexicalDeclContext() == CanonDef) {
10920 llvm::SmallVector<const NamedDecl*, 4> Candidates;
10921 for (
auto *CanonMember : CanonDef->
decls()) {
10922 if (CanonMember->getCanonicalDecl() == DCanon) {
10931 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
10933 Candidates.push_back(ND);
10946 std::string CanonDefModule =
10951 << CanonDef << CanonDefModule.empty() << CanonDefModule;
10953 if (Candidates.empty())
10955 diag::note_module_odr_violation_no_possible_decls) << D;
10957 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
10958 Diag(Candidates[I]->getLocation(),
10959 diag::note_module_odr_violation_possible_decl)
10963 DiagnosedOdrMergeFailures.insert(CanonDef);
10967 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
10968 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
10969 ObjCInterfaceOdrMergeFailures.empty() &&
10970 ObjCProtocolOdrMergeFailures.empty())
10973 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
10977 for (
auto &Merge : OdrMergeFailures) {
10980 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
10983 bool Diagnosed =
false;
10984 CXXRecordDecl *FirstRecord = Merge.first;
10985 for (
auto &RecordPair : Merge.second) {
10986 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
10987 RecordPair.second)) {
11000 Diag(Merge.first->getLocation(),
11001 diag::err_module_odr_violation_different_instantiations)
11008 for (
auto &Merge : RecordOdrMergeFailures) {
11011 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11014 RecordDecl *FirstRecord = Merge.first;
11015 bool Diagnosed =
false;
11016 for (
auto *SecondRecord : Merge.second) {
11017 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11023 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11027 for (
auto &Merge : FunctionOdrMergeFailures) {
11028 FunctionDecl *FirstFunction = Merge.first;
11029 bool Diagnosed =
false;
11030 for (
auto &SecondFunction : Merge.second) {
11031 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11037 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11041 for (
auto &Merge : EnumOdrMergeFailures) {
11044 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11047 EnumDecl *FirstEnum = Merge.first;
11048 bool Diagnosed =
false;
11049 for (
auto &SecondEnum : Merge.second) {
11050 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11056 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11059 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11062 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11065 bool Diagnosed =
false;
11066 ObjCInterfaceDecl *FirstID = Merge.first;
11067 for (
auto &InterfacePair : Merge.second) {
11068 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11069 InterfacePair.second)) {
11075 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11078 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11081 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11084 ObjCProtocolDecl *FirstProtocol = Merge.first;
11085 bool Diagnosed =
false;
11086 for (
auto &ProtocolPair : Merge.second) {
11087 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11088 ProtocolPair.second)) {
11094 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11099 if (llvm::Timer *
T = ReadTimer.get();
11100 ++NumCurrentElementsDeserializing == 1 &&
T)
11101 ReadTimeRegion.emplace(
T);
11105 assert(NumCurrentElementsDeserializing &&
11106 "FinishedDeserializing not paired with StartedDeserializing");
11107 if (NumCurrentElementsDeserializing == 1) {
11110 finishPendingActions();
11112 --NumCurrentElementsDeserializing;
11114 if (NumCurrentElementsDeserializing == 0) {
11118 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11126 while (!PendingExceptionSpecUpdates.empty() ||
11127 !PendingDeducedTypeUpdates.empty() ||
11128 !PendingUndeducedFunctionDecls.empty()) {
11129 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11130 PendingExceptionSpecUpdates.clear();
11131 for (
auto Update : ESUpdates) {
11132 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11135 if (
auto *Listener =
getContext().getASTMutationListener())
11137 for (
auto *Redecl :
Update.second->redecls())
11141 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11142 PendingDeducedTypeUpdates.clear();
11143 for (
auto Update : DTUpdates) {
11144 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11151 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11152 PendingUndeducedFunctionDecls.clear();
11156 (void)UndeducedFD->getMostRecentDecl();
11159 ReadTimeRegion.reset();
11161 diagnoseOdrViolations();
11167 PassInterestingDeclsToConsumer();
11174 auto It = PendingFakeLookupResults.find(II);
11175 if (It != PendingFakeLookupResults.end()) {
11176 for (
auto *ND : It->second)
11181 It->second.clear();
11185 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11186 SemaObj->TUScope->AddDecl(D);
11187 }
else if (SemaObj->TUScope) {
11191 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11192 SemaObj->TUScope->AddDecl(D);
11200 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11201 StringRef isysroot,
11203 bool AllowASTWithCompilerErrors,
11204 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11205 bool ForceValidateUserInputs,
11206 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11207 std::unique_ptr<llvm::Timer> ReadTimer)
11212 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11213 StackHandler(Diags), PP(PP), ContextObj(Context),
11214 CodeGenOpts(CodeGenOpts),
11216 PP.getHeaderSearchInfo()),
11217 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11218 DisableValidationKind(DisableValidationKind),
11219 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11220 AllowConfigurationMismatch(AllowConfigurationMismatch),
11221 ValidateSystemInputs(ValidateSystemInputs),
11222 ForceValidateUserInputs(ForceValidateUserInputs),
11223 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11224 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11225 SourceMgr.setExternalSLocEntrySource(
this);
11227 PathBuf.reserve(256);
11229 for (
const auto &Ext : Extensions) {
11230 auto BlockName = Ext->getExtensionMetadata().BlockName;
11231 auto Known = ModuleFileExtensions.find(BlockName);
11232 if (Known != ModuleFileExtensions.end()) {
11233 Diags.Report(diag::warn_duplicate_module_file_extension)
11238 ModuleFileExtensions.insert({BlockName, Ext});
11243 if (OwnsDeserializationListener)
11244 delete DeserializationListener;
11248 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11252 unsigned AbbrevID) {
11255 return Cursor.readRecord(AbbrevID, Record);
11271 : Record(Record), Context(Record.getContext()) {}
11272#define GEN_CLANG_CLAUSE_CLASS
11273#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11274#include "llvm/Frontend/OpenMP/OMP.inc"
11288 switch (llvm::omp::Clause(Record.readInt())) {
11289 case llvm::omp::OMPC_if:
11292 case llvm::omp::OMPC_final:
11295 case llvm::omp::OMPC_num_threads:
11298 case llvm::omp::OMPC_safelen:
11301 case llvm::omp::OMPC_simdlen:
11304 case llvm::omp::OMPC_sizes: {
11305 unsigned NumSizes = Record.readInt();
11309 case llvm::omp::OMPC_permutation: {
11310 unsigned NumLoops = Record.readInt();
11314 case llvm::omp::OMPC_full:
11317 case llvm::omp::OMPC_partial:
11320 case llvm::omp::OMPC_looprange:
11323 case llvm::omp::OMPC_allocator:
11326 case llvm::omp::OMPC_collapse:
11329 case llvm::omp::OMPC_default:
11332 case llvm::omp::OMPC_proc_bind:
11335 case llvm::omp::OMPC_schedule:
11338 case llvm::omp::OMPC_ordered:
11341 case llvm::omp::OMPC_nowait:
11344 case llvm::omp::OMPC_untied:
11347 case llvm::omp::OMPC_mergeable:
11350 case llvm::omp::OMPC_threadset:
11353 case llvm::omp::OMPC_read:
11356 case llvm::omp::OMPC_write:
11359 case llvm::omp::OMPC_update:
11362 case llvm::omp::OMPC_capture:
11365 case llvm::omp::OMPC_compare:
11368 case llvm::omp::OMPC_fail:
11371 case llvm::omp::OMPC_seq_cst:
11374 case llvm::omp::OMPC_acq_rel:
11377 case llvm::omp::OMPC_absent: {
11378 unsigned NumKinds = Record.readInt();
11382 case llvm::omp::OMPC_holds:
11385 case llvm::omp::OMPC_contains: {
11386 unsigned NumKinds = Record.readInt();
11390 case llvm::omp::OMPC_no_openmp:
11393 case llvm::omp::OMPC_no_openmp_routines:
11396 case llvm::omp::OMPC_no_openmp_constructs:
11399 case llvm::omp::OMPC_no_parallelism:
11402 case llvm::omp::OMPC_acquire:
11405 case llvm::omp::OMPC_release:
11408 case llvm::omp::OMPC_relaxed:
11411 case llvm::omp::OMPC_weak:
11414 case llvm::omp::OMPC_threads:
11417 case llvm::omp::OMPC_simd:
11420 case llvm::omp::OMPC_nogroup:
11423 case llvm::omp::OMPC_unified_address:
11426 case llvm::omp::OMPC_unified_shared_memory:
11429 case llvm::omp::OMPC_reverse_offload:
11432 case llvm::omp::OMPC_dynamic_allocators:
11435 case llvm::omp::OMPC_atomic_default_mem_order:
11438 case llvm::omp::OMPC_self_maps:
11441 case llvm::omp::OMPC_at:
11444 case llvm::omp::OMPC_severity:
11447 case llvm::omp::OMPC_message:
11450 case llvm::omp::OMPC_private:
11453 case llvm::omp::OMPC_firstprivate:
11456 case llvm::omp::OMPC_lastprivate:
11459 case llvm::omp::OMPC_shared:
11462 case llvm::omp::OMPC_reduction: {
11463 unsigned N = Record.readInt();
11468 case llvm::omp::OMPC_task_reduction:
11471 case llvm::omp::OMPC_in_reduction:
11474 case llvm::omp::OMPC_linear:
11477 case llvm::omp::OMPC_aligned:
11480 case llvm::omp::OMPC_copyin:
11483 case llvm::omp::OMPC_copyprivate:
11486 case llvm::omp::OMPC_flush:
11489 case llvm::omp::OMPC_depobj:
11492 case llvm::omp::OMPC_depend: {
11493 unsigned NumVars = Record.readInt();
11494 unsigned NumLoops = Record.readInt();
11498 case llvm::omp::OMPC_device:
11501 case llvm::omp::OMPC_map: {
11503 Sizes.
NumVars = Record.readInt();
11510 case llvm::omp::OMPC_num_teams:
11513 case llvm::omp::OMPC_thread_limit:
11516 case llvm::omp::OMPC_priority:
11519 case llvm::omp::OMPC_grainsize:
11522 case llvm::omp::OMPC_num_tasks:
11525 case llvm::omp::OMPC_hint:
11528 case llvm::omp::OMPC_dist_schedule:
11531 case llvm::omp::OMPC_defaultmap:
11534 case llvm::omp::OMPC_to: {
11536 Sizes.
NumVars = Record.readInt();
11543 case llvm::omp::OMPC_from: {
11545 Sizes.
NumVars = Record.readInt();
11552 case llvm::omp::OMPC_use_device_ptr: {
11554 Sizes.
NumVars = Record.readInt();
11561 case llvm::omp::OMPC_use_device_addr: {
11563 Sizes.
NumVars = Record.readInt();
11570 case llvm::omp::OMPC_is_device_ptr: {
11572 Sizes.
NumVars = Record.readInt();
11579 case llvm::omp::OMPC_has_device_addr: {
11581 Sizes.
NumVars = Record.readInt();
11588 case llvm::omp::OMPC_allocate:
11591 case llvm::omp::OMPC_nontemporal:
11594 case llvm::omp::OMPC_inclusive:
11597 case llvm::omp::OMPC_exclusive:
11600 case llvm::omp::OMPC_order:
11603 case llvm::omp::OMPC_init:
11606 case llvm::omp::OMPC_use:
11609 case llvm::omp::OMPC_destroy:
11612 case llvm::omp::OMPC_novariants:
11615 case llvm::omp::OMPC_nocontext:
11618 case llvm::omp::OMPC_detach:
11621 case llvm::omp::OMPC_uses_allocators:
11624 case llvm::omp::OMPC_affinity:
11627 case llvm::omp::OMPC_filter:
11630 case llvm::omp::OMPC_bind:
11633 case llvm::omp::OMPC_align:
11636 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11639 case llvm::omp::OMPC_dyn_groupprivate:
11642 case llvm::omp::OMPC_doacross: {
11643 unsigned NumVars = Record.readInt();
11644 unsigned NumLoops = Record.readInt();
11648 case llvm::omp::OMPC_ompx_attribute:
11651 case llvm::omp::OMPC_ompx_bare:
11654#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11655 case llvm::omp::Enum: \
11657#include "llvm/Frontend/OpenMP/OMPKinds.def"
11661 assert(
C &&
"Unknown OMPClause type");
11664 C->setLocStart(Record.readSourceLocation());
11665 C->setLocEnd(Record.readSourceLocation());
11671 C->setPreInitStmt(Record.readSubStmt(),
11677 C->setPostUpdateExpr(Record.readSubExpr());
11680void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11683 C->setNameModifierLoc(
Record.readSourceLocation());
11684 C->setColonLoc(
Record.readSourceLocation());
11685 C->setCondition(
Record.readSubExpr());
11686 C->setLParenLoc(
Record.readSourceLocation());
11691 C->setCondition(
Record.readSubExpr());
11692 C->setLParenLoc(
Record.readSourceLocation());
11698 C->setNumThreads(Record.readSubExpr());
11699 C->setModifierLoc(Record.readSourceLocation());
11700 C->setLParenLoc(Record.readSourceLocation());
11704 C->setSafelen(Record.readSubExpr());
11705 C->setLParenLoc(Record.readSourceLocation());
11709 C->setSimdlen(Record.readSubExpr());
11710 C->setLParenLoc(Record.readSourceLocation());
11714 for (Expr *&E :
C->getSizesRefs())
11715 E = Record.readSubExpr();
11716 C->setLParenLoc(Record.readSourceLocation());
11720 for (Expr *&E :
C->getArgsRefs())
11721 E = Record.readSubExpr();
11722 C->setLParenLoc(Record.readSourceLocation());
11728 C->setFactor(Record.readSubExpr());
11729 C->setLParenLoc(Record.readSourceLocation());
11733 C->setFirst(Record.readSubExpr());
11734 C->setCount(Record.readSubExpr());
11735 C->setLParenLoc(Record.readSourceLocation());
11736 C->setFirstLoc(Record.readSourceLocation());
11737 C->setCountLoc(Record.readSourceLocation());
11741 C->setAllocator(Record.readExpr());
11742 C->setLParenLoc(Record.readSourceLocation());
11746 C->setNumForLoops(Record.readSubExpr());
11747 C->setLParenLoc(Record.readSourceLocation());
11751 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11752 C->setLParenLoc(Record.readSourceLocation());
11753 C->setDefaultKindKwLoc(Record.readSourceLocation());
11754 C->setDefaultVariableCategory(
11756 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11762 C->setLParenLoc(Record.readSourceLocation());
11763 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11764 C->setThreadsetKindLoc(ThreadsetKindLoc);
11767 C->setThreadsetKind(TKind);
11771 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11772 C->setLParenLoc(Record.readSourceLocation());
11773 C->setProcBindKindKwLoc(Record.readSourceLocation());
11778 C->setScheduleKind(
11780 C->setFirstScheduleModifier(
11782 C->setSecondScheduleModifier(
11784 C->setChunkSize(Record.readSubExpr());
11785 C->setLParenLoc(Record.readSourceLocation());
11786 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11787 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11788 C->setScheduleKindLoc(Record.readSourceLocation());
11789 C->setCommaLoc(Record.readSourceLocation());
11793 C->setNumForLoops(Record.readSubExpr());
11794 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11795 C->setLoopNumIterations(I, Record.readSubExpr());
11796 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11797 C->setLoopCounter(I, Record.readSubExpr());
11798 C->setLParenLoc(Record.readSourceLocation());
11802 C->setEventHandler(Record.readSubExpr());
11803 C->setLParenLoc(Record.readSourceLocation());
11807 C->setCondition(Record.readSubExpr());
11808 C->setLParenLoc(Record.readSourceLocation());
11815void OMPClauseReader::VisitOMPReadClause(
OMPReadClause *) {}
11820 if (
C->isExtended()) {
11821 C->setLParenLoc(Record.readSourceLocation());
11822 C->setArgumentLoc(Record.readSourceLocation());
11834 C->setLParenLoc(Record.readSourceLocation());
11835 SourceLocation FailParameterLoc = Record.readSourceLocation();
11836 C->setFailParameterLoc(FailParameterLoc);
11838 C->setFailParameter(CKind);
11842 unsigned Count =
C->getDirectiveKinds().size();
11843 C->setLParenLoc(Record.readSourceLocation());
11844 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11845 DKVec.reserve(Count);
11846 for (
unsigned I = 0; I < Count; I++) {
11849 C->setDirectiveKinds(DKVec);
11853 C->setExpr(Record.readExpr());
11854 C->setLParenLoc(Record.readSourceLocation());
11858 unsigned Count =
C->getDirectiveKinds().size();
11859 C->setLParenLoc(Record.readSourceLocation());
11860 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
11861 DKVec.reserve(Count);
11862 for (
unsigned I = 0; I < Count; I++) {
11865 C->setDirectiveKinds(DKVec);
11870void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
11873void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
11888void OMPClauseReader::VisitOMPWeakClause(
OMPWeakClause *) {}
11892void OMPClauseReader::VisitOMPSIMDClause(
OMPSIMDClause *) {}
11897 unsigned NumVars =
C->varlist_size();
11898 SmallVector<Expr *, 16> Vars;
11899 Vars.reserve(NumVars);
11900 for (
unsigned I = 0; I != NumVars; ++I)
11901 Vars.push_back(Record.readSubExpr());
11902 C->setVarRefs(Vars);
11903 C->setIsTarget(Record.readBool());
11904 C->setIsTargetSync(Record.readBool());
11905 C->setLParenLoc(Record.readSourceLocation());
11906 C->setVarLoc(Record.readSourceLocation());
11910 C->setInteropVar(Record.readSubExpr());
11911 C->setLParenLoc(Record.readSourceLocation());
11912 C->setVarLoc(Record.readSourceLocation());
11916 C->setInteropVar(Record.readSubExpr());
11917 C->setLParenLoc(Record.readSourceLocation());
11918 C->setVarLoc(Record.readSourceLocation());
11923 C->setCondition(Record.readSubExpr());
11924 C->setLParenLoc(Record.readSourceLocation());
11929 C->setCondition(Record.readSubExpr());
11930 C->setLParenLoc(Record.readSourceLocation());
11935void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
11944void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
11946 C->setAtomicDefaultMemOrderKind(
11948 C->setLParenLoc(Record.readSourceLocation());
11949 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
11954void OMPClauseReader::VisitOMPAtClause(
OMPAtClause *
C) {
11956 C->setLParenLoc(Record.readSourceLocation());
11957 C->setAtKindKwLoc(Record.readSourceLocation());
11962 C->setLParenLoc(Record.readSourceLocation());
11963 C->setSeverityKindKwLoc(Record.readSourceLocation());
11968 C->setMessageString(Record.readSubExpr());
11969 C->setLParenLoc(Record.readSourceLocation());
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);
11981 for (
unsigned i = 0; i != NumVars; ++i)
11982 Vars.push_back(Record.readSubExpr());
11983 C->setPrivateCopies(Vars);
11988 C->setLParenLoc(Record.readSourceLocation());
11989 unsigned NumVars =
C->varlist_size();
11990 SmallVector<Expr *, 16> Vars;
11991 Vars.reserve(NumVars);
11992 for (
unsigned i = 0; i != NumVars; ++i)
11993 Vars.push_back(Record.readSubExpr());
11994 C->setVarRefs(Vars);
11996 for (
unsigned i = 0; i != NumVars; ++i)
11997 Vars.push_back(Record.readSubExpr());
11998 C->setPrivateCopies(Vars);
12000 for (
unsigned i = 0; i != NumVars; ++i)
12001 Vars.push_back(Record.readSubExpr());
12007 C->setLParenLoc(Record.readSourceLocation());
12009 C->setKindLoc(Record.readSourceLocation());
12010 C->setColonLoc(Record.readSourceLocation());
12011 unsigned NumVars =
C->varlist_size();
12012 SmallVector<Expr *, 16> Vars;
12013 Vars.reserve(NumVars);
12014 for (
unsigned i = 0; i != NumVars; ++i)
12015 Vars.push_back(Record.readSubExpr());
12016 C->setVarRefs(Vars);
12018 for (
unsigned i = 0; i != NumVars; ++i)
12019 Vars.push_back(Record.readSubExpr());
12020 C->setPrivateCopies(Vars);
12022 for (
unsigned i = 0; i != NumVars; ++i)
12023 Vars.push_back(Record.readSubExpr());
12024 C->setSourceExprs(Vars);
12026 for (
unsigned i = 0; i != NumVars; ++i)
12027 Vars.push_back(Record.readSubExpr());
12028 C->setDestinationExprs(Vars);
12030 for (
unsigned i = 0; i != NumVars; ++i)
12031 Vars.push_back(Record.readSubExpr());
12032 C->setAssignmentOps(Vars);
12036 C->setLParenLoc(Record.readSourceLocation());
12037 unsigned NumVars =
C->varlist_size();
12038 SmallVector<Expr *, 16> Vars;
12039 Vars.reserve(NumVars);
12040 for (
unsigned i = 0; i != NumVars; ++i)
12041 Vars.push_back(Record.readSubExpr());
12042 C->setVarRefs(Vars);
12047 C->setLParenLoc(Record.readSourceLocation());
12048 C->setModifierLoc(Record.readSourceLocation());
12049 C->setColonLoc(Record.readSourceLocation());
12050 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12051 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12052 C->setQualifierLoc(NNSL);
12053 C->setNameInfo(DNI);
12055 unsigned NumVars =
C->varlist_size();
12056 SmallVector<Expr *, 16> Vars;
12057 Vars.reserve(NumVars);
12058 for (
unsigned i = 0; i != NumVars; ++i)
12059 Vars.push_back(Record.readSubExpr());
12060 C->setVarRefs(Vars);
12062 for (
unsigned i = 0; i != NumVars; ++i)
12063 Vars.push_back(Record.readSubExpr());
12064 C->setPrivates(Vars);
12066 for (
unsigned i = 0; i != NumVars; ++i)
12067 Vars.push_back(Record.readSubExpr());
12068 C->setLHSExprs(Vars);
12070 for (
unsigned i = 0; i != NumVars; ++i)
12071 Vars.push_back(Record.readSubExpr());
12072 C->setRHSExprs(Vars);
12074 for (
unsigned i = 0; i != NumVars; ++i)
12075 Vars.push_back(Record.readSubExpr());
12076 C->setReductionOps(Vars);
12077 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12079 for (
unsigned i = 0; i != NumVars; ++i)
12080 Vars.push_back(Record.readSubExpr());
12081 C->setInscanCopyOps(Vars);
12083 for (
unsigned i = 0; i != NumVars; ++i)
12084 Vars.push_back(Record.readSubExpr());
12085 C->setInscanCopyArrayTemps(Vars);
12087 for (
unsigned i = 0; i != NumVars; ++i)
12088 Vars.push_back(Record.readSubExpr());
12089 C->setInscanCopyArrayElems(Vars);
12091 unsigned NumFlags = Record.readInt();
12092 SmallVector<bool, 16> Flags;
12093 Flags.reserve(NumFlags);
12094 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12095 Flags.push_back(Record.readInt());
12096 C->setPrivateVariableReductionFlags(Flags);
12101 C->setLParenLoc(Record.readSourceLocation());
12102 C->setColonLoc(Record.readSourceLocation());
12103 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12104 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12105 C->setQualifierLoc(NNSL);
12106 C->setNameInfo(DNI);
12108 unsigned NumVars =
C->varlist_size();
12109 SmallVector<Expr *, 16> Vars;
12110 Vars.reserve(NumVars);
12111 for (
unsigned I = 0; I != NumVars; ++I)
12112 Vars.push_back(Record.readSubExpr());
12113 C->setVarRefs(Vars);
12115 for (
unsigned I = 0; I != NumVars; ++I)
12116 Vars.push_back(Record.readSubExpr());
12117 C->setPrivates(Vars);
12119 for (
unsigned I = 0; I != NumVars; ++I)
12120 Vars.push_back(Record.readSubExpr());
12121 C->setLHSExprs(Vars);
12123 for (
unsigned I = 0; I != NumVars; ++I)
12124 Vars.push_back(Record.readSubExpr());
12125 C->setRHSExprs(Vars);
12127 for (
unsigned I = 0; I != NumVars; ++I)
12128 Vars.push_back(Record.readSubExpr());
12129 C->setReductionOps(Vars);
12134 C->setLParenLoc(Record.readSourceLocation());
12135 C->setColonLoc(Record.readSourceLocation());
12136 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12137 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12138 C->setQualifierLoc(NNSL);
12139 C->setNameInfo(DNI);
12141 unsigned NumVars =
C->varlist_size();
12142 SmallVector<Expr *, 16> Vars;
12143 Vars.reserve(NumVars);
12144 for (
unsigned I = 0; I != NumVars; ++I)
12145 Vars.push_back(Record.readSubExpr());
12146 C->setVarRefs(Vars);
12148 for (
unsigned I = 0; I != NumVars; ++I)
12149 Vars.push_back(Record.readSubExpr());
12150 C->setPrivates(Vars);
12152 for (
unsigned I = 0; I != NumVars; ++I)
12153 Vars.push_back(Record.readSubExpr());
12154 C->setLHSExprs(Vars);
12156 for (
unsigned I = 0; I != NumVars; ++I)
12157 Vars.push_back(Record.readSubExpr());
12158 C->setRHSExprs(Vars);
12160 for (
unsigned I = 0; I != NumVars; ++I)
12161 Vars.push_back(Record.readSubExpr());
12162 C->setReductionOps(Vars);
12164 for (
unsigned I = 0; I != NumVars; ++I)
12165 Vars.push_back(Record.readSubExpr());
12166 C->setTaskgroupDescriptors(Vars);
12171 C->setLParenLoc(Record.readSourceLocation());
12172 C->setColonLoc(Record.readSourceLocation());
12174 C->setModifierLoc(Record.readSourceLocation());
12175 unsigned NumVars =
C->varlist_size();
12176 SmallVector<Expr *, 16> Vars;
12177 Vars.reserve(NumVars);
12178 for (
unsigned i = 0; i != NumVars; ++i)
12179 Vars.push_back(Record.readSubExpr());
12180 C->setVarRefs(Vars);
12182 for (
unsigned i = 0; i != NumVars; ++i)
12183 Vars.push_back(Record.readSubExpr());
12184 C->setPrivates(Vars);
12186 for (
unsigned i = 0; i != NumVars; ++i)
12187 Vars.push_back(Record.readSubExpr());
12190 for (
unsigned i = 0; i != NumVars; ++i)
12191 Vars.push_back(Record.readSubExpr());
12192 C->setUpdates(Vars);
12194 for (
unsigned i = 0; i != NumVars; ++i)
12195 Vars.push_back(Record.readSubExpr());
12196 C->setFinals(Vars);
12197 C->setStep(Record.readSubExpr());
12198 C->setCalcStep(Record.readSubExpr());
12200 for (
unsigned I = 0; I != NumVars + 1; ++I)
12201 Vars.push_back(Record.readSubExpr());
12202 C->setUsedExprs(Vars);
12206 C->setLParenLoc(Record.readSourceLocation());
12207 C->setColonLoc(Record.readSourceLocation());
12208 unsigned NumVars =
C->varlist_size();
12209 SmallVector<Expr *, 16> Vars;
12210 Vars.reserve(NumVars);
12211 for (
unsigned i = 0; i != NumVars; ++i)
12212 Vars.push_back(Record.readSubExpr());
12213 C->setVarRefs(Vars);
12214 C->setAlignment(Record.readSubExpr());
12218 C->setLParenLoc(Record.readSourceLocation());
12219 unsigned NumVars =
C->varlist_size();
12220 SmallVector<Expr *, 16> Exprs;
12221 Exprs.reserve(NumVars);
12222 for (
unsigned i = 0; i != NumVars; ++i)
12223 Exprs.push_back(Record.readSubExpr());
12224 C->setVarRefs(Exprs);
12226 for (
unsigned i = 0; i != NumVars; ++i)
12227 Exprs.push_back(Record.readSubExpr());
12228 C->setSourceExprs(Exprs);
12230 for (
unsigned i = 0; i != NumVars; ++i)
12231 Exprs.push_back(Record.readSubExpr());
12232 C->setDestinationExprs(Exprs);
12234 for (
unsigned i = 0; i != NumVars; ++i)
12235 Exprs.push_back(Record.readSubExpr());
12236 C->setAssignmentOps(Exprs);
12240 C->setLParenLoc(Record.readSourceLocation());
12241 unsigned NumVars =
C->varlist_size();
12242 SmallVector<Expr *, 16> Exprs;
12243 Exprs.reserve(NumVars);
12244 for (
unsigned i = 0; i != NumVars; ++i)
12245 Exprs.push_back(Record.readSubExpr());
12246 C->setVarRefs(Exprs);
12248 for (
unsigned i = 0; i != NumVars; ++i)
12249 Exprs.push_back(Record.readSubExpr());
12250 C->setSourceExprs(Exprs);
12252 for (
unsigned i = 0; i != NumVars; ++i)
12253 Exprs.push_back(Record.readSubExpr());
12254 C->setDestinationExprs(Exprs);
12256 for (
unsigned i = 0; i != NumVars; ++i)
12257 Exprs.push_back(Record.readSubExpr());
12258 C->setAssignmentOps(Exprs);
12262 C->setLParenLoc(Record.readSourceLocation());
12263 unsigned NumVars =
C->varlist_size();
12264 SmallVector<Expr *, 16> Vars;
12265 Vars.reserve(NumVars);
12266 for (
unsigned i = 0; i != NumVars; ++i)
12267 Vars.push_back(Record.readSubExpr());
12268 C->setVarRefs(Vars);
12272 C->setDepobj(Record.readSubExpr());
12273 C->setLParenLoc(Record.readSourceLocation());
12277 C->setLParenLoc(Record.readSourceLocation());
12278 C->setModifier(Record.readSubExpr());
12279 C->setDependencyKind(
12281 C->setDependencyLoc(Record.readSourceLocation());
12282 C->setColonLoc(Record.readSourceLocation());
12283 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12284 unsigned NumVars =
C->varlist_size();
12285 SmallVector<Expr *, 16> Vars;
12286 Vars.reserve(NumVars);
12287 for (
unsigned I = 0; I != NumVars; ++I)
12288 Vars.push_back(Record.readSubExpr());
12289 C->setVarRefs(Vars);
12290 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12291 C->setLoopData(I, Record.readSubExpr());
12297 C->setDevice(Record.readSubExpr());
12298 C->setModifierLoc(Record.readSourceLocation());
12299 C->setLParenLoc(Record.readSourceLocation());
12303 C->setLParenLoc(Record.readSourceLocation());
12304 bool HasIteratorModifier =
false;
12306 C->setMapTypeModifier(
12308 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12309 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12310 HasIteratorModifier =
true;
12312 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12313 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12316 C->setMapLoc(Record.readSourceLocation());
12317 C->setColonLoc(Record.readSourceLocation());
12318 auto NumVars =
C->varlist_size();
12319 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12320 auto TotalLists =
C->getTotalComponentListNum();
12321 auto TotalComponents =
C->getTotalComponentsNum();
12323 SmallVector<Expr *, 16> Vars;
12324 Vars.reserve(NumVars);
12325 for (
unsigned i = 0; i != NumVars; ++i)
12326 Vars.push_back(Record.readExpr());
12327 C->setVarRefs(Vars);
12329 SmallVector<Expr *, 16> UDMappers;
12330 UDMappers.reserve(NumVars);
12331 for (
unsigned I = 0; I < NumVars; ++I)
12332 UDMappers.push_back(Record.readExpr());
12333 C->setUDMapperRefs(UDMappers);
12335 if (HasIteratorModifier)
12336 C->setIteratorModifier(Record.readExpr());
12338 SmallVector<ValueDecl *, 16> Decls;
12339 Decls.reserve(UniqueDecls);
12340 for (
unsigned i = 0; i < UniqueDecls; ++i)
12341 Decls.push_back(Record.readDeclAs<ValueDecl>());
12342 C->setUniqueDecls(Decls);
12344 SmallVector<unsigned, 16> ListsPerDecl;
12345 ListsPerDecl.reserve(UniqueDecls);
12346 for (
unsigned i = 0; i < UniqueDecls; ++i)
12347 ListsPerDecl.push_back(Record.readInt());
12348 C->setDeclNumLists(ListsPerDecl);
12350 SmallVector<unsigned, 32> ListSizes;
12351 ListSizes.reserve(TotalLists);
12352 for (
unsigned i = 0; i < TotalLists; ++i)
12353 ListSizes.push_back(Record.readInt());
12354 C->setComponentListSizes(ListSizes);
12356 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12357 Components.reserve(TotalComponents);
12358 for (
unsigned i = 0; i < TotalComponents; ++i) {
12359 Expr *AssociatedExprPr = Record.readExpr();
12360 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12361 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12364 C->setComponents(Components, ListSizes);
12370 C->setLParenLoc(Record.readSourceLocation());
12371 C->setColonLoc(Record.readSourceLocation());
12372 C->setAllocator(Record.readSubExpr());
12373 C->setAlignment(Record.readSubExpr());
12374 unsigned NumVars =
C->varlist_size();
12375 SmallVector<Expr *, 16> Vars;
12376 Vars.reserve(NumVars);
12377 for (
unsigned i = 0; i != NumVars; ++i)
12378 Vars.push_back(Record.readSubExpr());
12379 C->setVarRefs(Vars);
12384 C->setLParenLoc(Record.readSourceLocation());
12385 unsigned NumVars =
C->varlist_size();
12386 SmallVector<Expr *, 16> Vars;
12387 Vars.reserve(NumVars);
12388 for (
unsigned I = 0; I != NumVars; ++I)
12389 Vars.push_back(Record.readSubExpr());
12390 C->setVarRefs(Vars);
12395 C->setLParenLoc(Record.readSourceLocation());
12396 unsigned NumVars =
C->varlist_size();
12397 SmallVector<Expr *, 16> Vars;
12398 Vars.reserve(NumVars);
12399 for (
unsigned I = 0; I != NumVars; ++I)
12400 Vars.push_back(Record.readSubExpr());
12401 C->setVarRefs(Vars);
12406 C->setPriority(Record.readSubExpr());
12407 C->setLParenLoc(Record.readSourceLocation());
12413 C->setGrainsize(Record.readSubExpr());
12414 C->setModifierLoc(Record.readSourceLocation());
12415 C->setLParenLoc(Record.readSourceLocation());
12421 C->setNumTasks(Record.readSubExpr());
12422 C->setModifierLoc(Record.readSourceLocation());
12423 C->setLParenLoc(Record.readSourceLocation());
12427 C->setHint(Record.readSubExpr());
12428 C->setLParenLoc(Record.readSourceLocation());
12433 C->setDistScheduleKind(
12435 C->setChunkSize(Record.readSubExpr());
12436 C->setLParenLoc(Record.readSourceLocation());
12437 C->setDistScheduleKindLoc(Record.readSourceLocation());
12438 C->setCommaLoc(Record.readSourceLocation());
12442 C->setDefaultmapKind(
12444 C->setDefaultmapModifier(
12446 C->setLParenLoc(Record.readSourceLocation());
12447 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12448 C->setDefaultmapKindLoc(Record.readSourceLocation());
12451void OMPClauseReader::VisitOMPToClause(
OMPToClause *
C) {
12452 C->setLParenLoc(Record.readSourceLocation());
12454 C->setMotionModifier(
12456 C->setMotionModifierLoc(I, Record.readSourceLocation());
12457 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12458 C->setIteratorModifier(Record.readExpr());
12460 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12461 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12462 C->setColonLoc(Record.readSourceLocation());
12463 auto NumVars =
C->varlist_size();
12464 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12465 auto TotalLists =
C->getTotalComponentListNum();
12466 auto TotalComponents =
C->getTotalComponentsNum();
12468 SmallVector<Expr *, 16> Vars;
12469 Vars.reserve(NumVars);
12470 for (
unsigned i = 0; i != NumVars; ++i)
12471 Vars.push_back(Record.readSubExpr());
12472 C->setVarRefs(Vars);
12474 SmallVector<Expr *, 16> UDMappers;
12475 UDMappers.reserve(NumVars);
12476 for (
unsigned I = 0; I < NumVars; ++I)
12477 UDMappers.push_back(Record.readSubExpr());
12478 C->setUDMapperRefs(UDMappers);
12480 SmallVector<ValueDecl *, 16> Decls;
12481 Decls.reserve(UniqueDecls);
12482 for (
unsigned i = 0; i < UniqueDecls; ++i)
12483 Decls.push_back(Record.readDeclAs<ValueDecl>());
12484 C->setUniqueDecls(Decls);
12486 SmallVector<unsigned, 16> ListsPerDecl;
12487 ListsPerDecl.reserve(UniqueDecls);
12488 for (
unsigned i = 0; i < UniqueDecls; ++i)
12489 ListsPerDecl.push_back(Record.readInt());
12490 C->setDeclNumLists(ListsPerDecl);
12492 SmallVector<unsigned, 32> ListSizes;
12493 ListSizes.reserve(TotalLists);
12494 for (
unsigned i = 0; i < TotalLists; ++i)
12495 ListSizes.push_back(Record.readInt());
12496 C->setComponentListSizes(ListSizes);
12498 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12499 Components.reserve(TotalComponents);
12500 for (
unsigned i = 0; i < TotalComponents; ++i) {
12501 Expr *AssociatedExprPr = Record.readSubExpr();
12502 bool IsNonContiguous = Record.readBool();
12503 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12504 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12506 C->setComponents(Components, ListSizes);
12510 C->setLParenLoc(Record.readSourceLocation());
12512 C->setMotionModifier(
12514 C->setMotionModifierLoc(I, Record.readSourceLocation());
12515 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12516 C->setIteratorModifier(Record.readExpr());
12518 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12519 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12520 C->setColonLoc(Record.readSourceLocation());
12521 auto NumVars =
C->varlist_size();
12522 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12523 auto TotalLists =
C->getTotalComponentListNum();
12524 auto TotalComponents =
C->getTotalComponentsNum();
12526 SmallVector<Expr *, 16> Vars;
12527 Vars.reserve(NumVars);
12528 for (
unsigned i = 0; i != NumVars; ++i)
12529 Vars.push_back(Record.readSubExpr());
12530 C->setVarRefs(Vars);
12532 SmallVector<Expr *, 16> UDMappers;
12533 UDMappers.reserve(NumVars);
12534 for (
unsigned I = 0; I < NumVars; ++I)
12535 UDMappers.push_back(Record.readSubExpr());
12536 C->setUDMapperRefs(UDMappers);
12538 SmallVector<ValueDecl *, 16> Decls;
12539 Decls.reserve(UniqueDecls);
12540 for (
unsigned i = 0; i < UniqueDecls; ++i)
12541 Decls.push_back(Record.readDeclAs<ValueDecl>());
12542 C->setUniqueDecls(Decls);
12544 SmallVector<unsigned, 16> ListsPerDecl;
12545 ListsPerDecl.reserve(UniqueDecls);
12546 for (
unsigned i = 0; i < UniqueDecls; ++i)
12547 ListsPerDecl.push_back(Record.readInt());
12548 C->setDeclNumLists(ListsPerDecl);
12550 SmallVector<unsigned, 32> ListSizes;
12551 ListSizes.reserve(TotalLists);
12552 for (
unsigned i = 0; i < TotalLists; ++i)
12553 ListSizes.push_back(Record.readInt());
12554 C->setComponentListSizes(ListSizes);
12556 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12557 Components.reserve(TotalComponents);
12558 for (
unsigned i = 0; i < TotalComponents; ++i) {
12559 Expr *AssociatedExprPr = Record.readSubExpr();
12560 bool IsNonContiguous = Record.readBool();
12561 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12562 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12564 C->setComponents(Components, ListSizes);
12568 C->setLParenLoc(Record.readSourceLocation());
12569 auto NumVars =
C->varlist_size();
12570 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12571 auto TotalLists =
C->getTotalComponentListNum();
12572 auto TotalComponents =
C->getTotalComponentsNum();
12574 SmallVector<Expr *, 16> Vars;
12575 Vars.reserve(NumVars);
12576 for (
unsigned i = 0; i != NumVars; ++i)
12577 Vars.push_back(Record.readSubExpr());
12578 C->setVarRefs(Vars);
12580 for (
unsigned i = 0; i != NumVars; ++i)
12581 Vars.push_back(Record.readSubExpr());
12582 C->setPrivateCopies(Vars);
12584 for (
unsigned i = 0; i != NumVars; ++i)
12585 Vars.push_back(Record.readSubExpr());
12588 SmallVector<ValueDecl *, 16> Decls;
12589 Decls.reserve(UniqueDecls);
12590 for (
unsigned i = 0; i < UniqueDecls; ++i)
12591 Decls.push_back(Record.readDeclAs<ValueDecl>());
12592 C->setUniqueDecls(Decls);
12594 SmallVector<unsigned, 16> ListsPerDecl;
12595 ListsPerDecl.reserve(UniqueDecls);
12596 for (
unsigned i = 0; i < UniqueDecls; ++i)
12597 ListsPerDecl.push_back(Record.readInt());
12598 C->setDeclNumLists(ListsPerDecl);
12600 SmallVector<unsigned, 32> ListSizes;
12601 ListSizes.reserve(TotalLists);
12602 for (
unsigned i = 0; i < TotalLists; ++i)
12603 ListSizes.push_back(Record.readInt());
12604 C->setComponentListSizes(ListSizes);
12606 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12607 Components.reserve(TotalComponents);
12608 for (
unsigned i = 0; i < TotalComponents; ++i) {
12609 auto *AssociatedExprPr = Record.readSubExpr();
12610 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12611 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12614 C->setComponents(Components, ListSizes);
12618 C->setLParenLoc(Record.readSourceLocation());
12619 auto NumVars =
C->varlist_size();
12620 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12621 auto TotalLists =
C->getTotalComponentListNum();
12622 auto TotalComponents =
C->getTotalComponentsNum();
12624 SmallVector<Expr *, 16> Vars;
12625 Vars.reserve(NumVars);
12626 for (
unsigned i = 0; i != NumVars; ++i)
12627 Vars.push_back(Record.readSubExpr());
12628 C->setVarRefs(Vars);
12630 SmallVector<ValueDecl *, 16> Decls;
12631 Decls.reserve(UniqueDecls);
12632 for (
unsigned i = 0; i < UniqueDecls; ++i)
12633 Decls.push_back(Record.readDeclAs<ValueDecl>());
12634 C->setUniqueDecls(Decls);
12636 SmallVector<unsigned, 16> ListsPerDecl;
12637 ListsPerDecl.reserve(UniqueDecls);
12638 for (
unsigned i = 0; i < UniqueDecls; ++i)
12639 ListsPerDecl.push_back(Record.readInt());
12640 C->setDeclNumLists(ListsPerDecl);
12642 SmallVector<unsigned, 32> ListSizes;
12643 ListSizes.reserve(TotalLists);
12644 for (
unsigned i = 0; i < TotalLists; ++i)
12645 ListSizes.push_back(Record.readInt());
12646 C->setComponentListSizes(ListSizes);
12648 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12649 Components.reserve(TotalComponents);
12650 for (
unsigned i = 0; i < TotalComponents; ++i) {
12651 Expr *AssociatedExpr = Record.readSubExpr();
12652 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12653 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12656 C->setComponents(Components, ListSizes);
12660 C->setLParenLoc(Record.readSourceLocation());
12661 auto NumVars =
C->varlist_size();
12662 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12663 auto TotalLists =
C->getTotalComponentListNum();
12664 auto TotalComponents =
C->getTotalComponentsNum();
12666 SmallVector<Expr *, 16> Vars;
12667 Vars.reserve(NumVars);
12668 for (
unsigned i = 0; i != NumVars; ++i)
12669 Vars.push_back(Record.readSubExpr());
12670 C->setVarRefs(Vars);
12673 SmallVector<ValueDecl *, 16> Decls;
12674 Decls.reserve(UniqueDecls);
12675 for (
unsigned i = 0; i < UniqueDecls; ++i)
12676 Decls.push_back(Record.readDeclAs<ValueDecl>());
12677 C->setUniqueDecls(Decls);
12679 SmallVector<unsigned, 16> ListsPerDecl;
12680 ListsPerDecl.reserve(UniqueDecls);
12681 for (
unsigned i = 0; i < UniqueDecls; ++i)
12682 ListsPerDecl.push_back(Record.readInt());
12683 C->setDeclNumLists(ListsPerDecl);
12685 SmallVector<unsigned, 32> ListSizes;
12686 ListSizes.reserve(TotalLists);
12687 for (
unsigned i = 0; i < TotalLists; ++i)
12688 ListSizes.push_back(Record.readInt());
12689 C->setComponentListSizes(ListSizes);
12691 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12692 Components.reserve(TotalComponents);
12693 for (
unsigned i = 0; i < TotalComponents; ++i) {
12694 Expr *AssociatedExpr = Record.readSubExpr();
12695 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12696 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12699 C->setComponents(Components, ListSizes);
12703 C->setLParenLoc(Record.readSourceLocation());
12704 auto NumVars =
C->varlist_size();
12705 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12706 auto TotalLists =
C->getTotalComponentListNum();
12707 auto TotalComponents =
C->getTotalComponentsNum();
12709 SmallVector<Expr *, 16> Vars;
12710 Vars.reserve(NumVars);
12711 for (
unsigned I = 0; I != NumVars; ++I)
12712 Vars.push_back(Record.readSubExpr());
12713 C->setVarRefs(Vars);
12716 SmallVector<ValueDecl *, 16> Decls;
12717 Decls.reserve(UniqueDecls);
12718 for (
unsigned I = 0; I < UniqueDecls; ++I)
12719 Decls.push_back(Record.readDeclAs<ValueDecl>());
12720 C->setUniqueDecls(Decls);
12722 SmallVector<unsigned, 16> ListsPerDecl;
12723 ListsPerDecl.reserve(UniqueDecls);
12724 for (
unsigned I = 0; I < UniqueDecls; ++I)
12725 ListsPerDecl.push_back(Record.readInt());
12726 C->setDeclNumLists(ListsPerDecl);
12728 SmallVector<unsigned, 32> ListSizes;
12729 ListSizes.reserve(TotalLists);
12730 for (
unsigned i = 0; i < TotalLists; ++i)
12731 ListSizes.push_back(Record.readInt());
12732 C->setComponentListSizes(ListSizes);
12734 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12735 Components.reserve(TotalComponents);
12736 for (
unsigned I = 0; I < TotalComponents; ++I) {
12737 Expr *AssociatedExpr = Record.readSubExpr();
12738 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12739 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12742 C->setComponents(Components, ListSizes);
12746 C->setLParenLoc(Record.readSourceLocation());
12747 unsigned NumVars =
C->varlist_size();
12748 SmallVector<Expr *, 16> Vars;
12749 Vars.reserve(NumVars);
12750 for (
unsigned i = 0; i != NumVars; ++i)
12751 Vars.push_back(Record.readSubExpr());
12752 C->setVarRefs(Vars);
12754 Vars.reserve(NumVars);
12755 for (
unsigned i = 0; i != NumVars; ++i)
12756 Vars.push_back(Record.readSubExpr());
12757 C->setPrivateRefs(Vars);
12761 C->setLParenLoc(Record.readSourceLocation());
12762 unsigned NumVars =
C->varlist_size();
12763 SmallVector<Expr *, 16> Vars;
12764 Vars.reserve(NumVars);
12765 for (
unsigned i = 0; i != NumVars; ++i)
12766 Vars.push_back(Record.readSubExpr());
12767 C->setVarRefs(Vars);
12771 C->setLParenLoc(Record.readSourceLocation());
12772 unsigned NumVars =
C->varlist_size();
12773 SmallVector<Expr *, 16> Vars;
12774 Vars.reserve(NumVars);
12775 for (
unsigned i = 0; i != NumVars; ++i)
12776 Vars.push_back(Record.readSubExpr());
12777 C->setVarRefs(Vars);
12781 C->setLParenLoc(Record.readSourceLocation());
12782 unsigned NumOfAllocators =
C->getNumberOfAllocators();
12783 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
12784 Data.reserve(NumOfAllocators);
12785 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
12786 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
12789 D.
LParenLoc = Record.readSourceLocation();
12790 D.
RParenLoc = Record.readSourceLocation();
12792 C->setAllocatorsData(
Data);
12796 C->setLParenLoc(Record.readSourceLocation());
12797 C->setModifier(Record.readSubExpr());
12798 C->setColonLoc(Record.readSourceLocation());
12799 unsigned NumOfLocators =
C->varlist_size();
12800 SmallVector<Expr *, 4> Locators;
12801 Locators.reserve(NumOfLocators);
12802 for (
unsigned I = 0; I != NumOfLocators; ++I)
12803 Locators.push_back(Record.readSubExpr());
12804 C->setVarRefs(Locators);
12810 C->setLParenLoc(Record.readSourceLocation());
12811 C->setKindKwLoc(Record.readSourceLocation());
12812 C->setModifierKwLoc(Record.readSourceLocation());
12817 C->setThreadID(Record.readSubExpr());
12818 C->setLParenLoc(Record.readSourceLocation());
12823 C->setLParenLoc(Record.readSourceLocation());
12824 C->setBindKindLoc(Record.readSourceLocation());
12828 C->setAlignment(Record.readExpr());
12829 C->setLParenLoc(Record.readSourceLocation());
12834 C->setSize(Record.readSubExpr());
12835 C->setLParenLoc(Record.readSourceLocation());
12838void OMPClauseReader::VisitOMPDynGroupprivateClause(
12841 C->setDynGroupprivateModifier(
12843 C->setDynGroupprivateFallbackModifier(
12845 C->setSize(Record.readSubExpr());
12846 C->setLParenLoc(Record.readSourceLocation());
12847 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
12848 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
12852 C->setLParenLoc(Record.readSourceLocation());
12853 C->setDependenceType(
12855 C->setDependenceLoc(Record.readSourceLocation());
12856 C->setColonLoc(Record.readSourceLocation());
12857 unsigned NumVars =
C->varlist_size();
12858 SmallVector<Expr *, 16> Vars;
12859 Vars.reserve(NumVars);
12860 for (
unsigned I = 0; I != NumVars; ++I)
12861 Vars.push_back(Record.readSubExpr());
12862 C->setVarRefs(Vars);
12863 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12864 C->setLoopData(I, Record.readSubExpr());
12869 Record.readAttributes(Attrs);
12870 C->setAttrs(Attrs);
12871 C->setLocStart(Record.readSourceLocation());
12872 C->setLParenLoc(Record.readSourceLocation());
12873 C->setLocEnd(Record.readSourceLocation());
12886 Selector.ScoreOrCondition =
nullptr;
12888 Selector.ScoreOrCondition = readExprRef();
12900 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
12905 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
12907 Data->setClauses(Clauses);
12908 if (
Data->hasAssociatedStmt())
12910 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
12915 unsigned NumVars =
readInt();
12917 for (
unsigned I = 0; I < NumVars; ++I)
12923 unsigned NumExprs =
readInt();
12925 for (
unsigned I = 0; I < NumExprs; ++I)
12935 switch (ClauseKind) {
12950 bool isConditionExprClause =
readBool();
12951 if (isConditionExprClause) {
12956 unsigned NumVars =
readInt();
12958 for (
unsigned I = 0; I < NumVars; ++I)
12965 unsigned NumClauses =
readInt();
12967 for (
unsigned I = 0; I < NumClauses; ++I)
13001 for (
unsigned I = 0; I < VarList.size(); ++I) {
13004 RecipeList.push_back({Alloca});
13008 VarList, RecipeList, EndLoc);
13026 for (
unsigned I = 0; I < VarList.size(); ++I) {
13030 RecipeList.push_back({Recipe, RecipeTemp});
13034 VarList, RecipeList, EndLoc);
13085 LParenLoc, ModList, VarList, EndLoc);
13094 LParenLoc, ModList, VarList, EndLoc);
13103 LParenLoc, ModList, VarList, EndLoc);
13112 LParenLoc, ModList, VarList, EndLoc);
13118 AsyncExpr, EndLoc);
13126 DevNumExpr, QueuesLoc, QueueIdExprs,
13133 unsigned NumArchs =
readInt();
13135 for (
unsigned I = 0; I < NumArchs; ++I) {
13138 Archs.emplace_back(Loc, Ident);
13142 LParenLoc, Archs, EndLoc);
13150 for (
unsigned I = 0; I < VarList.size(); ++I) {
13154 3 *
sizeof(
int *));
13157 unsigned NumCombiners =
readInt();
13158 for (
unsigned I = 0; I < NumCombiners; ++I) {
13163 Combiners.push_back({LHS, RHS, Op});
13166 RecipeList.push_back({Recipe, Combiners});
13170 VarList, RecipeList, EndLoc);
13189 HasForce, LoopCount, EndLoc);
13193 unsigned NumClauses =
readInt();
13195 for (
unsigned I = 0; I < NumClauses; ++I)
13198 SizeExprs, EndLoc);
13202 unsigned NumExprs =
readInt();
13205 for (
unsigned I = 0; I < NumExprs; ++I) {
13211 GangKinds, Exprs, EndLoc);
13217 WorkerExpr, EndLoc);
13223 VectorExpr, EndLoc);
13235 LParenLoc, VarList, EndLoc);
13249 llvm_unreachable(
"Clause serialization not yet implemented");
13251 llvm_unreachable(
"Invalid Clause Kind");
13256 for (
unsigned I = 0; I < Clauses.size(); ++I)
13261 unsigned NumVars =
readInt();
13262 A->Clauses.resize(NumVars);
13269 llvm::FoldingSetNodeID ID;
13270 ID.AddString(PrimaryModuleName);
13271 return ID.computeStableHash();
13276 return std::nullopt;
13279 return std::nullopt;
13282 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,...
const clang::PrintingPolicy & getPrintingPolicy() const
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
ASTIdentifierIterator(const ASTReader &Reader, bool SkipModules=false)
StringRef Next() override
Retrieve the next string in the identifier table and advances the iterator for the following string.
Abstract interface for callback invocations by the ASTReader.
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
virtual ~ASTReaderListener()
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain)
Receives the header search options.
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
virtual void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind)
This is called for each AST file loaded.
virtual void ReadModuleName(StringRef ModuleName)
virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value)
Receives COUNTER value.
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the codegen options.
Reads an AST files chain containing the contents of a translation unit.
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const
Retrieve the global submodule ID given a module and its local ID number.
ExtKind hasExternalDefinitions(const Decl *D) override
IdentifierTable & getIdentifierTable()
Retrieve the identifier table associated with the preprocessor.
ModuleManager & getModuleManager()
Retrieve the module manager.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx)
void ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector< Decl *, 4 > &Decls) override
Read the set of decls to be checked for deferred diags.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
@ ARR_VersionMismatch
The client can handle an AST file that cannot load because it was built with a different version of C...
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &Exprs) override
void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls) override
Get the decls that are contained in a file in the Offset/Length range.
std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record, unsigned &Idx, StringRef &Blob)
SourceRange ReadSkippedRange(unsigned Index) override
Read a preallocated skipped range from the external source.
serialization::TypeID getGlobalTypeID(ModuleFile &F, serialization::LocalTypeID LocalID) const
Map a local type ID within a given AST file into a global type ID.
void dump()
Dump information about the AST reader to standard error.
MacroInfo * ReadMacroRecord(ModuleFile &F, uint64_t Offset)
Reads the macro record located at the given offset.
SmallVector< std::pair< llvm::BitstreamCursor, serialization::ModuleFile * >, 8 > CommentsCursors
Cursors for comments blocks.
Selector getLocalSelector(ModuleFile &M, unsigned LocalID)
Retrieve a selector from the given module with its local ID number.
void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Decls) override
Read all of the declarations lexically stored in a declaration context.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
std::optional< ASTSourceDescriptor > getSourceDescriptor(unsigned ID) override
Return a descriptor for the corresponding module.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ClearSwitchCaseIDs()
void SetGloballyVisibleDecls(IdentifierInfo *II, const SmallVectorImpl< GlobalDeclID > &DeclIDs, SmallVectorImpl< Decl * > *Decls=nullptr)
Set the globally-visible declarations associated with the given identifier.
serialization::ModuleKind ModuleKind
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility, SourceLocation ImportLoc)
Make the entities in the given module and any of its (non-explicit) submodules visible to name lookup...
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a source range.
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
static std::string ResolveImportedPathAndAllocate(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx, StringRef &Blob)
CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
Read the contents of a CXXCtorInitializer array.
void visitInputFileInfos(serialization::ModuleFile &MF, bool IncludeSystem, llvm::function_ref< void(const serialization::InputFileInfo &IFI, bool IsSystem)> Visitor)
Visit all the input file infos of the given module file.
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo)
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs) override
Read the set of tentative definitions known to the external Sema source.
Decl * GetExternalDecl(GlobalDeclID ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
serialization::MacroID ReadMacroID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a macro ID from the given position in a record in the given module.
GlobalDeclID ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a declaration ID from the given position in a record in the given module.
llvm::Expected< SourceLocation::UIntTy > readSLocOffset(ModuleFile *F, unsigned Index)
Try to read the offset of the SLocEntry at the given index in the given module file.
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
friend class PCHValidator
friend class serialization::ReadMethodPoolVisitor
void CompleteRedeclChain(const Decl *D) override
If any redeclarations of D have been imported since it was last checked, this digs out those redeclar...
SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile, SourceLocation Loc) const
Translate a source location from another module file's source location space into ours.
static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID, uint64_t *StartOfBlockOffset=nullptr)
ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the specified cursor.
void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II)
std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range) override
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
IdentifierInfo * get(StringRef Name) override
Retrieve the IdentifierInfo for the named identifier.
IdentifierInfo * getLocalIdentifier(ModuleFile &M, uint64_t LocalID)
void visitInputFiles(serialization::ModuleFile &MF, bool IncludeSystem, bool Complain, llvm::function_ref< void(const serialization::InputFile &IF, bool isSystem)> Visitor)
Visit all the input files of the given module file.
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
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.
Decl * getKeyDeclaration(Decl *D)
Returns the first key declaration for the given declaration.
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC) override
Finds all the visible declarations with a given name.
IdentifierInfo * DecodeIdentifierInfo(serialization::IdentifierID ID)
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
@ Success
The control block was read successfully.
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
@ Failure
The AST file itself appears corrupted.
@ VersionMismatch
The AST file was written by a different version of Clang.
@ HadErrors
The AST file has errors.
@ Missing
The AST file was missing.
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx)
Reads a token out of a record.
SwitchCase * getSwitchCaseWithID(unsigned ID)
Retrieve the switch-case statement with the given ID.
serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID)
FileID TranslateFileID(ModuleFile &F, FileID FID) const
Translate a FileID from another module file's FileID space into ours.
void ReadLateParsedTemplates(llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > &LPTMap) override
Read the set of late parsed template functions for this source.
IdentifierIterator * getIdentifiers() override
Retrieve an iterator into the set of all identifiers in all loaded AST files.
void ReadUsedVTables(SmallVectorImpl< ExternalVTableUse > &VTables) override
Read the set of used vtables known to the external Sema source.
bool isGlobalIndexUnavailable() const
Determine whether we tried to load the global index, but failed, e.g., because it is out-of-date or d...
uint32_t GetNumExternalSelectors() override
Returns the number of selectors known to the external AST source.
static TemporarilyOwnedStringRef ResolveImportedPath(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
void updateOutOfDateSelector(Selector Sel) override
Load the contents of the global method pool for a given selector if necessary.
Decl * GetExistingDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration.
static llvm::BitVector ReadBitVector(const RecordData &Record, const StringRef Blob)
ModuleFile * getLocalModuleFile(ModuleFile &M, unsigned ID) const
Retrieve the module file with a given local ID within the specified ModuleFile.
ASTReader(Preprocessor &PP, ModuleCache &ModCache, ASTContext *Context, const PCHContainerReader &PCHContainerRdr, const CodeGenOptions &CodeGenOpts, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, StringRef isysroot="", DisableValidationForModuleKind DisableValidationKind=DisableValidationForModuleKind::None, bool AllowASTWithCompilerErrors=false, bool AllowConfigurationMismatch=false, bool ValidateSystemInputs=false, bool ForceValidateUserInputs=true, bool ValidateASTInputFilesContent=false, bool UseGlobalIndex=true, std::unique_ptr< llvm::Timer > ReadTimer={})
Load the AST file and validate its contents against the given Preprocessor.
void LoadSelector(Selector Sel)
Load a selector from disk, registering its ID if it exists.
void ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag)
void makeNamesVisible(const HiddenNames &Names, Module *Owner)
Make the names within this set of hidden names visible.
void UpdateSema()
Update the state of Sema after loading some additional modules.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Decl * GetLocalDecl(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override
Get the index ID for the loaded SourceLocation offset.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
void ReadPendingInstantiations(SmallVectorImpl< std::pair< ValueDecl *, SourceLocation > > &Pending) override
Read the set of pending instantiations known to the external Sema source.
Preprocessor & getPreprocessor() const
Retrieve the preprocessor.
serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)
Get the loaded specializations lookup tables for D, if any.
CXXTemporary * ReadCXXTemporary(ModuleFile &F, const RecordData &Record, unsigned &Idx)
void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces) override
Load the set of namespaces that are known to the external source, which will be used during typo corr...
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
void PrintStats() override
Print some statistics about AST usage.
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
serialization::SelectorID getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const
Retrieve the global selector ID that corresponds to this the local selector ID in a given module.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
SmallVector< uint64_t, 64 > RecordData
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
serialization::MacroID getGlobalMacroID(ModuleFile &M, serialization::MacroID LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
FileManager & getFileManager() const
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::ModuleFile ModuleFile
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, serialization::PreprocessedEntityID LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
void setKWLoc(SourceLocation Loc)
Attr - This represents one attribute.
void setAttr(const Attr *A)
void setConceptReference(ConceptReference *CR)
void setRParenLoc(SourceLocation Loc)
void setCaretLoc(SourceLocation Loc)
void setWrittenTypeSpec(TypeSpecifierType written)
bool needsExtraLocalData() const
void setModeAttr(bool written)
void setBuiltinLoc(SourceLocation Loc)
void setWrittenWidthSpec(TypeSpecifierWidth written)
void setWrittenSignSpec(TypeSpecifierSign written)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
void setSourceOrder(int Pos)
Set the source order of this initializer.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
unsigned getLambdaIndexInContext() const
Retrieve the index of this lambda within the context declaration returned by getLambdaContextDecl().
base_class_iterator bases_begin()
base_class_iterator vbases_begin()
Represents a C++ temporary.
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule) override
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind) override
This is called for each AST file loaded.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A reference to a concept and its template args, as it appears in the code.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
A map from continuous integer ranges to some value, with a very specialized interface.
void insertOrReplace(const value_type &Val)
typename Representation::iterator iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool hasExternalVisibleStorage() const
Whether this DeclContext has external storage containing additional declarations that are visible in ...
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void setMustBuildLookupTable()
Mark that there are external lexical declarations that we need to include in our lookup table (and th...
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
bool isDeclInLexicalTraversal(const Decl *D) const
Determine whether the given declaration is stored in the list of declarations lexically within this c...
decl_iterator decls_begin() const
unsigned getModuleFileIndex() const
DeclID getRawValue() const
unsigned getLocalDeclIndex() const
uint64_t DeclID
An ID number that refers to a declaration in an AST file.
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Kind
Lists the kind of concrete classes of Decl.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
SourceLocation getLocation() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
GlobalDeclID getGlobalID() const
Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
static DeclarationNameLoc makeCXXLiteralOperatorNameLoc(SourceLocation Loc)
Construct location information for a literal C++ operator.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NameKind
The kind of the name stored in this DeclarationName.
@ CXXConversionFunctionName
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
void setRParenLoc(SourceLocation Loc)
void setDecltypeLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setTemplateNameLoc(SourceLocation Loc)
void setAttrNameLoc(SourceLocation loc)
void setAttrOperandParensRange(SourceRange range)
void setAttrExprOperand(Expr *e)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
A little helper class used to produce diagnostics.
bool wasUpgradedFromWarning() const
Whether this mapping attempted to map the diagnostic to a warning, but was overruled because the diag...
bool isErrorOrFatal() const
void setSeverity(diag::Severity Value)
static DiagnosticMapping deserialize(unsigned Bits)
Deserialize a mapping.
void setUpgradedFromWarning(bool Value)
Options for controlling the compiler diagnostics engine.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > SystemHeaderWarningsModules
The list of -Wsystem-headers-in-module=... options used to override whether -Wsystem-headers is enabl...
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
bool getEnableAllWarnings() const
Level
The level of the diagnostic, after it has been through mapping.
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
bool getSuppressSystemWarnings() const
bool getWarningsAsErrors() const
diag::Severity getExtensionHandlingBehavior() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
StringRef getName() const
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
This represents one expression.
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl * > Decls)
uint32_t incrementGeneration(ASTContext &C)
Increment the current generation.
uint32_t getGeneration() const
Get the current generation of this AST source.
Represents difference between two FPOptions values.
static FPOptionsOverride getFromOpaqueInt(storage_type I)
FPOptions applyOverrides(FPOptions Base)
static FPOptions getFromOpaqueInt(storage_type Value)
Represents a member of a struct/union/class.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
time_t getModificationTime() const
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
llvm::vfs::FileSystem & getVirtualFileSystem() const
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Get a FileEntryRef if it exists, without doing anything on error.
FileEntryRef getVirtualFileRef(StringRef Filename, off_t Size, time_t ModificationTime)
Retrieve a file entry for a "virtual" file that acts as if there were a file with the given name on d...
Keeps track of options that affect how file operations are performed.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
Wrapper for source info for functions.
unsigned getNumParams() const
void setLocalRangeBegin(SourceLocation L)
void setLParenLoc(SourceLocation Loc)
void setParam(unsigned i, ParmVarDecl *VD)
void setRParenLoc(SourceLocation Loc)
void setLocalRangeEnd(SourceLocation L)
void setExceptionSpecRange(SourceRange R)
llvm::SmallPtrSet< ModuleFile *, 4 > HitSet
A set of module files in which we found a result.
static std::pair< GlobalModuleIndex *, llvm::Error > readIndex(llvm::StringRef Path)
Read a global index file for the given directory.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isCPlusPlusOperatorKeyword() const
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
bool isPoisoned() const
Return true if this token has been poisoned.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
tok::NotableIdentifierKind getNotableIdentifierID() const
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
void setObjCOrBuiltinID(unsigned ID)
void revertTokenIDToIdentifier()
Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2 compatibility.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
void * getFETokenInfo() const
Get and set FETokenInfo.
StringRef getName() const
Return the actual identifier string.
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
An iterator that walks over all of the known identifiers in the lookup table.
IdentifierIterator()=default
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
Implements an efficient mapping from strings to IdentifierInfo nodes.
llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename) const
Get a pointer to the pCM if it exists; else nullptr.
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
Represents a field injected from an anonymous union/struct into the parent scope.
Wrapper for source info for injected class names of class templates.
void setAmpLoc(SourceLocation Loc)
PragmaMSPointersToMembersKind
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
An UnresolvedSet-like class that might not have been loaded from the external AST source yet.
unsigned getLineTableFilenameID(StringRef Str)
void AddEntry(FileID FID, const std::vector< LineEntry > &Entries)
Add a new line entry that has already been encoded into the internal representation of the line table...
static LocalDeclID get(ASTReader &Reader, serialization::ModuleFile &MF, DeclID ID)
Record the location of a macro definition.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
void setPrevious(MacroDirective *Prev)
Set previous definition of the macro with the same name.
Records the location of a macro expansion.
Encapsulates the data about a macro definition (e.g.
void setUsedForHeaderGuard(bool Val)
void setHasCommaPasting()
void setDefinitionEndLoc(SourceLocation EndLoc)
Set the location of the last token in the macro.
void setParameterList(ArrayRef< IdentifierInfo * > List, llvm::BumpPtrAllocator &PPAllocator)
Set the specified list of identifiers as the parameter list for this macro.
llvm::MutableArrayRef< Token > allocateTokens(unsigned NumTokens, llvm::BumpPtrAllocator &PPAllocator)
void setIsFunctionLike()
Function/Object-likeness.
void setIsC99Varargs()
Varargs querying methods. This can only be set for function-like macros.
void setIsUsed(bool Val)
Set the value of the IsUsed flag.
void setExpansionLoc(SourceLocation Loc)
void setAttrRowOperand(Expr *e)
void setAttrColumnOperand(Expr *e)
void setAttrOperandParensRange(SourceRange range)
void setAttrNameLoc(SourceLocation loc)
void setStarLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
The module cache used for compiling modules implicitly.
virtual InMemoryModuleCache & getInMemoryModuleCache()=0
Returns this process's view of the module cache.
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory)
Sets the umbrella directory of the given module to the given directory.
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory)
Sets the umbrella header of the given module to the given header.
llvm::DenseSet< FileEntryRef > AdditionalModMapsSet
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
ModuleHeaderRole
Flags describing the role of a module header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false)
Adds this header to the given module.
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
void addRequirement(StringRef Feature, bool RequiredState, const LangOptions &LangOpts, const TargetInfo &Target)
Add the given feature requirement to the list of features required by this module.
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
NameVisibilityKind
Describes the visibility of the various names within a particular module.
@ Hidden
All of the names in this module are hidden.
@ AllVisible
All of the names in this module are visible.
SourceLocation DefinitionLoc
The location of the module definition.
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
ModuleKind Kind
The kind of this module.
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
bool isUnimportable() const
Determine whether this module has been declared unimportable.
void setASTFile(OptionalFileEntryRef File)
Set the serialized AST file for the top-level module of this module.
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
std::string Name
The name of this module.
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
OptionalDirectoryEntryRef Directory
The build directory of this module.
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
ASTFileSignature Signature
The module signature.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
llvm::PointerIntPair< Module *, 1, bool > ExportDecl
Describes an exported module.
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
unsigned IsAvailable
Whether this module is available in the current translation unit.
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
OptionalFileEntryRef getASTFile() const
The serialized AST file for this module, if one was created.
std::vector< Conflict > Conflicts
The list of conflicts.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Represent a C++ namespace.
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
static std::string getOwningModuleNameForDiagnostic(const Decl *D)
Get the best name we know for the module that owns the given declaration, or an empty string if the d...
This represents the '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.
@ RISCV_VECTOR_INTRINSICS_PRAGMA
Record code for pragma clang riscv intrinsic vector.
@ VTABLES_TO_EMIT
Record code for vtables to emit.
@ UPDATE_MODULE_LOCAL_VISIBLE
@ IDENTIFIER_OFFSET
Record code for the table of offsets of each identifier ID.
@ OBJC_CATEGORIES
Record code for the array of Objective-C categories (including extensions).
@ METHOD_POOL
Record code for the Objective-C method pool,.
@ DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD
Record code for lexical and visible block for delayed namespace in reduced BMI.
@ PP_CONDITIONAL_STACK
The stack of open ifs/ifdefs recorded in a preamble.
@ REFERENCED_SELECTOR_POOL
Record code for referenced selector pool.
@ SOURCE_LOCATION_OFFSETS
Record code for the table of offsets into the block of source-location information.
@ WEAK_UNDECLARED_IDENTIFIERS
Record code for weak undeclared identifiers.
@ UNDEFINED_BUT_USED
Record code for undefined but used functions and variables that need a definition in this TU.
@ FILE_SORTED_DECLS
Record code for a file sorted array of DeclIDs in a module.
@ MSSTRUCT_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
@ TENTATIVE_DEFINITIONS
Record code for the array of tentative definitions.
@ UPDATE_TU_LOCAL_VISIBLE
@ UNUSED_FILESCOPED_DECLS
Record code for the array of unused file scoped decls.
@ ALIGN_PACK_PRAGMA_OPTIONS
Record code for #pragma align/pack options.
@ IMPORTED_MODULES
Record code for an array of all of the (sub)modules that were imported by the AST file.
@ SELECTOR_OFFSETS
Record code for the table of offsets into the Objective-C method pool.
@ UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES
Record code for potentially unused local typedef names.
@ EAGERLY_DESERIALIZED_DECLS
Record code for the array of eagerly deserialized decls.
@ INTERESTING_IDENTIFIERS
A list of "interesting" identifiers.
@ HEADER_SEARCH_TABLE
Record code for header search information.
@ OBJC_CATEGORIES_MAP
Record code for map of Objective-C class definition IDs to the ObjC categories in a module that are a...
@ CUDA_SPECIAL_DECL_REFS
Record code for special CUDA declarations.
@ TU_UPDATE_LEXICAL
Record code for an update to the TU's lexically contained declarations.
@ PPD_SKIPPED_RANGES
A table of skipped ranges within the preprocessing record.
@ IDENTIFIER_TABLE
Record code for the identifier table.
@ SEMA_DECL_REFS
Record code for declarations that Sema keeps references of.
@ OPTIMIZE_PRAGMA_OPTIONS
Record code for #pragma optimize options.
@ MODULE_OFFSET_MAP
Record code for the remapping information used to relate loaded modules to the various offsets and ID...
@ POINTERS_TO_MEMBERS_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
unsigned ComputeHash(Selector Sel)
TypeID LocalTypeID
Same with TypeID except that the LocalTypeID is only meaningful with the corresponding ModuleFile.
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isa(CodeGen::Address addr)
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
OpenMPDefaultClauseVariableCategory
OpenMP variable-category for 'default' clause.
OpenMPDefaultmapClauseModifier
OpenMP modifiers for 'defaultmap' clause.
OpenMPOrderClauseModifier
OpenMP modifiers for 'order' clause.
std::vector< std::string > Macros
A list of macros of the form <definition>=<expansion> .
@ Success
Annotation was successful.
std::pair< FileID, unsigned > FileIDAndOffset
OpenMPAtClauseKind
OpenMP attributes for 'at' clause.
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
OpenACCClauseKind
Represents the kind of an OpenACC clause.
@ Auto
'auto' clause, allowed on 'loop' directives.
@ Bind
'bind' clause, allowed on routine constructs.
@ Gang
'gang' clause, allowed on 'loop' and Combined constructs.
@ Wait
'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ PCopyOut
'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ PresentOrCreate
'create' clause alias 'present_or_create'.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ NoHost
'nohost' clause, allowed on 'routine' directives.
@ PresentOrCopy
'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Invalid
Represents an invalid clause, for the purposes of parsing.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Copy
'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ DeviceType
'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ Shortloop
'shortloop' is represented in the ACC.td file, but isn't present in the standard.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
OpenMPScheduleClauseModifier
OpenMP modifiers for 'schedule' clause.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
OpenMPDynGroupprivateClauseFallbackModifier
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
PredefinedDeclIDs
Predefined declaration IDs.
@ PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID
The internal '__NSConstantString' tag type.
@ PREDEF_DECL_TRANSLATION_UNIT_ID
The translation unit.
@ PREDEF_DECL_OBJC_CLASS_ID
The Objective-C 'Class' type.
@ PREDEF_DECL_BUILTIN_MS_GUID_ID
The predeclared '_GUID' struct.
@ PREDEF_DECL_BUILTIN_MS_TYPE_INFO_TAG_ID
The predeclared 'type_info' struct.
@ PREDEF_DECL_OBJC_INSTANCETYPE_ID
The internal 'instancetype' typedef.
@ PREDEF_DECL_OBJC_PROTOCOL_ID
The Objective-C 'Protocol' type.
@ PREDEF_DECL_UNSIGNED_INT_128_ID
The unsigned 128-bit integer type.
@ PREDEF_DECL_OBJC_SEL_ID
The Objective-C 'SEL' type.
@ NUM_PREDEF_DECL_IDS
The number of declaration IDs that are predefined.
@ PREDEF_DECL_INT_128_ID
The signed 128-bit integer type.
@ PREDEF_DECL_VA_LIST_TAG
The internal '__va_list_tag' struct, if any.
@ PREDEF_DECL_BUILTIN_MS_VA_LIST_ID
The internal '__builtin_ms_va_list' typedef.
@ PREDEF_DECL_CF_CONSTANT_STRING_ID
The internal '__NSConstantString' typedef.
@ PREDEF_DECL_NULL_ID
The NULL declaration.
@ PREDEF_DECL_BUILTIN_VA_LIST_ID
The internal '__builtin_va_list' typedef.
@ PREDEF_DECL_EXTERN_C_CONTEXT_ID
The extern "C" context.
@ PREDEF_DECL_OBJC_ID_ID
The Objective-C 'id' type.
@ Property
The type of a property.
@ Result
The result type of a method or function.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
const FunctionProtoType * T
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ Template
We are parsing a template declaration.
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
@ 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)
MultiOnDiskHashTable< LazySpecializationInfoLookupTrait > Table
void insert(LazySpecializationInfo Info)