97#include "llvm/ADT/APFloat.h"
98#include "llvm/ADT/APInt.h"
99#include "llvm/ADT/ArrayRef.h"
100#include "llvm/ADT/DenseMap.h"
101#include "llvm/ADT/FoldingSet.h"
102#include "llvm/ADT/IntrusiveRefCntPtr.h"
103#include "llvm/ADT/STLExtras.h"
104#include "llvm/ADT/ScopeExit.h"
105#include "llvm/ADT/Sequence.h"
106#include "llvm/ADT/SmallPtrSet.h"
107#include "llvm/ADT/SmallVector.h"
108#include "llvm/ADT/StringExtras.h"
109#include "llvm/ADT/StringMap.h"
110#include "llvm/ADT/StringRef.h"
111#include "llvm/ADT/iterator_range.h"
112#include "llvm/Bitstream/BitstreamReader.h"
113#include "llvm/Support/Compiler.h"
114#include "llvm/Support/Compression.h"
115#include "llvm/Support/DJB.h"
116#include "llvm/Support/Endian.h"
117#include "llvm/Support/Error.h"
118#include "llvm/Support/ErrorHandling.h"
119#include "llvm/Support/LEB128.h"
120#include "llvm/Support/MemoryBuffer.h"
121#include "llvm/Support/Path.h"
122#include "llvm/Support/SaveAndRestore.h"
123#include "llvm/Support/TimeProfiler.h"
124#include "llvm/Support/Timer.h"
125#include "llvm/Support/VersionTuple.h"
126#include "llvm/Support/raw_ostream.h"
127#include "llvm/TargetParser/Triple.h"
140#include <system_error>
145using namespace clang;
148using llvm::BitstreamCursor;
156 return First->ReadFullVersionInformation(FullVersion) ||
157 Second->ReadFullVersionInformation(FullVersion);
161 First->ReadModuleName(ModuleName);
162 Second->ReadModuleName(ModuleName);
166 First->ReadModuleMapFile(ModuleMapPath);
167 Second->ReadModuleMapFile(ModuleMapPath);
171 const LangOptions &LangOpts, StringRef ModuleFilename,
bool Complain,
172 bool AllowCompatibleDifferences) {
173 return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
174 AllowCompatibleDifferences) ||
175 Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
176 AllowCompatibleDifferences);
180 const CodeGenOptions &CGOpts, StringRef ModuleFilename,
bool Complain,
181 bool AllowCompatibleDifferences) {
182 return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
183 AllowCompatibleDifferences) ||
184 Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
185 AllowCompatibleDifferences);
189 const TargetOptions &TargetOpts, StringRef ModuleFilename,
bool Complain,
190 bool AllowCompatibleDifferences) {
191 return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
192 AllowCompatibleDifferences) ||
193 Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
194 AllowCompatibleDifferences);
199 return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
200 Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
206 return First->ReadFileSystemOptions(FSOpts, Complain) ||
207 Second->ReadFileSystemOptions(FSOpts, Complain);
212 StringRef ContextHash,
bool Complain) {
213 return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
215 Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename, ContextHash,
221 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
222 return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
223 Complain, SuggestedPredefines) ||
224 Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
225 Complain, SuggestedPredefines);
230 First->ReadCounter(M,
Value);
231 Second->ReadCounter(M,
Value);
235 return First->needsInputFileVisitation() ||
236 Second->needsInputFileVisitation();
240 return First->needsSystemInputFileVisitation() ||
241 Second->needsSystemInputFileVisitation();
246 bool DirectlyImported) {
247 First->visitModuleFile(Filename, Kind, DirectlyImported);
248 Second->visitModuleFile(Filename, Kind, DirectlyImported);
254 bool isExplicitModule) {
255 bool Continue =
false;
256 if (First->needsInputFileVisitation() &&
257 (!isSystem || First->needsSystemInputFileVisitation()))
258 Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
260 if (Second->needsInputFileVisitation() &&
261 (!isSystem || Second->needsSystemInputFileVisitation()))
262 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
269 First->readModuleFileExtension(Metadata);
270 Second->readModuleFileExtension(Metadata);
289 StringRef ModuleFilename,
291 bool AllowCompatibleDifferences =
true) {
295#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
296 if constexpr (CK::Compatibility != CK::Benign) { \
297 if ((CK::Compatibility == CK::NotCompatible) || \
298 (CK::Compatibility == CK::Compatible && \
299 !AllowCompatibleDifferences)) { \
300 if (ExistingLangOpts.Name != LangOpts.Name) { \
303 Diags->Report(diag::err_ast_file_langopt_mismatch) \
304 << Description << LangOpts.Name << ExistingLangOpts.Name \
307 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
308 << Description << ModuleFilename; \
315#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
316 if constexpr (CK::Compatibility != CK::Benign) { \
317 if ((CK::Compatibility == CK::NotCompatible) || \
318 (CK::Compatibility == CK::Compatible && \
319 !AllowCompatibleDifferences)) { \
320 if (ExistingLangOpts.Name != LangOpts.Name) { \
322 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
323 << Description << ModuleFilename; \
329#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
330 if constexpr (CK::Compatibility != CK::Benign) { \
331 if ((CK::Compatibility == CK::NotCompatible) || \
332 (CK::Compatibility == CK::Compatible && \
333 !AllowCompatibleDifferences)) { \
334 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
336 Diags->Report(diag::err_ast_file_langopt_value_mismatch) \
337 << Description << ModuleFilename; \
343#include "clang/Basic/LangOptions.def"
347 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
348 <<
"module features" << ModuleFilename;
354 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
355 <<
"target Objective-C runtime" << ModuleFilename;
362 Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
363 <<
"block command names" << ModuleFilename;
371 if (!AllowCompatibleDifferences) {
375 ExistingSanitizers.
clear(ModularSanitizers);
376 ImportedSanitizers.
clear(ModularSanitizers);
377 if (ExistingSanitizers.
Mask != ImportedSanitizers.
Mask) {
378 const std::string Flag =
"-fsanitize=";
380#define SANITIZER(NAME, ID) \
382 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
383 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
384 if (InExistingModule != InImportedModule) \
385 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
386 << InExistingModule << ModuleFilename << (Flag + NAME); \
388#include "clang/Basic/Sanitizers.def"
399 StringRef ModuleFilename,
401 bool AllowCompatibleDifferences =
true) {
405#define CODEGENOPT(Name, Bits, Default, Compatibility) \
406 if constexpr (CK::Compatibility != CK::Benign) { \
407 if ((CK::Compatibility == CK::NotCompatible) || \
408 (CK::Compatibility == CK::Compatible && \
409 !AllowCompatibleDifferences)) { \
410 if (ExistingCGOpts.Name != CGOpts.Name) { \
413 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
414 << #Name << CGOpts.Name << ExistingCGOpts.Name \
417 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
418 << #Name << ModuleFilename; \
425#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
426 if constexpr (CK::Compatibility != CK::Benign) { \
427 if ((CK::Compatibility == CK::NotCompatible) || \
428 (CK::Compatibility == CK::Compatible && \
429 !AllowCompatibleDifferences)) { \
430 if (ExistingCGOpts.Name != CGOpts.Name) { \
432 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
433 << #Name << ModuleFilename; \
438#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
439 if constexpr (CK::Compatibility != CK::Benign) { \
440 if ((CK::Compatibility == CK::NotCompatible) || \
441 (CK::Compatibility == CK::Compatible && \
442 !AllowCompatibleDifferences)) { \
443 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
445 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
446 << #Name << ModuleFilename; \
451#define DEBUGOPT(Name, Bits, Default, Compatibility)
452#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
453#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
454#include "clang/Basic/CodeGenOptions.def"
467 StringRef ModuleFilename,
469 bool AllowCompatibleDifferences =
true) {
470#define CHECK_TARGET_OPT(Field, Name) \
471 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
473 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
474 << ModuleFilename << Name << TargetOpts.Field \
475 << ExistingTargetOpts.Field; \
486 if (!AllowCompatibleDifferences) {
491#undef CHECK_TARGET_OPT
499 llvm::sort(ExistingFeatures);
500 ExistingFeatures.erase(llvm::unique(ExistingFeatures),
501 ExistingFeatures.end());
502 llvm::sort(ReadFeatures);
503 ReadFeatures.erase(llvm::unique(ReadFeatures), ReadFeatures.end());
509 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
510 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
511 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
512 ExistingFeatures.begin(), ExistingFeatures.end(),
513 std::back_inserter(UnmatchedReadFeatures));
517 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
521 for (StringRef
Feature : UnmatchedReadFeatures)
522 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
523 <<
false << ModuleFilename <<
Feature;
524 for (StringRef
Feature : UnmatchedExistingFeatures)
525 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
526 <<
true << ModuleFilename <<
Feature;
529 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
533 StringRef ModuleFilename,
bool Complain,
534 bool AllowCompatibleDifferences) {
535 const LangOptions &ExistingLangOpts = PP.getLangOpts();
537 Complain ? &Reader.Diags :
nullptr,
538 AllowCompatibleDifferences);
542 StringRef ModuleFilename,
bool Complain,
543 bool AllowCompatibleDifferences) {
546 Complain ? &Reader.Diags :
nullptr,
547 AllowCompatibleDifferences);
551 StringRef ModuleFilename,
bool Complain,
552 bool AllowCompatibleDifferences) {
553 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
555 Complain ? &Reader.Diags :
nullptr,
556 AllowCompatibleDifferences);
561using MacroDefinitionsMap =
562 llvm::StringMap<std::pair<StringRef,
bool >>;
571 bool empty()
const {
return Decls.empty(); }
573 bool insert(NamedDecl *ND) {
574 auto [_, Inserted] =
Found.insert(ND);
581using DeclsMap = llvm::DenseMap<DeclarationName, DeclsSet>;
587 StringRef ModuleFilename,
597 for (
auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
606 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
608 ->getWarningOptionForDiag(DiagID)
628 StringRef ModuleFilename,
bool IsSystem,
629 bool SystemHeaderWarningsInModule,
638 !SystemHeaderWarningsInModule) {
640 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
641 <<
"-Wsystem-headers" << ModuleFilename;
648 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
649 <<
"-Werror" << ModuleFilename;
656 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
657 <<
"-Weverything -Werror" << ModuleFilename;
664 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
665 <<
"-pedantic-errors" << ModuleFilename;
690 assert(!ModuleName.empty() &&
"diagnostic options read before module name");
694 assert(M &&
"missing module");
699 StringRef ModuleFilename,
703 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
707 PP.getFileManager().getVirtualFileSystem(),
711 assert(ModuleMgr.
size() >= 1 &&
"what ASTFile is this then");
717 Module *Importer = PP.getCurrentModule();
720 bool SystemHeaderWarningsInModule =
727 TopM->
IsSystem, SystemHeaderWarningsInModule,
735 MacroDefinitionsMap &
Macros,
737 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
739 bool IsUndef = PPOpts.
Macros[I].second;
741 std::pair<StringRef, StringRef> MacroPair =
Macro.split(
'=');
742 StringRef MacroName = MacroPair.first;
743 StringRef MacroBody = MacroPair.second;
747 auto [It, Inserted] =
Macros.try_emplace(MacroName);
748 if (MacroNames && Inserted)
749 MacroNames->push_back(MacroName);
751 It->second = std::make_pair(
"",
true);
756 if (MacroName.size() ==
Macro.size())
760 StringRef::size_type End = MacroBody.find_first_of(
"\n\r");
761 MacroBody = MacroBody.substr(0, End);
764 auto [It, Inserted] =
Macros.try_emplace(MacroName);
765 if (MacroNames && Inserted)
766 MacroNames->push_back(MacroName);
767 It->second = std::make_pair(MacroBody,
false);
791 std::string &SuggestedPredefines,
const LangOptions &LangOpts,
795 MacroDefinitionsMap ASTFileMacros;
797 MacroDefinitionsMap ExistingMacros;
800 &ExistingMacroNames);
804 SuggestedPredefines +=
"# 1 \"<command line>\" 1\n";
806 for (
unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
808 StringRef MacroName = ExistingMacroNames[I];
809 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
812 llvm::StringMap<std::pair<StringRef,
bool >>
::iterator Known =
813 ASTFileMacros.find(MacroName);
819 Diags->
Report(diag::err_ast_file_macro_def_undef)
820 << MacroName <<
true << ModuleFilename;
828 if (Existing.second) {
829 SuggestedPredefines +=
"#undef ";
830 SuggestedPredefines += MacroName.str();
831 SuggestedPredefines +=
'\n';
833 SuggestedPredefines +=
"#define ";
834 SuggestedPredefines += MacroName.str();
835 SuggestedPredefines +=
' ';
836 SuggestedPredefines += Existing.first.str();
837 SuggestedPredefines +=
'\n';
844 if (Existing.second != Known->second.second) {
846 Diags->
Report(diag::err_ast_file_macro_def_undef)
847 << MacroName << Known->second.second << ModuleFilename;
854 if (Existing.second || Existing.first == Known->second.first) {
855 ASTFileMacros.erase(Known);
861 Diags->
Report(diag::err_ast_file_macro_def_conflict)
862 << MacroName << Known->second.first << Existing.first
869 SuggestedPredefines +=
"# 1 \"<built-in>\" 2\n";
874 for (
const auto &MacroName : ASTFileMacros.keys()) {
876 Diags->
Report(diag::err_ast_file_macro_def_undef)
877 << MacroName <<
false << ModuleFilename;
888 Diags->
Report(diag::err_ast_file_undef)
895 if (LangOpts.Modules &&
899 Diags->
Report(diag::err_ast_file_pp_detailed_record)
906 for (
unsigned I = 0, N = ExistingPPOpts.
Includes.size(); I != N; ++I) {
913 SuggestedPredefines +=
"#include \"";
914 SuggestedPredefines +=
File;
915 SuggestedPredefines +=
"\"\n";
925 SuggestedPredefines +=
"#include \"";
926 SuggestedPredefines +=
File;
927 SuggestedPredefines +=
"\"\n";
930 for (
unsigned I = 0, N = ExistingPPOpts.
MacroIncludes.size(); I != N; ++I) {
935 SuggestedPredefines +=
"#__include_macros \"";
936 SuggestedPredefines +=
File;
937 SuggestedPredefines +=
"\"\n##\n";
944 StringRef ModuleFilename,
945 bool ReadMacros,
bool Complain,
946 std::string &SuggestedPredefines) {
950 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
951 Complain ? &Reader.Diags :
nullptr, PP.getFileManager(),
952 SuggestedPredefines, PP.getLangOpts());
957 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
959 ModuleFilename, ReadMacros,
nullptr,
960 PP.getFileManager(), SuggestedPredefines,
969 StringRef ExistingSpecificModuleCachePath,
970 StringRef ASTFilename,
978 std::string(ContextHash));
981 SpecificModuleCachePath == ExistingSpecificModuleCachePath)
983 auto EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
984 SpecificModuleCachePath, ExistingSpecificModuleCachePath);
985 if (EqualOrErr && *EqualOrErr)
991 EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
993 if (EqualOrErr && *EqualOrErr)
994 Diags->
Report(clang::diag::warn_ast_file_config_mismatch) << ASTFilename;
996 Diags->
Report(diag::err_ast_file_modulecache_mismatch)
997 << SpecificModuleCachePath << ExistingSpecificModuleCachePath
1004 StringRef ASTFilename,
1005 StringRef ContextHash,
1007 const HeaderSearch &HeaderSearchInfo = PP.getHeaderSearchInfo();
1010 ASTFilename, Complain ? &Reader.Diags :
nullptr,
1011 PP.getLangOpts(), PP.getPreprocessorOpts(),
1016 PP.setCounterValue(
Value);
1024 unsigned Length = 0;
1025 const char *
Error =
nullptr;
1027 uint64_t Val = llvm::decodeULEB128(P, &Length,
nullptr, &
Error);
1029 llvm::report_fatal_error(
Error);
1035static std::pair<unsigned, unsigned>
1038 if ((
unsigned)KeyLen != KeyLen)
1039 llvm::report_fatal_error(
"key too large");
1042 if ((
unsigned)DataLen != DataLen)
1043 llvm::report_fatal_error(
"data too large");
1045 return std::make_pair(KeyLen, DataLen);
1049 bool TakeOwnership) {
1050 DeserializationListener = Listener;
1051 OwnsDeserializationListener = TakeOwnership;
1062 Reader.ReadModuleOffsetMap(MF);
1064 unsigned ModuleFileIndex =
ID.getModuleFileIndex();
1065 unsigned LocalDeclID =
ID.getLocalDeclIndex();
1071 assert(OwningModuleFile);
1075 if (!ModuleFileIndex)
1078 assert(LocalDeclID < LocalNumDecls);
1086 unsigned ModuleFileIndex,
unsigned LocalDeclID) {
1091std::pair<unsigned, unsigned>
1098 using namespace llvm::support;
1101 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1103 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1110 Args.push_back(FirstII);
1111 for (
unsigned I = 1; I != N; ++I)
1112 Args.push_back(Reader.getLocalIdentifier(
1113 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1121 using namespace llvm::support;
1125 Result.ID = Reader.getGlobalSelectorID(
1126 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1127 unsigned FullInstanceBits =
1128 endian::readNext<uint16_t, llvm::endianness::little>(d);
1129 unsigned FullFactoryBits =
1130 endian::readNext<uint16_t, llvm::endianness::little>(d);
1131 Result.InstanceBits = FullInstanceBits & 0x3;
1132 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1133 Result.FactoryBits = FullFactoryBits & 0x3;
1134 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1135 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1136 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1139 for (
unsigned I = 0; I != NumInstanceMethods; ++I) {
1143 endian::readNext<DeclID, llvm::endianness::little>(d))))
1148 for (
unsigned I = 0; I != NumFactoryMethods; ++I) {
1152 endian::readNext<DeclID, llvm::endianness::little>(d))))
1160 return llvm::djbHash(a);
1163std::pair<unsigned, unsigned>
1170 assert(n >= 2 && d[n-1] ==
'\0');
1171 return StringRef((
const char*) d, n-1);
1177 bool IsInteresting =
1188 bool Value = Bits & 0x1;
1194 using namespace llvm::support;
1197 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1198 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1211 const unsigned char* d,
1213 using namespace llvm::support;
1216 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1217 bool IsInteresting = RawID & 0x01;
1227 II = &Reader.getIdentifierTable().getOwn(k);
1230 bool IsModule = Reader.getPreprocessor().getCurrentModule() !=
nullptr;
1232 Reader.markIdentifierUpToDate(II);
1234 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1235 if (!IsInteresting) {
1238 Reader.SetIdentifierInfo(ID, II);
1242 unsigned ObjCOrBuiltinID =
1243 endian::readNext<uint16_t, llvm::endianness::little>(d);
1244 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1245 bool CPlusPlusOperatorKeyword =
readBit(Bits);
1246 bool HasRevertedTokenIDToIdentifier =
readBit(Bits);
1247 bool Poisoned =
readBit(Bits);
1248 bool ExtensionToken =
readBit(Bits);
1249 bool HasMacroDefinition =
readBit(Bits);
1251 assert(Bits == 0 &&
"Extra bits in the identifier?");
1252 DataLen -=
sizeof(uint16_t) * 2;
1256 if (HasRevertedTokenIDToIdentifier && II->
getTokenID() != tok::identifier)
1261 "Incorrect extension token flag");
1262 (void)ExtensionToken;
1266 "Incorrect C++ operator keyword flag");
1267 (void)CPlusPlusOperatorKeyword;
1271 if (HasMacroDefinition) {
1272 uint32_t MacroDirectivesOffset =
1273 endian::readNext<uint32_t, llvm::endianness::little>(d);
1276 if (MacroDirectivesOffset)
1277 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1279 hasMacroDefinitionInDependencies =
true;
1282 Reader.SetIdentifierInfo(ID, II);
1288 for (; DataLen > 0; DataLen -=
sizeof(
DeclID))
1289 DeclIDs.push_back(Reader.getGlobalDeclID(
1292 endian::readNext<DeclID, llvm::endianness::little>(d))));
1293 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1300 : Kind(Name.getNameKind()) {
1330 llvm::FoldingSetNodeID ID;
1331 ID.AddInteger(Kind);
1354 return ID.computeStableHash();
1359 using namespace llvm::support;
1361 uint32_t ModuleFileID =
1362 endian::readNext<uint32_t, llvm::endianness::little>(d);
1363 return Reader.getLocalModuleFile(
F, ModuleFileID);
1366std::pair<unsigned, unsigned>
1373 using namespace llvm::support;
1382 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1389 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1413 using namespace llvm::support;
1415 for (
unsigned NumDecls = DataLen /
sizeof(
DeclID); NumDecls; --NumDecls) {
1417 Reader,
F, endian::readNext<DeclID, llvm::endianness::little>(d));
1423 const unsigned char *d,
1431 llvm::FoldingSetNodeID ID;
1432 ID.AddInteger(Key.first.getHash());
1433 ID.AddInteger(Key.second);
1434 return ID.computeStableHash();
1445 return {Name, *ModuleHash};
1451 unsigned PrimaryModuleHash =
1452 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1453 return {Name, PrimaryModuleHash};
1457 const unsigned char *d,
1465 using namespace llvm::support;
1467 uint32_t ModuleFileID =
1468 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1469 return Reader.getLocalModuleFile(F, ModuleFileID);
1474 using namespace llvm::support;
1475 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1478std::pair<unsigned, unsigned>
1484 const unsigned char *d,
1487 using namespace llvm::support;
1489 for (
unsigned NumDecls =
1491 NumDecls; --NumDecls) {
1494 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1495 Val.
insert(Reader.getGlobalDeclID(F, LocalID));
1499bool ASTReader::ReadLexicalDeclContextStorage(
ModuleFile &M,
1500 BitstreamCursor &Cursor,
1503 assert(Offset != 0);
1506 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1507 Error(std::move(Err));
1515 Error(MaybeCode.takeError());
1518 unsigned Code = MaybeCode.get();
1521 if (!MaybeRecCode) {
1522 Error(MaybeRecCode.takeError());
1525 unsigned RecCode = MaybeRecCode.get();
1527 Error(
"Expected lexical block");
1532 "expected a TU_UPDATE_LEXICAL record for TU");
1537 auto &Lex = LexicalDecls[DC];
1539 Lex = std::make_pair(
1542 Blob.size() /
sizeof(
DeclID)));
1548bool ASTReader::ReadVisibleDeclContextStorage(
1549 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1550 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1551 assert(Offset != 0);
1553 SavedStreamPosition SavedPosition(Cursor);
1554 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1555 Error(std::move(Err));
1561 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1563 Error(MaybeCode.takeError());
1566 unsigned Code = MaybeCode.get();
1568 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1569 if (!MaybeRecCode) {
1570 Error(MaybeRecCode.takeError());
1573 unsigned RecCode = MaybeRecCode.get();
1574 switch (VisibleKind) {
1575 case VisibleDeclContextStorageKind::GenerallyVisible:
1577 Error(
"Expected visible lookup table block");
1581 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1583 Error(
"Expected module local visible lookup table block");
1587 case VisibleDeclContextStorageKind::TULocalVisible:
1589 Error(
"Expected TU local lookup table block");
1597 auto *
Data = (
const unsigned char*)Blob.data();
1598 switch (VisibleKind) {
1599 case VisibleDeclContextStorageKind::GenerallyVisible:
1600 PendingVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1602 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1603 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1605 case VisibleDeclContextStorageKind::TULocalVisible:
1607 TULocalUpdates[
ID].push_back(UpdateData{&M,
Data});
1613void ASTReader::AddSpecializations(
const Decl *D,
const unsigned char *
Data,
1617 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1618 SpecLookups[D].Table.add(&M,
Data,
1622bool ASTReader::ReadSpecializations(
ModuleFile &M, BitstreamCursor &Cursor,
1623 uint64_t Offset, Decl *D,
bool IsPartial) {
1624 assert(Offset != 0);
1626 SavedStreamPosition SavedPosition(Cursor);
1627 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1628 Error(std::move(Err));
1634 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1636 Error(MaybeCode.takeError());
1639 unsigned Code = MaybeCode.get();
1641 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1642 if (!MaybeRecCode) {
1643 Error(MaybeRecCode.takeError());
1646 unsigned RecCode = MaybeRecCode.get();
1649 Error(
"Expected decl specs block");
1653 auto *
Data = (
const unsigned char *)Blob.data();
1654 AddSpecializations(D,
Data, M, IsPartial);
1658void ASTReader::Error(StringRef Msg)
const {
1659 Error(diag::err_fe_ast_file_malformed, Msg);
1660 if (PP.getLangOpts().Modules &&
1661 !PP.getHeaderSearchInfo().getSpecificModuleCachePath().empty()) {
1662 Diag(diag::note_module_cache_path)
1663 << PP.getHeaderSearchInfo().getSpecificModuleCachePath();
1667void ASTReader::Error(
unsigned DiagID, StringRef Arg1, StringRef Arg2,
1668 StringRef Arg3)
const {
1669 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1673struct AlreadyReportedDiagnosticError
1674 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1677 void log(raw_ostream &OS)
const override {
1678 llvm_unreachable(
"reporting an already-reported diagnostic error");
1681 std::error_code convertToErrorCode()
const override {
1682 return llvm::inconvertibleErrorCode();
1686char AlreadyReportedDiagnosticError::ID = 0;
1689void ASTReader::Error(llvm::Error &&Err)
const {
1691 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1692 [&](llvm::ErrorInfoBase &E) {
return Error(E.message()); });
1702 LineTableInfo &LineTable = SourceMgr.getLineTable();
1705 std::map<int, int> FileIDs;
1707 for (
unsigned I = 0;
Record[Idx]; ++I) {
1709 auto Filename = ReadPath(F,
Record, Idx);
1715 std::vector<LineEntry> Entries;
1716 while (Idx <
Record.size()) {
1717 FileID FID = ReadFileID(F,
Record, Idx);
1720 unsigned NumEntries =
Record[Idx++];
1721 assert(NumEntries &&
"no line entries for file ID");
1723 Entries.reserve(NumEntries);
1724 for (
unsigned I = 0; I != NumEntries; ++I) {
1725 unsigned FileOffset =
Record[Idx++];
1726 unsigned LineNo =
Record[Idx++];
1727 int FilenameID = FileIDs[
Record[Idx++]];
1730 unsigned IncludeOffset =
Record[Idx++];
1732 FileKind, IncludeOffset));
1739llvm::Error ASTReader::ReadSourceManagerBlock(
ModuleFile &F) {
1740 using namespace SrcMgr;
1748 SLocEntryCursor = F.
Stream;
1751 if (llvm::Error Err = F.
Stream.SkipBlock())
1761 Expected<llvm::BitstreamEntry> MaybeE =
1762 SLocEntryCursor.advanceSkippingSubblocks();
1764 return MaybeE.takeError();
1765 llvm::BitstreamEntry E = MaybeE.get();
1768 case llvm::BitstreamEntry::SubBlock:
1769 case llvm::BitstreamEntry::Error:
1770 return llvm::createStringError(std::errc::illegal_byte_sequence,
1771 "malformed block record in AST file");
1772 case llvm::BitstreamEntry::EndBlock:
1773 return llvm::Error::success();
1774 case llvm::BitstreamEntry::Record:
1782 Expected<unsigned> MaybeRecord =
1783 SLocEntryCursor.readRecord(E.ID,
Record, &Blob);
1785 return MaybeRecord.takeError();
1786 switch (MaybeRecord.get()) {
1794 return llvm::Error::success();
1799llvm::Expected<SourceLocation::UIntTy>
1805 return std::move(Err);
1809 return MaybeEntry.takeError();
1811 llvm::BitstreamEntry Entry = MaybeEntry.get();
1812 if (Entry.Kind != llvm::BitstreamEntry::Record)
1813 return llvm::createStringError(
1814 std::errc::illegal_byte_sequence,
1815 "incorrectly-formatted source location entry in AST file");
1821 return MaybeSLOC.takeError();
1823 switch (MaybeSLOC.get()) {
1825 return llvm::createStringError(
1826 std::errc::illegal_byte_sequence,
1827 "incorrectly-formatted source location entry in AST file");
1837 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1838 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1839 "Corrupted global sloc offset map");
1844 auto It = llvm::upper_bound(
1847 int ID = F->SLocEntryBaseID + LocalIndex;
1848 std::size_t Index = -ID - 2;
1849 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1850 assert(!SourceMgr.SLocEntryLoaded[Index]);
1851 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1852 if (!MaybeEntryOffset) {
1853 Error(MaybeEntryOffset.takeError());
1857 SourceMgr.LoadedSLocEntryTable[Index] =
1858 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1859 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1861 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1877 Error(
"source location entry ID out-of-range for AST file");
1883 auto ReadBuffer = [
this](
1884 BitstreamCursor &SLocEntryCursor,
1885 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1890 Error(MaybeCode.takeError());
1893 unsigned Code = MaybeCode.get();
1896 SLocEntryCursor.readRecord(Code,
Record, &Blob);
1897 if (!MaybeRecCode) {
1898 Error(MaybeRecCode.takeError());
1901 unsigned RecCode = MaybeRecCode.get();
1906 const llvm::compression::Format F =
1907 Blob.size() > 0 && Blob.data()[0] == 0x78
1908 ? llvm::compression::Format::Zlib
1909 : llvm::compression::Format::Zstd;
1910 if (
const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1915 if (llvm::Error E = llvm::compression::decompress(
1916 F, llvm::arrayRefFromStringRef(Blob), Decompressed,
Record[0])) {
1917 Error(
"could not decompress embedded file contents: " +
1918 llvm::toString(std::move(E)));
1921 return llvm::MemoryBuffer::getMemBufferCopy(
1922 llvm::toStringRef(Decompressed), Name);
1924 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name,
true);
1926 Error(
"AST record has invalid code");
1931 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1935 Error(std::move(Err));
1942 ++NumSLocEntriesRead;
1945 Error(MaybeEntry.takeError());
1948 llvm::BitstreamEntry Entry = MaybeEntry.get();
1950 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1951 Error(
"incorrectly-formatted source location entry in AST file");
1958 SLocEntryCursor.readRecord(Entry.ID,
Record, &Blob);
1960 Error(MaybeSLOC.takeError());
1963 switch (MaybeSLOC.get()) {
1965 Error(
"incorrectly-formatted source location entry in AST file");
1971 unsigned InputID =
Record[4];
1972 InputFile IF = getInputFile(*F, InputID);
1985 IncludeLoc = getImportLocation(F);
1989 FileID FID = SourceMgr.createFileID(*
File, IncludeLoc, FileCharacter, ID,
1992 FileInfo.NumCreatedFIDs =
Record[5];
1996 unsigned NumFileDecls =
Record[7];
1997 if (NumFileDecls && ContextObj) {
1999 assert(F->
FileSortedDecls &&
"FILE_SORTED_DECLS not encountered yet ?");
2005 SourceMgr.getOrCreateContentCache(*
File, isSystem(FileCharacter));
2009 auto Buffer = ReadBuffer(SLocEntryCursor,
File->getName());
2012 SourceMgr.overrideFileContents(*
File, std::move(Buffer));
2019 const char *Name = Blob.data();
2020 unsigned Offset =
Record[0];
2025 IncludeLoc = getImportLocation(F);
2028 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2031 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2032 BaseOffset + Offset, IncludeLoc);
2034 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2035 FileInfo.setHasLineDirectives();
2044 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2059 Error(
"source location entry ID out-of-range for AST file");
2064 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2082 assert(SourceMgr.getMainFileID().isValid() &&
"missing main file");
2083 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2093 uint64_t *StartOfBlockOffset) {
2094 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2097 if (StartOfBlockOffset)
2098 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2101 uint64_t Offset = Cursor.GetCurrentBitNo();
2104 return MaybeCode.takeError();
2105 unsigned Code = MaybeCode.get();
2108 if (Code != llvm::bitc::DEFINE_ABBREV) {
2109 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2111 return llvm::Error::success();
2113 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2126 if (
Tok.isAnnotation()) {
2128 switch (
Tok.getKind()) {
2129 case tok::annot_pragma_loop_hint: {
2133 unsigned NumTokens =
Record[Idx++];
2135 Toks.reserve(NumTokens);
2136 for (
unsigned I = 0; I < NumTokens; ++I)
2138 Info->Toks =
llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2139 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2142 case tok::annot_pragma_pack: {
2147 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2149 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2153 case tok::annot_pragma_openmp:
2154 case tok::annot_pragma_openmp_end:
2155 case tok::annot_pragma_unused:
2156 case tok::annot_pragma_openacc:
2157 case tok::annot_pragma_openacc_end:
2158 case tok::annot_repl_input_end:
2161 llvm_unreachable(
"missing deserialization code for annotation token");
2166 Tok.setIdentifierInfo(II);
2178 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2180 consumeError(std::move(Err));
2192 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2194 Stream.advanceSkippingSubblocks(Flags);
2196 Error(MaybeEntry.takeError());
2199 llvm::BitstreamEntry Entry = MaybeEntry.get();
2201 switch (Entry.Kind) {
2202 case llvm::BitstreamEntry::SubBlock:
2203 case llvm::BitstreamEntry::Error:
2204 Error(
"malformed block record in AST file");
2206 case llvm::BitstreamEntry::EndBlock:
2208 case llvm::BitstreamEntry::Record:
2219 Error(MaybeRecType.takeError());
2235 unsigned NextIndex = 1;
2237 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2242 PP.getPreprocessorAllocator());
2245 bool isC99VarArgs =
Record[NextIndex++];
2246 bool isGNUVarArgs =
Record[NextIndex++];
2247 bool hasCommaPasting =
Record[NextIndex++];
2248 MacroParams.clear();
2249 unsigned NumArgs =
Record[NextIndex++];
2250 for (
unsigned i = 0; i != NumArgs; ++i)
2265 if (NextIndex + 1 ==
Record.size() && PP.getPreprocessingRecord() &&
2270 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2272 PreprocessingRecord::PPEntityID PPID =
2273 PPRec.getPPEntityID(Index,
true);
2275 PPRec.getPreprocessedEntity(PPID));
2277 PPRec.RegisterMacroDefinition(
Macro, PPDef);
2288 if (MacroTokens.empty()) {
2289 Error(
"unexpected number of macro tokens for a macro in AST file");
2295 MacroTokens = MacroTokens.drop_front();
2306 ReadModuleOffsetMap(M);
2308 unsigned ModuleFileIndex = LocalID >> 32;
2309 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2312 assert(MF &&
"malformed identifier ID encoding?");
2314 if (!ModuleFileIndex) {
2323HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
2326 return FileMgr.getOptionalFileRef(Key.Filename);
2330 return FileMgr.getOptionalFileRef(*Resolved);
2334 uint8_t buf[
sizeof(ikey.
Size) +
sizeof(ikey.
ModTime)];
2337 return llvm::xxh3_64bits(buf);
2358 return FEA && FEA == FEB;
2361std::pair<unsigned, unsigned>
2368 using namespace llvm::support;
2371 ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2373 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2382 using namespace llvm::support;
2384 const unsigned char *End = d + DataLen;
2386 unsigned Flags = *d++;
2389 bool Included = (Flags >> 6) & 0x01;
2391 if ((FE = getFile(key)))
2394 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2397 HFI.
isImport |= (Flags >> 5) & 0x01;
2399 HFI.
DirInfo = (Flags >> 1) & 0x07;
2401 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2403 assert((End - d) % 4 == 0 &&
2404 "Wrong data length in HeaderFileInfo deserialization");
2406 uint32_t LocalSMID =
2407 endian::readNext<uint32_t, llvm::endianness::little>(d);
2413 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2414 Module *Mod = Reader.getSubmodule(GlobalSMID);
2416 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2418 if (FE || (FE = getFile(key))) {
2421 ModMap.
addHeader(Mod, H, HeaderRole,
true);
2433 uint32_t MacroDirectivesOffset) {
2434 assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
2435 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2442 for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
2443 BitstreamCursor &MacroCursor = I.MacroCursor;
2446 if (MacroCursor.getBitcodeBytes().empty())
2449 BitstreamCursor Cursor = MacroCursor;
2450 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2451 Error(std::move(Err));
2459 Error(MaybeE.takeError());
2462 llvm::BitstreamEntry E = MaybeE.get();
2465 case llvm::BitstreamEntry::SubBlock:
2466 case llvm::BitstreamEntry::Error:
2467 Error(
"malformed block record in AST file");
2469 case llvm::BitstreamEntry::EndBlock:
2472 case llvm::BitstreamEntry::Record: {
2476 Error(MaybeRecord.takeError());
2479 switch (MaybeRecord.get()) {
2506 class IdentifierLookupVisitor {
2509 unsigned PriorGeneration;
2510 unsigned &NumIdentifierLookups;
2511 unsigned &NumIdentifierLookupHits;
2515 IdentifierLookupVisitor(StringRef Name,
unsigned PriorGeneration,
2516 unsigned &NumIdentifierLookups,
2517 unsigned &NumIdentifierLookupHits)
2519 PriorGeneration(PriorGeneration),
2520 NumIdentifierLookups(NumIdentifierLookups),
2521 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2535 ++NumIdentifierLookups;
2536 ASTIdentifierLookupTable::iterator Pos =
2537 IdTable->find_hashed(Name, NameHash, &Trait);
2538 if (Pos == IdTable->end())
2544 ++NumIdentifierLookupHits;
2546 if (Trait.hasMoreInformationInDependencies()) {
2555 IdentifierInfo *getIdentifierInfo()
const {
return Found; }
2564 unsigned PriorGeneration = 0;
2566 PriorGeneration = IdentifierGeneration[&II];
2573 if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
2578 IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
2579 NumIdentifierLookups,
2580 NumIdentifierLookupHits);
2581 ModuleMgr.visit(Visitor, HitsPtr);
2598 uint64_t ModuleFileIndex =
Record[Idx++] << 32;
2599 uint64_t LocalIndex =
Record[Idx++];
2604 const PendingMacroInfo &PMInfo) {
2609 if (llvm::Error Err =
2611 Error(std::move(Err));
2615 struct ModuleMacroRecord {
2628 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2630 Error(MaybeEntry.takeError());
2633 llvm::BitstreamEntry Entry = MaybeEntry.get();
2635 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2636 Error(
"malformed block record in AST file");
2643 Error(MaybePP.takeError());
2651 ModuleMacros.push_back(ModuleMacroRecord());
2652 auto &Info = ModuleMacros.back();
2656 for (
int I = Idx, N =
Record.size(); I != N; ++I)
2662 Error(
"malformed block record in AST file");
2673 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2675 for (
auto &MMR : ModuleMacros) {
2677 for (
unsigned ModID : MMR.Overrides) {
2679 auto *
Macro = PP.getModuleMacro(Mod, II);
2680 assert(
Macro &&
"missing definition for overridden macro");
2681 Overrides.push_back(
Macro);
2684 bool Inserted =
false;
2686 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2697 unsigned Idx = 0, N =
Record.size();
2705 MD = PP.AllocateDefMacroDirective(MI, Loc);
2709 MD = PP.AllocateUndefMacroDirective(Loc);
2712 bool isPublic =
Record[Idx++];
2713 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2725 PP.setLoadedMacroDirective(II, Earliest, Latest);
2728bool ASTReader::shouldDisableValidationForFile(
2751static std::pair<StringRef, StringRef>
2753 const StringRef InputBlob) {
2754 uint16_t AsRequestedLength =
Record[7];
2755 return {InputBlob.substr(0, AsRequestedLength),
2756 InputBlob.substr(AsRequestedLength)};
2770 SavedStreamPosition SavedPosition(Cursor);
2774 consumeError(std::move(Err));
2777 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
2780 consumeError(MaybeCode.takeError());
2782 unsigned Code = MaybeCode.get();
2786 if (Expected<unsigned> Maybe =
Cursor.readRecord(Code,
Record, &Blob))
2788 "invalid record type for input file");
2791 consumeError(
Maybe.takeError());
2794 assert(
Record[0] == ID &&
"Bogus stored ID or offset");
2796 R.StoredSize =
static_cast<off_t
>(
Record[1]);
2797 R.StoredTime =
static_cast<time_t
>(
Record[2]);
2798 R.Overridden =
static_cast<bool>(
Record[3]);
2799 R.Transient =
static_cast<bool>(
Record[4]);
2800 R.TopLevel =
static_cast<bool>(
Record[5]);
2801 R.ModuleMap =
static_cast<bool>(
Record[6]);
2802 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2804 R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2805 R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2806 ? UnresolvedFilenameAsRequested
2807 : UnresolvedFilename;
2809 Expected<llvm::BitstreamEntry> MaybeEntry =
Cursor.advance();
2811 consumeError(MaybeEntry.takeError());
2812 llvm::BitstreamEntry Entry = MaybeEntry.get();
2813 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2814 "expected record type for input file hash");
2817 if (Expected<unsigned> Maybe =
Cursor.readRecord(Entry.ID,
Record))
2819 "invalid record type for input file hash");
2822 consumeError(
Maybe.takeError());
2847 SavedStreamPosition SavedPosition(Cursor);
2851 consumeError(std::move(Err));
2866 const HeaderSearchOptions &HSOpts =
2867 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2880 if ((Overridden || Transient || SkipChecks) && !
File)
2885 std::string ErrorStr =
"could not find file '";
2886 ErrorStr += *Filename;
2887 ErrorStr +=
"' referenced by AST file '";
2901 SourceManager &
SM = getSourceManager();
2903 if ((!Overridden && !Transient) && !SkipChecks &&
2904 SM.isFileOverridden(*
File)) {
2906 Error(diag::err_fe_pch_file_overridden, *Filename);
2917 auto HasInputContentChanged = [&](
Change OriginalChange) {
2918 assert(ValidateASTInputFilesContent &&
2919 "We should only check the content of the inputs with "
2920 "ValidateASTInputFilesContent enabled.");
2922 if (StoredContentHash == 0)
2923 return OriginalChange;
2926 if (!MemBuffOrError) {
2928 return OriginalChange;
2929 std::string ErrorStr =
"could not get buffer for file '";
2930 ErrorStr +=
File->getName();
2933 return OriginalChange;
2936 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2937 if (StoredContentHash ==
static_cast<uint64_t>(ContentHash))
2942 auto HasInputFileChanged = [&]() {
2943 if (StoredSize !=
File->getSize())
2945 if (!shouldDisableValidationForFile(F) && StoredTime &&
2946 StoredTime !=
File->getModificationTime()) {
2948 File->getModificationTime()};
2952 if (ValidateASTInputFilesContent)
2953 return HasInputContentChanged(MTimeChange);
2960 bool IsOutOfDate =
false;
2967 FileChange = HasInputContentChanged(FileChange);
2973 if (!StoredTime && ValidateASTInputFilesContent &&
2975 FileChange = HasInputContentChanged(FileChange);
2981 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
2982 while (!ImportStack.back()->ImportedBy.empty())
2983 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
2986 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
2987 Diag(diag::err_fe_ast_file_modified)
2989 << TopLevelASTFileName;
2990 Diag(diag::note_fe_ast_file_modified)
2991 << FileChange.Kind << (FileChange.Old && FileChange.New)
2992 << llvm::itostr(FileChange.Old.value_or(0))
2993 << llvm::itostr(FileChange.New.value_or(0));
2996 if (ImportStack.size() > 1) {
2997 Diag(diag::note_ast_file_required_by)
2998 << *Filename << ImportStack[0]->FileName;
2999 for (
unsigned I = 1; I < ImportStack.size(); ++I)
3000 Diag(diag::note_ast_file_required_by)
3001 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3005 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3006 Diag(diag::note_ast_file_input_files_validation_status)
3022ASTReader::TemporarilyOwnedStringRef
3028ASTReader::TemporarilyOwnedStringRef
3031 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
3033 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3034 Path ==
"<built-in>" || Path ==
"<command line>")
3038 llvm::sys::path::append(Buf, Prefix, Path);
3039 StringRef ResolvedPath{Buf.data(), Buf.size()};
3040 return {ResolvedPath, Buf};
3053 return ResolvedPath->str();
3068 llvm_unreachable(
"unknown ASTReadResult");
3072 BitstreamCursor &Stream, StringRef Filename,
3073 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3074 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3077 consumeError(std::move(Err));
3085 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3088 consumeError(MaybeEntry.takeError());
3091 llvm::BitstreamEntry Entry = MaybeEntry.get();
3093 switch (Entry.Kind) {
3094 case llvm::BitstreamEntry::Error:
3095 case llvm::BitstreamEntry::SubBlock:
3098 case llvm::BitstreamEntry::EndBlock:
3101 case llvm::BitstreamEntry::Record:
3108 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3109 if (!MaybeRecordType) {
3111 consumeError(MaybeRecordType.takeError());
3116 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3117 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3118 AllowCompatibleConfigurationMismatch))
3119 Result = ConfigurationMismatch;
3124 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3125 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3126 AllowCompatibleConfigurationMismatch))
3127 Result = ConfigurationMismatch;
3132 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3133 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3134 AllowCompatibleConfigurationMismatch))
3135 Result = ConfigurationMismatch;
3140 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3141 if (!AllowCompatibleConfigurationMismatch &&
3142 ParseFileSystemOptions(
Record, Complain, Listener))
3143 Result = ConfigurationMismatch;
3148 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3149 if (!AllowCompatibleConfigurationMismatch &&
3150 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3151 Result = ConfigurationMismatch;
3156 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3157 if (!AllowCompatibleConfigurationMismatch &&
3158 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3159 SuggestedPredefines))
3160 Result = ConfigurationMismatch;
3166ASTReader::RelocationResult
3167ASTReader::getModuleForRelocationChecks(
ModuleFile &F,
bool DirectoryCheck) {
3169 const bool IgnoreError =
3170 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3173 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3174 return {std::nullopt, IgnoreError};
3178 if (!DirectoryCheck &&
3179 (!IsImplicitModule || ModuleMgr.begin()->Kind ==
MK_MainFile))
3180 return {std::nullopt, IgnoreError};
3182 const HeaderSearchOptions &HSOpts =
3183 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3190 return {std::nullopt, IgnoreError};
3192 return {std::nullopt, IgnoreError};
3200 Module *M = PP.getHeaderSearchInfo().lookupModule(
3205 return {M, IgnoreError};
3210 SmallVectorImpl<ImportedModule> &Loaded,
3212 unsigned ClientLoadCapabilities) {
3213 BitstreamCursor &Stream = F.
Stream;
3216 Error(std::move(Err));
3226 bool HasReadUnhashedControlBlock =
false;
3227 auto readUnhashedControlBlockOnce = [&]() {
3228 if (!HasReadUnhashedControlBlock) {
3229 HasReadUnhashedControlBlock =
true;
3230 if (ASTReadResult
Result =
3231 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3237 bool DisableValidation = shouldDisableValidationForFile(F);
3241 unsigned NumInputs = 0;
3242 unsigned NumUserInputs = 0;
3243 StringRef BaseDirectoryAsWritten;
3245 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3247 Error(MaybeEntry.takeError());
3250 llvm::BitstreamEntry Entry = MaybeEntry.get();
3252 switch (Entry.Kind) {
3253 case llvm::BitstreamEntry::Error:
3254 Error(
"malformed block record in AST file");
3256 case llvm::BitstreamEntry::EndBlock: {
3259 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3263 const HeaderSearchOptions &HSOpts =
3264 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3271 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
3277 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3284 N = ForceValidateUserInputs ? NumUserInputs : 0;
3286 ForceValidateUserInputs
3292 Diag(diag::remark_module_validation)
3295 for (
unsigned I = 0; I < N; ++I) {
3296 InputFile IF = getInputFile(F, I+1, Complain);
3310 for (
unsigned I = 0; I < N; ++I) {
3311 bool IsSystem = I >= NumUserInputs;
3313 auto FilenameAsRequested = ResolveImportedPath(
3316 *FilenameAsRequested, IsSystem, FI.
Overridden,
3324 case llvm::BitstreamEntry::SubBlock:
3328 if (llvm::Error Err = Stream.SkipBlock()) {
3329 Error(std::move(Err));
3333 Error(
"malformed block record in AST file");
3343 if (Listener && !ImportedBy) {
3349 bool AllowCompatibleConfigurationMismatch =
3353 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3354 AllowCompatibleConfigurationMismatch, *Listener,
3355 SuggestedPredefines);
3357 Error(
"malformed block record in AST file");
3361 if (DisableValidation ||
3362 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3370 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3371 Error(std::move(Err));
3377 if (llvm::Error Err = Stream.SkipBlock()) {
3378 Error(std::move(Err));
3384 case llvm::BitstreamEntry::Record:
3392 Expected<unsigned> MaybeRecordType =
3393 Stream.readRecord(Entry.ID,
Record, &Blob);
3394 if (!MaybeRecordType) {
3395 Error(MaybeRecordType.takeError());
3401 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3403 : diag::err_ast_file_version_too_new)
3408 bool hasErrors =
Record[7];
3409 if (hasErrors && !DisableValidation) {
3412 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3413 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3416 if (!AllowASTWithCompilerErrors) {
3417 Diag(diag::err_ast_file_with_compiler_errors)
3423 Diags.ErrorOccurred =
true;
3424 Diags.UncompilableErrorOccurred =
true;
3425 Diags.UnrecoverableErrorOccurred =
true;
3438 StringRef ASTBranch = Blob;
3439 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3440 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3441 Diag(diag::err_ast_file_different_branch)
3453 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3463 auto [ImportLoc, ImportModuleFileIndex] =
3464 ReadUntranslatedSourceLocation(
Record[Idx++]);
3466 assert(ImportModuleFileIndex == 0);
3468 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3470 bool IsImportingStdCXXModule =
Record[Idx++];
3472 off_t StoredSize = 0;
3473 time_t StoredModTime = 0;
3474 unsigned ImplicitModuleSuffixLength = 0;
3475 ASTFileSignature StoredSignature;
3476 ModuleFileName ImportedFile;
3477 std::string StoredFile;
3478 bool IgnoreImportedByNote =
false;
3487 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3488 ImportedName, !IsImportingStdCXXModule);
3490 if (IsImportingStdCXXModule && ImportedFile.
empty()) {
3491 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3495 if (!IsImportingStdCXXModule) {
3496 StoredSize = (off_t)
Record[Idx++];
3497 StoredModTime = (time_t)
Record[Idx++];
3498 ImplicitModuleSuffixLength = (unsigned)
Record[Idx++];
3502 SignatureBytes.end());
3505 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3506 if (ImportedFile.
empty()) {
3507 ImportedFile = ImplicitModuleSuffixLength
3509 StoredFile, ImplicitModuleSuffixLength)
3510 : ModuleFileName::makeExplicit(StoredFile);
3512 (ImplicitModuleSuffixLength != 0));
3513 }
else if (!getDiags().isIgnored(
3514 diag::warn_module_file_mapping_mismatch,
3515 CurrentImportLoc)) {
3516 auto ImportedFileRef =
3517 PP.getFileManager().getOptionalFileRef(ImportedFile);
3518 auto StoredFileRef =
3519 PP.getFileManager().getOptionalFileRef(StoredFile);
3520 if ((ImportedFileRef && StoredFileRef) &&
3521 (*ImportedFileRef != *StoredFileRef)) {
3522 Diag(diag::warn_module_file_mapping_mismatch)
3523 << ImportedFile << StoredFile;
3524 Diag(diag::note_module_file_imported_by)
3526 IgnoreImportedByNote =
true;
3533 unsigned Capabilities = ClientLoadCapabilities;
3534 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3535 Capabilities &= ~ARR_Missing;
3538 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3539 Loaded, StoredSize, StoredModTime,
3540 StoredSignature, Capabilities);
3545 if (IsImportingStdCXXModule) {
3546 if (
const auto *Imported =
3547 getModuleManager().lookupByFileName(ImportedFile);
3548 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3549 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3555 bool recompilingFinalized =
Result == OutOfDate &&
3556 (Capabilities & ARR_OutOfDate) &&
3559 .getInMemoryModuleCache()
3561 if (!IgnoreImportedByNote &&
3563 Diag(diag::note_module_file_imported_by)
3567 case Failure:
return Failure;
3570 case OutOfDate:
return OutOfDate;
3572 case ConfigurationMismatch:
return ConfigurationMismatch;
3573 case HadErrors:
return HadErrors;
3592 Diag(diag::remark_module_import)
3594 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3600 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3608 BaseDirectoryAsWritten = Blob;
3610 "MODULE_DIRECTORY found before MODULE_NAME");
3613 auto [MaybeM, IgnoreError] =
3614 getModuleForRelocationChecks(F,
true);
3615 if (!MaybeM.has_value())
3618 Module *M = MaybeM.value();
3630 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3631 if (BuildDir && (*BuildDir == M->
Directory)) {
3635 Diag(diag::remark_module_relocated)
3638 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3639 Diag(diag::err_imported_module_relocated)
3645 if (ASTReadResult
Result =
3646 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3652 NumUserInputs =
Record[1];
3654 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3663llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3664 unsigned ClientLoadCapabilities) {
3665 BitstreamCursor &Stream = F.
Stream;
3667 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3674 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3676 return MaybeEntry.takeError();
3677 llvm::BitstreamEntry Entry = MaybeEntry.get();
3679 switch (Entry.Kind) {
3680 case llvm::BitstreamEntry::Error:
3681 return llvm::createStringError(
3682 std::errc::illegal_byte_sequence,
3683 "error at end of module block in AST file");
3684 case llvm::BitstreamEntry::EndBlock:
3690 if (ASTContext *Ctx = ContextObj) {
3691 DeclContext *DC = Ctx->getTranslationUnitDecl();
3696 return llvm::Error::success();
3697 case llvm::BitstreamEntry::SubBlock:
3705 if (llvm::Error Err = Stream.SkipBlock())
3707 if (llvm::Error Err = ReadBlockAbbrevs(
3714 if (!PP.getExternalSource())
3715 PP.setExternalSource(
this);
3717 if (llvm::Error Err = Stream.SkipBlock())
3719 if (llvm::Error Err =
3728 if (llvm::Error Err = Stream.SkipBlock()) {
3737 if (!PP.getPreprocessingRecord())
3738 PP.createPreprocessingRecord();
3739 if (!PP.getPreprocessingRecord()->getExternalSource())
3740 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3744 if (llvm::Error Err = ReadSourceManagerBlock(F))
3749 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
3754 BitstreamCursor
C = Stream;
3756 if (llvm::Error Err = Stream.SkipBlock())
3760 CommentsCursors.push_back(std::make_pair(
C, &F));
3765 if (llvm::Error Err = Stream.SkipBlock())
3771 case llvm::BitstreamEntry::Record:
3779 Expected<unsigned> MaybeRecordType =
3780 Stream.readRecord(Entry.ID,
Record, &Blob);
3781 if (!MaybeRecordType)
3782 return MaybeRecordType.takeError();
3787 switch (RecordType) {
3808 switch (RecordType) {
3814 return llvm::createStringError(
3815 std::errc::illegal_byte_sequence,
3816 "duplicate TYPE_OFFSET record in AST file");
3829 return llvm::createStringError(
3830 std::errc::illegal_byte_sequence,
3831 "duplicate DECL_OFFSET record in AST file");
3843 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3844 LexicalContents Contents(
3846 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3847 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3854 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3855 auto *
Data = (
const unsigned char*)Blob.data();
3856 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3859 if (Decl *D = GetExistingDecl(ID))
3860 PendingUpdateRecords.push_back(
3861 PendingUpdateRecord(ID, D,
false));
3867 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3868 auto *
Data = (
const unsigned char *)Blob.data();
3869 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3872 if (Decl *D = GetExistingDecl(ID))
3873 PendingUpdateRecords.push_back(
3874 PendingUpdateRecord(ID, D,
false));
3882 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3883 auto *
Data = (
const unsigned char *)Blob.data();
3884 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3887 if (Decl *D = GetExistingDecl(ID))
3888 PendingUpdateRecords.push_back(
3889 PendingUpdateRecord(ID, D,
false));
3895 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3896 auto *
Data = (
const unsigned char *)Blob.data();
3897 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3900 if (Decl *D = GetExistingDecl(ID))
3901 PendingUpdateRecords.push_back(
3902 PendingUpdateRecord(ID, D,
false));
3908 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3909 auto *
Data = (
const unsigned char *)Blob.data();
3910 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3913 if (Decl *D = GetExistingDecl(ID))
3914 PendingUpdateRecords.push_back(
3915 PendingUpdateRecord(ID, D,
false));
3921 reinterpret_cast<const unsigned char *
>(Blob.data());
3927 ASTIdentifierLookupTrait(*
this, F));
3929 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
3935 return llvm::createStringError(
3936 std::errc::illegal_byte_sequence,
3937 "duplicate IDENTIFIER_OFFSET record in AST file");
3943 IdentifiersLoaded.resize(IdentifiersLoaded.size()
3955 for (
unsigned I = 0, N =
Record.size(); I != N; )
3956 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3963 getContext().getLangOpts().BuildingPCHWithObjectFile)
3964 for (
unsigned I = 0, N =
Record.size(); I != N; )
3965 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
3969 if (SpecialTypes.empty()) {
3970 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
3971 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
3978 if (SpecialTypes.size() !=
Record.size())
3979 return llvm::createStringError(std::errc::illegal_byte_sequence,
3980 "invalid special-types record");
3982 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
3984 if (!SpecialTypes[I])
3985 SpecialTypes[I] =
ID;
3992 TotalNumStatements +=
Record[0];
3993 TotalNumMacros +=
Record[1];
3994 TotalLexicalDeclContexts +=
Record[2];
3995 TotalVisibleDeclContexts +=
Record[3];
3996 TotalModuleLocalVisibleDeclContexts +=
Record[4];
3997 TotalTULocalVisibleDeclContexts +=
Record[5];
4001 for (
unsigned I = 0, N =
Record.size(); I != N; )
4002 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
4006 for (
unsigned I = 0, N =
Record.size(); I != N; )
4007 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
4011 if (
Record.size() % 3 != 0)
4012 return llvm::createStringError(std::errc::illegal_byte_sequence,
4013 "invalid weak identifiers record");
4017 WeakUndeclaredIdentifiers.clear();
4020 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4021 WeakUndeclaredIdentifiers.push_back(
4022 getGlobalIdentifierID(F,
Record[I++]));
4023 WeakUndeclaredIdentifiers.push_back(
4024 getGlobalIdentifierID(F,
Record[I++]));
4025 WeakUndeclaredIdentifiers.push_back(
4026 ReadSourceLocation(F,
Record, I).getRawEncoding());
4031 if (
Record.size() % 3 != 0)
4032 return llvm::createStringError(std::errc::illegal_byte_sequence,
4033 "invalid extname identifiers record");
4037 ExtnameUndeclaredIdentifiers.clear();
4041 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4042 ExtnameUndeclaredIdentifiers.push_back(
4043 getGlobalIdentifierID(F,
Record[I++]));
4044 ExtnameUndeclaredIdentifiers.push_back(
4045 getGlobalIdentifierID(F,
Record[I++]));
4046 ExtnameUndeclaredIdentifiers.push_back(
4047 ReadSourceLocation(F,
Record, I).getRawEncoding());
4054 unsigned LocalBaseSelectorID =
Record[1];
4060 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4065 std::make_pair(LocalBaseSelectorID,
4077 = ASTSelectorLookupTable::Create(
4080 ASTSelectorLookupTrait(*
this, F));
4081 TotalNumMethodPoolEntries +=
Record[1];
4086 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
4087 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4089 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
4098 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4099 ReadSourceLocation(F,
Record, Idx));
4105 SmallVector<SourceLocation, 64> SrcLocs;
4107 while (Idx <
Record.size())
4108 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
4109 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4116 unsigned Idx = 0, End =
Record.size() - 1;
4117 bool ReachedEOFWhileSkipping =
Record[Idx++];
4118 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4119 if (ReachedEOFWhileSkipping) {
4120 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4121 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4122 bool FoundNonSkipPortion =
Record[Idx++];
4123 bool FoundElse =
Record[Idx++];
4124 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4125 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4126 FoundElse, ElseLoc);
4128 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4130 auto Loc = ReadSourceLocation(F,
Record, Idx);
4131 bool WasSkipping =
Record[Idx++];
4132 bool FoundNonSkip =
Record[Idx++];
4133 bool FoundElse =
Record[Idx++];
4134 ConditionalStack.push_back(
4135 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4137 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4142 if (!
Record.empty() && Listener)
4160 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4161 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4162 return llvm::createStringError(std::errc::invalid_argument,
4163 "ran out of source locations");
4168 unsigned RangeStart =
4170 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4175 GlobalSLocOffsetMap.insert(
4177 - SLocSpaceSize,&F));
4188 ParseLineTable(F,
Record);
4192 for (
unsigned I = 0, N =
Record.size(); I != N; )
4193 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4197 if (
Record.size() % 3 != 0)
4198 return llvm::createStringError(std::errc::illegal_byte_sequence,
4199 "Invalid VTABLE_USES record");
4206 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4207 VTableUses.push_back(
4208 {ReadDeclID(F,
Record, Idx),
4209 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4216 if (
Record.size() % 2 != 0)
4217 return llvm::createStringError(
4218 std::errc::illegal_byte_sequence,
4219 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4224 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4225 PendingInstantiations.push_back(
4226 {ReadDeclID(F,
Record, I),
4227 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4234 return llvm::createStringError(std::errc::illegal_byte_sequence,
4235 "Invalid SEMA_DECL_REFS block");
4236 for (
unsigned I = 0, N =
Record.size(); I != N; )
4237 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4245 unsigned StartingID;
4246 if (!PP.getPreprocessingRecord())
4247 PP.createPreprocessingRecord();
4248 if (!PP.getPreprocessingRecord()->getExternalSource())
4249 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4251 = PP.getPreprocessingRecord()
4258 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4269 if (!PP.getPreprocessingRecord())
4270 PP.createPreprocessingRecord();
4271 if (!PP.getPreprocessingRecord()->getExternalSource())
4272 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4277 GlobalSkippedRangeMap.insert(
4283 if (
Record.size() % 2 != 0)
4284 return llvm::createStringError(
4285 std::errc::illegal_byte_sequence,
4286 "invalid DECL_UPDATE_OFFSETS block in AST file");
4287 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4288 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4289 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4293 if (Decl *D = GetExistingDecl(ID))
4294 PendingUpdateRecords.push_back(
4295 PendingUpdateRecord(ID, D,
false));
4300 if (
Record.size() % 5 != 0)
4301 return llvm::createStringError(
4302 std::errc::illegal_byte_sequence,
4303 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4305 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4306 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4309 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4312 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4315 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4318 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4321 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4323 DelayedNamespaceOffsetMap[
ID] = {
4324 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4326 assert(!GetExistingDecl(ID) &&
4327 "We shouldn't load the namespace in the front of delayed "
4328 "namespace lexical and visible block");
4334 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4335 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4336 auto &RelatedDecls = RelatedDeclsMap[
ID];
4337 unsigned NN =
Record[I++];
4338 RelatedDecls.reserve(NN);
4339 for (
unsigned II = 0; II < NN; II++)
4340 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4346 return llvm::createStringError(
4347 std::errc::illegal_byte_sequence,
4348 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4361 CUDASpecialDeclRefs.clear();
4362 for (
unsigned I = 0, N =
Record.size(); I != N; )
4363 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4373 HeaderFileInfoTrait(*
this, F));
4375 PP.getHeaderSearchInfo().SetExternalSource(
this);
4376 if (!PP.getHeaderSearchInfo().getExternalLookup())
4377 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4383 FPPragmaOptions.swap(
Record);
4387 for (
unsigned I = 0, N =
Record.size(); I != N; )
4388 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4392 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4393 auto Name = ReadString(
Record, I);
4394 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4395 OptInfo.Supported =
Record[I++] != 0;
4396 OptInfo.Enabled =
Record[I++] != 0;
4397 OptInfo.WithPragma =
Record[I++] != 0;
4398 OptInfo.Avail =
Record[I++];
4399 OptInfo.Core =
Record[I++];
4400 OptInfo.Opt =
Record[I++];
4405 for (
unsigned I = 0, N =
Record.size(); I != N; )
4406 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4410 for (
unsigned I = 0, N =
Record.size(); I != N; )
4411 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4415 if (
Record.size() % 2 != 0)
4416 return llvm::createStringError(std::errc::illegal_byte_sequence,
4417 "invalid undefined-but-used record");
4418 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4419 UndefinedButUsed.push_back(
4420 {ReadDeclID(F,
Record, I),
4421 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4426 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4427 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4429 DelayedDeleteExprs.push_back(Count);
4430 for (uint64_t
C = 0;
C < Count; ++
C) {
4431 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4432 bool IsArrayForm =
Record[I++] == 1;
4433 DelayedDeleteExprs.push_back(IsArrayForm);
4440 getContext().getLangOpts().BuildingPCHWithObjectFile)
4441 for (
unsigned I = 0, N =
Record.size(); I != N;)
4442 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4450 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4451 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4452 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4454 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4455 if (DeserializationListener)
4456 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4464 return llvm::createStringError(
4465 std::errc::illegal_byte_sequence,
4466 "duplicate MACRO_OFFSET record in AST file");
4478 LateParsedTemplates.emplace_back(
4479 std::piecewise_construct, std::forward_as_tuple(&F),
4485 return llvm::createStringError(std::errc::illegal_byte_sequence,
4486 "invalid pragma optimize record");
4487 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4492 return llvm::createStringError(std::errc::illegal_byte_sequence,
4493 "invalid pragma ms_struct record");
4494 PragmaMSStructState =
Record[0];
4499 return llvm::createStringError(
4500 std::errc::illegal_byte_sequence,
4501 "invalid pragma pointers to members record");
4502 PragmaMSPointersToMembersState =
Record[0];
4503 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4507 for (
unsigned I = 0, N =
Record.size(); I != N; )
4508 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4513 return llvm::createStringError(std::errc::illegal_byte_sequence,
4514 "invalid cuda pragma options record");
4515 ForceHostDeviceDepth =
Record[0];
4520 return llvm::createStringError(std::errc::illegal_byte_sequence,
4521 "invalid pragma pack record");
4522 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4523 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4524 unsigned NumStackEntries =
Record[2];
4527 PragmaAlignPackStack.clear();
4528 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4529 PragmaAlignPackStackEntry Entry;
4530 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4531 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4532 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4533 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4534 Entry.SlotLabel = PragmaAlignPackStrings.back();
4535 PragmaAlignPackStack.push_back(Entry);
4542 return llvm::createStringError(std::errc::illegal_byte_sequence,
4543 "invalid pragma float control record");
4545 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4546 unsigned NumStackEntries =
Record[2];
4549 FpPragmaStack.clear();
4550 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4551 FpPragmaStackEntry Entry;
4553 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4554 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4555 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4556 Entry.SlotLabel = FpPragmaStrings.back();
4557 FpPragmaStack.push_back(Entry);
4563 for (
unsigned I = 0, N =
Record.size(); I != N; )
4564 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4568 unsigned NumRecords =
Record.front();
4570 if (
Record.size() - 1 != NumRecords)
4571 return llvm::createStringError(std::errc::illegal_byte_sequence,
4572 "invalid rvv intrinsic pragma record");
4574 if (RISCVVecIntrinsicPragma.empty())
4575 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4578 for (
unsigned i = 0; i < NumRecords; ++i)
4579 RISCVVecIntrinsicPragma[i] |=
Record[i + 1];
4586void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4599 assert(ImportedModuleVector.empty());
4601 while (
Data < DataEnd) {
4605 using namespace llvm::support;
4607 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4608 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4609 StringRef Name = StringRef((
const char*)
Data, Len);
4614 ? ModuleMgr.lookupByModuleName(Name)
4617 std::string Msg =
"refers to unknown module, cannot find ";
4618 Msg.append(std::string(Name));
4623 ImportedModuleVector.push_back(OM);
4626 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4628 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4631 RemapBuilder &Remap) {
4632 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4634 Remap.insert(std::make_pair(Offset,
4635 static_cast<int>(BaseOffset - Offset)));
4646 unsigned ClientLoadCapabilities) {
4655 "MODULE_NAME should come before MODULE_MAP_FILE");
4656 auto [MaybeM, IgnoreError] =
4657 getModuleForRelocationChecks(F,
false);
4658 if (MaybeM.has_value()) {
4661 Module *M = MaybeM.value();
4662 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4664 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4665 if (!IgnoreError && !ModMap) {
4667 Diag(diag::remark_module_relocated)
4670 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4673 Diag(diag::err_module_file_conflict)
4678 Diag(diag::err_imported_module_not_found)
4685 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4686 Diag(diag::note_imported_by_pch_module_not_found)
4693 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4697 if (!StoredModMap || *StoredModMap != ModMap) {
4698 assert(ModMap &&
"found module is missing module map file");
4700 "top-level import should be verified");
4702 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4703 Diag(diag::err_imported_module_modmap_changed)
4710 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4712 std::string Filename = ReadPath(F,
Record, Idx);
4715 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4716 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4719 AdditionalStoredMaps.insert(*SF);
4724 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4725 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4728 if (!AdditionalStoredMaps.erase(ModMap)) {
4729 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4730 Diag(diag::err_module_different_modmap)
4739 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4740 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4741 Diag(diag::err_module_different_modmap)
4755 SemaObjC::GlobalMethodPool::iterator Known =
4761 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4762 : Known->second.second;
4766 if (List->getMethod() == Method) {
4774 if (List->getNext())
4775 List->setMethod(List->getNext()->getMethod());
4777 List->setMethod(Method);
4783 for (
Decl *D : Names) {
4787 if (wasHidden && SemaObj) {
4800 Stack.push_back(Mod);
4801 while (!Stack.empty()) {
4802 Mod = Stack.pop_back_val();
4804 if (NameVisibility <= Mod->NameVisibility) {
4820 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4821 if (Hidden != HiddenNamesMap.end()) {
4822 auto HiddenNames = std::move(*Hidden);
4823 HiddenNamesMap.erase(Hidden);
4825 assert(!HiddenNamesMap.contains(Mod) &&
4826 "making names visible added hidden names");
4833 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4835 if (Visited.insert(Exported).second)
4836 Stack.push_back(Exported);
4854 PendingMergedDefinitionsToDeduplicate.insert(Def);
4863 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4864 !PP.getLangOpts().Modules)
4868 TriedLoadingGlobalIndex =
true;
4869 StringRef SpecificModuleCachePath =
4871 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4873 if (llvm::Error Err = std::move(
Result.second)) {
4875 consumeError(std::move(Err));
4879 GlobalIndex.reset(
Result.first);
4880 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4885 return PP.getLangOpts().Modules && UseGlobalIndex &&
4897 consumeError(MaybeEntry.takeError());
4900 llvm::BitstreamEntry Entry = MaybeEntry.get();
4902 switch (Entry.Kind) {
4903 case llvm::BitstreamEntry::Error:
4904 case llvm::BitstreamEntry::EndBlock:
4907 case llvm::BitstreamEntry::Record:
4913 consumeError(Skipped.takeError());
4917 case llvm::BitstreamEntry::SubBlock:
4918 if (Entry.ID == BlockID) {
4919 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
4921 consumeError(std::move(Err));
4928 if (llvm::Error Err = Cursor.SkipBlock()) {
4930 consumeError(std::move(Err));
4940 unsigned ClientLoadCapabilities,
4942 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
4946 CurrentDeserializingModuleKind,
Type);
4952 unsigned PreviousGeneration = 0;
4956 unsigned NumModules = ModuleMgr.size();
4961 ClientLoadCapabilities)) {
4962 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
4966 GlobalIndex.reset();
4967 ModuleMgr.setGlobalIndex(
nullptr);
4971 if (NewLoadedModuleFile && !Loaded.empty())
4972 *NewLoadedModuleFile = Loaded.back().Mod;
4985 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
4988 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
4989 Error(std::move(Err));
4995 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
5001 if (llvm::Error Err = ReadExtensionBlock(F)) {
5002 Error(std::move(Err));
5031 if (!PP.getLangOpts().CPlusPlus) {
5038 auto It = PP.getIdentifierTable().find(Key);
5039 if (It == PP.getIdentifierTable().end())
5048 II = &PP.getIdentifierTable().getOwn(Key);
5066 for (
auto &Id : PP.getIdentifierTable())
5067 Id.second->setOutOfDate(
true);
5070 for (
const auto &Sel : SelectorGeneration)
5071 SelectorOutOfDate[Sel.first] =
true;
5078 ModuleMgr.moduleFileAccepted(&F);
5091 for (
unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
5092 UnresolvedModuleRef &
Unresolved = UnresolvedModuleRefs[I];
5097 case UnresolvedModuleRef::Conflict:
5100 Conflict.
Other = ResolvedMod;
5102 Unresolved.Mod->Conflicts.push_back(Conflict);
5106 case UnresolvedModuleRef::Import:
5111 case UnresolvedModuleRef::Affecting:
5113 Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
5116 case UnresolvedModuleRef::Export:
5123 UnresolvedModuleRefs.clear();
5135 if (DeserializationListener)
5136 DeserializationListener->ReaderInitialized(
this);
5138 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5153 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5154 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5155 ObjCClassesLoaded[I], PreviousGeneration);
5160 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5165 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5184 if (!Stream.canSkipToPos(4))
5185 return llvm::createStringError(
5186 std::errc::illegal_byte_sequence,
5187 "file too small to contain precompiled file magic");
5188 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5191 return llvm::createStringError(
5192 std::errc::illegal_byte_sequence,
5193 "file doesn't start with precompiled file magic");
5195 return Res.takeError();
5196 return llvm::Error::success();
5211 llvm_unreachable(
"unknown module kind");
5217 off_t ExpectedSize, time_t ExpectedModTime,
5219 auto Result = ModuleMgr.addModule(
5224 switch (
Result.getKind()) {
5226 Diag(diag::remark_module_import)
5228 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5243 Diag(diag::err_ast_file_not_found)
5245 if (!
Result.getBufferError().empty())
5246 Diag(diag::note_ast_file_buffer_failed) <<
Result.getBufferError();
5256 Diag(diag::err_ast_file_out_of_date)
5258 for (
const auto &
C :
Result.getChanges()) {
5259 Diag(diag::note_fe_ast_file_modified)
5260 <<
C.Kind << (
C.Old &&
C.New) << llvm::itostr(
C.Old.value_or(0))
5261 << llvm::itostr(
C.New.value_or(0));
5263 Diag(diag::note_ast_file_input_files_validation_status)
5264 <<
Result.getValidationStatus();
5265 if (!
Result.getSignatureError().empty())
5266 Diag(diag::note_ast_file_signature_failed) <<
Result.getSignatureError();
5270 llvm_unreachable(
"Unexpected value from adding module.");
5273 assert(M &&
"Missing module file");
5275 bool ShouldFinalizePCM =
false;
5276 llvm::scope_exit FinalizeOrDropPCM([&]() {
5278 if (ShouldFinalizePCM)
5284 BitstreamCursor &Stream = F.
Stream;
5285 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5286 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5290 Diag(diag::err_ast_file_invalid)
5296 bool HaveReadControlBlock =
false;
5300 Error(MaybeEntry.takeError());
5303 llvm::BitstreamEntry Entry = MaybeEntry.get();
5305 switch (Entry.Kind) {
5306 case llvm::BitstreamEntry::Error:
5307 case llvm::BitstreamEntry::Record:
5308 case llvm::BitstreamEntry::EndBlock:
5309 Error(
"invalid record at top-level of AST file");
5312 case llvm::BitstreamEntry::SubBlock:
5318 HaveReadControlBlock =
true;
5319 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5327 F.ModuleName.empty()) {
5346 if (!HaveReadControlBlock) {
5348 Diag(diag::err_ast_file_version_too_old)
5355 ShouldFinalizePCM =
true;
5359 if (llvm::Error Err = Stream.SkipBlock()) {
5360 Error(std::move(Err));
5367 llvm_unreachable(
"unexpected break; expected return");
5371ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5372 unsigned ClientLoadCapabilities) {
5374 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5375 bool AllowCompatibleConfigurationMismatch =
5377 bool DisableValidation = shouldDisableValidationForFile(F);
5379 ASTReadResult
Result = readUnhashedControlBlockImpl(
5381 AllowCompatibleConfigurationMismatch, Listener.get(),
5386 if (DisableValidation || WasImportedBy ||
5387 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5391 Error(
"malformed block record in AST file");
5414 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5416 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5425 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5426 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5427 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5429 BitstreamCursor Stream(StreamData);
5434 consumeError(std::move(Err));
5446 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5449 consumeError(MaybeEntry.takeError());
5452 llvm::BitstreamEntry Entry = MaybeEntry.get();
5454 switch (Entry.Kind) {
5455 case llvm::BitstreamEntry::Error:
5456 case llvm::BitstreamEntry::SubBlock:
5459 case llvm::BitstreamEntry::EndBlock:
5462 case llvm::BitstreamEntry::Record:
5470 Expected<unsigned> MaybeRecordType =
5471 Stream.readRecord(Entry.ID,
Record, &Blob);
5472 if (!MaybeRecordType) {
5481 "Dummy AST file signature not backpatched in ASTWriter.");
5488 "Dummy AST block hash not backpatched in ASTWriter.");
5492 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5493 if (Listener && ValidateDiagnosticOptions &&
5494 !AllowCompatibleConfigurationMismatch &&
5495 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5500 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5501 if (Listener && !AllowCompatibleConfigurationMismatch &&
5502 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5503 Result = ConfigurationMismatch;
5532 if (
Record.size() < 4)
return true;
5537 unsigned BlockNameLen =
Record[2];
5538 unsigned UserInfoLen =
Record[3];
5540 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5542 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5543 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5544 Blob.data() + BlockNameLen + UserInfoLen);
5548llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5549 BitstreamCursor &Stream = F.
Stream;
5553 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5555 return MaybeEntry.takeError();
5556 llvm::BitstreamEntry Entry = MaybeEntry.get();
5558 switch (Entry.Kind) {
5559 case llvm::BitstreamEntry::SubBlock:
5560 if (llvm::Error Err = Stream.SkipBlock())
5563 case llvm::BitstreamEntry::EndBlock:
5564 return llvm::Error::success();
5565 case llvm::BitstreamEntry::Error:
5566 return llvm::createStringError(std::errc::illegal_byte_sequence,
5567 "malformed block record in AST file");
5568 case llvm::BitstreamEntry::Record:
5574 Expected<unsigned> MaybeRecCode =
5575 Stream.readRecord(Entry.ID,
Record, &Blob);
5577 return MaybeRecCode.takeError();
5578 switch (MaybeRecCode.get()) {
5580 ModuleFileExtensionMetadata Metadata;
5582 return llvm::createStringError(
5583 std::errc::illegal_byte_sequence,
5584 "malformed EXTENSION_METADATA in AST file");
5587 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5588 if (Known == ModuleFileExtensions.end())
break;
5591 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5601 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5605 assert(ContextObj &&
"no context to initialize");
5609 if (DeserializationListener)
5610 DeserializationListener->DeclRead(
5612 Context.getTranslationUnitDecl());
5620 if (!Context.CFConstantStringTypeDecl)
5621 Context.setCFConstantStringType(
GetType(String));
5626 if (FileType.isNull()) {
5627 Error(
"FILE type is NULL");
5631 if (!Context.FILEDecl) {
5633 Context.setFILEDecl(
Typedef->getDecl());
5635 const TagType *Tag = FileType->getAs<TagType>();
5637 Error(
"Invalid FILE type in AST file");
5640 Context.setFILEDecl(Tag->getDecl());
5647 if (Jmp_bufType.
isNull()) {
5648 Error(
"jmp_buf type is NULL");
5652 if (!Context.jmp_bufDecl) {
5654 Context.setjmp_bufDecl(
Typedef->getDecl());
5656 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5658 Error(
"Invalid jmp_buf type in AST file");
5661 Context.setjmp_bufDecl(Tag->getDecl());
5668 if (Sigjmp_bufType.
isNull()) {
5669 Error(
"sigjmp_buf type is NULL");
5673 if (!Context.sigjmp_bufDecl) {
5675 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5677 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5678 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5679 Context.setsigjmp_bufDecl(Tag->getDecl());
5685 if (Context.ObjCIdRedefinitionType.isNull())
5686 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5689 if (
TypeID ObjCClassRedef =
5691 if (Context.ObjCClassRedefinitionType.isNull())
5692 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5695 if (
TypeID ObjCSelRedef =
5697 if (Context.ObjCSelRedefinitionType.isNull())
5698 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5703 if (Ucontext_tType.
isNull()) {
5704 Error(
"ucontext_t type is NULL");
5708 if (!Context.ucontext_tDecl) {
5710 Context.setucontext_tDecl(
Typedef->getDecl());
5712 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5713 assert(Tag &&
"Invalid ucontext_t type in AST file");
5714 Context.setucontext_tDecl(Tag->getDecl());
5723 if (!CUDASpecialDeclRefs.empty()) {
5724 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5725 Context.setcudaConfigureCallDecl(
5726 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5727 Context.setcudaGetParameterBufferDecl(
5728 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5729 Context.setcudaLaunchDeviceDecl(
5730 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5735 for (
auto &Import : PendingImportedModules) {
5739 if (Import.ImportLoc.isValid())
5740 PP.makeModuleVisible(Imported, Import.ImportLoc);
5747 PendingImportedModulesSema.append(PendingImportedModules);
5748 PendingImportedModules.clear();
5758 BitstreamCursor Stream(
PCH);
5761 consumeError(std::move(Err));
5773 Stream.advanceSkippingSubblocks();
5776 consumeError(MaybeEntry.takeError());
5779 llvm::BitstreamEntry Entry = MaybeEntry.get();
5781 if (Entry.Kind != llvm::BitstreamEntry::Record)
5789 consumeError(MaybeRecord.takeError());
5795 "Dummy AST file signature not backpatched in ASTWriter.");
5805 const std::string &ASTFileName,
FileManager &FileMgr,
5808 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5813 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5814 << ASTFileName << Buffer.getError().message();
5815 return std::string();
5819 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5823 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5824 return std::string();
5829 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5830 return std::string();
5837 Stream.advanceSkippingSubblocks();
5840 consumeError(MaybeEntry.takeError());
5841 return std::string();
5843 llvm::BitstreamEntry Entry = MaybeEntry.get();
5845 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5846 return std::string();
5848 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5849 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5850 return std::string();
5858 consumeError(MaybeRecord.takeError());
5859 return std::string();
5874 std::string ExistingSpecificModuleCachePath;
5876 bool StrictOptionMatches;
5879 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5884 StringRef ExistingSpecificModuleCachePath,
5886 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5887 ExistingTargetOpts(ExistingTargetOpts),
5888 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
5889 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
5892 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5893 StringRef ModuleFilename,
bool Complain,
5894 bool AllowCompatibleDifferences)
override {
5896 nullptr, AllowCompatibleDifferences);
5899 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5900 StringRef ModuleFilename,
bool Complain,
5901 bool AllowCompatibleDifferences)
override {
5903 nullptr, AllowCompatibleDifferences);
5906 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5907 StringRef ModuleFilename,
bool Complain,
5908 bool AllowCompatibleDifferences)
override {
5910 nullptr, AllowCompatibleDifferences);
5913 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5914 StringRef ASTFilename, StringRef ContextHash,
5915 bool Complain)
override {
5917 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
5918 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
5921 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5922 StringRef ModuleFilename,
bool ReadMacros,
5924 std::string &SuggestedPredefines)
override {
5926 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5927 FileMgr, SuggestedPredefines, ExistingLangOpts,
5939 unsigned ClientLoadCapabilities) {
5943 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5944 llvm::MemoryBuffer *Buffer =
5953 auto Entry = Filename ==
"-" ? FileMgr.getSTDIN()
5954 : FileMgr.getFileRef(Filename,
5959 llvm::consumeError(Entry.takeError());
5963 FileMgr.getBufferForFile(*Entry,
5970 OwnedBuffer = std::move(*BufferOrErr);
5971 Buffer = OwnedBuffer.get();
5975 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
5976 BitstreamCursor Stream(Bytes);
5980 consumeError(std::move(Err));
5988 bool NeedsInputFiles = Listener.needsInputFileVisitation();
5989 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
5990 bool NeedsImports = Listener.needsImportVisitation();
5991 BitstreamCursor InputFilesCursor;
5992 uint64_t InputFilesOffsetBase = 0;
5995 std::string ModuleDir;
5996 bool DoneWithControlBlock =
false;
5998 PathBuf.reserve(256);
6003 AdditionalPathBuf.reserve(256);
6004 while (!DoneWithControlBlock) {
6008 consumeError(MaybeEntry.takeError());
6011 llvm::BitstreamEntry Entry = MaybeEntry.get();
6013 switch (Entry.Kind) {
6014 case llvm::BitstreamEntry::SubBlock: {
6017 std::string IgnoredSuggestedPredefines;
6018 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6020 Listener, IgnoredSuggestedPredefines) !=
Success)
6026 InputFilesCursor = Stream;
6027 if (llvm::Error Err = Stream.SkipBlock()) {
6029 consumeError(std::move(Err));
6032 if (NeedsInputFiles &&
6035 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6039 if (llvm::Error Err = Stream.SkipBlock()) {
6041 consumeError(std::move(Err));
6050 case llvm::BitstreamEntry::EndBlock:
6051 DoneWithControlBlock =
true;
6054 case llvm::BitstreamEntry::Error:
6057 case llvm::BitstreamEntry::Record:
6061 if (DoneWithControlBlock)
break;
6066 Stream.readRecord(Entry.ID,
Record, &Blob);
6067 if (!MaybeRecCode) {
6075 if (Listener.ReadFullVersionInformation(Blob))
6079 Listener.ReadModuleName(Blob);
6082 ModuleDir = std::string(Blob);
6088 Listener.ReadModuleMapFile(*Path);
6092 if (!NeedsInputFiles)
6095 unsigned NumInputFiles =
Record[0];
6096 unsigned NumUserFiles =
Record[1];
6097 const llvm::support::unaligned_uint64_t *InputFileOffs =
6098 (
const llvm::support::unaligned_uint64_t *)Blob.data();
6099 for (
unsigned I = 0; I != NumInputFiles; ++I) {
6101 bool isSystemFile = I >= NumUserFiles;
6103 if (isSystemFile && !NeedsSystemInputFiles)
6106 BitstreamCursor &Cursor = InputFilesCursor;
6108 if (llvm::Error Err =
6109 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6111 consumeError(std::move(Err));
6117 consumeError(MaybeCode.takeError());
6119 unsigned Code = MaybeCode.get();
6123 bool shouldContinue =
false;
6125 Cursor.readRecord(Code,
Record, &Blob);
6126 if (!MaybeRecordType) {
6128 consumeError(MaybeRecordType.takeError());
6134 time_t StoredTime =
static_cast<time_t
>(
Record[2]);
6135 bool Overridden =
static_cast<bool>(
Record[3]);
6136 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6139 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6141 if (UnresolvedFilename.empty())
6142 Filename = *FilenameAsRequestedBuf;
6145 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6146 Filename = *FilenameBuf;
6148 shouldContinue = Listener.visitInputFileAsRequested(
6149 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6153 if (!shouldContinue)
6174 bool IsStandardCXXModule =
Record[Idx++];
6178 if (IsStandardCXXModule) {
6179 Listener.visitImport(ModuleName,
"");
6190 Listener.visitImport(ModuleName, *Filename);
6201 if (FindModuleFileExtensions) {
6202 BitstreamCursor SavedStream = Stream;
6204 bool DoneWithExtensionBlock =
false;
6205 while (!DoneWithExtensionBlock) {
6211 llvm::BitstreamEntry Entry = MaybeEntry.get();
6213 switch (Entry.Kind) {
6214 case llvm::BitstreamEntry::SubBlock:
6215 if (llvm::Error Err = Stream.SkipBlock()) {
6217 consumeError(std::move(Err));
6222 case llvm::BitstreamEntry::EndBlock:
6223 DoneWithExtensionBlock =
true;
6226 case llvm::BitstreamEntry::Error:
6229 case llvm::BitstreamEntry::Record:
6236 Stream.readRecord(Entry.ID,
Record, &Blob);
6237 if (!MaybeRecCode) {
6241 switch (MaybeRecCode.get()) {
6247 Listener.readModuleFileExtension(Metadata);
6253 Stream = std::move(SavedStream);
6257 if (readUnhashedControlBlockImpl(
6258 nullptr, Bytes, Filename, ClientLoadCapabilities,
6260 ValidateDiagnosticOptions) !=
Success)
6271 StringRef SpecificModuleCachePath,
bool RequireStrictOptionMatches) {
6272 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6273 SpecificModuleCachePath, FileMgr,
6274 RequireStrictOptionMatches);
6280llvm::Error ASTReader::ReadSubmoduleBlock(
ModuleFile &F,
6281 unsigned ClientLoadCapabilities) {
6286 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6291 auto CreateModule = !KnowsTopLevelModule
6296 Module *CurrentModule =
nullptr;
6300 F.
Stream.advanceSkippingSubblocks();
6302 return MaybeEntry.takeError();
6303 llvm::BitstreamEntry Entry = MaybeEntry.get();
6305 switch (Entry.Kind) {
6306 case llvm::BitstreamEntry::SubBlock:
6307 case llvm::BitstreamEntry::Error:
6308 return llvm::createStringError(std::errc::illegal_byte_sequence,
6309 "malformed block record in AST file");
6310 case llvm::BitstreamEntry::EndBlock:
6311 return llvm::Error::success();
6312 case llvm::BitstreamEntry::Record:
6322 return MaybeKind.takeError();
6323 unsigned Kind = MaybeKind.get();
6326 return llvm::createStringError(
6327 std::errc::illegal_byte_sequence,
6328 "submodule metadata record should be at beginning of block");
6343 return llvm::createStringError(std::errc::illegal_byte_sequence,
6344 "malformed module definition");
6346 StringRef Name = Blob;
6353 bool IsFramework =
Record[Idx++];
6354 bool IsExplicit =
Record[Idx++];
6355 bool IsSystem =
Record[Idx++];
6356 bool IsExternC =
Record[Idx++];
6357 bool InferSubmodules =
Record[Idx++];
6358 bool InferExplicitSubmodules =
Record[Idx++];
6359 bool InferExportWildcard =
Record[Idx++];
6360 bool ConfigMacrosExhaustive =
Record[Idx++];
6361 bool ModuleMapIsPrivate =
Record[Idx++];
6362 bool NamedModuleHasInit =
Record[Idx++];
6364 Module *ParentModule =
nullptr;
6366 ParentModule = getSubmodule(Parent);
6368 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6369 IsFramework, IsExplicit);
6372 if (GlobalIndex >= SubmodulesLoaded.size() ||
6373 SubmodulesLoaded[GlobalIndex])
6374 return llvm::createStringError(std::errc::invalid_argument,
6375 "too many submodules");
6377 if (!ParentModule) {
6381 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6383 assert(*CurFileKey != F.
FileKey &&
6384 "ModuleManager did not de-duplicate");
6386 Diag(diag::err_module_file_conflict)
6390 auto CurModMapFile =
6393 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6394 Diag(diag::note_module_file_conflict)
6395 << CurModMapFile->getName() << ModMapFile->getName();
6397 return llvm::make_error<AlreadyReportedDiagnosticError>();
6416 if (InferredAllowedBy.
isValid())
6430 }
else if (ParentModule && ParentModule->
Directory) {
6435 if (DeserializationListener)
6436 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6438 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6460 SmallString<128> RelativePathName;
6462 CurrentModule, Blob.str(), RelativePathName)) {
6490 auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
6496 auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
6498 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6510 unsigned LocalBaseSubmoduleID =
Record[1];
6514 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
6519 std::make_pair(LocalBaseSubmoduleID,
6528 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6540 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6552 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6569 PP.getTargetInfo());
6575 Module::LinkLibrary(std::string(Blob),
Record[0]));
6599 SmallVector<GlobalDeclID, 16>
Inits;
6600 for (
unsigned I = 0; I <
Record.size(); )
6602 ContextObj->addLazyModuleInitializers(CurrentModule,
Inits);
6622bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6623 StringRef ModuleFilename,
bool Complain,
6624 ASTReaderListener &Listener,
6625 bool AllowCompatibleDifferences) {
6626 LangOptions LangOpts;
6628#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6629 LangOpts.Name = Record[Idx++];
6630#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6631 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6632#include "clang/Basic/LangOptions.def"
6633#define SANITIZER(NAME, ID) \
6634 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6635#include "clang/Basic/Sanitizers.def"
6637 for (
unsigned N =
Record[Idx++]; N; --N)
6641 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6642 LangOpts.
ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
6647 for (
unsigned N =
Record[Idx++]; N; --N) {
6649 ReadString(
Record, Idx));
6654 for (
unsigned N =
Record[Idx++]; N; --N) {
6661 AllowCompatibleDifferences);
6664bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6665 StringRef ModuleFilename,
bool Complain,
6666 ASTReaderListener &Listener,
6667 bool AllowCompatibleDifferences) {
6669 CodeGenOptions CGOpts;
6671#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6672 if constexpr (CK::Compatibility != CK::Benign) \
6673 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6674#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6675 if constexpr (CK::Compatibility != CK::Benign) \
6676 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6677#define DEBUGOPT(Name, Bits, Default, Compatibility)
6678#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6679#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6680#include "clang/Basic/CodeGenOptions.def"
6683 AllowCompatibleDifferences);
6686bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6687 StringRef ModuleFilename,
bool Complain,
6688 ASTReaderListener &Listener,
6689 bool AllowCompatibleDifferences) {
6691 TargetOptions TargetOpts;
6693 TargetOpts.
CPU = ReadString(
Record, Idx);
6695 TargetOpts.
ABI = ReadString(
Record, Idx);
6696 for (
unsigned N =
Record[Idx++]; N; --N) {
6699 for (
unsigned N =
Record[Idx++]; N; --N) {
6704 AllowCompatibleDifferences);
6707bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6708 StringRef ModuleFilename,
bool Complain,
6709 ASTReaderListener &Listener) {
6710 DiagnosticOptions DiagOpts;
6712#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6713#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6714 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6715#include "clang/Basic/DiagnosticOptions.def"
6717 for (
unsigned N =
Record[Idx++]; N; --N)
6719 for (
unsigned N =
Record[Idx++]; N; --N)
6725bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6726 ASTReaderListener &Listener) {
6727 FileSystemOptions FSOpts;
6733bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6734 StringRef ModuleFilename,
6736 ASTReaderListener &Listener) {
6737 HeaderSearchOptions HSOpts;
6752 std::string ContextHash = ReadString(
Record, Idx);
6758bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6759 ASTReaderListener &Listener) {
6760 HeaderSearchOptions HSOpts;
6764 for (
unsigned N =
Record[Idx++]; N; --N) {
6765 std::string Path = ReadString(
Record, Idx);
6768 bool IsFramework =
Record[Idx++];
6769 bool IgnoreSysRoot =
Record[Idx++];
6770 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6775 for (
unsigned N =
Record[Idx++]; N; --N) {
6776 std::string Prefix = ReadString(
Record, Idx);
6777 bool IsSystemHeader =
Record[Idx++];
6782 for (
unsigned N =
Record[Idx++]; N; --N) {
6783 std::string VFSOverlayFile = ReadString(
Record, Idx);
6790bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6791 StringRef ModuleFilename,
6793 ASTReaderListener &Listener,
6794 std::string &SuggestedPredefines) {
6795 PreprocessorOptions PPOpts;
6799 bool ReadMacros =
Record[Idx++];
6801 for (
unsigned N =
Record[Idx++]; N; --N) {
6803 bool IsUndef =
Record[Idx++];
6804 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6809 for (
unsigned N =
Record[Idx++]; N; --N) {
6814 for (
unsigned N =
Record[Idx++]; N; --N) {
6823 SuggestedPredefines.clear();
6825 Complain, SuggestedPredefines);
6828std::pair<ModuleFile *, unsigned>
6829ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6830 GlobalPreprocessedEntityMapType::iterator
6831 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6832 assert(I != GlobalPreprocessedEntityMap.end() &&
6833 "Corrupted global preprocessed entity map");
6836 return std::make_pair(M, LocalIndex);
6839llvm::iterator_range<PreprocessingRecord::iterator>
6840ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6841 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6845 return llvm::make_range(PreprocessingRecord::iterator(),
6846 PreprocessingRecord::iterator());
6849bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6850 unsigned int ClientLoadCapabilities) {
6851 return ClientLoadCapabilities & ARR_OutOfDate &&
6854 .getInMemoryModuleCache()
6855 .isPCMFinal(ModuleFileName);
6858llvm::iterator_range<ASTReader::ModuleDeclIterator>
6860 return llvm::make_range(
6867 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6868 assert(I != GlobalSkippedRangeMap.end() &&
6869 "Corrupted global skipped range map");
6872 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6876 assert(Range.isValid());
6882 unsigned ModuleFileIndex = ID >> 32;
6883 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
6884 assert(getModuleManager().size() > ModuleFileIndex - 1);
6885 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6887 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6892 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6894 unsigned LocalIndex = PPInfo.second;
6899 if (!PP.getPreprocessingRecord()) {
6900 Error(
"no preprocessing record");
6907 Error(std::move(Err));
6914 Error(MaybeEntry.takeError());
6917 llvm::BitstreamEntry Entry = MaybeEntry.get();
6919 if (Entry.Kind != llvm::BitstreamEntry::Record)
6930 if (!MaybeRecType) {
6931 Error(MaybeRecType.takeError());
6936 bool isBuiltin =
Record[0];
6944 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
6964 if (DeserializationListener)
6965 DeserializationListener->MacroDefinitionRead(PPID, MD);
6971 const char *FullFileNameStart = Blob.data() +
Record[0];
6972 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
6974 if (!FullFileName.empty())
6975 File = PP.getFileManager().getOptionalFileRef(FullFileName);
6982 StringRef(Blob.data(),
Record[0]),
6990 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
6999unsigned ASTReader::findNextPreprocessedEntity(
7000 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
7002 for (GlobalSLocOffsetMapType::const_iterator
7003 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7009 return getTotalNumPreprocessedEntities();
7014struct PPEntityComp {
7015 const ASTReader &Reader;
7018 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7020 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
7021 SourceLocation LHS = getLoc(L);
7022 SourceLocation RHS = getLoc(R);
7026 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
7027 SourceLocation LHS = getLoc(L);
7031 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
7032 SourceLocation RHS = getLoc(R);
7036 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
7043unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7044 bool EndsAfter)
const {
7045 if (SourceMgr.isLocalSourceLocation(Loc))
7046 return getTotalNumPreprocessedEntities();
7048 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7049 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7050 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7051 "Corrupted global sloc offset map");
7053 if (SLocMapI->second->NumPreprocessedEntities == 0)
7054 return findNextPreprocessedEntity(SLocMapI);
7065 pp_iterator
First = pp_begin;
7069 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7070 PPEntityComp(*
this, M));
7079 std::advance(PPI,
Half);
7080 if (SourceMgr.isBeforeInTranslationUnit(
7081 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7084 Count = Count -
Half - 1;
7091 return findNextPreprocessedEntity(SLocMapI);
7098std::pair<unsigned, unsigned>
7100 if (Range.isInvalid())
7101 return std::make_pair(0,0);
7102 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7104 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
7105 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
7106 return std::make_pair(BeginID, EndID);
7116 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7118 unsigned LocalIndex = PPInfo.second;
7125 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7134 class HeaderFileInfoVisitor {
7136 std::optional<HeaderFileInfo> HFI;
7139 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7148 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7149 if (Pos == Table->end())
7156 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7162 HeaderFileInfoVisitor Visitor(FE);
7163 ModuleMgr.visit(Visitor);
7164 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7171 using DiagState = DiagnosticsEngine::DiagState;
7182 auto ReadDiagState = [&](
const DiagState &BasedOn,
7183 bool IncludeNonPragmaStates) {
7184 unsigned BackrefID =
Record[Idx++];
7186 return DiagStates[BackrefID - 1];
7189 Diag.DiagStates.push_back(BasedOn);
7190 DiagState *NewState = &
Diag.DiagStates.back();
7191 DiagStates.push_back(NewState);
7192 unsigned Size =
Record[Idx++];
7193 assert(Idx + Size * 2 <=
Record.size() &&
7194 "Invalid data, not enough diag/map pairs");
7196 unsigned DiagID =
Record[Idx++];
7199 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7212 Mapping = NewMapping;
7218 DiagState *FirstState;
7223 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7224 DiagStates.push_back(FirstState);
7228 "Invalid data, unexpected backref in initial state");
7230 assert(Idx <
Record.size() &&
7231 "Invalid data, not enough state change pairs in initial state");
7236 unsigned Flags =
Record[Idx++];
7237 DiagState Initial(*
Diag.getDiagnosticIDs());
7238 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7239 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7240 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7241 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7242 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7244 FirstState = ReadDiagState(Initial,
true);
7252 .StateTransitions.push_back({FirstState, 0});
7257 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7261 unsigned NumLocations =
Record[Idx++];
7262 while (NumLocations--) {
7263 assert(Idx <
Record.size() &&
7264 "Invalid data, missing pragma diagnostic states");
7266 assert(FID.
isValid() &&
"invalid FileID for transition");
7267 unsigned Transitions =
Record[Idx++];
7273 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7274 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7275 for (
unsigned I = 0; I != Transitions; ++I) {
7276 unsigned Offset =
Record[Idx++];
7277 auto *State = ReadDiagState(*FirstState,
false);
7278 F.StateTransitions.push_back({State, Offset});
7283 assert(Idx <
Record.size() &&
7284 "Invalid data, missing final pragma diagnostic state");
7286 auto *CurState = ReadDiagState(*FirstState,
false);
7289 Diag.DiagStatesByLoc.CurDiagState = CurState;
7290 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7295 auto &T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7297 T.push_back({CurState, 0});
7299 T[0].State = CurState;
7305 assert(Idx <
Record.size() &&
7306 "Invalid data, missing diagnostic push stack");
7307 unsigned NumPushes =
Record[Idx++];
7308 for (
unsigned I = 0; I != NumPushes; ++I) {
7309 auto *State = ReadDiagState(*FirstState,
false);
7311 Diag.DiagStateOnPushStack.push_back(State);
7320ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7321 auto [M, Index] = translateTypeIDToIndex(ID);
7328#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7329 case TYPE_##CODE_ID: return Type::CLASS_ID;
7330#include "clang/Serialization/TypeBitCodes.def"
7332 return std::nullopt;
7342QualType ASTReader::readTypeRecord(
TypeID ID) {
7343 assert(ContextObj &&
"reading type with no AST context");
7344 ASTContext &Context = *ContextObj;
7345 RecordLocation Loc = TypeCursorForIndex(ID);
7346 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7350 SavedStreamPosition SavedPosition(DeclsCursor);
7352 ReadingKindTracker ReadingKind(Read_Type, *
this);
7355 Deserializing AType(
this);
7357 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7358 Error(std::move(Err));
7361 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7363 Error(RawCode.takeError());
7367 ASTRecordReader
Record(*
this, *Loc.F);
7368 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7370 Error(Code.takeError());
7374 QualType baseType =
Record.readQualType();
7375 Qualifiers quals =
Record.readQualifiers();
7381 Error(
"Unexpected code for type");
7385 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7386 return TypeReader.read(*maybeClass);
7394 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7395 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7398 return Reader.readTypeSourceInfo();
7402 return Reader.readNestedNameSpecifierLoc();
7406 return Reader.readAttr();
7415#define ABSTRACT_TYPELOC(CLASS, PARENT)
7416#define TYPELOC(CLASS, PARENT) \
7417 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7418#include "clang/AST/TypeLocNodes.def"
7427void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7431void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7441void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7445void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7449void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7453void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7457void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7461void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7465void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7469void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7473void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7477void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7485 if (Reader.readBool())
7492 VisitArrayTypeLoc(TL);
7496 VisitArrayTypeLoc(TL);
7499void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7500 VisitArrayTypeLoc(TL);
7503void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7504 DependentSizedArrayTypeLoc TL) {
7505 VisitArrayTypeLoc(TL);
7508void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7509 DependentAddressSpaceTypeLoc TL) {
7516void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7517 DependentSizedExtVectorTypeLoc TL) {
7521void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7525void TypeLocReader::VisitDependentVectorTypeLoc(
7526 DependentVectorTypeLoc TL) {
7530void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7534void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7541void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7542 DependentSizedMatrixTypeLoc TL) {
7555 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7561 VisitFunctionTypeLoc(TL);
7565 VisitFunctionTypeLoc(TL);
7568void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7569 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7570 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7571 SourceLocation NameLoc = readSourceLocation();
7572 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7575void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7576 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7577 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7578 SourceLocation NameLoc = readSourceLocation();
7579 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7582void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7583 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7584 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7585 SourceLocation NameLoc = readSourceLocation();
7586 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7589void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7595void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7602void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7607void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7611void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7625 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7630void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7632 if (Reader.readBool())
7634 if (Reader.readBool())
7638void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7652 VisitTagTypeLoc(TL);
7656 VisitTagTypeLoc(TL);
7659void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7661void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7665void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7669void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7673void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7677void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7678 HLSLAttributedResourceTypeLoc TL) {
7682void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7686void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7690void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7691 SubstTemplateTypeParmTypeLoc TL) {
7695void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7696 SubstTemplateTypeParmPackTypeLoc TL) {
7700void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7701 SubstBuiltinTemplatePackTypeLoc TL) {
7705void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7706 TemplateSpecializationTypeLoc TL) {
7707 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7708 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7709 SourceLocation TemplateKeywordLoc = readSourceLocation();
7710 SourceLocation NameLoc = readSourceLocation();
7711 SourceLocation LAngleLoc = readSourceLocation();
7712 SourceLocation RAngleLoc = readSourceLocation();
7713 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7714 LAngleLoc, RAngleLoc);
7715 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7716 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7717 Args[I] = Reader.readTemplateArgumentLocInfo(
7718 TL.
getTypePtr()->template_arguments()[I].getKind());
7721void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7726void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7732void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7736void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7741void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7750void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7762void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7766void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7772void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7776void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7780void TypeLocReader::VisitDependentBitIntTypeLoc(
7781 clang::DependentBitIntTypeLoc TL) {
7785void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7819std::pair<ModuleFile *, unsigned>
7822 "Predefined type shouldn't be in TypesLoaded");
7824 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7826 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7827 assert(OwningModuleFile &&
7828 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7830 return {OwningModuleFile,
7835 assert(ContextObj &&
"reading type with no AST context");
7846 llvm_unreachable(
"Invalid predefined type");
7862 T = Context.UnsignedCharTy;
7865 T = Context.UnsignedShortTy;
7868 T = Context.UnsignedIntTy;
7871 T = Context.UnsignedLongTy;
7874 T = Context.UnsignedLongLongTy;
7877 T = Context.UnsignedInt128Ty;
7880 T = Context.SignedCharTy;
7883 T = Context.WCharTy;
7886 T = Context.ShortTy;
7895 T = Context.LongLongTy;
7898 T = Context.Int128Ty;
7901 T = Context.BFloat16Ty;
7907 T = Context.FloatTy;
7910 T = Context.DoubleTy;
7913 T = Context.LongDoubleTy;
7916 T = Context.ShortAccumTy;
7919 T = Context.AccumTy;
7922 T = Context.LongAccumTy;
7925 T = Context.UnsignedShortAccumTy;
7928 T = Context.UnsignedAccumTy;
7931 T = Context.UnsignedLongAccumTy;
7934 T = Context.ShortFractTy;
7937 T = Context.FractTy;
7940 T = Context.LongFractTy;
7943 T = Context.UnsignedShortFractTy;
7946 T = Context.UnsignedFractTy;
7949 T = Context.UnsignedLongFractTy;
7952 T = Context.SatShortAccumTy;
7955 T = Context.SatAccumTy;
7958 T = Context.SatLongAccumTy;
7961 T = Context.SatUnsignedShortAccumTy;
7964 T = Context.SatUnsignedAccumTy;
7967 T = Context.SatUnsignedLongAccumTy;
7970 T = Context.SatShortFractTy;
7973 T = Context.SatFractTy;
7976 T = Context.SatLongFractTy;
7979 T = Context.SatUnsignedShortFractTy;
7982 T = Context.SatUnsignedFractTy;
7985 T = Context.SatUnsignedLongFractTy;
7988 T = Context.Float16Ty;
7991 T = Context.Float128Ty;
7994 T = Context.Ibm128Ty;
7997 T = Context.OverloadTy;
8000 T = Context.UnresolvedTemplateTy;
8003 T = Context.BoundMemberTy;
8006 T = Context.PseudoObjectTy;
8009 T = Context.DependentTy;
8012 T = Context.UnknownAnyTy;
8015 T = Context.NullPtrTy;
8018 T = Context.Char8Ty;
8021 T = Context.Char16Ty;
8024 T = Context.Char32Ty;
8027 T = Context.ObjCBuiltinIdTy;
8030 T = Context.ObjCBuiltinClassTy;
8033 T = Context.ObjCBuiltinSelTy;
8035#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8036 case PREDEF_TYPE_##Id##_ID: \
8037 T = Context.SingletonId; \
8039#include "clang/Basic/OpenCLImageTypes.def"
8040#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8041 case PREDEF_TYPE_##Id##_ID: \
8042 T = Context.Id##Ty; \
8044#include "clang/Basic/OpenCLExtensionTypes.def"
8046 T = Context.OCLSamplerTy;
8049 T = Context.OCLEventTy;
8052 T = Context.OCLClkEventTy;
8055 T = Context.OCLQueueTy;
8058 T = Context.OCLReserveIDTy;
8061 T = Context.getAutoDeductType();
8064 T = Context.getAutoRRefDeductType();
8067 T = Context.ARCUnbridgedCastTy;
8070 T = Context.BuiltinFnTy;
8073 T = Context.IncompleteMatrixIdxTy;
8076 T = Context.ArraySectionTy;
8079 T = Context.OMPArrayShapingTy;
8082 T = Context.OMPIteratorTy;
8084#define SVE_TYPE(Name, Id, SingletonId) \
8085 case PREDEF_TYPE_##Id##_ID: \
8086 T = Context.SingletonId; \
8088#include "clang/Basic/AArch64ACLETypes.def"
8089#define PPC_VECTOR_TYPE(Name, Id, Size) \
8090 case PREDEF_TYPE_##Id##_ID: \
8091 T = Context.Id##Ty; \
8093#include "clang/Basic/PPCTypes.def"
8094#define RVV_TYPE(Name, Id, SingletonId) \
8095 case PREDEF_TYPE_##Id##_ID: \
8096 T = Context.SingletonId; \
8098#include "clang/Basic/RISCVVTypes.def"
8099#define WASM_TYPE(Name, Id, SingletonId) \
8100 case PREDEF_TYPE_##Id##_ID: \
8101 T = Context.SingletonId; \
8103#include "clang/Basic/WebAssemblyReferenceTypes.def"
8104#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8105 case PREDEF_TYPE_##Id##_ID: \
8106 T = Context.SingletonId; \
8108#include "clang/Basic/AMDGPUTypes.def"
8109#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8110 case PREDEF_TYPE_##Id##_ID: \
8111 T = Context.SingletonId; \
8113#include "clang/Basic/HLSLIntangibleTypes.def"
8116 assert(!T.isNull() &&
"Unknown predefined type");
8117 return T.withFastQualifiers(FastQuals);
8120 unsigned Index = translateTypeIDToIndex(ID).second;
8122 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
8123 if (TypesLoaded[Index].isNull()) {
8124 TypesLoaded[Index] = readTypeRecord(ID);
8125 if (TypesLoaded[Index].isNull())
8128 TypesLoaded[Index]->setFromAST();
8129 if (DeserializationListener)
8131 TypesLoaded[Index]);
8134 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8147 ReadModuleOffsetMap(F);
8150 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8152 if (ModuleFileIndex == 0)
8157 ModuleFileIndex = MF.
Index + 1;
8158 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8177 TemplateNameLoc, EllipsisLoc);
8188 llvm_unreachable(
"unexpected template argument loc");
8205 unsigned NumArgsAsWritten =
readInt();
8206 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8220 if (NumCurrentElementsDeserializing) {
8225 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8248 auto *II = Name.getAsIdentifierInfo();
8249 assert(II &&
"non-identifier name in C?");
8250 if (II->isOutOfDate())
8267 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8268 Template = CTSD->getSpecializedTemplate();
8269 Args = CTSD->getTemplateArgs().asArray();
8270 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8271 Template = VTSD->getSpecializedTemplate();
8272 Args = VTSD->getTemplateArgs().asArray();
8273 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8274 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8276 Args = FD->getTemplateSpecializationArgs()->asArray();
8281 Template->loadLazySpecializationsImpl(Args);
8286 RecordLocation Loc = getLocalBitOffset(Offset);
8289 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8290 Error(std::move(Err));
8293 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8298 Error(MaybeCode.takeError());
8301 unsigned Code = MaybeCode.get();
8305 if (!MaybeRecCode) {
8306 Error(MaybeRecCode.takeError());
8310 Error(
"malformed AST file: missing C++ ctor initializers");
8314 return Record.readCXXCtorInitializers();
8318 assert(ContextObj &&
"reading base specifiers with no AST context");
8321 RecordLocation Loc = getLocalBitOffset(Offset);
8324 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8325 Error(std::move(Err));
8328 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8333 Error(MaybeCode.takeError());
8336 unsigned Code = MaybeCode.get();
8340 if (!MaybeRecCode) {
8341 Error(MaybeCode.takeError());
8344 unsigned RecCode = MaybeRecCode.get();
8347 Error(
"malformed AST file: missing C++ base specifiers");
8351 unsigned NumBases =
Record.readInt();
8354 for (
unsigned I = 0; I != NumBases; ++I)
8355 Bases[I] =
Record.readCXXBaseSpecifier();
8368 ReadModuleOffsetMap(F);
8371 OwningModuleFileIndex == 0
8375 if (OwningModuleFileIndex == 0)
8378 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8387 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8388 return M.
Index == ModuleFileIndex - 1;
8396 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8397 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8417 DeclCursorForID(ID, Loc);
8422 assert(ContextObj &&
"reading predefined decl without AST context");
8424 Decl *NewLoaded =
nullptr;
8430 return Context.getTranslationUnitDecl();
8433 if (Context.ObjCIdDecl)
8434 return Context.ObjCIdDecl;
8435 NewLoaded = Context.getObjCIdDecl();
8439 if (Context.ObjCSelDecl)
8440 return Context.ObjCSelDecl;
8441 NewLoaded = Context.getObjCSelDecl();
8445 if (Context.ObjCClassDecl)
8446 return Context.ObjCClassDecl;
8447 NewLoaded = Context.getObjCClassDecl();
8451 if (Context.ObjCProtocolClassDecl)
8452 return Context.ObjCProtocolClassDecl;
8453 NewLoaded = Context.getObjCProtocolDecl();
8457 if (Context.Int128Decl)
8458 return Context.Int128Decl;
8459 NewLoaded = Context.getInt128Decl();
8463 if (Context.UInt128Decl)
8464 return Context.UInt128Decl;
8465 NewLoaded = Context.getUInt128Decl();
8469 if (Context.ObjCInstanceTypeDecl)
8470 return Context.ObjCInstanceTypeDecl;
8471 NewLoaded = Context.getObjCInstanceTypeDecl();
8475 if (Context.BuiltinVaListDecl)
8476 return Context.BuiltinVaListDecl;
8477 NewLoaded = Context.getBuiltinVaListDecl();
8481 if (Context.VaListTagDecl)
8482 return Context.VaListTagDecl;
8483 NewLoaded = Context.getVaListTagDecl();
8487 if (Context.BuiltinMSVaListDecl)
8488 return Context.BuiltinMSVaListDecl;
8489 NewLoaded = Context.getBuiltinMSVaListDecl();
8494 return Context.getMSGuidTagDecl();
8497 if (Context.ExternCContext)
8498 return Context.ExternCContext;
8499 NewLoaded = Context.getExternCContextDecl();
8503 if (Context.CFConstantStringTypeDecl)
8504 return Context.CFConstantStringTypeDecl;
8505 NewLoaded = Context.getCFConstantStringDecl();
8509 if (Context.CFConstantStringTagDecl)
8510 return Context.CFConstantStringTagDecl;
8511 NewLoaded = Context.getCFConstantStringTagDecl();
8515 return Context.getMSTypeInfoTagDecl();
8517#define BuiltinTemplate(BTName) \
8518 case PREDEF_DECL##BTName##_ID: \
8519 if (Context.Decl##BTName) \
8520 return Context.Decl##BTName; \
8521 NewLoaded = Context.get##BTName##Decl(); \
8523#include "clang/Basic/BuiltinTemplates.inc"
8526 llvm_unreachable(
"Invalid decl ID");
8530 assert(NewLoaded &&
"Failed to load predefined decl?");
8532 if (DeserializationListener)
8533 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8538unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8539 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8540 if (!OwningModuleFile) {
8549 assert(ContextObj &&
"reading decl with no AST context");
8558 Merged.push_back(ID);
8563 unsigned Index = translateGlobalDeclIDToIndex(ID);
8565 if (Index >= DeclsLoaded.size()) {
8566 assert(0 &&
"declaration ID out-of-range for AST file");
8567 Error(
"declaration ID out-of-range for AST file");
8571 return DeclsLoaded[Index];
8578 unsigned Index = translateGlobalDeclIDToIndex(ID);
8580 if (Index >= DeclsLoaded.size()) {
8581 assert(0 &&
"declaration ID out-of-range for AST file");
8582 Error(
"declaration ID out-of-range for AST file");
8586 if (!DeclsLoaded[Index]) {
8588 if (DeserializationListener)
8589 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8592 return DeclsLoaded[Index];
8601 ReadModuleOffsetMap(M);
8611 uint64_t OrignalModuleFileIndex = 0;
8614 OrignalModuleFileIndex = I + 1;
8618 if (!OrignalModuleFileIndex)
8626 if (Idx >=
Record.size()) {
8627 Error(
"Corrupted AST file");
8644 RecordLocation Loc = getLocalBitOffset(Offset);
8645 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8646 Error(std::move(Err));
8649 assert(NumCurrentElementsDeserializing == 0 &&
8650 "should not be called while already deserializing");
8652 return ReadStmtFromStream(*Loc.F);
8655bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8659 auto It = SpecLookups.find(D);
8660 if (It == SpecLookups.end())
8666 It->second.Table.findAll();
8670 SpecLookups.erase(It);
8672 bool NewSpecsFound =
false;
8673 Deserializing LookupResults(
this);
8674 for (
auto &Info : Infos) {
8675 if (GetExistingDecl(Info))
8677 NewSpecsFound =
true;
8681 return NewSpecsFound;
8688 bool NewSpecsFound =
8689 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8691 return NewSpecsFound;
8693 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8694 return NewSpecsFound;
8697bool ASTReader::LoadExternalSpecializationsImpl(
8698 SpecLookupTableTy &SpecLookups,
const Decl *D,
8703 if (
auto It = SpecLookups.find(D); It != SpecLookups.end())
8704 LookupTable = &It->getSecond();
8710 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8712 llvm::raw_string_ostream OS(Name);
8719 Deserializing LookupResults(
this);
8724 LookupTable->
Table.find(HashValue);
8726 bool NewSpecsFound =
false;
8727 for (
auto &Info : Infos) {
8728 if (GetExistingDecl(Info))
8730 NewSpecsFound =
true;
8734 return NewSpecsFound;
8741 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8742 PartialSpecializationsLookups, D, TemplateArgs);
8744 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8746 return NewDeclsFound;
8754 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8755 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8756 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8758 if (!IsKindWeWant(K))
8761 auto ID = (
DeclID) + LexicalDecls[I + 1];
8766 if (PredefsVisited[ID])
8769 PredefsVisited[ID] =
true;
8773 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8781 for (
const auto &Lexical : TULexicalDecls)
8782 Visit(Lexical.first, Lexical.second);
8784 auto I = LexicalDecls.find(DC);
8785 if (I != LexicalDecls.end())
8786 Visit(I->second.first, I->second.second);
8789 ++NumLexicalDeclContextsRead;
8794class UnalignedDeclIDComp {
8800 : Reader(Reader), Mod(M) {}
8809 SourceLocation RHS = getLocation(R);
8814 SourceLocation LHS = getLocation(L);
8828 unsigned Offset,
unsigned Length,
8832 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8833 if (I == FileDeclIDs.end())
8836 FileDeclsInfo &DInfo = I->second;
8837 if (DInfo.Decls.empty())
8841 BeginLoc =
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
8844 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8846 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8847 if (BeginIt != DInfo.Decls.begin())
8853 while (BeginIt != DInfo.Decls.begin() &&
8856 ->isTopLevelDeclInObjCContainer())
8860 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8861 if (EndIt != DInfo.Decls.end())
8874 "DeclContext has no visible decls in storage");
8881 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8903 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8904 ++NumVisibleDeclContextsRead;
8905 Find(It->second.Table, Name);
8908 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8909 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8910 ++NumModuleLocalVisibleDeclContexts;
8911 Find(It->second.Table, std::make_pair(Name, NamedModule));
8914 if (
auto *NamedModule =
8915 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8917 FindModuleLocalLookup(NamedModule);
8922 if (ContextObj && ContextObj->getCurrentNamedModule())
8923 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8925 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8926 ++NumTULocalVisibleDeclContexts;
8927 Find(It->second.Table, Name);
8940 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
8941 auto It = LookupTables.find(DC);
8942 if (It == LookupTables.end())
8964 findAll(Lookups, NumVisibleDeclContextsRead);
8965 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
8966 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
8968 for (
auto &[Name, DS] : Decls)
8971 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
8976 auto I = Lookups.find(Primary);
8977 return I == Lookups.end() ?
nullptr : &I->second;
8982 auto I = ModuleLocalLookups.find(Primary);
8983 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
8988 auto I = TULocalLookups.find(Primary);
8989 return I == TULocalLookups.end() ?
nullptr : &I->second;
8996 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
8997 auto I = LookupTable.find(D);
8998 return I == LookupTable.end() ?
nullptr : &I->second;
9003 return PartialSpecializationsLookups.contains(D) ||
9004 SpecializationsLookups.contains(D);
9013 assert(ImplD && Consumer);
9015 for (
auto *I : ImplD->
methods())
9021void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9022 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9025 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9028void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9029 Consumer->HandleVTable(RD);
9033 this->Consumer = Consumer;
9036 PassInterestingDeclsToConsumer();
9038 if (DeserializationListener)
9039 DeserializationListener->ReaderInitialized(
this);
9043 std::fprintf(
stderr,
"*** AST File Statistics:\n");
9045 unsigned NumTypesLoaded =
9046 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
9047 unsigned NumDeclsLoaded =
9048 DeclsLoaded.size() -
9049 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
9050 unsigned NumIdentifiersLoaded =
9051 IdentifiersLoaded.size() -
9053 unsigned NumMacrosLoaded =
9054 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
9055 unsigned NumSelectorsLoaded =
9056 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
9059 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
9060 NumSLocEntriesRead, TotalNumSLocEntries,
9061 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9062 if (!TypesLoaded.empty())
9063 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
9064 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
9065 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
9066 if (!DeclsLoaded.empty())
9067 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
9068 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
9069 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9070 if (!IdentifiersLoaded.empty())
9071 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
9072 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
9073 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9074 if (!MacrosLoaded.empty())
9075 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9076 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
9077 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9078 if (!SelectorsLoaded.empty())
9079 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
9080 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
9081 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9082 if (TotalNumStatements)
9083 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
9084 NumStatementsRead, TotalNumStatements,
9085 ((
float)NumStatementsRead/TotalNumStatements * 100));
9087 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9088 NumMacrosRead, TotalNumMacros,
9089 ((
float)NumMacrosRead/TotalNumMacros * 100));
9090 if (TotalLexicalDeclContexts)
9091 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
9092 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9093 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9095 if (TotalVisibleDeclContexts)
9096 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
9097 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9098 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9100 if (TotalModuleLocalVisibleDeclContexts)
9102 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
9103 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9104 ((
float)NumModuleLocalVisibleDeclContexts /
9105 TotalModuleLocalVisibleDeclContexts * 100));
9106 if (TotalTULocalVisibleDeclContexts)
9107 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
9108 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9109 ((
float)NumTULocalVisibleDeclContexts /
9110 TotalTULocalVisibleDeclContexts * 100));
9111 if (TotalNumMethodPoolEntries)
9112 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
9113 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9114 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9116 if (NumMethodPoolLookups)
9117 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
9118 NumMethodPoolHits, NumMethodPoolLookups,
9119 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9120 if (NumMethodPoolTableLookups)
9121 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
9122 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9123 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9125 if (NumIdentifierLookupHits)
9127 " %u / %u identifier table lookups succeeded (%f%%)\n",
9128 NumIdentifierLookupHits, NumIdentifierLookups,
9129 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9132 std::fprintf(
stderr,
"\n");
9133 GlobalIndex->printStats();
9136 std::fprintf(
stderr,
"\n");
9138 std::fprintf(
stderr,
"\n");
9141template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9142LLVM_DUMP_METHOD
static void
9145 InitialCapacity> &Map) {
9146 if (Map.begin() == Map.end())
9151 llvm::errs() << Name <<
":\n";
9152 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9154 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9159 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9161 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9165 GlobalPreprocessedEntityMap);
9167 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9176 if (llvm::MemoryBuffer *buf = I.Buffer) {
9177 size_t bytes = buf->getBufferSize();
9178 switch (buf->getBufferKind()) {
9179 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9182 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9203 if (!FPPragmaOptions.empty()) {
9204 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9207 SemaObj->CurFPFeatures =
9213 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9214 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9215 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9216 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9218 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9220 DeclsWithEffectsToVerify.clear();
9222 SemaObj->OpenCLFeatures = OpenCLExtensions;
9228 assert(SemaObj &&
"no Sema to update");
9232 if (!SemaDeclRefs.empty()) {
9233 assert(SemaDeclRefs.size() % 3 == 0);
9234 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9235 if (!SemaObj->StdNamespace)
9236 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9237 if (!SemaObj->StdBadAlloc)
9238 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9239 if (!SemaObj->StdAlignValT)
9240 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9242 SemaDeclRefs.clear();
9247 if(OptimizeOffPragmaLocation.isValid())
9248 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9249 if (PragmaMSStructState != -1)
9251 if (PointersToMembersPragmaLocation.isValid()) {
9252 SemaObj->ActOnPragmaMSPointersToMembers(
9254 PragmaMSPointersToMembersState,
9255 PointersToMembersPragmaLocation);
9257 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9258 if (!RISCVVecIntrinsicPragma.empty()) {
9259 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9260 "Wrong number of RISCVVecIntrinsicPragma");
9261 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9262 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9263 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9266 if (PragmaAlignPackCurrentValue) {
9270 bool DropFirst =
false;
9271 if (!PragmaAlignPackStack.empty() &&
9272 PragmaAlignPackStack.front().Location.isInvalid()) {
9273 assert(PragmaAlignPackStack.front().Value ==
9274 SemaObj->AlignPackStack.DefaultValue &&
9275 "Expected a default alignment value");
9276 SemaObj->AlignPackStack.Stack.emplace_back(
9277 PragmaAlignPackStack.front().SlotLabel,
9278 SemaObj->AlignPackStack.CurrentValue,
9279 SemaObj->AlignPackStack.CurrentPragmaLocation,
9280 PragmaAlignPackStack.front().PushLocation);
9283 for (
const auto &Entry :
9284 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9285 SemaObj->AlignPackStack.Stack.emplace_back(
9286 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9288 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9289 assert(*PragmaAlignPackCurrentValue ==
9290 SemaObj->AlignPackStack.DefaultValue &&
9291 "Expected a default align and pack value");
9294 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9295 SemaObj->AlignPackStack.CurrentPragmaLocation =
9296 PragmaAlignPackCurrentLocation;
9299 if (FpPragmaCurrentValue) {
9303 bool DropFirst =
false;
9304 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9305 assert(FpPragmaStack.front().Value ==
9306 SemaObj->FpPragmaStack.DefaultValue &&
9307 "Expected a default pragma float_control value");
9308 SemaObj->FpPragmaStack.Stack.emplace_back(
9309 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9310 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9311 FpPragmaStack.front().PushLocation);
9314 for (
const auto &Entry :
9316 SemaObj->FpPragmaStack.Stack.emplace_back(
9317 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9318 if (FpPragmaCurrentLocation.isInvalid()) {
9319 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9320 "Expected a default pragma float_control value");
9323 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9324 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9329 for (
auto &Import : PendingImportedModulesSema) {
9330 if (Import.ImportLoc.isInvalid())
9333 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9336 PendingImportedModulesSema.clear();
9343 IdentifierLookupVisitor Visitor(Name, 0,
9344 NumIdentifierLookups,
9345 NumIdentifierLookupHits);
9351 if (PP.getLangOpts().CPlusPlus) {
9352 for (
auto *F : ModuleMgr.pch_modules())
9361 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9366 ModuleMgr.visit(Visitor, HitsPtr);
9388 ASTIdentifierLookupTable::key_iterator Current;
9392 ASTIdentifierLookupTable::key_iterator End;
9399 bool SkipModules =
false);
9401 StringRef
Next()
override;
9408 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9412 while (Current == End) {
9424 Current = IdTable->key_begin();
9425 End = IdTable->key_end();
9430 StringRef
Result = *Current;
9439 std::unique_ptr<IdentifierIterator> Current;
9440 std::unique_ptr<IdentifierIterator> Queued;
9443 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9444 std::unique_ptr<IdentifierIterator> Second)
9445 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9447 StringRef
Next()
override {
9451 StringRef result = Current->Next();
9452 if (!result.empty())
9457 std::swap(Current, Queued);
9466 std::unique_ptr<IdentifierIterator> ReaderIter(
9468 std::unique_ptr<IdentifierIterator> ModulesIter(
9469 GlobalIndex->createIdentifierIterator());
9470 return new ChainedIdentifierIterator(std::move(ReaderIter),
9471 std::move(ModulesIter));
9483 unsigned PriorGeneration;
9484 unsigned InstanceBits = 0;
9485 unsigned FactoryBits = 0;
9486 bool InstanceHasMoreThanOneDecl =
false;
9487 bool FactoryHasMoreThanOneDecl =
false;
9493 unsigned PriorGeneration)
9494 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9504 ++Reader.NumMethodPoolTableLookups;
9507 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9508 if (Pos == PoolTable->end())
9511 ++Reader.NumMethodPoolTableHits;
9512 ++Reader.NumSelectorsRead;
9516 ++Reader.NumMethodPoolEntriesRead;
9518 if (Reader.DeserializationListener)
9519 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9524 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9525 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9526 InstanceBits =
Data.InstanceBits;
9527 FactoryBits =
Data.FactoryBits;
9528 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9529 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9535 return InstanceMethods;
9540 return FactoryMethods;
9547 return InstanceHasMoreThanOneDecl;
9565 unsigned &Generation = SelectorGeneration[Sel];
9566 unsigned PriorGeneration = Generation;
9568 SelectorOutOfDate[Sel] =
false;
9571 ++NumMethodPoolLookups;
9573 ModuleMgr.visit(Visitor);
9579 ++NumMethodPoolHits;
9600 if (SelectorOutOfDate[Sel])
9608 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9610 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9611 Namespaces.push_back(Namespace);
9616 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9617 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9618 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9621 Undefined.insert(std::make_pair(D, Loc));
9623 UndefinedButUsed.clear();
9629 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9632 uint64_t Count = DelayedDeleteExprs[Idx++];
9633 for (uint64_t
C = 0;
C < Count; ++
C) {
9636 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9637 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9644 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9645 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9647 TentativeDefs.push_back(Var);
9649 TentativeDefinitions.clear();
9654 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9656 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9660 UnusedFileScopedDecls.clear();
9665 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9667 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9671 DelegatingCtorDecls.clear();
9675 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9677 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9681 ExtVectorDecls.clear();
9686 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9689 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9693 UnusedLocalTypedefNameCandidates.clear();
9698 for (
auto I : DeclsToCheckForDeferredDiags) {
9699 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9703 DeclsToCheckForDeferredDiags.clear();
9708 if (ReferencedSelectorsData.empty())
9713 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9715 while (I < DataSize) {
9719 Sels.push_back(std::make_pair(Sel, SelLoc));
9721 ReferencedSelectorsData.clear();
9726 if (WeakUndeclaredIdentifiers.empty())
9729 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9737 WeakIDs.push_back(std::make_pair(WeakId, WI));
9739 WeakUndeclaredIdentifiers.clear();
9743 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9744 if (ExtnameUndeclaredIdentifiers.empty())
9747 for (
unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9754 AsmLabelAttr *
Attr = AsmLabelAttr::CreateImplicit(
9758 ExtnameIDs.push_back(std::make_pair(NameId,
Attr));
9760 ExtnameUndeclaredIdentifiers.clear();
9764 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9766 VTableUse &TableInfo = VTableUses[Idx++];
9767 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9770 VTables.push_back(VT);
9778 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9779 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9783 Pending.push_back(std::make_pair(D, Loc));
9785 PendingInstantiations.clear();
9789 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9791 for (
auto &LPT : LateParsedTemplates) {
9794 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9798 auto LT = std::make_unique<LateParsedTemplate>();
9799 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9803 assert(F &&
"No module");
9805 unsigned TokN = LateParsed[Idx++];
9806 LT->Toks.reserve(TokN);
9807 for (
unsigned T = 0; T < TokN; ++T)
9808 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9810 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9814 LateParsedTemplates.clear();
9826 if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9827 Iter != LambdaDeclarationsForMerging.end() &&
9828 Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
9837 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9846 assert(ID &&
"Non-zero identifier ID required");
9847 unsigned Index = translateIdentifierIDToIndex(ID).second;
9848 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9849 IdentifiersLoaded[Index] = II;
9850 if (DeserializationListener)
9851 DeserializationListener->IdentifierRead(ID, II);
9873 if (NumCurrentElementsDeserializing && !Decls) {
9874 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9878 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9891 Decls->push_back(D);
9898 pushExternalDeclIntoScope(D, II);
9902std::pair<ModuleFile *, unsigned>
9903ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9905 return {
nullptr, 0};
9907 unsigned ModuleFileIndex = ID >> 32;
9908 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9910 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9922 if (IdentifiersLoaded.empty()) {
9923 Error(
"no identifier table in AST file");
9927 auto [M, Index] = translateIdentifierIDToIndex(ID);
9928 if (!IdentifiersLoaded[Index]) {
9929 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9932 const unsigned char *
Data =
9938 auto &II = PP.getIdentifierTable().get(Key);
9939 IdentifiersLoaded[Index] = &II;
9942 if (DeserializationListener)
9943 DeserializationListener->IdentifierRead(ID, &II);
9946 return IdentifiersLoaded[Index];
9958 ReadModuleOffsetMap(M);
9960 unsigned ModuleFileIndex = LocalID >> 32;
9961 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
9964 assert(MF &&
"malformed identifier ID encoding?");
9966 if (!ModuleFileIndex)
9972std::pair<ModuleFile *, unsigned>
9973ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
9975 return {
nullptr, 0};
9977 unsigned ModuleFileIndex = ID >> 32;
9978 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
9982 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
9991 if (MacrosLoaded.empty()) {
9992 Error(
"no macro table in AST file");
9996 auto [M, Index] = translateMacroIDToIndex(ID);
9997 if (!MacrosLoaded[Index]) {
9998 assert(M !=
nullptr &&
"Untranslated Macro ID?");
10004 if (DeserializationListener)
10005 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10008 return MacrosLoaded[Index];
10016 ReadModuleOffsetMap(M);
10018 unsigned ModuleFileIndex = LocalID >> 32;
10019 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10022 assert(MF &&
"malformed identifier ID encoding?");
10024 if (!ModuleFileIndex) {
10029 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
10038 ReadModuleOffsetMap(M);
10043 &&
"Invalid index into submodule index remap");
10045 return LocalID + I->second;
10050 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
10054 if (GlobalID > SubmodulesLoaded.size()) {
10055 Error(
"submodule ID out of range in AST file");
10070 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
10073 int IndexFromEnd =
static_cast<int>(ID >> 1);
10074 assert(IndexFromEnd &&
"got reference to unknown module file");
10091 auto I = llvm::find(PCHModules, M);
10092 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
10093 return std::distance(I, PCHModules.end()) << 1;
10102 const auto &PCHChain = ModuleMgr.pch_modules();
10103 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10104 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10108 llvm::sys::path::parent_path(MF.
FileName),
10111 return std::nullopt;
10115 auto I = DefinitionSource.find(FD);
10116 if (I == DefinitionSource.end())
10122 return ThisDeclarationWasADefinitionSet.contains(FD);
10133 if (ID > SelectorsLoaded.size()) {
10134 Error(
"selector ID out of range in AST file");
10138 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
10141 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
10145 SelectorsLoaded[ID - 1] =
10147 if (DeserializationListener)
10148 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10151 return SelectorsLoaded[ID - 1];
10169 ReadModuleOffsetMap(M);
10174 &&
"Invalid index into selector index remap");
10176 return LocalID + I->second;
10207 NameInfo.
setName(readDeclarationName());
10221 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10222 assert(Op.isValid());
10228 unsigned NumTPLists =
readInt();
10233 for (
unsigned i = 0; i != NumTPLists; ++i)
10244 unsigned NumParams =
readInt();
10246 Params.reserve(NumParams);
10247 while (NumParams--)
10250 bool HasRequiresClause =
readBool();
10251 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10254 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10255 return TemplateParams;
10260 bool Canonicalize) {
10261 unsigned NumTemplateArgs =
readInt();
10262 TemplArgs.reserve(NumTemplateArgs);
10263 while (NumTemplateArgs--)
10269 unsigned NumDecls =
readInt();
10271 while (NumDecls--) {
10283 bool inheritConstructors =
readBool();
10289 Result.setInheritConstructors(inheritConstructors);
10296 unsigned NumInitializers =
readInt();
10297 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10299 for (
unsigned i = 0; i != NumInitializers; ++i) {
10301 bool IsBaseVirtual =
false;
10332 BOMInit =
new (Context)
10334 RParenLoc, MemberOrEllipsisLoc);
10336 BOMInit =
new (Context)
10339 BOMInit =
new (Context)
10343 BOMInit =
new (Context)
10345 LParenLoc,
Init, RParenLoc);
10348 unsigned SourceOrder =
readInt();
10352 CtorInitializers[i] = BOMInit;
10355 return CtorInitializers;
10363 for (
unsigned I = 0; I != N; ++I) {
10364 auto Kind = readNestedNameSpecifierKind();
10369 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10378 Builder.Make(Context, T->getTypeLoc(), ColonColonLoc);
10384 Builder.MakeGlobal(Context, ColonColonLoc);
10391 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10396 llvm_unreachable(
"unexpected null nested name specifier");
10411 const StringRef Blob) {
10412 unsigned Count =
Record[0];
10413 const char *Byte = Blob.data();
10414 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10415 for (
unsigned I = 0; I < Count; ++Byte)
10416 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10417 if (*Byte & (1 << Bit))
10424 return llvm::APFloat(Sem,
readAPInt());
10429 unsigned Len =
Record[Idx++];
10437 unsigned Len =
Record[Idx++];
10438 StringRef
Result = Blob.substr(0, Len);
10439 Blob = Blob.substr(Len);
10463 unsigned Major =
Record[Idx++];
10464 unsigned Minor =
Record[Idx++];
10465 unsigned Subminor =
Record[Idx++];
10467 return VersionTuple(Major);
10469 return VersionTuple(Major, Minor - 1);
10470 return VersionTuple(Major, Minor - 1, Subminor - 1);
10481 return Diag(CurrentImportLoc, DiagID);
10485 return Diags.Report(Loc, DiagID);
10489 llvm::function_ref<
void()> Fn) {
10492 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10496 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10502 return PP.getIdentifierTable();
10508 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10509 "Already have a SwitchCase with this ID");
10510 (*CurrSwitchCaseStmts)[ID] = SC;
10515 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10516 return (*CurrSwitchCaseStmts)[ID];
10520 CurrSwitchCaseStmts->clear();
10525 std::vector<RawComment *> Comments;
10532 BitstreamCursor &Cursor = I->first;
10539 Cursor.advanceSkippingSubblocks(
10540 BitstreamCursor::AF_DontPopBlockAtEnd);
10542 Error(MaybeEntry.takeError());
10545 llvm::BitstreamEntry Entry = MaybeEntry.get();
10547 switch (Entry.Kind) {
10548 case llvm::BitstreamEntry::SubBlock:
10549 case llvm::BitstreamEntry::Error:
10550 Error(
"malformed block record in AST file");
10552 case llvm::BitstreamEntry::EndBlock:
10554 case llvm::BitstreamEntry::Record:
10562 if (!MaybeComment) {
10563 Error(MaybeComment.takeError());
10572 bool IsTrailingComment =
Record[Idx++];
10573 bool IsAlmostTrailingComment =
Record[Idx++];
10574 Comments.push_back(
new (Context)
RawComment(
10575 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10585 if (Loc.first.isValid())
10586 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10599 assert(NumUserInputs <= NumInputs);
10600 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10601 for (
unsigned I = 0; I < N; ++I) {
10602 bool IsSystem = I >= NumUserInputs;
10604 Visitor(IFI, IsSystem);
10609 bool IncludeSystem,
bool Complain,
10611 bool isSystem)> Visitor) {
10614 assert(NumUserInputs <= NumInputs);
10615 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10616 for (
unsigned I = 0; I < N; ++I) {
10617 bool IsSystem = I >= NumUserInputs;
10618 InputFile IF = getInputFile(MF, I+1, Complain);
10619 Visitor(IF, IsSystem);
10627 for (
unsigned I = 0; I < NumInputs; ++I) {
10630 if (
auto FE = getInputFile(MF, I + 1).getFile())
10635void ASTReader::finishPendingActions() {
10636 while (!PendingIdentifierInfos.empty() ||
10637 !PendingDeducedFunctionTypes.empty() ||
10638 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10639 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10640 !PendingUpdateRecords.empty() ||
10641 !PendingObjCExtensionIvarRedeclarations.empty()) {
10644 using TopLevelDeclsMap =
10645 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10646 TopLevelDeclsMap TopLevelDecls;
10648 while (!PendingIdentifierInfos.empty()) {
10651 std::move(PendingIdentifierInfos.back().second);
10652 PendingIdentifierInfos.pop_back();
10659 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10660 auto *FD = PendingDeducedFunctionTypes[I].first;
10661 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10663 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10666 if (DT->isDeduced()) {
10667 PendingDeducedTypeUpdates.insert(
10668 {FD->getCanonicalDecl(), FD->getReturnType()});
10675 PendingUndeducedFunctionDecls.push_back(FD);
10679 PendingDeducedFunctionTypes.clear();
10683 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10684 auto *VD = PendingDeducedVarTypes[I].first;
10685 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10687 PendingDeducedVarTypes.clear();
10690 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10691 loadPendingDeclChain(PendingDeclChains[I].first,
10692 PendingDeclChains[I].second);
10693 PendingDeclChains.clear();
10696 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10697 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10698 IdentifierInfo *II = TLD->first;
10699 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10705 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10706 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10707 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10708 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10710 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10712 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10713 if (!Info.M->isModule())
10717 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10719 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10720 if (Info.M->isModule())
10724 PendingMacroIDs.clear();
10728 while (!PendingDeclContextInfos.empty()) {
10729 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10730 PendingDeclContextInfos.pop_front();
10733 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10737 while (!PendingUpdateRecords.empty()) {
10738 auto Update = PendingUpdateRecords.pop_back_val();
10739 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10740 loadDeclUpdateRecords(
Update);
10743 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10744 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10745 auto DuplicateIvars =
10746 PendingObjCExtensionIvarRedeclarations.back().second;
10748 StructuralEquivalenceContext Ctx(
10749 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10750 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10754 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10756 for (
auto IvarPair : DuplicateIvars) {
10757 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10759 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10765 ExtensionsPair.first->setInvalidDecl();
10766 ExtensionsPair.second->getClassInterface()
10768 ->setIvarList(
nullptr);
10770 for (
auto IvarPair : DuplicateIvars) {
10771 Diag(IvarPair.first->getLocation(),
10772 diag::err_duplicate_ivar_declaration)
10773 << IvarPair.first->getIdentifier();
10774 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10777 PendingObjCExtensionIvarRedeclarations.pop_back();
10783 assert(PendingFakeDefinitionData.empty() &&
10784 "faked up a class definition but never saw the real one");
10790 for (Decl *D : PendingDefinitions) {
10791 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10792 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10793 for (
auto *R = getMostRecentExistingDecl(RD);
R;
10794 R =
R->getPreviousDecl()) {
10797 "declaration thinks it's the definition but it isn't");
10805 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10810 for (
auto *R = getMostRecentExistingDecl(ID);
R;
R =
R->getPreviousDecl())
10816 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10817 for (
auto *R = getMostRecentExistingDecl(PD);
R;
R =
R->getPreviousDecl())
10824 for (
auto *R = getMostRecentExistingDecl(RTD);
R;
R =
R->getPreviousDecl())
10827 PendingDefinitions.clear();
10829 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10830 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10831 if (
auto *VD = dyn_cast<VarDecl>(D))
10832 return VD->isThisDeclarationADefinition() ||
10833 VD->isThisDeclarationADemotedDefinition();
10835 if (
auto *TD = dyn_cast<TagDecl>(D))
10836 return TD->isThisDeclarationADefinition() ||
10837 TD->isThisDeclarationADemotedDefinition();
10839 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10840 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10842 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10843 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10850 return hasDefinitionImpl(D, hasDefinitionImpl);
10866 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10872 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10873 PBEnd = PendingBodies.end();
10874 PB != PBEnd; ++PB) {
10875 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10877 const FunctionDecl *Defn =
nullptr;
10878 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10879 FD->setLazyBody(PB->second);
10881 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10884 if (!FD->isLateTemplateParsed() &&
10885 !NonConstDefn->isLateTemplateParsed() &&
10890 FD->getODRHash() != NonConstDefn->getODRHash()) {
10892 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10893 }
else if (FD->getLexicalParent()->isFileContext() &&
10894 NonConstDefn->getLexicalParent()->isFileContext()) {
10898 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10909 PendingBodies.clear();
10912 for (
auto [RD, MD] : PendingAddedClassMembers) {
10913 RD->addedMember(MD);
10915 PendingAddedClassMembers.clear();
10918 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10920 PendingMergedDefinitionsToDeduplicate.clear();
10924 for (Decl *D : PendingIncompleteDeclChains)
10925 markIncompleteDeclChain(D);
10926 PendingIncompleteDeclChains.clear();
10928 assert(PendingIdentifierInfos.empty() &&
10929 "Should be empty at the end of finishPendingActions");
10930 assert(PendingDeducedFunctionTypes.empty() &&
10931 "Should be empty at the end of finishPendingActions");
10932 assert(PendingDeducedVarTypes.empty() &&
10933 "Should be empty at the end of finishPendingActions");
10934 assert(PendingDeclChains.empty() &&
10935 "Should be empty at the end of finishPendingActions");
10936 assert(PendingMacroIDs.empty() &&
10937 "Should be empty at the end of finishPendingActions");
10938 assert(PendingDeclContextInfos.empty() &&
10939 "Should be empty at the end of finishPendingActions");
10940 assert(PendingUpdateRecords.empty() &&
10941 "Should be empty at the end of finishPendingActions");
10942 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10943 "Should be empty at the end of finishPendingActions");
10944 assert(PendingFakeDefinitionData.empty() &&
10945 "Should be empty at the end of finishPendingActions");
10946 assert(PendingDefinitions.empty() &&
10947 "Should be empty at the end of finishPendingActions");
10948 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10949 "Should be empty at the end of finishPendingActions");
10950 assert(PendingBodies.empty() &&
10951 "Should be empty at the end of finishPendingActions");
10952 assert(PendingAddedClassMembers.empty() &&
10953 "Should be empty at the end of finishPendingActions");
10954 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10955 "Should be empty at the end of finishPendingActions");
10956 assert(PendingIncompleteDeclChains.empty() &&
10957 "Should be empty at the end of finishPendingActions");
10960void ASTReader::diagnoseOdrViolations() {
10961 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10962 PendingRecordOdrMergeFailures.empty() &&
10963 PendingFunctionOdrMergeFailures.empty() &&
10964 PendingEnumOdrMergeFailures.empty() &&
10965 PendingObjCInterfaceOdrMergeFailures.empty() &&
10966 PendingObjCProtocolOdrMergeFailures.empty())
10973 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
10974 PendingOdrMergeFailures.clear();
10975 for (
auto &Merge : OdrMergeFailures) {
10976 Merge.first->buildLookup();
10977 Merge.first->decls_begin();
10978 Merge.first->bases_begin();
10979 Merge.first->vbases_begin();
10980 for (
auto &RecordPair : Merge.second) {
10981 auto *RD = RecordPair.first;
10989 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
10990 PendingRecordOdrMergeFailures.clear();
10991 for (
auto &Merge : RecordOdrMergeFailures) {
10992 Merge.first->decls_begin();
10993 for (
auto &D : Merge.second)
10998 auto ObjCInterfaceOdrMergeFailures =
10999 std::move(PendingObjCInterfaceOdrMergeFailures);
11000 PendingObjCInterfaceOdrMergeFailures.clear();
11001 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11002 Merge.first->decls_begin();
11003 for (
auto &InterfacePair : Merge.second)
11004 InterfacePair.first->decls_begin();
11008 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11009 PendingFunctionOdrMergeFailures.clear();
11010 for (
auto &Merge : FunctionOdrMergeFailures) {
11011 Merge.first->buildLookup();
11012 Merge.first->decls_begin();
11013 Merge.first->getBody();
11014 for (
auto &FD : Merge.second) {
11022 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11023 PendingEnumOdrMergeFailures.clear();
11024 for (
auto &Merge : EnumOdrMergeFailures) {
11025 Merge.first->decls_begin();
11026 for (
auto &
Enum : Merge.second) {
11027 Enum->decls_begin();
11032 auto ObjCProtocolOdrMergeFailures =
11033 std::move(PendingObjCProtocolOdrMergeFailures);
11034 PendingObjCProtocolOdrMergeFailures.clear();
11035 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11036 Merge.first->decls_begin();
11037 for (
auto &ProtocolPair : Merge.second)
11038 ProtocolPair.first->decls_begin();
11047 while (!PendingOdrMergeChecks.empty()) {
11048 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11059 bool Found =
false;
11062 for (
auto *RI : D->
redecls()) {
11063 if (RI->getLexicalDeclContext() == CanonDef) {
11077 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11078 for (
auto *CanonMember : CanonDef->
decls()) {
11079 if (CanonMember->getCanonicalDecl() == DCanon) {
11088 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
11090 Candidates.push_back(ND);
11103 std::string CanonDefModule =
11108 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11110 if (Candidates.empty())
11112 diag::note_module_odr_violation_no_possible_decls) << D;
11114 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
11115 Diag(Candidates[I]->getLocation(),
11116 diag::note_module_odr_violation_possible_decl)
11120 DiagnosedOdrMergeFailures.insert(CanonDef);
11124 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11125 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11126 ObjCInterfaceOdrMergeFailures.empty() &&
11127 ObjCProtocolOdrMergeFailures.empty())
11130 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
11134 for (
auto &Merge : OdrMergeFailures) {
11137 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11140 bool Diagnosed =
false;
11141 CXXRecordDecl *FirstRecord = Merge.first;
11142 for (
auto &RecordPair : Merge.second) {
11143 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11144 RecordPair.second)) {
11157 Diag(Merge.first->getLocation(),
11158 diag::err_module_odr_violation_different_instantiations)
11165 for (
auto &Merge : RecordOdrMergeFailures) {
11168 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11171 RecordDecl *FirstRecord = Merge.first;
11172 bool Diagnosed =
false;
11173 for (
auto *SecondRecord : Merge.second) {
11174 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11180 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11184 for (
auto &Merge : FunctionOdrMergeFailures) {
11185 FunctionDecl *FirstFunction = Merge.first;
11186 bool Diagnosed =
false;
11187 for (
auto &SecondFunction : Merge.second) {
11188 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11194 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11198 for (
auto &Merge : EnumOdrMergeFailures) {
11201 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11204 EnumDecl *FirstEnum = Merge.first;
11205 bool Diagnosed =
false;
11206 for (
auto &SecondEnum : Merge.second) {
11207 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11213 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11216 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11219 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11222 bool Diagnosed =
false;
11223 ObjCInterfaceDecl *FirstID = Merge.first;
11224 for (
auto &InterfacePair : Merge.second) {
11225 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11226 InterfacePair.second)) {
11232 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11235 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11238 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11241 ObjCProtocolDecl *FirstProtocol = Merge.first;
11242 bool Diagnosed =
false;
11243 for (
auto &ProtocolPair : Merge.second) {
11244 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11245 ProtocolPair.second)) {
11251 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11256 if (llvm::Timer *T = ReadTimer.get();
11257 ++NumCurrentElementsDeserializing == 1 && T)
11258 ReadTimeRegion.emplace(T);
11262 assert(NumCurrentElementsDeserializing &&
11263 "FinishedDeserializing not paired with StartedDeserializing");
11264 if (NumCurrentElementsDeserializing == 1) {
11267 finishPendingActions();
11269 --NumCurrentElementsDeserializing;
11271 if (NumCurrentElementsDeserializing == 0) {
11275 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11283 while (!PendingExceptionSpecUpdates.empty() ||
11284 !PendingDeducedTypeUpdates.empty() ||
11285 !PendingUndeducedFunctionDecls.empty()) {
11286 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11287 PendingExceptionSpecUpdates.clear();
11288 for (
auto Update : ESUpdates) {
11289 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11292 if (
auto *Listener =
getContext().getASTMutationListener())
11294 for (
auto *Redecl :
Update.second->redecls())
11298 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11299 PendingDeducedTypeUpdates.clear();
11300 for (
auto Update : DTUpdates) {
11301 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11308 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11309 PendingUndeducedFunctionDecls.clear();
11313 (void)UndeducedFD->getMostRecentDecl();
11316 ReadTimeRegion.reset();
11318 diagnoseOdrViolations();
11324 PassInterestingDeclsToConsumer();
11331 auto It = PendingFakeLookupResults.find(II);
11332 if (It != PendingFakeLookupResults.end()) {
11333 for (
auto *ND : It->second)
11338 It->second.clear();
11342 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11343 SemaObj->TUScope->AddDecl(D);
11344 }
else if (SemaObj->TUScope) {
11348 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11349 SemaObj->TUScope->AddDecl(D);
11357 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11358 StringRef isysroot,
11360 bool AllowASTWithCompilerErrors,
11361 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11362 bool ForceValidateUserInputs,
11363 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11364 std::unique_ptr<llvm::Timer> ReadTimer)
11369 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11370 StackHandler(Diags), PP(PP), ContextObj(Context),
11371 CodeGenOpts(CodeGenOpts),
11373 PP.getHeaderSearchInfo()),
11374 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11375 DisableValidationKind(DisableValidationKind),
11376 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11377 AllowConfigurationMismatch(AllowConfigurationMismatch),
11378 ValidateSystemInputs(ValidateSystemInputs),
11379 ForceValidateUserInputs(ForceValidateUserInputs),
11380 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11381 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11382 SourceMgr.setExternalSLocEntrySource(
this);
11384 PathBuf.reserve(256);
11386 for (
const auto &Ext : Extensions) {
11387 auto BlockName = Ext->getExtensionMetadata().BlockName;
11388 auto Known = ModuleFileExtensions.find(BlockName);
11389 if (Known != ModuleFileExtensions.end()) {
11390 Diags.Report(diag::warn_duplicate_module_file_extension)
11395 ModuleFileExtensions.insert({BlockName, Ext});
11400 if (OwnsDeserializationListener)
11401 delete DeserializationListener;
11405 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11409 unsigned AbbrevID) {
11412 return Cursor.readRecord(AbbrevID, Record);
11428 : Record(Record), Context(Record.getContext()) {}
11429#define GEN_CLANG_CLAUSE_CLASS
11430#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11431#include "llvm/Frontend/OpenMP/OMP.inc"
11445 switch (llvm::omp::Clause(Record.readInt())) {
11446 case llvm::omp::OMPC_if:
11449 case llvm::omp::OMPC_final:
11452 case llvm::omp::OMPC_num_threads:
11455 case llvm::omp::OMPC_safelen:
11458 case llvm::omp::OMPC_simdlen:
11461 case llvm::omp::OMPC_sizes: {
11462 unsigned NumSizes = Record.readInt();
11466 case llvm::omp::OMPC_counts: {
11467 unsigned NumCounts = Record.readInt();
11471 case llvm::omp::OMPC_permutation: {
11472 unsigned NumLoops = Record.readInt();
11476 case llvm::omp::OMPC_full:
11479 case llvm::omp::OMPC_partial:
11482 case llvm::omp::OMPC_looprange:
11485 case llvm::omp::OMPC_allocator:
11488 case llvm::omp::OMPC_collapse:
11491 case llvm::omp::OMPC_default:
11494 case llvm::omp::OMPC_proc_bind:
11495 C =
new (Context) OMPProcBindClause();
11497 case llvm::omp::OMPC_schedule:
11498 C =
new (Context) OMPScheduleClause();
11500 case llvm::omp::OMPC_ordered:
11501 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11503 case llvm::omp::OMPC_nowait:
11504 C =
new (Context) OMPNowaitClause();
11506 case llvm::omp::OMPC_untied:
11507 C =
new (Context) OMPUntiedClause();
11509 case llvm::omp::OMPC_mergeable:
11510 C =
new (Context) OMPMergeableClause();
11512 case llvm::omp::OMPC_threadset:
11515 case llvm::omp::OMPC_transparent:
11516 C =
new (Context) OMPTransparentClause();
11518 case llvm::omp::OMPC_read:
11519 C =
new (Context) OMPReadClause();
11521 case llvm::omp::OMPC_write:
11522 C =
new (Context) OMPWriteClause();
11524 case llvm::omp::OMPC_update:
11525 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11527 case llvm::omp::OMPC_capture:
11528 C =
new (Context) OMPCaptureClause();
11530 case llvm::omp::OMPC_compare:
11531 C =
new (Context) OMPCompareClause();
11533 case llvm::omp::OMPC_fail:
11534 C =
new (Context) OMPFailClause();
11536 case llvm::omp::OMPC_seq_cst:
11537 C =
new (Context) OMPSeqCstClause();
11539 case llvm::omp::OMPC_acq_rel:
11540 C =
new (Context) OMPAcqRelClause();
11542 case llvm::omp::OMPC_absent: {
11543 unsigned NumKinds = Record.readInt();
11544 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11547 case llvm::omp::OMPC_holds:
11548 C =
new (Context) OMPHoldsClause();
11550 case llvm::omp::OMPC_contains: {
11551 unsigned NumKinds = Record.readInt();
11552 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11555 case llvm::omp::OMPC_no_openmp:
11556 C =
new (Context) OMPNoOpenMPClause();
11558 case llvm::omp::OMPC_no_openmp_routines:
11559 C =
new (Context) OMPNoOpenMPRoutinesClause();
11561 case llvm::omp::OMPC_no_openmp_constructs:
11562 C =
new (Context) OMPNoOpenMPConstructsClause();
11564 case llvm::omp::OMPC_no_parallelism:
11565 C =
new (Context) OMPNoParallelismClause();
11567 case llvm::omp::OMPC_acquire:
11568 C =
new (Context) OMPAcquireClause();
11570 case llvm::omp::OMPC_release:
11571 C =
new (Context) OMPReleaseClause();
11573 case llvm::omp::OMPC_relaxed:
11574 C =
new (Context) OMPRelaxedClause();
11576 case llvm::omp::OMPC_weak:
11577 C =
new (Context) OMPWeakClause();
11579 case llvm::omp::OMPC_threads:
11582 case llvm::omp::OMPC_simd:
11585 case llvm::omp::OMPC_nogroup:
11588 case llvm::omp::OMPC_unified_address:
11589 C =
new (Context) OMPUnifiedAddressClause();
11591 case llvm::omp::OMPC_unified_shared_memory:
11592 C =
new (Context) OMPUnifiedSharedMemoryClause();
11594 case llvm::omp::OMPC_reverse_offload:
11595 C =
new (Context) OMPReverseOffloadClause();
11597 case llvm::omp::OMPC_dynamic_allocators:
11598 C =
new (Context) OMPDynamicAllocatorsClause();
11600 case llvm::omp::OMPC_atomic_default_mem_order:
11601 C =
new (Context) OMPAtomicDefaultMemOrderClause();
11603 case llvm::omp::OMPC_self_maps:
11604 C =
new (Context) OMPSelfMapsClause();
11606 case llvm::omp::OMPC_at:
11607 C =
new (Context) OMPAtClause();
11609 case llvm::omp::OMPC_severity:
11610 C =
new (Context) OMPSeverityClause();
11612 case llvm::omp::OMPC_message:
11613 C =
new (Context) OMPMessageClause();
11615 case llvm::omp::OMPC_private:
11616 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11618 case llvm::omp::OMPC_firstprivate:
11619 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11621 case llvm::omp::OMPC_lastprivate:
11622 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11624 case llvm::omp::OMPC_shared:
11625 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11627 case llvm::omp::OMPC_reduction: {
11628 unsigned N = Record.readInt();
11630 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11633 case llvm::omp::OMPC_task_reduction:
11634 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11636 case llvm::omp::OMPC_in_reduction:
11637 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11639 case llvm::omp::OMPC_linear:
11640 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11642 case llvm::omp::OMPC_aligned:
11645 case llvm::omp::OMPC_copyin:
11648 case llvm::omp::OMPC_copyprivate:
11651 case llvm::omp::OMPC_flush:
11654 case llvm::omp::OMPC_depobj:
11657 case llvm::omp::OMPC_depend: {
11658 unsigned NumVars = Record.readInt();
11659 unsigned NumLoops = Record.readInt();
11663 case llvm::omp::OMPC_device:
11666 case llvm::omp::OMPC_map: {
11668 Sizes.
NumVars = Record.readInt();
11675 case llvm::omp::OMPC_num_teams:
11678 case llvm::omp::OMPC_thread_limit:
11681 case llvm::omp::OMPC_priority:
11684 case llvm::omp::OMPC_grainsize:
11687 case llvm::omp::OMPC_num_tasks:
11690 case llvm::omp::OMPC_hint:
11693 case llvm::omp::OMPC_dist_schedule:
11696 case llvm::omp::OMPC_defaultmap:
11699 case llvm::omp::OMPC_to: {
11701 Sizes.
NumVars = Record.readInt();
11708 case llvm::omp::OMPC_from: {
11710 Sizes.
NumVars = Record.readInt();
11717 case llvm::omp::OMPC_use_device_ptr: {
11719 Sizes.
NumVars = Record.readInt();
11726 case llvm::omp::OMPC_use_device_addr: {
11728 Sizes.
NumVars = Record.readInt();
11735 case llvm::omp::OMPC_is_device_ptr: {
11737 Sizes.
NumVars = Record.readInt();
11744 case llvm::omp::OMPC_has_device_addr: {
11746 Sizes.
NumVars = Record.readInt();
11753 case llvm::omp::OMPC_allocate:
11756 case llvm::omp::OMPC_nontemporal:
11759 case llvm::omp::OMPC_inclusive:
11762 case llvm::omp::OMPC_exclusive:
11765 case llvm::omp::OMPC_order:
11768 case llvm::omp::OMPC_init:
11771 case llvm::omp::OMPC_use:
11774 case llvm::omp::OMPC_destroy:
11777 case llvm::omp::OMPC_novariants:
11780 case llvm::omp::OMPC_nocontext:
11783 case llvm::omp::OMPC_detach:
11786 case llvm::omp::OMPC_uses_allocators:
11789 case llvm::omp::OMPC_affinity:
11792 case llvm::omp::OMPC_filter:
11795 case llvm::omp::OMPC_bind:
11798 case llvm::omp::OMPC_align:
11801 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11804 case llvm::omp::OMPC_dyn_groupprivate:
11807 case llvm::omp::OMPC_doacross: {
11808 unsigned NumVars = Record.readInt();
11809 unsigned NumLoops = Record.readInt();
11813 case llvm::omp::OMPC_ompx_attribute:
11816 case llvm::omp::OMPC_ompx_bare:
11819#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11820 case llvm::omp::Enum: \
11822#include "llvm/Frontend/OpenMP/OMPKinds.def"
11826 assert(
C &&
"Unknown OMPClause type");
11829 C->setLocStart(Record.readSourceLocation());
11830 C->setLocEnd(Record.readSourceLocation());
11836 C->setPreInitStmt(Record.readSubStmt(),
11842 C->setPostUpdateExpr(Record.readSubExpr());
11845void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11848 C->setNameModifierLoc(
Record.readSourceLocation());
11849 C->setColonLoc(
Record.readSourceLocation());
11850 C->setCondition(
Record.readSubExpr());
11851 C->setLParenLoc(
Record.readSourceLocation());
11856 C->setCondition(
Record.readSubExpr());
11857 C->setLParenLoc(
Record.readSourceLocation());
11863 C->setNumThreads(Record.readSubExpr());
11864 C->setModifierLoc(Record.readSourceLocation());
11865 C->setLParenLoc(Record.readSourceLocation());
11869 C->setSafelen(Record.readSubExpr());
11870 C->setLParenLoc(Record.readSourceLocation());
11874 C->setSimdlen(Record.readSubExpr());
11875 C->setLParenLoc(Record.readSourceLocation());
11879 for (Expr *&E :
C->getSizesRefs())
11880 E = Record.readSubExpr();
11881 C->setLParenLoc(Record.readSourceLocation());
11885 bool HasFill = Record.readBool();
11887 C->setOmpFillIndex(Record.readInt());
11888 C->setOmpFillLoc(Record.readSourceLocation());
11889 for (Expr *&E :
C->getCountsRefs())
11890 E = Record.readSubExpr();
11891 C->setLParenLoc(Record.readSourceLocation());
11895 for (Expr *&E :
C->getArgsRefs())
11896 E = Record.readSubExpr();
11897 C->setLParenLoc(Record.readSourceLocation());
11903 C->setFactor(Record.readSubExpr());
11904 C->setLParenLoc(Record.readSourceLocation());
11908 C->setFirst(Record.readSubExpr());
11909 C->setCount(Record.readSubExpr());
11910 C->setLParenLoc(Record.readSourceLocation());
11911 C->setFirstLoc(Record.readSourceLocation());
11912 C->setCountLoc(Record.readSourceLocation());
11916 C->setAllocator(Record.readExpr());
11917 C->setLParenLoc(Record.readSourceLocation());
11921 C->setNumForLoops(Record.readSubExpr());
11922 C->setLParenLoc(Record.readSourceLocation());
11926 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11927 C->setLParenLoc(Record.readSourceLocation());
11928 C->setDefaultKindKwLoc(Record.readSourceLocation());
11929 C->setDefaultVariableCategory(
11931 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11937 C->setLParenLoc(Record.readSourceLocation());
11938 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11939 C->setThreadsetKindLoc(ThreadsetKindLoc);
11942 C->setThreadsetKind(TKind);
11945void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *
C) {
11946 C->setLParenLoc(Record.readSourceLocation());
11947 C->setImpexTypeKind(Record.readSubExpr());
11950void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *
C) {
11951 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11952 C->setLParenLoc(Record.readSourceLocation());
11953 C->setProcBindKindKwLoc(Record.readSourceLocation());
11956void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *
C) {
11958 C->setScheduleKind(
11960 C->setFirstScheduleModifier(
11962 C->setSecondScheduleModifier(
11964 C->setChunkSize(Record.readSubExpr());
11965 C->setLParenLoc(Record.readSourceLocation());
11966 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
11967 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
11968 C->setScheduleKindLoc(Record.readSourceLocation());
11969 C->setCommaLoc(Record.readSourceLocation());
11972void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *
C) {
11973 C->setNumForLoops(Record.readSubExpr());
11974 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11975 C->setLoopNumIterations(I, Record.readSubExpr());
11976 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
11977 C->setLoopCounter(I, Record.readSubExpr());
11978 C->setLParenLoc(Record.readSourceLocation());
11981void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *
C) {
11982 C->setEventHandler(Record.readSubExpr());
11983 C->setLParenLoc(Record.readSourceLocation());
11986void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *
C) {
11987 C->setCondition(Record.readSubExpr());
11988 C->setLParenLoc(Record.readSourceLocation());
11991void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
11993void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
11995void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
11997void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
11999void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *
C) {
12000 if (
C->isExtended()) {
12001 C->setLParenLoc(Record.readSourceLocation());
12002 C->setArgumentLoc(Record.readSourceLocation());
12007void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12009void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12013void OMPClauseReader::VisitOMPFailClause(OMPFailClause *
C) {
12014 C->setLParenLoc(Record.readSourceLocation());
12015 SourceLocation FailParameterLoc = Record.readSourceLocation();
12016 C->setFailParameterLoc(FailParameterLoc);
12018 C->setFailParameter(CKind);
12021void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *
C) {
12022 unsigned Count =
C->getDirectiveKinds().size();
12023 C->setLParenLoc(Record.readSourceLocation());
12024 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12025 DKVec.reserve(Count);
12026 for (
unsigned I = 0; I < Count; I++) {
12029 C->setDirectiveKinds(DKVec);
12032void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *
C) {
12033 C->setExpr(Record.readExpr());
12034 C->setLParenLoc(Record.readSourceLocation());
12037void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *
C) {
12038 unsigned Count =
C->getDirectiveKinds().size();
12039 C->setLParenLoc(Record.readSourceLocation());
12040 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12041 DKVec.reserve(Count);
12042 for (
unsigned I = 0; I < Count; I++) {
12045 C->setDirectiveKinds(DKVec);
12048void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12050void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12051 OMPNoOpenMPRoutinesClause *) {}
12053void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12054 OMPNoOpenMPConstructsClause *) {}
12056void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12058void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12060void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12062void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12064void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12066void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12068void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12070void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12072void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12074void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12076void OMPClauseReader::VisitOMPInitClause(OMPInitClause *
C) {
12077 unsigned NumVars =
C->varlist_size();
12078 SmallVector<Expr *, 16> Vars;
12079 Vars.reserve(NumVars);
12080 for (
unsigned I = 0; I != NumVars; ++I)
12081 Vars.push_back(Record.readSubExpr());
12082 C->setVarRefs(Vars);
12083 C->setIsTarget(Record.readBool());
12084 C->setIsTargetSync(Record.readBool());
12085 C->setLParenLoc(Record.readSourceLocation());
12086 C->setVarLoc(Record.readSourceLocation());
12089void OMPClauseReader::VisitOMPUseClause(OMPUseClause *
C) {
12090 C->setInteropVar(Record.readSubExpr());
12091 C->setLParenLoc(Record.readSourceLocation());
12092 C->setVarLoc(Record.readSourceLocation());
12095void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *
C) {
12096 C->setInteropVar(Record.readSubExpr());
12097 C->setLParenLoc(Record.readSourceLocation());
12098 C->setVarLoc(Record.readSourceLocation());
12101void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
12103 C->setCondition(Record.readSubExpr());
12104 C->setLParenLoc(Record.readSourceLocation());
12107void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *
C) {
12109 C->setCondition(Record.readSubExpr());
12110 C->setLParenLoc(Record.readSourceLocation());
12113void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12115void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12116 OMPUnifiedSharedMemoryClause *) {}
12118void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12121OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12124void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12125 OMPAtomicDefaultMemOrderClause *
C) {
12126 C->setAtomicDefaultMemOrderKind(
12128 C->setLParenLoc(Record.readSourceLocation());
12129 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12132void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12134void OMPClauseReader::VisitOMPAtClause(OMPAtClause *
C) {
12136 C->setLParenLoc(Record.readSourceLocation());
12137 C->setAtKindKwLoc(Record.readSourceLocation());
12140void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *
C) {
12142 C->setLParenLoc(Record.readSourceLocation());
12143 C->setSeverityKindKwLoc(Record.readSourceLocation());
12146void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *
C) {
12148 C->setMessageString(Record.readSubExpr());
12149 C->setLParenLoc(Record.readSourceLocation());
12152void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *
C) {
12153 C->setLParenLoc(Record.readSourceLocation());
12154 unsigned NumVars =
C->varlist_size();
12155 SmallVector<Expr *, 16> Vars;
12156 Vars.reserve(NumVars);
12157 for (
unsigned i = 0; i != NumVars; ++i)
12158 Vars.push_back(Record.readSubExpr());
12159 C->setVarRefs(Vars);
12161 for (
unsigned i = 0; i != NumVars; ++i)
12162 Vars.push_back(Record.readSubExpr());
12163 C->setPrivateCopies(Vars);
12166void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
12168 C->setLParenLoc(Record.readSourceLocation());
12169 unsigned NumVars =
C->varlist_size();
12170 SmallVector<Expr *, 16> Vars;
12171 Vars.reserve(NumVars);
12172 for (
unsigned i = 0; i != NumVars; ++i)
12173 Vars.push_back(Record.readSubExpr());
12174 C->setVarRefs(Vars);
12176 for (
unsigned i = 0; i != NumVars; ++i)
12177 Vars.push_back(Record.readSubExpr());
12178 C->setPrivateCopies(Vars);
12180 for (
unsigned i = 0; i != NumVars; ++i)
12181 Vars.push_back(Record.readSubExpr());
12185void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
12187 C->setLParenLoc(Record.readSourceLocation());
12189 C->setKindLoc(Record.readSourceLocation());
12190 C->setColonLoc(Record.readSourceLocation());
12191 unsigned NumVars =
C->varlist_size();
12192 SmallVector<Expr *, 16> Vars;
12193 Vars.reserve(NumVars);
12194 for (
unsigned i = 0; i != NumVars; ++i)
12195 Vars.push_back(Record.readSubExpr());
12196 C->setVarRefs(Vars);
12198 for (
unsigned i = 0; i != NumVars; ++i)
12199 Vars.push_back(Record.readSubExpr());
12200 C->setPrivateCopies(Vars);
12202 for (
unsigned i = 0; i != NumVars; ++i)
12203 Vars.push_back(Record.readSubExpr());
12204 C->setSourceExprs(Vars);
12206 for (
unsigned i = 0; i != NumVars; ++i)
12207 Vars.push_back(Record.readSubExpr());
12208 C->setDestinationExprs(Vars);
12210 for (
unsigned i = 0; i != NumVars; ++i)
12211 Vars.push_back(Record.readSubExpr());
12212 C->setAssignmentOps(Vars);
12215void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *
C) {
12216 C->setLParenLoc(Record.readSourceLocation());
12217 unsigned NumVars =
C->varlist_size();
12218 SmallVector<Expr *, 16> Vars;
12219 Vars.reserve(NumVars);
12220 for (
unsigned i = 0; i != NumVars; ++i)
12221 Vars.push_back(Record.readSubExpr());
12222 C->setVarRefs(Vars);
12225void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *
C) {
12227 C->setLParenLoc(Record.readSourceLocation());
12228 C->setModifierLoc(Record.readSourceLocation());
12229 C->setColonLoc(Record.readSourceLocation());
12230 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12231 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12232 C->setQualifierLoc(NNSL);
12233 C->setNameInfo(DNI);
12235 unsigned NumVars =
C->varlist_size();
12236 SmallVector<Expr *, 16> Vars;
12237 Vars.reserve(NumVars);
12238 for (
unsigned i = 0; i != NumVars; ++i)
12239 Vars.push_back(Record.readSubExpr());
12240 C->setVarRefs(Vars);
12242 for (
unsigned i = 0; i != NumVars; ++i)
12243 Vars.push_back(Record.readSubExpr());
12244 C->setPrivates(Vars);
12246 for (
unsigned i = 0; i != NumVars; ++i)
12247 Vars.push_back(Record.readSubExpr());
12248 C->setLHSExprs(Vars);
12250 for (
unsigned i = 0; i != NumVars; ++i)
12251 Vars.push_back(Record.readSubExpr());
12252 C->setRHSExprs(Vars);
12254 for (
unsigned i = 0; i != NumVars; ++i)
12255 Vars.push_back(Record.readSubExpr());
12256 C->setReductionOps(Vars);
12257 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12259 for (
unsigned i = 0; i != NumVars; ++i)
12260 Vars.push_back(Record.readSubExpr());
12261 C->setInscanCopyOps(Vars);
12263 for (
unsigned i = 0; i != NumVars; ++i)
12264 Vars.push_back(Record.readSubExpr());
12265 C->setInscanCopyArrayTemps(Vars);
12267 for (
unsigned i = 0; i != NumVars; ++i)
12268 Vars.push_back(Record.readSubExpr());
12269 C->setInscanCopyArrayElems(Vars);
12271 unsigned NumFlags = Record.readInt();
12272 SmallVector<bool, 16> Flags;
12273 Flags.reserve(NumFlags);
12274 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12275 Flags.push_back(Record.readInt());
12276 C->setPrivateVariableReductionFlags(Flags);
12279void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
12281 C->setLParenLoc(Record.readSourceLocation());
12282 C->setColonLoc(Record.readSourceLocation());
12283 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12284 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12285 C->setQualifierLoc(NNSL);
12286 C->setNameInfo(DNI);
12288 unsigned NumVars =
C->varlist_size();
12289 SmallVector<Expr *, 16> Vars;
12290 Vars.reserve(NumVars);
12291 for (
unsigned I = 0; I != NumVars; ++I)
12292 Vars.push_back(Record.readSubExpr());
12293 C->setVarRefs(Vars);
12295 for (
unsigned I = 0; I != NumVars; ++I)
12296 Vars.push_back(Record.readSubExpr());
12297 C->setPrivates(Vars);
12299 for (
unsigned I = 0; I != NumVars; ++I)
12300 Vars.push_back(Record.readSubExpr());
12301 C->setLHSExprs(Vars);
12303 for (
unsigned I = 0; I != NumVars; ++I)
12304 Vars.push_back(Record.readSubExpr());
12305 C->setRHSExprs(Vars);
12307 for (
unsigned I = 0; I != NumVars; ++I)
12308 Vars.push_back(Record.readSubExpr());
12309 C->setReductionOps(Vars);
12312void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *
C) {
12314 C->setLParenLoc(Record.readSourceLocation());
12315 C->setColonLoc(Record.readSourceLocation());
12316 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12317 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12318 C->setQualifierLoc(NNSL);
12319 C->setNameInfo(DNI);
12321 unsigned NumVars =
C->varlist_size();
12322 SmallVector<Expr *, 16> Vars;
12323 Vars.reserve(NumVars);
12324 for (
unsigned I = 0; I != NumVars; ++I)
12325 Vars.push_back(Record.readSubExpr());
12326 C->setVarRefs(Vars);
12328 for (
unsigned I = 0; I != NumVars; ++I)
12329 Vars.push_back(Record.readSubExpr());
12330 C->setPrivates(Vars);
12332 for (
unsigned I = 0; I != NumVars; ++I)
12333 Vars.push_back(Record.readSubExpr());
12334 C->setLHSExprs(Vars);
12336 for (
unsigned I = 0; I != NumVars; ++I)
12337 Vars.push_back(Record.readSubExpr());
12338 C->setRHSExprs(Vars);
12340 for (
unsigned I = 0; I != NumVars; ++I)
12341 Vars.push_back(Record.readSubExpr());
12342 C->setReductionOps(Vars);
12344 for (
unsigned I = 0; I != NumVars; ++I)
12345 Vars.push_back(Record.readSubExpr());
12346 C->setTaskgroupDescriptors(Vars);
12349void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *
C) {
12351 C->setLParenLoc(Record.readSourceLocation());
12352 C->setColonLoc(Record.readSourceLocation());
12354 C->setModifierLoc(Record.readSourceLocation());
12355 unsigned NumVars =
C->varlist_size();
12356 SmallVector<Expr *, 16> Vars;
12357 Vars.reserve(NumVars);
12358 for (
unsigned i = 0; i != NumVars; ++i)
12359 Vars.push_back(Record.readSubExpr());
12360 C->setVarRefs(Vars);
12362 for (
unsigned i = 0; i != NumVars; ++i)
12363 Vars.push_back(Record.readSubExpr());
12364 C->setPrivates(Vars);
12366 for (
unsigned i = 0; i != NumVars; ++i)
12367 Vars.push_back(Record.readSubExpr());
12370 for (
unsigned i = 0; i != NumVars; ++i)
12371 Vars.push_back(Record.readSubExpr());
12372 C->setUpdates(Vars);
12374 for (
unsigned i = 0; i != NumVars; ++i)
12375 Vars.push_back(Record.readSubExpr());
12376 C->setFinals(Vars);
12377 C->setStep(Record.readSubExpr());
12378 C->setCalcStep(Record.readSubExpr());
12380 for (
unsigned I = 0; I != NumVars + 1; ++I)
12381 Vars.push_back(Record.readSubExpr());
12382 C->setUsedExprs(Vars);
12385void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *
C) {
12386 C->setLParenLoc(Record.readSourceLocation());
12387 C->setColonLoc(Record.readSourceLocation());
12388 unsigned NumVars =
C->varlist_size();
12389 SmallVector<Expr *, 16> Vars;
12390 Vars.reserve(NumVars);
12391 for (
unsigned i = 0; i != NumVars; ++i)
12392 Vars.push_back(Record.readSubExpr());
12393 C->setVarRefs(Vars);
12394 C->setAlignment(Record.readSubExpr());
12397void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *
C) {
12398 C->setLParenLoc(Record.readSourceLocation());
12399 unsigned NumVars =
C->varlist_size();
12400 SmallVector<Expr *, 16> Exprs;
12401 Exprs.reserve(NumVars);
12402 for (
unsigned i = 0; i != NumVars; ++i)
12403 Exprs.push_back(Record.readSubExpr());
12404 C->setVarRefs(Exprs);
12406 for (
unsigned i = 0; i != NumVars; ++i)
12407 Exprs.push_back(Record.readSubExpr());
12408 C->setSourceExprs(Exprs);
12410 for (
unsigned i = 0; i != NumVars; ++i)
12411 Exprs.push_back(Record.readSubExpr());
12412 C->setDestinationExprs(Exprs);
12414 for (
unsigned i = 0; i != NumVars; ++i)
12415 Exprs.push_back(Record.readSubExpr());
12416 C->setAssignmentOps(Exprs);
12419void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
12420 C->setLParenLoc(Record.readSourceLocation());
12421 unsigned NumVars =
C->varlist_size();
12422 SmallVector<Expr *, 16> Exprs;
12423 Exprs.reserve(NumVars);
12424 for (
unsigned i = 0; i != NumVars; ++i)
12425 Exprs.push_back(Record.readSubExpr());
12426 C->setVarRefs(Exprs);
12428 for (
unsigned i = 0; i != NumVars; ++i)
12429 Exprs.push_back(Record.readSubExpr());
12430 C->setSourceExprs(Exprs);
12432 for (
unsigned i = 0; i != NumVars; ++i)
12433 Exprs.push_back(Record.readSubExpr());
12434 C->setDestinationExprs(Exprs);
12436 for (
unsigned i = 0; i != NumVars; ++i)
12437 Exprs.push_back(Record.readSubExpr());
12438 C->setAssignmentOps(Exprs);
12441void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *
C) {
12442 C->setLParenLoc(Record.readSourceLocation());
12443 unsigned NumVars =
C->varlist_size();
12444 SmallVector<Expr *, 16> Vars;
12445 Vars.reserve(NumVars);
12446 for (
unsigned i = 0; i != NumVars; ++i)
12447 Vars.push_back(Record.readSubExpr());
12448 C->setVarRefs(Vars);
12451void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *
C) {
12452 C->setDepobj(Record.readSubExpr());
12453 C->setLParenLoc(Record.readSourceLocation());
12456void OMPClauseReader::VisitOMPDependClause(OMPDependClause *
C) {
12457 C->setLParenLoc(Record.readSourceLocation());
12458 C->setModifier(Record.readSubExpr());
12459 C->setDependencyKind(
12461 C->setDependencyLoc(Record.readSourceLocation());
12462 C->setColonLoc(Record.readSourceLocation());
12463 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12464 unsigned NumVars =
C->varlist_size();
12465 SmallVector<Expr *, 16> Vars;
12466 Vars.reserve(NumVars);
12467 for (
unsigned I = 0; I != NumVars; ++I)
12468 Vars.push_back(Record.readSubExpr());
12469 C->setVarRefs(Vars);
12470 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12471 C->setLoopData(I, Record.readSubExpr());
12474void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *
C) {
12477 C->setDevice(Record.readSubExpr());
12478 C->setModifierLoc(Record.readSourceLocation());
12479 C->setLParenLoc(Record.readSourceLocation());
12482void OMPClauseReader::VisitOMPMapClause(OMPMapClause *
C) {
12483 C->setLParenLoc(Record.readSourceLocation());
12484 bool HasIteratorModifier =
false;
12486 C->setMapTypeModifier(
12488 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12489 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12490 HasIteratorModifier =
true;
12492 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12493 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12496 C->setMapLoc(Record.readSourceLocation());
12497 C->setColonLoc(Record.readSourceLocation());
12498 auto NumVars =
C->varlist_size();
12499 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12500 auto TotalLists =
C->getTotalComponentListNum();
12501 auto TotalComponents =
C->getTotalComponentsNum();
12503 SmallVector<Expr *, 16> Vars;
12504 Vars.reserve(NumVars);
12505 for (
unsigned i = 0; i != NumVars; ++i)
12506 Vars.push_back(Record.readExpr());
12507 C->setVarRefs(Vars);
12509 SmallVector<Expr *, 16> UDMappers;
12510 UDMappers.reserve(NumVars);
12511 for (
unsigned I = 0; I < NumVars; ++I)
12512 UDMappers.push_back(Record.readExpr());
12513 C->setUDMapperRefs(UDMappers);
12515 if (HasIteratorModifier)
12516 C->setIteratorModifier(Record.readExpr());
12518 SmallVector<ValueDecl *, 16> Decls;
12519 Decls.reserve(UniqueDecls);
12520 for (
unsigned i = 0; i < UniqueDecls; ++i)
12521 Decls.push_back(Record.readDeclAs<ValueDecl>());
12522 C->setUniqueDecls(Decls);
12524 SmallVector<unsigned, 16> ListsPerDecl;
12525 ListsPerDecl.reserve(UniqueDecls);
12526 for (
unsigned i = 0; i < UniqueDecls; ++i)
12527 ListsPerDecl.push_back(Record.readInt());
12528 C->setDeclNumLists(ListsPerDecl);
12530 SmallVector<unsigned, 32> ListSizes;
12531 ListSizes.reserve(TotalLists);
12532 for (
unsigned i = 0; i < TotalLists; ++i)
12533 ListSizes.push_back(Record.readInt());
12534 C->setComponentListSizes(ListSizes);
12536 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12537 Components.reserve(TotalComponents);
12538 for (
unsigned i = 0; i < TotalComponents; ++i) {
12539 Expr *AssociatedExprPr = Record.readExpr();
12540 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12541 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12544 C->setComponents(Components, ListSizes);
12550 C->setLParenLoc(Record.readSourceLocation());
12551 C->setColonLoc(Record.readSourceLocation());
12552 C->setAllocator(Record.readSubExpr());
12553 C->setAlignment(Record.readSubExpr());
12554 unsigned NumVars =
C->varlist_size();
12555 SmallVector<Expr *, 16> Vars;
12556 Vars.reserve(NumVars);
12557 for (
unsigned i = 0; i != NumVars; ++i)
12558 Vars.push_back(Record.readSubExpr());
12559 C->setVarRefs(Vars);
12562void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
12564 C->setLParenLoc(Record.readSourceLocation());
12565 unsigned NumVars =
C->varlist_size();
12566 SmallVector<Expr *, 16> Vars;
12567 Vars.reserve(NumVars);
12568 for (
unsigned I = 0; I != NumVars; ++I)
12569 Vars.push_back(Record.readSubExpr());
12570 C->setVarRefs(Vars);
12573void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
12575 C->setLParenLoc(Record.readSourceLocation());
12576 unsigned NumVars =
C->varlist_size();
12577 SmallVector<Expr *, 16> Vars;
12578 Vars.reserve(NumVars);
12579 for (
unsigned I = 0; I != NumVars; ++I)
12580 Vars.push_back(Record.readSubExpr());
12581 C->setVarRefs(Vars);
12584void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *
C) {
12586 C->setPriority(Record.readSubExpr());
12587 C->setLParenLoc(Record.readSourceLocation());
12590void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
12593 C->setGrainsize(Record.readSubExpr());
12594 C->setModifierLoc(Record.readSourceLocation());
12595 C->setLParenLoc(Record.readSourceLocation());
12598void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
12601 C->setNumTasks(Record.readSubExpr());
12602 C->setModifierLoc(Record.readSourceLocation());
12603 C->setLParenLoc(Record.readSourceLocation());
12606void OMPClauseReader::VisitOMPHintClause(OMPHintClause *
C) {
12607 C->setHint(Record.readSubExpr());
12608 C->setLParenLoc(Record.readSourceLocation());
12611void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
12613 C->setDistScheduleKind(
12615 C->setChunkSize(Record.readSubExpr());
12616 C->setLParenLoc(Record.readSourceLocation());
12617 C->setDistScheduleKindLoc(Record.readSourceLocation());
12618 C->setCommaLoc(Record.readSourceLocation());
12621void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
12622 C->setDefaultmapKind(
12624 C->setDefaultmapModifier(
12626 C->setLParenLoc(Record.readSourceLocation());
12627 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12628 C->setDefaultmapKindLoc(Record.readSourceLocation());
12631void OMPClauseReader::VisitOMPToClause(OMPToClause *
C) {
12632 C->setLParenLoc(Record.readSourceLocation());
12634 C->setMotionModifier(
12636 C->setMotionModifierLoc(I, Record.readSourceLocation());
12637 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12638 C->setIteratorModifier(Record.readExpr());
12640 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12641 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12642 C->setColonLoc(Record.readSourceLocation());
12643 auto NumVars =
C->varlist_size();
12644 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12645 auto TotalLists =
C->getTotalComponentListNum();
12646 auto TotalComponents =
C->getTotalComponentsNum();
12648 SmallVector<Expr *, 16> Vars;
12649 Vars.reserve(NumVars);
12650 for (
unsigned i = 0; i != NumVars; ++i)
12651 Vars.push_back(Record.readSubExpr());
12652 C->setVarRefs(Vars);
12654 SmallVector<Expr *, 16> UDMappers;
12655 UDMappers.reserve(NumVars);
12656 for (
unsigned I = 0; I < NumVars; ++I)
12657 UDMappers.push_back(Record.readSubExpr());
12658 C->setUDMapperRefs(UDMappers);
12660 SmallVector<ValueDecl *, 16> Decls;
12661 Decls.reserve(UniqueDecls);
12662 for (
unsigned i = 0; i < UniqueDecls; ++i)
12663 Decls.push_back(Record.readDeclAs<ValueDecl>());
12664 C->setUniqueDecls(Decls);
12666 SmallVector<unsigned, 16> ListsPerDecl;
12667 ListsPerDecl.reserve(UniqueDecls);
12668 for (
unsigned i = 0; i < UniqueDecls; ++i)
12669 ListsPerDecl.push_back(Record.readInt());
12670 C->setDeclNumLists(ListsPerDecl);
12672 SmallVector<unsigned, 32> ListSizes;
12673 ListSizes.reserve(TotalLists);
12674 for (
unsigned i = 0; i < TotalLists; ++i)
12675 ListSizes.push_back(Record.readInt());
12676 C->setComponentListSizes(ListSizes);
12678 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12679 Components.reserve(TotalComponents);
12680 for (
unsigned i = 0; i < TotalComponents; ++i) {
12681 Expr *AssociatedExprPr = Record.readSubExpr();
12682 bool IsNonContiguous = Record.readBool();
12683 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12684 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12686 C->setComponents(Components, ListSizes);
12689void OMPClauseReader::VisitOMPFromClause(OMPFromClause *
C) {
12690 C->setLParenLoc(Record.readSourceLocation());
12692 C->setMotionModifier(
12694 C->setMotionModifierLoc(I, Record.readSourceLocation());
12695 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12696 C->setIteratorModifier(Record.readExpr());
12698 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12699 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12700 C->setColonLoc(Record.readSourceLocation());
12701 auto NumVars =
C->varlist_size();
12702 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12703 auto TotalLists =
C->getTotalComponentListNum();
12704 auto TotalComponents =
C->getTotalComponentsNum();
12706 SmallVector<Expr *, 16> Vars;
12707 Vars.reserve(NumVars);
12708 for (
unsigned i = 0; i != NumVars; ++i)
12709 Vars.push_back(Record.readSubExpr());
12710 C->setVarRefs(Vars);
12712 SmallVector<Expr *, 16> UDMappers;
12713 UDMappers.reserve(NumVars);
12714 for (
unsigned I = 0; I < NumVars; ++I)
12715 UDMappers.push_back(Record.readSubExpr());
12716 C->setUDMapperRefs(UDMappers);
12718 SmallVector<ValueDecl *, 16> Decls;
12719 Decls.reserve(UniqueDecls);
12720 for (
unsigned i = 0; i < UniqueDecls; ++i)
12721 Decls.push_back(Record.readDeclAs<ValueDecl>());
12722 C->setUniqueDecls(Decls);
12724 SmallVector<unsigned, 16> ListsPerDecl;
12725 ListsPerDecl.reserve(UniqueDecls);
12726 for (
unsigned i = 0; i < UniqueDecls; ++i)
12727 ListsPerDecl.push_back(Record.readInt());
12728 C->setDeclNumLists(ListsPerDecl);
12730 SmallVector<unsigned, 32> ListSizes;
12731 ListSizes.reserve(TotalLists);
12732 for (
unsigned i = 0; i < TotalLists; ++i)
12733 ListSizes.push_back(Record.readInt());
12734 C->setComponentListSizes(ListSizes);
12736 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12737 Components.reserve(TotalComponents);
12738 for (
unsigned i = 0; i < TotalComponents; ++i) {
12739 Expr *AssociatedExprPr = Record.readSubExpr();
12740 bool IsNonContiguous = Record.readBool();
12741 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12742 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12744 C->setComponents(Components, ListSizes);
12747void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
12748 C->setLParenLoc(Record.readSourceLocation());
12750 C->setFallbackModifierLoc(Record.readSourceLocation());
12751 auto NumVars =
C->varlist_size();
12752 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12753 auto TotalLists =
C->getTotalComponentListNum();
12754 auto TotalComponents =
C->getTotalComponentsNum();
12756 SmallVector<Expr *, 16> Vars;
12757 Vars.reserve(NumVars);
12758 for (
unsigned i = 0; i != NumVars; ++i)
12759 Vars.push_back(Record.readSubExpr());
12760 C->setVarRefs(Vars);
12762 for (
unsigned i = 0; i != NumVars; ++i)
12763 Vars.push_back(Record.readSubExpr());
12764 C->setPrivateCopies(Vars);
12766 for (
unsigned i = 0; i != NumVars; ++i)
12767 Vars.push_back(Record.readSubExpr());
12770 SmallVector<ValueDecl *, 16> Decls;
12771 Decls.reserve(UniqueDecls);
12772 for (
unsigned i = 0; i < UniqueDecls; ++i)
12773 Decls.push_back(Record.readDeclAs<ValueDecl>());
12774 C->setUniqueDecls(Decls);
12776 SmallVector<unsigned, 16> ListsPerDecl;
12777 ListsPerDecl.reserve(UniqueDecls);
12778 for (
unsigned i = 0; i < UniqueDecls; ++i)
12779 ListsPerDecl.push_back(Record.readInt());
12780 C->setDeclNumLists(ListsPerDecl);
12782 SmallVector<unsigned, 32> ListSizes;
12783 ListSizes.reserve(TotalLists);
12784 for (
unsigned i = 0; i < TotalLists; ++i)
12785 ListSizes.push_back(Record.readInt());
12786 C->setComponentListSizes(ListSizes);
12788 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12789 Components.reserve(TotalComponents);
12790 for (
unsigned i = 0; i < TotalComponents; ++i) {
12791 auto *AssociatedExprPr = Record.readSubExpr();
12792 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12793 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12796 C->setComponents(Components, ListSizes);
12799void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
12800 C->setLParenLoc(Record.readSourceLocation());
12801 auto NumVars =
C->varlist_size();
12802 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12803 auto TotalLists =
C->getTotalComponentListNum();
12804 auto TotalComponents =
C->getTotalComponentsNum();
12806 SmallVector<Expr *, 16> Vars;
12807 Vars.reserve(NumVars);
12808 for (
unsigned i = 0; i != NumVars; ++i)
12809 Vars.push_back(Record.readSubExpr());
12810 C->setVarRefs(Vars);
12812 SmallVector<ValueDecl *, 16> Decls;
12813 Decls.reserve(UniqueDecls);
12814 for (
unsigned i = 0; i < UniqueDecls; ++i)
12815 Decls.push_back(Record.readDeclAs<ValueDecl>());
12816 C->setUniqueDecls(Decls);
12818 SmallVector<unsigned, 16> ListsPerDecl;
12819 ListsPerDecl.reserve(UniqueDecls);
12820 for (
unsigned i = 0; i < UniqueDecls; ++i)
12821 ListsPerDecl.push_back(Record.readInt());
12822 C->setDeclNumLists(ListsPerDecl);
12824 SmallVector<unsigned, 32> ListSizes;
12825 ListSizes.reserve(TotalLists);
12826 for (
unsigned i = 0; i < TotalLists; ++i)
12827 ListSizes.push_back(Record.readInt());
12828 C->setComponentListSizes(ListSizes);
12830 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12831 Components.reserve(TotalComponents);
12832 for (
unsigned i = 0; i < TotalComponents; ++i) {
12833 Expr *AssociatedExpr = Record.readSubExpr();
12834 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12835 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12838 C->setComponents(Components, ListSizes);
12841void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
12842 C->setLParenLoc(Record.readSourceLocation());
12843 auto NumVars =
C->varlist_size();
12844 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12845 auto TotalLists =
C->getTotalComponentListNum();
12846 auto TotalComponents =
C->getTotalComponentsNum();
12848 SmallVector<Expr *, 16> Vars;
12849 Vars.reserve(NumVars);
12850 for (
unsigned i = 0; i != NumVars; ++i)
12851 Vars.push_back(Record.readSubExpr());
12852 C->setVarRefs(Vars);
12855 SmallVector<ValueDecl *, 16> Decls;
12856 Decls.reserve(UniqueDecls);
12857 for (
unsigned i = 0; i < UniqueDecls; ++i)
12858 Decls.push_back(Record.readDeclAs<ValueDecl>());
12859 C->setUniqueDecls(Decls);
12861 SmallVector<unsigned, 16> ListsPerDecl;
12862 ListsPerDecl.reserve(UniqueDecls);
12863 for (
unsigned i = 0; i < UniqueDecls; ++i)
12864 ListsPerDecl.push_back(Record.readInt());
12865 C->setDeclNumLists(ListsPerDecl);
12867 SmallVector<unsigned, 32> ListSizes;
12868 ListSizes.reserve(TotalLists);
12869 for (
unsigned i = 0; i < TotalLists; ++i)
12870 ListSizes.push_back(Record.readInt());
12871 C->setComponentListSizes(ListSizes);
12873 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12874 Components.reserve(TotalComponents);
12875 for (
unsigned i = 0; i < TotalComponents; ++i) {
12876 Expr *AssociatedExpr = Record.readSubExpr();
12877 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12878 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12881 C->setComponents(Components, ListSizes);
12884void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
12885 C->setLParenLoc(Record.readSourceLocation());
12886 auto NumVars =
C->varlist_size();
12887 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12888 auto TotalLists =
C->getTotalComponentListNum();
12889 auto TotalComponents =
C->getTotalComponentsNum();
12891 SmallVector<Expr *, 16> Vars;
12892 Vars.reserve(NumVars);
12893 for (
unsigned I = 0; I != NumVars; ++I)
12894 Vars.push_back(Record.readSubExpr());
12895 C->setVarRefs(Vars);
12898 SmallVector<ValueDecl *, 16> Decls;
12899 Decls.reserve(UniqueDecls);
12900 for (
unsigned I = 0; I < UniqueDecls; ++I)
12901 Decls.push_back(Record.readDeclAs<ValueDecl>());
12902 C->setUniqueDecls(Decls);
12904 SmallVector<unsigned, 16> ListsPerDecl;
12905 ListsPerDecl.reserve(UniqueDecls);
12906 for (
unsigned I = 0; I < UniqueDecls; ++I)
12907 ListsPerDecl.push_back(Record.readInt());
12908 C->setDeclNumLists(ListsPerDecl);
12910 SmallVector<unsigned, 32> ListSizes;
12911 ListSizes.reserve(TotalLists);
12912 for (
unsigned i = 0; i < TotalLists; ++i)
12913 ListSizes.push_back(Record.readInt());
12914 C->setComponentListSizes(ListSizes);
12916 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12917 Components.reserve(TotalComponents);
12918 for (
unsigned I = 0; I < TotalComponents; ++I) {
12919 Expr *AssociatedExpr = Record.readSubExpr();
12920 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12921 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12924 C->setComponents(Components, ListSizes);
12927void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
12928 C->setLParenLoc(Record.readSourceLocation());
12929 unsigned NumVars =
C->varlist_size();
12930 SmallVector<Expr *, 16> Vars;
12931 Vars.reserve(NumVars);
12932 for (
unsigned i = 0; i != NumVars; ++i)
12933 Vars.push_back(Record.readSubExpr());
12934 C->setVarRefs(Vars);
12936 Vars.reserve(NumVars);
12937 for (
unsigned i = 0; i != NumVars; ++i)
12938 Vars.push_back(Record.readSubExpr());
12939 C->setPrivateRefs(Vars);
12942void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
12943 C->setLParenLoc(Record.readSourceLocation());
12944 unsigned NumVars =
C->varlist_size();
12945 SmallVector<Expr *, 16> Vars;
12946 Vars.reserve(NumVars);
12947 for (
unsigned i = 0; i != NumVars; ++i)
12948 Vars.push_back(Record.readSubExpr());
12949 C->setVarRefs(Vars);
12952void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
12953 C->setLParenLoc(Record.readSourceLocation());
12954 unsigned NumVars =
C->varlist_size();
12955 SmallVector<Expr *, 16> Vars;
12956 Vars.reserve(NumVars);
12957 for (
unsigned i = 0; i != NumVars; ++i)
12958 Vars.push_back(Record.readSubExpr());
12959 C->setVarRefs(Vars);
12962void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
12963 C->setLParenLoc(Record.readSourceLocation());
12964 unsigned NumOfAllocators =
C->getNumberOfAllocators();
12965 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
12966 Data.reserve(NumOfAllocators);
12967 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
12968 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
12971 D.
LParenLoc = Record.readSourceLocation();
12972 D.
RParenLoc = Record.readSourceLocation();
12974 C->setAllocatorsData(
Data);
12977void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *
C) {
12978 C->setLParenLoc(Record.readSourceLocation());
12979 C->setModifier(Record.readSubExpr());
12980 C->setColonLoc(Record.readSourceLocation());
12981 unsigned NumOfLocators =
C->varlist_size();
12982 SmallVector<Expr *, 4> Locators;
12983 Locators.reserve(NumOfLocators);
12984 for (
unsigned I = 0; I != NumOfLocators; ++I)
12985 Locators.push_back(Record.readSubExpr());
12986 C->setVarRefs(Locators);
12989void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *
C) {
12992 C->setLParenLoc(Record.readSourceLocation());
12993 C->setKindKwLoc(Record.readSourceLocation());
12994 C->setModifierKwLoc(Record.readSourceLocation());
12997void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *
C) {
12999 C->setThreadID(Record.readSubExpr());
13000 C->setLParenLoc(Record.readSourceLocation());
13003void OMPClauseReader::VisitOMPBindClause(OMPBindClause *
C) {
13005 C->setLParenLoc(Record.readSourceLocation());
13006 C->setBindKindLoc(Record.readSourceLocation());
13010 C->setAlignment(Record.readExpr());
13011 C->setLParenLoc(Record.readSourceLocation());
13014void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
13016 C->setSize(Record.readSubExpr());
13017 C->setLParenLoc(Record.readSourceLocation());
13020void OMPClauseReader::VisitOMPDynGroupprivateClause(
13021 OMPDynGroupprivateClause *
C) {
13023 C->setDynGroupprivateModifier(
13025 C->setDynGroupprivateFallbackModifier(
13027 C->setSize(Record.readSubExpr());
13028 C->setLParenLoc(Record.readSourceLocation());
13029 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13030 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13033void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
13034 C->setLParenLoc(Record.readSourceLocation());
13035 C->setDependenceType(
13037 C->setDependenceLoc(Record.readSourceLocation());
13038 C->setColonLoc(Record.readSourceLocation());
13039 unsigned NumVars =
C->varlist_size();
13040 SmallVector<Expr *, 16> Vars;
13041 Vars.reserve(NumVars);
13042 for (
unsigned I = 0; I != NumVars; ++I)
13043 Vars.push_back(Record.readSubExpr());
13044 C->setVarRefs(Vars);
13045 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
13046 C->setLoopData(I, Record.readSubExpr());
13049void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
13051 Record.readAttributes(Attrs);
13052 C->setAttrs(Attrs);
13053 C->setLocStart(Record.readSourceLocation());
13054 C->setLParenLoc(Record.readSourceLocation());
13055 C->setLocEnd(Record.readSourceLocation());
13058void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *
C) {}
13068 Selector.ScoreOrCondition =
nullptr;
13070 Selector.ScoreOrCondition = readExprRef();
13082 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13087 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
13089 Data->setClauses(Clauses);
13090 if (
Data->hasAssociatedStmt())
13092 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
13097 unsigned NumVars =
readInt();
13099 for (
unsigned I = 0; I < NumVars; ++I)
13105 unsigned NumExprs =
readInt();
13107 for (
unsigned I = 0; I < NumExprs; ++I)
13117 switch (ClauseKind) {
13132 bool isConditionExprClause =
readBool();
13133 if (isConditionExprClause) {
13138 unsigned NumVars =
readInt();
13140 for (
unsigned I = 0; I < NumVars; ++I)
13147 unsigned NumClauses =
readInt();
13149 for (
unsigned I = 0; I < NumClauses; ++I)
13183 for (
unsigned I = 0; I < VarList.size(); ++I) {
13186 RecipeList.push_back({Alloca});
13190 VarList, RecipeList, EndLoc);
13208 for (
unsigned I = 0; I < VarList.size(); ++I) {
13212 RecipeList.push_back({Recipe, RecipeTemp});
13216 VarList, RecipeList, EndLoc);
13267 LParenLoc, ModList, VarList, EndLoc);
13276 LParenLoc, ModList, VarList, EndLoc);
13285 LParenLoc, ModList, VarList, EndLoc);
13294 LParenLoc, ModList, VarList, EndLoc);
13300 AsyncExpr, EndLoc);
13308 DevNumExpr, QueuesLoc, QueueIdExprs,
13315 unsigned NumArchs =
readInt();
13317 for (
unsigned I = 0; I < NumArchs; ++I) {
13320 Archs.emplace_back(Loc, Ident);
13324 LParenLoc, Archs, EndLoc);
13332 for (
unsigned I = 0; I < VarList.size(); ++I) {
13336 3 *
sizeof(
int *));
13339 unsigned NumCombiners =
readInt();
13340 for (
unsigned I = 0; I < NumCombiners; ++I) {
13345 Combiners.push_back({LHS, RHS, Op});
13348 RecipeList.push_back({Recipe, Combiners});
13352 VarList, RecipeList, EndLoc);
13371 HasForce, LoopCount, EndLoc);
13375 unsigned NumClauses =
readInt();
13377 for (
unsigned I = 0; I < NumClauses; ++I)
13380 SizeExprs, EndLoc);
13384 unsigned NumExprs =
readInt();
13387 for (
unsigned I = 0; I < NumExprs; ++I) {
13393 GangKinds, Exprs, EndLoc);
13399 WorkerExpr, EndLoc);
13405 VectorExpr, EndLoc);
13417 LParenLoc, VarList, EndLoc);
13431 llvm_unreachable(
"Clause serialization not yet implemented");
13433 llvm_unreachable(
"Invalid Clause Kind");
13438 for (
unsigned I = 0; I < Clauses.size(); ++I)
13443 unsigned NumVars =
readInt();
13444 A->Clauses.resize(NumVars);
13451 llvm::FoldingSetNodeID ID;
13452 ID.AddString(PrimaryModuleName);
13453 return ID.computeStableHash();
13458 return std::nullopt;
13461 return std::nullopt;
13464 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 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)
static bool checkModuleCachePath(FileManager &FileMgr, StringRef ContextHash, StringRef ExistingSpecificModuleCachePath, StringRef ASTFilename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, const HeaderSearchOptions &ASTFileHSOpts)
Check that the specified and the existing module cache paths are equivalent.
Defines the clang::ASTSourceDescriptor class, which abstracts clang modules and precompiled header fi...
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines the Diagnostic-related interfaces.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
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)
static OMPAffinityClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N locator items.
static OMPAlignedClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
static OMPBindClause * CreateEmpty(const ASTContext &C)
Build an empty 'bind' clause.
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
void Visit(PTR(OMPClause) S)
static OMPCopyinClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
static OMPCopyprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'defaultmap' clause in the 'pragma omp ...' directive.
static OMPDependClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N variables.
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.
static OMPDoacrossClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N expressions.
This represents 'dyn_groupprivate' clause in 'pragma omp target ...' and 'pragma omp teams ....
static OMPExclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'filter' clause in the 'pragma omp ...' directive.
static OMPFlushClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
static OMPFromClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents 'grainsize' clause in the 'pragma omp ...' directive.
static OMPHasDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents 'hint' clause in the 'pragma omp ...' directive.
static OMPInclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
static OMPInitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N expressions.
static OMPIsDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPMapClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars original expressions, NumUniqueDeclarations declar...
This represents 'nocontext' clause in the 'pragma omp ...' directive.
This represents 'nogroup' clause in the 'pragma omp ...' directive.
static OMPNontemporalClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'novariants' clause in the 'pragma omp ...' directive.
This represents 'num_tasks' clause in the 'pragma omp ...' directive.
static OMPNumTeamsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'order' clause in the 'pragma omp ...' directive.
This represents 'priority' clause in the 'pragma omp ...' directive.
This represents 'simd' clause in the 'pragma omp ...' directive.
static OMPThreadLimitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'threads' clause in the 'pragma omp ...' directive.
static OMPToClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
This represents the 'use' clause in 'pragma omp ...' directives.
static OMPUseDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPUseDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPUsesAllocatorsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N allocators.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the 'pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the 'pragma omp target ...' directive.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
virtual void HandleInterestingDecl(DeclGroupRef D)
HandleInterestingDecl - Handle the specified interesting declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
const clang::PrintingPolicy & getPrintingPolicy() const
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
ASTIdentifierIterator(const ASTReader &Reader, bool SkipModules=false)
StringRef Next() override
Retrieve the next string in the identifier table and advances the iterator for the following string.
Abstract interface for callback invocations by the ASTReader.
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain)
Receives the header search options.
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
virtual void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported)
This is called for each AST file loaded.
virtual ~ASTReaderListener()
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
virtual void ReadModuleName(StringRef ModuleName)
virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value)
Receives COUNTER value.
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the codegen options.
Reads an AST files chain containing the contents of a translation unit.
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const
Retrieve the global submodule ID given a module and its local ID number.
ExtKind hasExternalDefinitions(const Decl *D) override
IdentifierTable & getIdentifierTable()
Retrieve the identifier table associated with the preprocessor.
ModuleManager & getModuleManager()
Retrieve the module manager.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx)
void ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector< Decl *, 4 > &Decls) override
Read the set of decls to be checked for deferred diags.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
@ ARR_VersionMismatch
The client can handle an AST file that cannot load because it was built with a different version of C...
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &Exprs) override
void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls) override
Get the decls that are contained in a file in the Offset/Length range.
std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record, unsigned &Idx, StringRef &Blob)
SourceRange ReadSkippedRange(unsigned Index) override
Read a preallocated skipped range from the external source.
serialization::TypeID getGlobalTypeID(ModuleFile &F, serialization::LocalTypeID LocalID) const
Map a local type ID within a given AST file into a global type ID.
void dump()
Dump information about the AST reader to standard error.
MacroInfo * ReadMacroRecord(ModuleFile &F, uint64_t Offset)
Reads the macro record located at the given offset.
SmallVector< std::pair< llvm::BitstreamCursor, serialization::ModuleFile * >, 8 > CommentsCursors
Cursors for comments blocks.
Selector getLocalSelector(ModuleFile &M, unsigned LocalID)
Retrieve a selector from the given module with its local ID number.
void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Decls) override
Read all of the declarations lexically stored in a declaration context.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
std::optional< ASTSourceDescriptor > getSourceDescriptor(unsigned ID) override
Return a descriptor for the corresponding module.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ReadExtnameUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, AsmLabelAttr * > > &ExtnameIDs) override
Read the set of pragma redefine_extname'd, undeclared identifiers known to the external Sema source.
void ClearSwitchCaseIDs()
void SetGloballyVisibleDecls(IdentifierInfo *II, const SmallVectorImpl< GlobalDeclID > &DeclIDs, SmallVectorImpl< Decl * > *Decls=nullptr)
Set the globally-visible declarations associated with the given identifier.
serialization::ModuleKind ModuleKind
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility, SourceLocation ImportLoc)
Make the entities in the given module and any of its (non-explicit) submodules visible to name lookup...
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a source range.
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
ASTReadResult ReadASTCore(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, ModuleFile *ImportedBy, SmallVectorImpl< ImportedModule > &Loaded, off_t ExpectedSize, time_t ExpectedModTime, ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities)
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
static std::string ResolveImportedPathAndAllocate(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx, StringRef &Blob)
CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
Read the contents of a CXXCtorInitializer array.
void visitInputFileInfos(serialization::ModuleFile &MF, bool IncludeSystem, llvm::function_ref< void(const serialization::InputFileInfo &IFI, bool IsSystem)> Visitor)
Visit all the input file infos of the given module file.
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo)
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs) override
Read the set of tentative definitions known to the external Sema source.
Decl * GetExternalDecl(GlobalDeclID ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
serialization::MacroID ReadMacroID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a macro ID from the given position in a record in the given module.
GlobalDeclID ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a declaration ID from the given position in a record in the given module.
llvm::Expected< SourceLocation::UIntTy > readSLocOffset(ModuleFile *F, unsigned Index)
Try to read the offset of the SLocEntry at the given index in the given module file.
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
friend class PCHValidator
friend class serialization::ReadMethodPoolVisitor
void CompleteRedeclChain(const Decl *D) override
If any redeclarations of D have been imported since it was last checked, this digs out those redeclar...
SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile, SourceLocation Loc) const
Translate a source location from another module file's source location space into ours.
static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID, uint64_t *StartOfBlockOffset=nullptr)
ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the specified cursor.
void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II)
std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range) override
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
IdentifierInfo * get(StringRef Name) override
Retrieve the IdentifierInfo for the named identifier.
IdentifierInfo * getLocalIdentifier(ModuleFile &M, uint64_t LocalID)
void visitInputFiles(serialization::ModuleFile &MF, bool IncludeSystem, bool Complain, llvm::function_ref< void(const serialization::InputFile &IF, bool isSystem)> Visitor)
Visit all the input files of the given module file.
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
llvm::iterator_range< ModuleDeclIterator > getModuleFileLevelDecls(ModuleFile &Mod)
Stmt * GetExternalDeclStmt(uint64_t Offset) override
Resolve the offset of a statement into a statement.
Selector GetExternalSelector(serialization::SelectorID ID) override
Resolve a selector ID into a selector.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
MacroInfo * getMacro(serialization::MacroID ID)
Retrieve the macro with the given ID.
void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined) override
Load the set of used but not defined functions or variables with internal linkage,...
void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls) override
Read the set of delegating constructors known to the external Sema source.
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
void addPendingMacro(IdentifierInfo *II, ModuleFile *M, uint32_t MacroDirectivesOffset)
Add a macro to deserialize its macro directive history.
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)
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.
static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts, const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, bool RequireStrictOptionMatches=false)
Determine whether the given AST file is acceptable to load into a translation unit with the given lan...
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
serialization::SelectorID getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const
Retrieve the global selector ID that corresponds to this the local selector ID in a given module.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
SmallVector< uint64_t, 64 > RecordData
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
serialization::MacroID getGlobalMacroID(ModuleFile &M, serialization::MacroID LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
FileManager & getFileManager() const
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
ASTReadResult ReadAST(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::ModuleFile ModuleFile
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, serialization::PreprocessedEntityID LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
void setKWLoc(SourceLocation Loc)
Attr - This represents one attribute.
void setAttr(const Attr *A)
void setConceptReference(ConceptReference *CR)
void setRParenLoc(SourceLocation Loc)
void setCaretLoc(SourceLocation Loc)
void setWrittenTypeSpec(TypeSpecifierType written)
bool needsExtraLocalData() const
void setModeAttr(bool written)
void setBuiltinLoc(SourceLocation Loc)
void setWrittenWidthSpec(TypeSpecifierWidth written)
void setWrittenSignSpec(TypeSpecifierSign written)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
void setSourceOrder(int Pos)
Set the source order of this initializer.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
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 ContextHash, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported) override
This is called for each AST file loaded.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A reference to a concept and its template args, as it appears in the code.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, 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::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
FileEntryRef getVirtualFileRef(StringRef Filename, off_t Size, time_t ModificationTime)
Retrieve a file entry for a "virtual" file that acts as if there were a file with the given name on d...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true, bool IsText=true)
Get a FileEntryRef if it exists, without doing anything on error.
OptionalDirectoryEntryRef getOptionalDirectoryRef(StringRef DirName, bool CacheFailure=true)
Get a DirectoryEntryRef if it exists, without doing anything on error.
Keeps track of options that affect how file operations are performed.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
Wrapper for source info for functions.
unsigned getNumParams() const
void setLocalRangeBegin(SourceLocation L)
void setLParenLoc(SourceLocation Loc)
void setParam(unsigned i, ParmVarDecl *VD)
void setRParenLoc(SourceLocation Loc)
void setLocalRangeEnd(SourceLocation L)
void setExceptionSpecRange(SourceRange R)
llvm::SmallPtrSet< ModuleFile *, 4 > HitSet
A set of module files in which we found a result.
static std::pair< GlobalModuleIndex *, llvm::Error > readIndex(llvm::StringRef Path)
Read a global index file for the given directory.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isCPlusPlusOperatorKeyword() const
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
bool isPoisoned() const
Return true if this token has been poisoned.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
tok::NotableIdentifierKind getNotableIdentifierID() const
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
void setObjCOrBuiltinID(unsigned ID)
void revertTokenIDToIdentifier()
Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2 compatibility.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
void * getFETokenInfo() const
Get and set FETokenInfo.
StringRef getName() const
Return the actual identifier string.
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
An iterator that walks over all of the known identifiers in the lookup table.
IdentifierIterator()=default
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
Implements an efficient mapping from strings to IdentifierInfo nodes.
llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename, off_t &Size, time_t &ModTime) const
Get a pointer to the PCM if it exists and set Size and ModTime to its on-disk size and modification t...
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
Represents a field injected from an anonymous union/struct into the parent scope.
Wrapper for source info for injected class names of class templates.
void setAmpLoc(SourceLocation Loc)
PragmaMSPointersToMembersKind
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
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.
Deduplication key for a loaded module file in ModuleManager.
Identifies a module file to be loaded.
bool empty() const
Checks whether the module file name is empty.
static ModuleFileName makeImplicit(std::string Name, unsigned SuffixLength)
Creates a file name for an implicit module.
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
StringRef str() const
Returns the plain module file name.
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella header of the given module to the given header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false, SourceLocation Loc=SourceLocation())
Adds this header to the given module.
OptionalFileEntryRef findUmbrellaHeaderForModule(Module *M, std::string NameAsWritten, SmallVectorImpl< char > &RelativePathName)
Find the FileEntry for an umbrella header in a module as if it was written in the module map as a hea...
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella directory of the given module to the given directory.
llvm::DenseSet< FileEntryRef > AdditionalModMapsSet
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
ModuleHeaderRole
Flags describing the role of a module header.
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.
const ModuleFileKey * getASTFileKey() const
The serialized AST file key for this module, if one was created.
SourceLocation DefinitionLoc
The location of the module definition.
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
ModuleKind Kind
The kind of this module.
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
bool isUnimportable() const
Determine whether this module has been declared unimportable.
void setASTFileNameAndKey(ModuleFileName NewName, ModuleFileKey NewKey)
Set the serialized module file for the top-level module of this module.
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
std::string Name
The name of this module.
const ModuleFileName * getASTFileName() const
The serialized AST file name for this module, if one was created.
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
OptionalDirectoryEntryRef Directory
The build directory of this module.
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.
std::vector< Conflict > Conflicts
The list of conflicts.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Represent a C++ namespace.
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
static std::string getOwningModuleNameForDiagnostic(const Decl *D)
Get the best name we know for the module that owns the given declaration, or an empty string if the d...
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'allocate' in the 'pragma omp ...' directives.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'allocator' clause in the 'pragma omp ...' directive.
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C)
OMPClauseReader(ASTRecordReader &Record)
void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C)
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This is a basic class for representing single OpenMP clause.
This represents 'collapse' clause in the 'pragma omp ...' directive.
This represents the 'counts' clause in the 'pragma omp split' directive.
static OMPCountsClause * CreateEmpty(const ASTContext &C, unsigned NumCounts)
Build an empty 'counts' AST node for deserialization.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents 'final' clause in the 'pragma omp ...' directive.
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 'if' clause in the 'pragma omp ...' directive.
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 'num_threads' clause in the 'pragma omp ...' directive.
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 'safelen' clause in the 'pragma omp ...' directive.
This represents 'simdlen' clause in the 'pragma omp ...' directive.
This represents the 'sizes' clause in the 'pragma omp tile' directive.
static OMPSizesClause * CreateEmpty(const ASTContext &C, unsigned NumSizes)
Build an empty 'sizes' AST node for deserialization.
This represents 'threadset' clause in the 'pragma omp task ...' directive.
method_range methods() const
void setNameLoc(SourceLocation Loc)
void setNameEndLoc(SourceLocation Loc)
ObjCMethodDecl - Represents an instance or class method declaration.
bool hasBody() const override
Determine whether this method has a body.
void setLazyBody(uint64_t Offset)
void setStarLoc(SourceLocation Loc)
void setTypeArgsRAngleLoc(SourceLocation Loc)
unsigned getNumTypeArgs() const
unsigned getNumProtocols() const
void setTypeArgsLAngleLoc(SourceLocation Loc)
void setTypeArgTInfo(unsigned i, TypeSourceInfo *TInfo)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
void setHasBaseTypeAsWritten(bool HasBaseType)
void setProtocolLoc(unsigned i, SourceLocation Loc)
Kind
The basic Objective-C runtimes that we know about.
unsigned getNumProtocols() const
void setProtocolLoc(unsigned i, SourceLocation Loc)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
static OpenACCAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCAttachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCAutoClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
This is the base type for all OpenACC Clauses.
static OpenACCCollapseClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, bool HasForce, Expr *LoopCount, SourceLocation EndLoc)
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDefaultAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDefaultClause * Create(const ASTContext &C, OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static OpenACCDeleteClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDetachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceNumClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCFinalizeClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCFirstPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCFirstPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCGangClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< OpenACCGangKind > GangKinds, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCHostClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCIfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCIfPresentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCIndependentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoCreateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCNumGangsClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCNumWorkersClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCReductionClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCReductionOperator Operator, ArrayRef< Expr * > VarList, ArrayRef< OpenACCReductionRecipeWithStorage > Recipes, SourceLocation EndLoc)
static OpenACCSelfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCTileClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > SizeExprs, SourceLocation EndLoc)
static OpenACCUseDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCVectorLengthClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWaitClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef< Expr * > QueueIdExprs, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
void setAttrLoc(SourceLocation loc)
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void setEllipsisLoc(SourceLocation Loc)
void setEllipsisLoc(SourceLocation Loc)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
Represents a parameter to a function.
void setKWLoc(SourceLocation Loc)
void setStarLoc(SourceLocation Loc)
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
std::string PCHThroughHeader
If non-empty, the filename used in an include directive in the primary source file (or command-line p...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool AllowPCHWithDifferentModulesCachePath
When true, a PCH with modules cache path different to the current compilation will not be rejected.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
HeaderSearch & getHeaderSearchInfo() const
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
@ FastWidth
The width of the "fast" qualifier mask.
@ FastMask
The fast qualifier mask.
void setAmpAmpLoc(SourceLocation Loc)
Wrapper for source info for record types.
Declaration of a redeclarable template.
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.
@ Missing
The module file is missing.
@ OutOfDate
The module file is out-of-date.
@ NewlyLoaded
The module file was just loaded in response to this call.
@ None
State at construction.
@ AlreadyLoaded
The module file had already been loaded.
Source location and bit offset of a declaration.
A key used when looking up entities by DeclarationName.
unsigned getHash() const
Compute a fingerprint of this key for use in on-disk hash table.
DeclarationNameKey()=default
Information about a module that has been loaded by the ASTReader.
const PPEntityOffset * PreprocessedEntityOffsets
void * IdentifierLookupTable
A pointer to an on-disk hash table of opaque type IdentifierHashTable.
void * SelectorLookupTable
A pointer to an on-disk hash table of opaque type ASTSelectorLookupTable.
std::vector< std::unique_ptr< ModuleFileExtensionReader > > ExtensionReaders
The list of extension readers that are attached to this module file.
SourceLocation DirectImportLoc
The source location where the module was explicitly or implicitly imported in the local translation u...
StringRef Data
The serialized bitstream data for this file.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
int SLocEntryBaseID
The base ID in the source manager's view of this module.
ModuleFileKey FileKey
The key ModuleManager used for the module file.
serialization::IdentifierID BaseIdentifierID
Base identifier ID for identifiers local to this module.
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
const 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.
time_t ModTime
Modification of the module file.
std::string ActualOriginalSourceFileName
The actual original source file name that was used to build this AST file.
uint64_t PreprocessorDetailStartOffset
The offset of the start of the preprocessor detail cursor.
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
unsigned LocalNumSubmodules
The number of submodules in this module.
SourceLocation FirstLoc
The first source location in this module.
ASTFileSignature ASTBlockHash
The signature of the AST block of the module file, this can be used to unique module files based on A...
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
std::string OriginalSourceFileName
The original source file name that was used to build the primary AST file, which may have been modifi...
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
bool HasTimestamps
Whether timestamps are included in this module file.
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
unsigned NumPreprocessedEntities
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
unsigned NumFileSortedDecls
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
unsigned Index
The index of this module in the list of modules.
unsigned NumUserInputFiles
llvm::BitstreamCursor Stream
The main bitstream cursor for the main block.
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
uint64_t SizeInBits
The size of this file, in bits.
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
bool StandardCXXModule
Whether this module file is a standard C++ module.
unsigned LocalNumTypes
The number of types in this AST file.
StringRef ModuleOffsetMap
The module offset map data for this file.
const PPSkippedRange * PreprocessedSkippedRangeOffsets
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
bool isDirectlyImported() const
Determine whether this module was directly imported at any point during translation.
std::string ModuleMapPath
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
unsigned LocalNumMacros
The number of macros in this AST file.
unsigned NumPreprocessedSkippedRanges
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
InputFilesValidation InputFilesValidationStatus
Captures the high-level result of validating input files.
unsigned Generation
The generation of which this module file is a part.
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
ModuleFileName FileName
The file name of the module file.
ContinuousRangeMap< uint32_t, int, 2 > SubmoduleRemap
Remapping table for submodule IDs in this module.
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
unsigned LocalNumSelectors
The number of selectors new to this file.
ModuleKind Kind
The type of this module.
std::string ModuleName
The name of the module.
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
std::string BaseDirectory
The base directory of the module.
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Manages the set of modules loaded by an AST reader.
llvm::iterator_range< SmallVectorImpl< ModuleFile * >::const_iterator > pch_modules() const
A range covering the PCH and preamble module files loaded.
ModuleReverseIterator rbegin()
Reverse iterator to traverse all loaded modules.
unsigned size() const
Number of modules loaded.
Source range/offset of a preprocessed entity.
uint32_t getOffset() const
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
Source range of a skipped preprocessor region.
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
unsigned getFactoryBits() const
ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, unsigned PriorGeneration)
ArrayRef< ObjCMethodDecl * > getInstanceMethods() const
Retrieve the instance methods found by this visitor.
ArrayRef< ObjCMethodDecl * > getFactoryMethods() const
Retrieve the instance methods found by this visitor.
bool instanceHasMoreThanOneDecl() const
bool operator()(ModuleFile &M)
bool factoryHasMoreThanOneDecl() const
unsigned getInstanceBits() const
static TypeIdx fromTypeID(TypeID ID)
32 aligned uint64_t in the AST file.
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
void ReadDataIntoImpl(const unsigned char *d, unsigned DataLen, data_type_builder &Val)
file_type ReadFileRef(const unsigned char *&d)
DeclarationNameKey ReadKeyBase(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
DeclarationNameKey internal_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(const internal_key_type &a)
StringRef internal_key_type
static internal_key_type ReadKey(const unsigned char *d, unsigned n)
Class that performs lookup for an identifier stored in an AST file.
IdentifierID ReadIdentifierID(const unsigned char *d)
data_type ReadData(const internal_key_type &k, const unsigned char *d, unsigned DataLen)
Class that performs lookup for a selector's entries in the global method pool stored in an AST file.
internal_key_type ReadKey(const unsigned char *d, unsigned)
data_type ReadData(Selector, const unsigned char *d, unsigned DataLen)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(Selector Sel)
external_key_type internal_key_type
Class that performs lookup to specialized decls.
file_type ReadFileRef(const unsigned char *&d)
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
unsigned internal_key_type
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
std::pair< DeclarationName, const Module * > external_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
std::pair< DeclarationNameKey, unsigned > internal_key_type
internal_key_type ReadKey(const unsigned char *d, unsigned)
static hash_value_type ComputeHash(const internal_key_type &Key)
static internal_key_type GetInternalKey(const external_key_type &Key)
PredefinedTypeIDs
Predefined type IDs.
CtorInitializerType
The different kinds of data that can occur in a CtorInitializer.
const unsigned NUM_PREDEF_TYPE_IDS
The number of predefined type IDs that are reserved for the PREDEF_TYPE_* constants.
const unsigned NumSpecialTypeIDs
The number of special type IDs.
TypeCode
Record codes for each kind of type.
@ PREDEF_TYPE_LONG_ACCUM_ID
The 'long _Accum' type.
@ PREDEF_TYPE_SAMPLER_ID
OpenCL sampler type.
@ PREDEF_TYPE_INT128_ID
The '__int128_t' type.
@ PREDEF_TYPE_CHAR32_ID
The C++ 'char32_t' type.
@ PREDEF_TYPE_SAT_SHORT_ACCUM_ID
The '_Sat short _Accum' type.
@ PREDEF_TYPE_IBM128_ID
The '__ibm128' type.
@ PREDEF_TYPE_SHORT_FRACT_ID
The 'short _Fract' type.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_BOUND_MEMBER
The placeholder type for bound member functions.
@ PREDEF_TYPE_LONGLONG_ID
The (signed) 'long long' type.
@ PREDEF_TYPE_FRACT_ID
The '_Fract' type.
@ PREDEF_TYPE_ARC_UNBRIDGED_CAST
ARC's unbridged-cast placeholder type.
@ PREDEF_TYPE_USHORT_FRACT_ID
The 'unsigned short _Fract' type.
@ PREDEF_TYPE_SAT_ULONG_FRACT_ID
The '_Sat unsigned long _Fract' type.
@ PREDEF_TYPE_BOOL_ID
The 'bool' or '_Bool' type.
@ PREDEF_TYPE_SAT_LONG_ACCUM_ID
The '_Sat long _Accum' type.
@ PREDEF_TYPE_SAT_LONG_FRACT_ID
The '_Sat long _Fract' type.
@ PREDEF_TYPE_SAT_SHORT_FRACT_ID
The '_Sat short _Fract' type.
@ PREDEF_TYPE_CHAR_U_ID
The 'char' type, when it is unsigned.
@ PREDEF_TYPE_RESERVE_ID_ID
OpenCL reserve_id type.
@ PREDEF_TYPE_SAT_ACCUM_ID
The '_Sat _Accum' type.
@ PREDEF_TYPE_BUILTIN_FN
The placeholder type for builtin functions.
@ PREDEF_TYPE_SHORT_ACCUM_ID
The 'short _Accum' type.
@ PREDEF_TYPE_FLOAT_ID
The 'float' type.
@ PREDEF_TYPE_QUEUE_ID
OpenCL queue type.
@ PREDEF_TYPE_INT_ID
The (signed) 'int' type.
@ PREDEF_TYPE_OBJC_SEL
The ObjC 'SEL' type.
@ PREDEF_TYPE_BFLOAT16_ID
The '__bf16' type.
@ PREDEF_TYPE_WCHAR_ID
The C++ 'wchar_t' type.
@ PREDEF_TYPE_UCHAR_ID
The 'unsigned char' type.
@ PREDEF_TYPE_UACCUM_ID
The 'unsigned _Accum' type.
@ PREDEF_TYPE_SCHAR_ID
The 'signed char' type.
@ PREDEF_TYPE_CHAR_S_ID
The 'char' type, when it is signed.
@ PREDEF_TYPE_NULLPTR_ID
The type of 'nullptr'.
@ PREDEF_TYPE_ULONG_FRACT_ID
The 'unsigned long _Fract' type.
@ PREDEF_TYPE_FLOAT16_ID
The '_Float16' type.
@ PREDEF_TYPE_UINT_ID
The 'unsigned int' type.
@ PREDEF_TYPE_FLOAT128_ID
The '__float128' type.
@ PREDEF_TYPE_OBJC_ID
The ObjC 'id' type.
@ PREDEF_TYPE_CHAR16_ID
The C++ 'char16_t' type.
@ PREDEF_TYPE_ARRAY_SECTION
The placeholder type for an array section.
@ PREDEF_TYPE_ULONGLONG_ID
The 'unsigned long long' type.
@ PREDEF_TYPE_SAT_UFRACT_ID
The '_Sat unsigned _Fract' type.
@ PREDEF_TYPE_USHORT_ID
The 'unsigned short' type.
@ PREDEF_TYPE_SHORT_ID
The (signed) 'short' type.
@ PREDEF_TYPE_OMP_ARRAY_SHAPING
The placeholder type for OpenMP array shaping operation.
@ PREDEF_TYPE_DEPENDENT_ID
The placeholder type for dependent types.
@ PREDEF_TYPE_LONGDOUBLE_ID
The 'long double' type.
@ PREDEF_TYPE_DOUBLE_ID
The 'double' type.
@ PREDEF_TYPE_UINT128_ID
The '__uint128_t' type.
@ PREDEF_TYPE_HALF_ID
The OpenCL 'half' / ARM NEON __fp16 type.
@ PREDEF_TYPE_VOID_ID
The void type.
@ PREDEF_TYPE_SAT_USHORT_FRACT_ID
The '_Sat unsigned short _Fract' type.
@ PREDEF_TYPE_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.
@ SkippedInBuildSession
When the validation is skipped because it was already done in the current build session.
@ AllFiles
When the validation is done both for user files and system files.
@ Disabled
When the validation is disabled. For example, for a precompiled header.
@ UserFiles
When the validation is done only for user files as an optimization.
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
OptionsRecordTypes
Record types that occur within the options block inside the control block.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ CODEGEN_OPTIONS
Record code for the codegen options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
CommentRecordTypes
Record types used within a comments block.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
@ SM_SLOC_FILE_ENTRY
Describes a source location entry (SLocEntry) for a file.
@ SM_SLOC_BUFFER_BLOB_COMPRESSED
Describes a zlib-compressed blob that contains the data for a buffer entry.
@ SM_SLOC_BUFFER_ENTRY
Describes a source location entry (SLocEntry) for a buffer.
@ SM_SLOC_BUFFER_BLOB
Describes a blob that contains the data for a buffer entry.
@ SM_SLOC_EXPANSION_ENTRY
Describes a source location entry (SLocEntry) for a macro expansion.
const unsigned int NUM_PREDEF_SELECTOR_IDS
The number of predefined selector IDs.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
uint64_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
PreprocessorRecordTypes
Record types used within a preprocessor block.
@ PP_TOKEN
Describes one token.
@ PP_MACRO_FUNCTION_LIKE
A function-like macro definition.
@ PP_MACRO_OBJECT_LIKE
An object-like macro definition.
@ PP_MACRO_DIRECTIVE_HISTORY
The macro directives history for a particular identifier.
@ PP_MODULE_MACRO
A macro directive exported by a module.
ControlRecordTypes
Record types that occur within the control block.
@ MODULE_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.
@ EXTNAME_UNDECLARED_IDENTIFIERS
Record code for extname-redefined undeclared identifiers.
@ RELATED_DECLS_MAP
Record code for related declarations that have to be deserialized together from the same module.
@ UPDATE_VISIBLE
Record code for an update to a decl context's lookup table.
@ CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH
Number of unmatched pragma clang cuda_force_host_device begin directives we've seen.
@ MACRO_OFFSET
Record code for the table of offsets of each macro ID.
@ PPD_ENTITIES_OFFSETS
Record code for the table of offsets to entries in the preprocessing record.
@ RISCV_VECTOR_INTRINSICS_PRAGMA
Record code for pragma clang riscv intrinsic vector.
@ VTABLES_TO_EMIT
Record code for vtables to emit.
@ UPDATE_MODULE_LOCAL_VISIBLE
@ IDENTIFIER_OFFSET
Record code for the table of offsets of each identifier ID.
@ OBJC_CATEGORIES
Record code for the array of Objective-C categories (including extensions).
@ METHOD_POOL
Record code for the Objective-C method pool,.
@ DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD
Record code for lexical and visible block for delayed namespace in reduced BMI.
@ PP_CONDITIONAL_STACK
The stack of open ifs/ifdefs recorded in a preamble.
@ REFERENCED_SELECTOR_POOL
Record code for referenced selector pool.
@ SOURCE_LOCATION_OFFSETS
Record code for the table of offsets into the block of source-location information.
@ WEAK_UNDECLARED_IDENTIFIERS
Record code for weak undeclared identifiers.
@ UNDEFINED_BUT_USED
Record code for undefined but used functions and variables that need a definition in this TU.
@ FILE_SORTED_DECLS
Record code for a file sorted array of DeclIDs in a module.
@ MSSTRUCT_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
@ TENTATIVE_DEFINITIONS
Record code for the array of tentative definitions.
@ UPDATE_TU_LOCAL_VISIBLE
@ UNUSED_FILESCOPED_DECLS
Record code for the array of unused file scoped decls.
@ ALIGN_PACK_PRAGMA_OPTIONS
Record code for #pragma align/pack options.
@ IMPORTED_MODULES
Record code for an array of all of the (sub)modules that were imported by the AST file.
@ SELECTOR_OFFSETS
Record code for the table of offsets into the Objective-C method pool.
@ UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES
Record code for potentially unused local typedef names.
@ EAGERLY_DESERIALIZED_DECLS
Record code for the array of eagerly deserialized decls.
@ INTERESTING_IDENTIFIERS
A list of "interesting" identifiers.
@ HEADER_SEARCH_TABLE
Record code for header search information.
@ OBJC_CATEGORIES_MAP
Record code for map of Objective-C class definition IDs to the ObjC categories in a module that are a...
@ CUDA_SPECIAL_DECL_REFS
Record code for special CUDA declarations.
@ TU_UPDATE_LEXICAL
Record code for an update to the TU's lexically contained declarations.
@ PPD_SKIPPED_RANGES
A table of skipped ranges within the preprocessing record.
@ IDENTIFIER_TABLE
Record code for the identifier table.
@ SEMA_DECL_REFS
Record code for declarations that Sema keeps references of.
@ OPTIMIZE_PRAGMA_OPTIONS
Record code for #pragma optimize options.
@ MODULE_OFFSET_MAP
Record code for the remapping information used to relate loaded modules to the various offsets and ID...
@ POINTERS_TO_MEMBERS_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
unsigned ComputeHash(Selector Sel)
TypeID LocalTypeID
Same with TypeID except that the LocalTypeID is only meaningful with the corresponding ModuleFile.
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
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.
OptionalUnsigned< unsigned > UnsignedOrNone
std::string createSpecificModuleCachePath(FileManager &FileMgr, StringRef ModuleCachePath, bool DisableModuleHash, std::string ContextHash)
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ Template
We are parsing a template declaration.
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
OpenMPUseDevicePtrFallbackModifier
OpenMP 6.1 use_device_ptr fallback modifier.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
TypeSpecifierWidth
Specifies the width of a type, e.g., short, long, or long long.
OpenMPMotionModifierKind
OpenMP modifier kind for 'to' or 'from' clause.
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
TypeSpecifierSign
Specifies the signedness of a type, e.g., signed or unsigned.
OpenMPDynGroupprivateClauseModifier
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
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponents
Total number of expression components.
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumVars
Number of expressions listed.
unsigned NumComponentLists
Number of component lists.
Expr * AllocatorTraits
Allocator traits.
Expr * Allocator
Allocator.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
The signature of a module, which is a hash of the AST content.
static constexpr size_t size
static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)
static ASTFileSignature createDummy()
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setInfo(const DeclarationNameLoc &Info)
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
A simple structure that captures a vtable use for the purposes of the ExternalSemaSource.
ExceptionSpecInfo ExceptionSpec
static LineEntry get(unsigned Offs, unsigned Line, int Filename, SrcMgr::CharacteristicKind FileKind, unsigned IncludeOffset)
A conflict between two modules.
Module * Other
The module that this module conflicts with.
std::string Message
The message provided to the user when there is a conflict.
a linked list of methods with the same selector name but different signatures.
ObjCMethodList * getNext() const
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
NestedNameSpecifierLoc QualifierLoc
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
SanitizerMask Mask
Bitmask of enabled sanitizers.
Helper class that saves the current stream position and then restores it when destroyed.
PragmaMsStackAction Action
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Location information for a TemplateArgument.
Describes a single change detected in a module file or input file.
Describes the categories of an Objective-C class.
void insert(GlobalDeclID ID)
MultiOnDiskHashTable< LazySpecializationInfoLookupTrait > Table
void insert(LazySpecializationInfo Info)