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);
281 bool CurrentValue, StringRef ModuleFilename) {
284 return Diags->
Report(diag::err_ast_file_langopt_mismatch)
285 << Description << SerializedValue << CurrentValue << ModuleFilename;
292 return Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
293 << Description << ModuleFilename;
306 StringRef ModuleFilename,
308 bool AllowCompatibleDifferences =
true) {
312#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
313 if constexpr (CK::Compatibility != CK::Benign) { \
314 if ((CK::Compatibility == CK::NotCompatible) || \
315 (CK::Compatibility == CK::Compatible && \
316 !AllowCompatibleDifferences)) { \
317 if (ExistingLangOpts.Name != LangOpts.Name) { \
319 return diagnoseLanguageOptionFlagMismatch( \
320 Diags, Description, LangOpts.Name, ExistingLangOpts.Name, \
322 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
328#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description) \
329 if constexpr (CK::Compatibility != CK::Benign) { \
330 if ((CK::Compatibility == CK::NotCompatible) || \
331 (CK::Compatibility == CK::Compatible && \
332 !AllowCompatibleDifferences)) { \
333 if (ExistingLangOpts.Name != LangOpts.Name) { \
334 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
340#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
341 if constexpr (CK::Compatibility != CK::Benign) { \
342 if ((CK::Compatibility == CK::NotCompatible) || \
343 (CK::Compatibility == CK::Compatible && \
344 !AllowCompatibleDifferences)) { \
345 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \
346 return diagnoseLanguageOptionValueMismatch(Diags, Description, \
352#include "clang/Basic/LangOptions.def"
361 Diags,
"target Objective-C runtime", ModuleFilename);
374 if (!AllowCompatibleDifferences) {
378 ExistingSanitizers.
clear(ModularSanitizers);
379 ImportedSanitizers.
clear(ModularSanitizers);
380 if (ExistingSanitizers.
Mask != ImportedSanitizers.
Mask) {
381 const std::string Flag =
"-fsanitize=";
383#define SANITIZER(NAME, ID) \
385 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \
386 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \
387 if (InExistingModule != InImportedModule) \
388 Diags->Report(diag::err_ast_file_targetopt_feature_mismatch) \
389 << InExistingModule << ModuleFilename << (Flag + NAME); \
391#include "clang/Basic/Sanitizers.def"
402 StringRef ModuleFilename,
404 bool AllowCompatibleDifferences =
true) {
408#define CODEGENOPT(Name, Bits, Default, Compatibility) \
409 if constexpr (CK::Compatibility != CK::Benign) { \
410 if ((CK::Compatibility == CK::NotCompatible) || \
411 (CK::Compatibility == CK::Compatible && \
412 !AllowCompatibleDifferences)) { \
413 if (ExistingCGOpts.Name != CGOpts.Name) { \
416 Diags->Report(diag::err_ast_file_codegenopt_mismatch) \
417 << #Name << CGOpts.Name << ExistingCGOpts.Name \
420 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
421 << #Name << ModuleFilename; \
428#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility) \
429 if constexpr (CK::Compatibility != CK::Benign) { \
430 if ((CK::Compatibility == CK::NotCompatible) || \
431 (CK::Compatibility == CK::Compatible && \
432 !AllowCompatibleDifferences)) { \
433 if (ExistingCGOpts.Name != CGOpts.Name) { \
435 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
436 << #Name << ModuleFilename; \
441#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
442 if constexpr (CK::Compatibility != CK::Benign) { \
443 if ((CK::Compatibility == CK::NotCompatible) || \
444 (CK::Compatibility == CK::Compatible && \
445 !AllowCompatibleDifferences)) { \
446 if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) { \
448 Diags->Report(diag::err_ast_file_codegenopt_value_mismatch) \
449 << #Name << ModuleFilename; \
454#define DEBUGOPT(Name, Bits, Default, Compatibility)
455#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
456#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
457#include "clang/Basic/CodeGenOptions.def"
462static std::vector<std::string>
464 llvm::erase_if(FeaturesAsWritten, [](
const std::string &S) {
465 return S.empty() || (S[0] !=
'+' && S[0] !=
'-');
467 llvm::stable_sort(FeaturesAsWritten,
468 [](
const std::string &A,
const std::string &B) {
469 return A.substr(1) < B.substr(1);
472 std::unique(FeaturesAsWritten.rbegin(), FeaturesAsWritten.rend(),
473 [](
const std::string &A,
const std::string &B) {
474 return A.substr(1) == B.substr(1);
478 FeaturesAsWritten.erase(FeaturesAsWritten.begin(), NewRend.base());
479 return FeaturesAsWritten;
490 StringRef ModuleFilename,
492 bool AllowCompatibleDifferences =
true) {
493#define CHECK_TARGET_OPT(Field, Name) \
494 if (TargetOpts.Field != ExistingTargetOpts.Field) { \
496 Diags->Report(diag::err_ast_file_targetopt_mismatch) \
497 << ModuleFilename << Name << TargetOpts.Field \
498 << ExistingTargetOpts.Field; \
509 if (!AllowCompatibleDifferences) {
514#undef CHECK_TARGET_OPT
519 std::vector<std::string> ExistingFeatures =
521 std::vector<std::string> ReadFeatures =
528 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
529 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
530 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
531 ExistingFeatures.begin(), ExistingFeatures.end(),
532 std::back_inserter(UnmatchedReadFeatures));
536 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
540 for (StringRef
Feature : UnmatchedReadFeatures)
541 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
542 <<
false << ModuleFilename <<
Feature;
543 for (StringRef
Feature : UnmatchedExistingFeatures)
544 Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
545 <<
true << ModuleFilename <<
Feature;
548 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
552 StringRef ModuleFilename,
bool Complain,
553 bool AllowCompatibleDifferences) {
554 const LangOptions &ExistingLangOpts = PP.getLangOpts();
556 Complain ? &Reader.Diags :
nullptr,
557 AllowCompatibleDifferences);
561 StringRef ModuleFilename,
bool Complain,
562 bool AllowCompatibleDifferences) {
565 Complain ? &Reader.Diags :
nullptr,
566 AllowCompatibleDifferences);
570 StringRef ModuleFilename,
bool Complain,
571 bool AllowCompatibleDifferences) {
572 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
574 Complain ? &Reader.Diags :
nullptr,
575 AllowCompatibleDifferences);
580using MacroDefinitionsMap =
581 llvm::StringMap<std::pair<StringRef,
bool >>;
590 bool empty()
const {
return Decls.empty(); }
592 bool insert(NamedDecl *ND) {
593 auto [_, Inserted] =
Found.insert(ND);
600using DeclsMap = llvm::DenseMap<DeclarationName, DeclsSet>;
606 StringRef ModuleFilename,
616 for (
auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
625 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
627 ->getWarningOptionForDiag(DiagID)
647 StringRef ModuleFilename,
bool IsSystem,
648 bool SystemHeaderWarningsInModule,
657 !SystemHeaderWarningsInModule) {
659 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
660 <<
"-Wsystem-headers" << ModuleFilename;
667 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
668 <<
"-Werror" << ModuleFilename;
675 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
676 <<
"-Weverything -Werror" << ModuleFilename;
683 Diags.
Report(diag::err_ast_file_diagopt_mismatch)
684 <<
"-pedantic-errors" << ModuleFilename;
709 assert(!ModuleName.empty() &&
"diagnostic options read before module name");
713 assert(M &&
"missing module");
718 StringRef ModuleFilename,
722 auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
726 PP.getFileManager().getVirtualFileSystem(),
730 assert(ModuleMgr.
size() >= 1 &&
"what ASTFile is this then");
736 Module *Importer = PP.getCurrentModule();
739 bool SystemHeaderWarningsInModule =
746 TopM->
IsSystem, SystemHeaderWarningsInModule,
754 MacroDefinitionsMap &
Macros,
756 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
758 bool IsUndef = PPOpts.
Macros[I].second;
760 std::pair<StringRef, StringRef> MacroPair =
Macro.split(
'=');
761 StringRef MacroName = MacroPair.first;
762 StringRef MacroBody = MacroPair.second;
766 auto [It, Inserted] =
Macros.try_emplace(MacroName);
767 if (MacroNames && Inserted)
768 MacroNames->push_back(MacroName);
770 It->second = std::make_pair(
"",
true);
775 if (MacroName.size() ==
Macro.size())
779 StringRef::size_type End = MacroBody.find_first_of(
"\n\r");
780 MacroBody = MacroBody.substr(0, End);
783 auto [It, Inserted] =
Macros.try_emplace(MacroName);
784 if (MacroNames && Inserted)
785 MacroNames->push_back(MacroName);
786 It->second = std::make_pair(MacroBody,
false);
810 std::string &SuggestedPredefines,
const LangOptions &LangOpts,
814 MacroDefinitionsMap ASTFileMacros;
816 MacroDefinitionsMap ExistingMacros;
819 &ExistingMacroNames);
823 SuggestedPredefines +=
"# 1 \"<command line>\" 1\n";
825 for (
unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
827 StringRef MacroName = ExistingMacroNames[I];
828 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
831 llvm::StringMap<std::pair<StringRef,
bool >>
::iterator Known =
832 ASTFileMacros.find(MacroName);
838 Diags->
Report(diag::err_ast_file_macro_def_undef)
839 << MacroName <<
true << ModuleFilename;
847 if (Existing.second) {
848 SuggestedPredefines +=
"#undef ";
849 SuggestedPredefines += MacroName.str();
850 SuggestedPredefines +=
'\n';
852 SuggestedPredefines +=
"#define ";
853 SuggestedPredefines += MacroName.str();
854 SuggestedPredefines +=
' ';
855 SuggestedPredefines += Existing.first.str();
856 SuggestedPredefines +=
'\n';
863 if (Existing.second != Known->second.second) {
865 Diags->
Report(diag::err_ast_file_macro_def_undef)
866 << MacroName << Known->second.second << ModuleFilename;
873 if (Existing.second || Existing.first == Known->second.first) {
874 ASTFileMacros.erase(Known);
880 Diags->
Report(diag::err_ast_file_macro_def_conflict)
881 << MacroName << Known->second.first << Existing.first
888 SuggestedPredefines +=
"# 1 \"<built-in>\" 2\n";
893 for (
const auto &MacroName : ASTFileMacros.keys()) {
895 Diags->
Report(diag::err_ast_file_macro_def_undef)
896 << MacroName <<
false << ModuleFilename;
907 Diags->
Report(diag::err_ast_file_undef)
914 if (LangOpts.Modules &&
918 Diags->
Report(diag::err_ast_file_pp_detailed_record)
925 for (
unsigned I = 0, N = ExistingPPOpts.
Includes.size(); I != N; ++I) {
932 SuggestedPredefines +=
"#include \"";
933 SuggestedPredefines +=
File;
934 SuggestedPredefines +=
"\"\n";
944 SuggestedPredefines +=
"#include \"";
945 SuggestedPredefines +=
File;
946 SuggestedPredefines +=
"\"\n";
949 for (
unsigned I = 0, N = ExistingPPOpts.
MacroIncludes.size(); I != N; ++I) {
954 SuggestedPredefines +=
"#__include_macros \"";
955 SuggestedPredefines +=
File;
956 SuggestedPredefines +=
"\"\n##\n";
963 StringRef ModuleFilename,
964 bool ReadMacros,
bool Complain,
965 std::string &SuggestedPredefines) {
969 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
970 Complain ? &Reader.Diags :
nullptr, PP.getFileManager(),
971 SuggestedPredefines, PP.getLangOpts());
976 bool ReadMacros,
bool Complain, std::string &SuggestedPredefines) {
978 ModuleFilename, ReadMacros,
nullptr,
979 PP.getFileManager(), SuggestedPredefines,
988 StringRef ExistingSpecificModuleCachePath,
989 StringRef ASTFilename,
997 std::string(ContextHash));
1000 SpecificModuleCachePath == ExistingSpecificModuleCachePath)
1002 auto EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
1003 SpecificModuleCachePath, ExistingSpecificModuleCachePath);
1004 if (EqualOrErr && *EqualOrErr)
1010 EqualOrErr =
FileMgr.getVirtualFileSystem().equivalent(
1012 if (EqualOrErr && *EqualOrErr)
1013 Diags->
Report(clang::diag::warn_ast_file_config_mismatch) << ASTFilename;
1015 Diags->
Report(diag::err_ast_file_modulecache_mismatch)
1016 << SpecificModuleCachePath << ExistingSpecificModuleCachePath
1023 StringRef ASTFilename,
1024 StringRef ContextHash,
1026 const HeaderSearch &HeaderSearchInfo = PP.getHeaderSearchInfo();
1029 ASTFilename, Complain ? &Reader.Diags :
nullptr,
1030 PP.getLangOpts(), PP.getPreprocessorOpts(),
1035 PP.setCounterValue(
Value);
1043 unsigned Length = 0;
1044 const char *
Error =
nullptr;
1046 uint64_t Val = llvm::decodeULEB128(P, &Length,
nullptr, &
Error);
1048 llvm::report_fatal_error(
Error);
1054static std::pair<unsigned, unsigned>
1057 if ((
unsigned)KeyLen != KeyLen)
1058 llvm::report_fatal_error(
"key too large");
1061 if ((
unsigned)DataLen != DataLen)
1062 llvm::report_fatal_error(
"data too large");
1064 return std::make_pair(KeyLen, DataLen);
1068 bool TakeOwnership) {
1069 DeserializationListener = Listener;
1070 OwnsDeserializationListener = TakeOwnership;
1081 Reader.ReadModuleOffsetMap(MF);
1083 unsigned ModuleFileIndex =
ID.getModuleFileIndex();
1084 unsigned LocalDeclID =
ID.getLocalDeclIndex();
1090 assert(OwningModuleFile);
1094 if (!ModuleFileIndex)
1097 assert(LocalDeclID < LocalNumDecls);
1105 unsigned ModuleFileIndex,
unsigned LocalDeclID) {
1110std::pair<unsigned, unsigned>
1117 using namespace llvm::support;
1120 unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
1122 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1129 Args.push_back(FirstII);
1130 for (
unsigned I = 1; I != N; ++I)
1131 Args.push_back(Reader.getLocalIdentifier(
1132 F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
1140 using namespace llvm::support;
1144 Result.ID = Reader.getGlobalSelectorID(
1145 F, endian::readNext<uint32_t, llvm::endianness::little>(d));
1146 unsigned FullInstanceBits =
1147 endian::readNext<uint16_t, llvm::endianness::little>(d);
1148 unsigned FullFactoryBits =
1149 endian::readNext<uint16_t, llvm::endianness::little>(d);
1150 Result.InstanceBits = FullInstanceBits & 0x3;
1151 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
1152 Result.FactoryBits = FullFactoryBits & 0x3;
1153 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
1154 unsigned NumInstanceMethods = FullInstanceBits >> 3;
1155 unsigned NumFactoryMethods = FullFactoryBits >> 3;
1158 for (
unsigned I = 0; I != NumInstanceMethods; ++I) {
1162 endian::readNext<DeclID, llvm::endianness::little>(d))))
1167 for (
unsigned I = 0; I != NumFactoryMethods; ++I) {
1171 endian::readNext<DeclID, llvm::endianness::little>(d))))
1179 return llvm::djbHash(a);
1182std::pair<unsigned, unsigned>
1189 assert(n >= 2 && d[n-1] ==
'\0');
1190 return StringRef((
const char*) d, n-1);
1196 bool IsInteresting =
1207 bool Value = Bits & 0x1;
1213 using namespace llvm::support;
1216 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1217 return Reader.getGlobalIdentifierID(F, RawID >> 1);
1230 const unsigned char* d,
1232 using namespace llvm::support;
1235 endian::readNext<IdentifierID, llvm::endianness::little>(d);
1236 bool IsInteresting = RawID & 0x01;
1246 II = &Reader.getIdentifierTable().getOwn(k);
1249 bool IsModule = Reader.getPreprocessor().getCurrentModule() !=
nullptr;
1251 Reader.markIdentifierUpToDate(II);
1253 IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
1254 if (!IsInteresting) {
1257 Reader.SetIdentifierInfo(ID, II);
1261 unsigned ObjCOrBuiltinID =
1262 endian::readNext<uint16_t, llvm::endianness::little>(d);
1263 unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
1264 bool CPlusPlusOperatorKeyword =
readBit(Bits);
1265 bool HasRevertedTokenIDToIdentifier =
readBit(Bits);
1266 bool Poisoned =
readBit(Bits);
1267 bool ExtensionToken =
readBit(Bits);
1268 bool HasMacroDefinition =
readBit(Bits);
1270 assert(Bits == 0 &&
"Extra bits in the identifier?");
1271 DataLen -=
sizeof(uint16_t) * 2;
1275 if (HasRevertedTokenIDToIdentifier && II->
getTokenID() != tok::identifier)
1280 "Incorrect extension token flag");
1281 (void)ExtensionToken;
1285 "Incorrect C++ operator keyword flag");
1286 (void)CPlusPlusOperatorKeyword;
1290 if (HasMacroDefinition) {
1291 uint32_t MacroDirectivesOffset =
1292 endian::readNext<uint32_t, llvm::endianness::little>(d);
1295 if (MacroDirectivesOffset)
1296 Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
1298 hasMacroDefinitionInDependencies =
true;
1301 Reader.SetIdentifierInfo(ID, II);
1307 for (; DataLen > 0; DataLen -=
sizeof(
DeclID))
1308 DeclIDs.push_back(Reader.getGlobalDeclID(
1311 endian::readNext<DeclID, llvm::endianness::little>(d))));
1312 Reader.SetGloballyVisibleDecls(II, DeclIDs);
1319 : Kind(Name.getNameKind()) {
1349 llvm::FoldingSetNodeID ID;
1350 ID.AddInteger(Kind);
1373 return ID.computeStableHash();
1378 using namespace llvm::support;
1380 uint32_t ModuleFileID =
1381 endian::readNext<uint32_t, llvm::endianness::little>(d);
1382 return Reader.getLocalModuleFile(
F, ModuleFileID);
1385std::pair<unsigned, unsigned>
1392 using namespace llvm::support;
1401 F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
1408 F, endian::readNext<uint32_t, llvm::endianness::little>(d))
1432 using namespace llvm::support;
1434 for (
unsigned NumDecls = DataLen /
sizeof(
DeclID); NumDecls; --NumDecls) {
1436 Reader,
F, endian::readNext<DeclID, llvm::endianness::little>(d));
1442 const unsigned char *d,
1450 llvm::FoldingSetNodeID ID;
1451 ID.AddInteger(Key.first.getHash());
1452 ID.AddInteger(Key.second);
1453 return ID.computeStableHash();
1464 return {Name, *ModuleHash};
1470 unsigned PrimaryModuleHash =
1471 llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
1472 return {Name, PrimaryModuleHash};
1476 const unsigned char *d,
1484 using namespace llvm::support;
1486 uint32_t ModuleFileID =
1487 endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1488 return Reader.getLocalModuleFile(F, ModuleFileID);
1493 using namespace llvm::support;
1494 return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
1497std::pair<unsigned, unsigned>
1503 const unsigned char *d,
1506 using namespace llvm::support;
1508 for (
unsigned NumDecls =
1510 NumDecls; --NumDecls) {
1513 endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
1514 Val.
insert(Reader.getGlobalDeclID(F, LocalID));
1518bool ASTReader::ReadLexicalDeclContextStorage(
ModuleFile &M,
1519 BitstreamCursor &Cursor,
1522 assert(Offset != 0);
1525 if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
1526 Error(std::move(Err));
1534 Error(MaybeCode.takeError());
1537 unsigned Code = MaybeCode.get();
1540 if (!MaybeRecCode) {
1541 Error(MaybeRecCode.takeError());
1544 unsigned RecCode = MaybeRecCode.get();
1546 Error(
"Expected lexical block");
1551 "expected a TU_UPDATE_LEXICAL record for TU");
1556 auto &Lex = LexicalDecls[DC];
1558 Lex = std::make_pair(
1561 Blob.size() /
sizeof(
DeclID)));
1567bool ASTReader::ReadVisibleDeclContextStorage(
1568 ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
1569 ASTReader::VisibleDeclContextStorageKind VisibleKind) {
1570 assert(Offset != 0);
1572 SavedStreamPosition SavedPosition(Cursor);
1573 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1574 Error(std::move(Err));
1580 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1582 Error(MaybeCode.takeError());
1585 unsigned Code = MaybeCode.get();
1587 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1588 if (!MaybeRecCode) {
1589 Error(MaybeRecCode.takeError());
1592 unsigned RecCode = MaybeRecCode.get();
1593 switch (VisibleKind) {
1594 case VisibleDeclContextStorageKind::GenerallyVisible:
1596 Error(
"Expected visible lookup table block");
1600 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1602 Error(
"Expected module local visible lookup table block");
1606 case VisibleDeclContextStorageKind::TULocalVisible:
1608 Error(
"Expected TU local lookup table block");
1616 auto *
Data = (
const unsigned char*)Blob.data();
1617 switch (VisibleKind) {
1618 case VisibleDeclContextStorageKind::GenerallyVisible:
1619 PendingVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1621 case VisibleDeclContextStorageKind::ModuleLocalVisible:
1622 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&M,
Data});
1624 case VisibleDeclContextStorageKind::TULocalVisible:
1626 TULocalUpdates[
ID].push_back(UpdateData{&M,
Data});
1632void ASTReader::AddSpecializations(
const Decl *D,
const unsigned char *
Data,
1636 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
1637 SpecLookups[D].Table.add(&M,
Data,
1641bool ASTReader::ReadSpecializations(
ModuleFile &M, BitstreamCursor &Cursor,
1642 uint64_t Offset, Decl *D,
bool IsPartial) {
1643 assert(Offset != 0);
1645 SavedStreamPosition SavedPosition(Cursor);
1646 if (llvm::Error Err =
Cursor.JumpToBit(Offset)) {
1647 Error(std::move(Err));
1653 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
1655 Error(MaybeCode.takeError());
1658 unsigned Code = MaybeCode.get();
1660 Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record, &Blob);
1661 if (!MaybeRecCode) {
1662 Error(MaybeRecCode.takeError());
1665 unsigned RecCode = MaybeRecCode.get();
1668 Error(
"Expected decl specs block");
1672 auto *
Data = (
const unsigned char *)Blob.data();
1673 AddSpecializations(D,
Data, M, IsPartial);
1677void ASTReader::Error(StringRef Msg)
const {
1678 Error(diag::err_fe_ast_file_malformed, Msg);
1679 if (PP.getLangOpts().Modules &&
1680 !PP.getHeaderSearchInfo().getSpecificModuleCachePath().empty()) {
1681 Diag(diag::note_module_cache_path)
1682 << PP.getHeaderSearchInfo().getSpecificModuleCachePath();
1686void ASTReader::Error(
unsigned DiagID, StringRef Arg1, StringRef Arg2,
1687 StringRef Arg3)
const {
1688 Diag(DiagID) << Arg1 << Arg2 << Arg3;
1692struct AlreadyReportedDiagnosticError
1693 : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
1696 void log(raw_ostream &OS)
const override {
1697 llvm_unreachable(
"reporting an already-reported diagnostic error");
1700 std::error_code convertToErrorCode()
const override {
1701 return llvm::inconvertibleErrorCode();
1705char AlreadyReportedDiagnosticError::ID = 0;
1708void ASTReader::Error(llvm::Error &&Err)
const {
1710 std::move(Err), [](AlreadyReportedDiagnosticError &) {},
1711 [&](llvm::ErrorInfoBase &E) {
return Error(E.message()); });
1721 LineTableInfo &LineTable = SourceMgr.getLineTable();
1724 std::map<int, int> FileIDs;
1726 for (
unsigned I = 0;
Record[Idx]; ++I) {
1728 auto Filename = ReadPath(F,
Record, Idx);
1734 std::vector<LineEntry> Entries;
1735 while (Idx <
Record.size()) {
1736 FileID FID = ReadFileID(F,
Record, Idx);
1739 unsigned NumEntries =
Record[Idx++];
1740 assert(NumEntries &&
"no line entries for file ID");
1742 Entries.reserve(NumEntries);
1743 for (
unsigned I = 0; I != NumEntries; ++I) {
1744 unsigned FileOffset =
Record[Idx++];
1745 unsigned LineNo =
Record[Idx++];
1746 int FilenameID = FileIDs[
Record[Idx++]];
1749 unsigned IncludeOffset =
Record[Idx++];
1751 FileKind, IncludeOffset));
1758llvm::Error ASTReader::ReadSourceManagerBlock(
ModuleFile &F) {
1759 using namespace SrcMgr;
1767 SLocEntryCursor = F.
Stream;
1770 if (llvm::Error Err = F.
Stream.SkipBlock())
1780 Expected<llvm::BitstreamEntry> MaybeE =
1781 SLocEntryCursor.advanceSkippingSubblocks();
1783 return MaybeE.takeError();
1784 llvm::BitstreamEntry E = MaybeE.get();
1787 case llvm::BitstreamEntry::SubBlock:
1788 case llvm::BitstreamEntry::Error:
1789 return llvm::createStringError(std::errc::illegal_byte_sequence,
1790 "malformed block record in AST file");
1791 case llvm::BitstreamEntry::EndBlock:
1792 return llvm::Error::success();
1793 case llvm::BitstreamEntry::Record:
1801 Expected<unsigned> MaybeRecord =
1802 SLocEntryCursor.readRecord(E.ID,
Record, &Blob);
1804 return MaybeRecord.takeError();
1805 switch (MaybeRecord.get()) {
1813 return llvm::Error::success();
1818llvm::Expected<SourceLocation::UIntTy>
1824 return std::move(Err);
1828 return MaybeEntry.takeError();
1830 llvm::BitstreamEntry Entry = MaybeEntry.get();
1831 if (Entry.Kind != llvm::BitstreamEntry::Record)
1832 return llvm::createStringError(
1833 std::errc::illegal_byte_sequence,
1834 "incorrectly-formatted source location entry in AST file");
1840 return MaybeSLOC.takeError();
1842 switch (MaybeSLOC.get()) {
1844 return llvm::createStringError(
1845 std::errc::illegal_byte_sequence,
1846 "incorrectly-formatted source location entry in AST file");
1856 GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
1857 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
1858 "Corrupted global sloc offset map");
1863 auto It = llvm::upper_bound(
1866 int ID = F->SLocEntryBaseID + LocalIndex;
1867 std::size_t Index = -ID - 2;
1868 if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
1869 assert(!SourceMgr.SLocEntryLoaded[Index]);
1870 auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
1871 if (!MaybeEntryOffset) {
1872 Error(MaybeEntryOffset.takeError());
1876 SourceMgr.LoadedSLocEntryTable[Index] =
1877 SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
1878 SourceMgr.SLocEntryOffsetLoaded[Index] = true;
1880 return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
1896 Error(
"source location entry ID out-of-range for AST file");
1902 auto ReadBuffer = [
this](
1903 BitstreamCursor &SLocEntryCursor,
1904 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
1909 Error(MaybeCode.takeError());
1912 unsigned Code = MaybeCode.get();
1915 SLocEntryCursor.readRecord(Code,
Record, &Blob);
1916 if (!MaybeRecCode) {
1917 Error(MaybeRecCode.takeError());
1920 unsigned RecCode = MaybeRecCode.get();
1925 const llvm::compression::Format F =
1926 Blob.size() > 0 && Blob.data()[0] == 0x78
1927 ? llvm::compression::Format::Zlib
1928 : llvm::compression::Format::Zstd;
1929 if (
const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
1934 if (llvm::Error E = llvm::compression::decompress(
1935 F, llvm::arrayRefFromStringRef(Blob), Decompressed,
Record[0])) {
1936 Error(
"could not decompress embedded file contents: " +
1937 llvm::toString(std::move(E)));
1940 return llvm::MemoryBuffer::getMemBufferCopy(
1941 llvm::toStringRef(Decompressed), Name);
1943 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name,
true);
1945 Error(
"AST record has invalid code");
1950 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
1954 Error(std::move(Err));
1961 ++NumSLocEntriesRead;
1964 Error(MaybeEntry.takeError());
1967 llvm::BitstreamEntry Entry = MaybeEntry.get();
1969 if (Entry.Kind != llvm::BitstreamEntry::Record) {
1970 Error(
"incorrectly-formatted source location entry in AST file");
1977 SLocEntryCursor.readRecord(Entry.ID,
Record, &Blob);
1979 Error(MaybeSLOC.takeError());
1982 switch (MaybeSLOC.get()) {
1984 Error(
"incorrectly-formatted source location entry in AST file");
1990 unsigned InputID =
Record[4];
1991 InputFile IF = getInputFile(*F, InputID);
2004 IncludeLoc = getImportLocation(F);
2008 FileID FID = SourceMgr.createFileID(*
File, IncludeLoc, FileCharacter, ID,
2011 FileInfo.NumCreatedFIDs =
Record[5];
2015 unsigned NumFileDecls =
Record[7];
2016 if (NumFileDecls && ContextObj) {
2018 assert(F->
FileSortedDecls &&
"FILE_SORTED_DECLS not encountered yet ?");
2024 SourceMgr.getOrCreateContentCache(*
File, isSystem(FileCharacter));
2028 auto Buffer = ReadBuffer(SLocEntryCursor,
File->getName());
2031 SourceMgr.overrideFileContents(*
File, std::move(Buffer));
2038 const char *Name = Blob.data();
2039 unsigned Offset =
Record[0];
2044 IncludeLoc = getImportLocation(F);
2047 auto Buffer = ReadBuffer(SLocEntryCursor, Name);
2050 FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
2051 BaseOffset + Offset, IncludeLoc);
2053 auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
2054 FileInfo.setHasLineDirectives();
2063 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
2078 Error(
"source location entry ID out-of-range for AST file");
2083 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
2101 assert(SourceMgr.getMainFileID().isValid() &&
"missing main file");
2102 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2112 uint64_t *StartOfBlockOffset) {
2113 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
2116 if (StartOfBlockOffset)
2117 *StartOfBlockOffset = Cursor.GetCurrentBitNo();
2120 uint64_t Offset = Cursor.GetCurrentBitNo();
2123 return MaybeCode.takeError();
2124 unsigned Code = MaybeCode.get();
2127 if (Code != llvm::bitc::DEFINE_ABBREV) {
2128 if (llvm::Error Err = Cursor.JumpToBit(Offset))
2130 return llvm::Error::success();
2132 if (llvm::Error Err = Cursor.ReadAbbrevRecord())
2145 if (
Tok.isAnnotation()) {
2147 switch (
Tok.getKind()) {
2148 case tok::annot_pragma_loop_hint: {
2152 unsigned NumTokens =
Record[Idx++];
2154 Toks.reserve(NumTokens);
2155 for (
unsigned I = 0; I < NumTokens; ++I)
2157 Info->Toks =
llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
2158 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2161 case tok::annot_pragma_pack: {
2166 llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
2168 Tok.setAnnotationValue(
static_cast<void *
>(Info));
2172 case tok::annot_pragma_openmp:
2173 case tok::annot_pragma_openmp_end:
2174 case tok::annot_pragma_unused:
2175 case tok::annot_pragma_openacc:
2176 case tok::annot_pragma_openacc_end:
2177 case tok::annot_repl_input_end:
2180 llvm_unreachable(
"missing deserialization code for annotation token");
2185 Tok.setIdentifierInfo(II);
2197 if (llvm::Error Err = Stream.JumpToBit(Offset)) {
2199 consumeError(std::move(Err));
2211 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
2213 Stream.advanceSkippingSubblocks(Flags);
2215 Error(MaybeEntry.takeError());
2218 llvm::BitstreamEntry Entry = MaybeEntry.get();
2220 switch (Entry.Kind) {
2221 case llvm::BitstreamEntry::SubBlock:
2222 case llvm::BitstreamEntry::Error:
2223 Error(
"malformed block record in AST file");
2225 case llvm::BitstreamEntry::EndBlock:
2227 case llvm::BitstreamEntry::Record:
2238 Error(MaybeRecType.takeError());
2254 unsigned NextIndex = 1;
2256 MacroInfo *MI = PP.AllocateMacroInfo(Loc);
2261 PP.getPreprocessorAllocator());
2264 bool isC99VarArgs =
Record[NextIndex++];
2265 bool isGNUVarArgs =
Record[NextIndex++];
2266 bool hasCommaPasting =
Record[NextIndex++];
2267 MacroParams.clear();
2268 unsigned NumArgs =
Record[NextIndex++];
2269 for (
unsigned i = 0; i != NumArgs; ++i)
2284 if (NextIndex + 1 ==
Record.size() && PP.getPreprocessingRecord() &&
2289 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
2291 PreprocessingRecord::PPEntityID PPID =
2292 PPRec.getPPEntityID(Index,
true);
2294 PPRec.getPreprocessedEntity(PPID));
2296 PPRec.RegisterMacroDefinition(
Macro, PPDef);
2307 if (MacroTokens.empty()) {
2308 Error(
"unexpected number of macro tokens for a macro in AST file");
2314 MacroTokens = MacroTokens.drop_front();
2325 ReadModuleOffsetMap(M);
2327 unsigned ModuleFileIndex = LocalID >> 32;
2328 LocalID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
2331 assert(MF &&
"malformed identifier ID encoding?");
2333 if (!ModuleFileIndex) {
2342HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
2345 return FileMgr.getOptionalFileRef(Key.Filename);
2349 return FileMgr.getOptionalFileRef(*Resolved);
2353 uint8_t buf[
sizeof(ikey.
Size) +
sizeof(ikey.
ModTime)];
2356 return llvm::xxh3_64bits(buf);
2377 return FEA && FEA == FEB;
2380std::pair<unsigned, unsigned>
2387 using namespace llvm::support;
2390 ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2392 time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
2401 using namespace llvm::support;
2403 const unsigned char *End = d + DataLen;
2405 unsigned Flags = *d++;
2408 bool Included = (Flags >> 6) & 0x01;
2410 if ((FE = getFile(key)))
2413 Reader.getPreprocessor().getIncludedFiles().insert(*FE);
2416 HFI.
isImport |= (Flags >> 5) & 0x01;
2418 HFI.
DirInfo = (Flags >> 1) & 0x07;
2420 M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
2422 assert((End - d) % 4 == 0 &&
2423 "Wrong data length in HeaderFileInfo deserialization");
2425 uint32_t LocalSMID =
2426 endian::readNext<uint32_t, llvm::endianness::little>(d);
2432 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
2433 Module *Mod = Reader.getSubmodule(GlobalSMID);
2435 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
2437 if (FE || (FE = getFile(key))) {
2440 ModMap.
addHeader(Mod, H, HeaderRole,
true);
2452 uint32_t MacroDirectivesOffset) {
2453 assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
2454 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
2461 for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
2462 BitstreamCursor &MacroCursor = I.MacroCursor;
2465 if (MacroCursor.getBitcodeBytes().empty())
2468 BitstreamCursor Cursor = MacroCursor;
2469 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
2470 Error(std::move(Err));
2478 Error(MaybeE.takeError());
2481 llvm::BitstreamEntry E = MaybeE.get();
2484 case llvm::BitstreamEntry::SubBlock:
2485 case llvm::BitstreamEntry::Error:
2486 Error(
"malformed block record in AST file");
2488 case llvm::BitstreamEntry::EndBlock:
2491 case llvm::BitstreamEntry::Record: {
2495 Error(MaybeRecord.takeError());
2498 switch (MaybeRecord.get()) {
2525 class IdentifierLookupVisitor {
2528 unsigned PriorGeneration;
2529 unsigned &NumIdentifierLookups;
2530 unsigned &NumIdentifierLookupHits;
2534 IdentifierLookupVisitor(StringRef Name,
unsigned PriorGeneration,
2535 unsigned &NumIdentifierLookups,
2536 unsigned &NumIdentifierLookupHits)
2538 PriorGeneration(PriorGeneration),
2539 NumIdentifierLookups(NumIdentifierLookups),
2540 NumIdentifierLookupHits(NumIdentifierLookupHits) {}
2554 ++NumIdentifierLookups;
2555 ASTIdentifierLookupTable::iterator Pos =
2556 IdTable->find_hashed(Name, NameHash, &Trait);
2557 if (Pos == IdTable->end())
2563 ++NumIdentifierLookupHits;
2565 if (Trait.hasMoreInformationInDependencies()) {
2574 IdentifierInfo *getIdentifierInfo()
const {
return Found; }
2583 unsigned PriorGeneration = 0;
2585 PriorGeneration = IdentifierGeneration[&II];
2592 if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
2597 IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
2598 NumIdentifierLookups,
2599 NumIdentifierLookupHits);
2600 ModuleMgr.visit(Visitor, HitsPtr);
2617 uint64_t ModuleFileIndex =
Record[Idx++] << 32;
2618 uint64_t LocalIndex =
Record[Idx++];
2623 const PendingMacroInfo &PMInfo) {
2628 if (llvm::Error Err =
2630 Error(std::move(Err));
2634 struct ModuleMacroRecord {
2647 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
2649 Error(MaybeEntry.takeError());
2652 llvm::BitstreamEntry Entry = MaybeEntry.get();
2654 if (Entry.Kind != llvm::BitstreamEntry::Record) {
2655 Error(
"malformed block record in AST file");
2662 Error(MaybePP.takeError());
2670 ModuleMacros.push_back(ModuleMacroRecord());
2671 auto &Info = ModuleMacros.back();
2675 for (
int I = Idx, N =
Record.size(); I != N; ++I)
2681 Error(
"malformed block record in AST file");
2692 std::reverse(ModuleMacros.begin(), ModuleMacros.end());
2694 for (
auto &MMR : ModuleMacros) {
2696 for (
unsigned ModID : MMR.Overrides) {
2698 auto *
Macro = PP.getModuleMacro(Mod, II);
2699 assert(
Macro &&
"missing definition for overridden macro");
2700 Overrides.push_back(
Macro);
2703 bool Inserted =
false;
2705 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
2716 unsigned Idx = 0, N =
Record.size();
2724 MD = PP.AllocateDefMacroDirective(MI, Loc);
2728 MD = PP.AllocateUndefMacroDirective(Loc);
2731 bool isPublic =
Record[Idx++];
2732 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
2744 PP.setLoadedMacroDirective(II, Earliest, Latest);
2747bool ASTReader::shouldDisableValidationForFile(
2770static std::pair<StringRef, StringRef>
2772 const StringRef InputBlob) {
2774 return {InputBlob.substr(0, AsRequestedLength),
2775 InputBlob.substr(AsRequestedLength)};
2789 SavedStreamPosition SavedPosition(Cursor);
2793 consumeError(std::move(Err));
2796 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
2799 consumeError(MaybeCode.takeError());
2801 unsigned Code = MaybeCode.get();
2805 if (Expected<unsigned> Maybe =
Cursor.readRecord(Code,
Record, &Blob))
2807 "invalid record type for input file");
2810 consumeError(
Maybe.takeError());
2813 assert(
Record[0] == ID &&
"Bogus stored ID or offset");
2815 R.StoredSize =
static_cast<off_t
>(
Record[1]);
2816 R.StoredTime =
static_cast<time_t
>(
Record[2]);
2817 R.Overridden =
static_cast<bool>(
Record[3]);
2818 R.Transient =
static_cast<bool>(
Record[4]);
2819 R.TopLevel =
static_cast<bool>(
Record[5]);
2820 R.ModuleMap =
static_cast<bool>(
Record[6]);
2821 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
2823 R.UnresolvedImportedFilenameAsRequested = UnresolvedFilenameAsRequested;
2824 R.UnresolvedImportedFilename = UnresolvedFilename.empty()
2825 ? UnresolvedFilenameAsRequested
2826 : UnresolvedFilename;
2828 Expected<llvm::BitstreamEntry> MaybeEntry =
Cursor.advance();
2830 consumeError(MaybeEntry.takeError());
2831 llvm::BitstreamEntry Entry = MaybeEntry.get();
2832 assert(Entry.Kind == llvm::BitstreamEntry::Record &&
2833 "expected record type for input file hash");
2836 if (Expected<unsigned> Maybe =
Cursor.readRecord(Entry.ID,
Record))
2838 "invalid record type for input file hash");
2841 consumeError(
Maybe.takeError());
2866 SavedStreamPosition SavedPosition(Cursor);
2870 consumeError(std::move(Err));
2885 const HeaderSearchOptions &HSOpts =
2886 PP.getHeaderSearchInfo().getHeaderSearchOpts();
2899 if ((Overridden || Transient || SkipChecks) && !
File)
2904 std::string ErrorStr =
"could not find file '";
2905 ErrorStr += *Filename;
2906 ErrorStr +=
"' referenced by AST file '";
2920 SourceManager &
SM = getSourceManager();
2922 if ((!Overridden && !Transient) && !SkipChecks &&
2923 SM.isFileOverridden(*
File)) {
2925 Error(diag::err_fe_pch_file_overridden, *Filename);
2936 auto HasInputContentChanged = [&](
Change OriginalChange) {
2937 assert(ValidateASTInputFilesContent &&
2938 "We should only check the content of the inputs with "
2939 "ValidateASTInputFilesContent enabled.");
2941 if (StoredContentHash == 0)
2942 return OriginalChange;
2945 if (!MemBuffOrError) {
2947 return OriginalChange;
2948 std::string ErrorStr =
"could not get buffer for file '";
2949 ErrorStr +=
File->getName();
2952 return OriginalChange;
2955 auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
2956 if (StoredContentHash ==
static_cast<uint64_t>(ContentHash))
2961 auto HasInputFileChanged = [&]() {
2962 if (StoredSize !=
File->getSize())
2964 if (!shouldDisableValidationForFile(F) && StoredTime &&
2965 StoredTime !=
File->getModificationTime()) {
2967 File->getModificationTime()};
2971 if (ValidateASTInputFilesContent)
2972 return HasInputContentChanged(MTimeChange);
2979 bool IsOutOfDate =
false;
2986 FileChange = HasInputContentChanged(FileChange);
2992 if (!StoredTime && ValidateASTInputFilesContent &&
2994 FileChange = HasInputContentChanged(FileChange);
3000 SmallVector<ModuleFile *, 4> ImportStack(1, &F);
3001 while (!ImportStack.back()->ImportedBy.empty())
3002 ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
3005 StringRef TopLevelASTFileName(ImportStack.back()->FileName);
3006 Diag(diag::err_fe_ast_file_modified)
3008 << TopLevelASTFileName;
3009 Diag(diag::note_fe_ast_file_modified)
3010 << FileChange.Kind << (FileChange.Old && FileChange.New)
3011 << llvm::itostr(FileChange.Old.value_or(0))
3012 << llvm::itostr(FileChange.New.value_or(0));
3013 if (getModuleManager()
3015 .getInMemoryModuleCache()
3020 if (ImportStack.size() > 1) {
3021 Diag(diag::note_ast_file_required_by)
3022 << *Filename << ImportStack[0]->FileName;
3023 for (
unsigned I = 1; I < ImportStack.size(); ++I)
3024 Diag(diag::note_ast_file_required_by)
3025 << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
3029 Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
3030 Diag(diag::note_ast_file_input_files_validation_status)
3046ASTReader::TemporarilyOwnedStringRef
3052ASTReader::TemporarilyOwnedStringRef
3055 assert(Buf.capacity() != 0 &&
"Overlapping ResolveImportedPath calls");
3057 if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
3058 Path ==
"<built-in>" || Path ==
"<command line>")
3062 llvm::sys::path::append(Buf, Prefix, Path);
3063 StringRef ResolvedPath{Buf.data(), Buf.size()};
3064 return {ResolvedPath, Buf};
3077 return ResolvedPath->str();
3092 llvm_unreachable(
"unknown ASTReadResult");
3096 BitstreamCursor &Stream, StringRef Filename,
3097 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
3098 ASTReaderListener &Listener, std::string &SuggestedPredefines) {
3101 consumeError(std::move(Err));
3109 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3112 consumeError(MaybeEntry.takeError());
3115 llvm::BitstreamEntry Entry = MaybeEntry.get();
3117 switch (Entry.Kind) {
3118 case llvm::BitstreamEntry::Error:
3119 case llvm::BitstreamEntry::SubBlock:
3122 case llvm::BitstreamEntry::EndBlock:
3125 case llvm::BitstreamEntry::Record:
3132 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID,
Record);
3133 if (!MaybeRecordType) {
3135 consumeError(MaybeRecordType.takeError());
3140 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3141 if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
3142 AllowCompatibleConfigurationMismatch))
3143 Result = ConfigurationMismatch;
3148 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3149 if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
3150 AllowCompatibleConfigurationMismatch))
3151 Result = ConfigurationMismatch;
3156 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3157 if (ParseTargetOptions(
Record, Filename, Complain, Listener,
3158 AllowCompatibleConfigurationMismatch))
3159 Result = ConfigurationMismatch;
3164 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3165 if (!AllowCompatibleConfigurationMismatch &&
3166 ParseFileSystemOptions(
Record, Complain, Listener))
3167 Result = ConfigurationMismatch;
3172 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3173 if (!AllowCompatibleConfigurationMismatch &&
3174 ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
3175 Result = ConfigurationMismatch;
3180 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
3181 if (!AllowCompatibleConfigurationMismatch &&
3182 ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
3183 SuggestedPredefines))
3184 Result = ConfigurationMismatch;
3191static std::pair<bool, bool>
3194 const bool EnablesBSValidation =
3196 const bool WasValidated =
3197 EnablesBSValidation &&
3199 return {EnablesBSValidation, WasValidated};
3202ASTReader::RelocationResult
3203ASTReader::getModuleForRelocationChecks(
ModuleFile &F,
bool DirectoryCheck) {
3205 const bool IgnoreError =
3206 bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3209 if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
3210 return {std::nullopt, IgnoreError};
3214 if (!DirectoryCheck &&
3215 (!IsImplicitModule || ModuleMgr.begin()->Kind ==
MK_MainFile))
3216 return {std::nullopt, IgnoreError};
3218 const HeaderSearchOptions &HSOpts =
3219 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3224 auto [EnablesBSValidation, WasValidated] =
3227 return {std::nullopt, IgnoreError};
3228 if (EnablesBSValidation &&
3230 return {std::nullopt, IgnoreError};
3237 Module *M = PP.getHeaderSearchInfo().lookupModule(
3242 return {M, IgnoreError};
3247 SmallVectorImpl<ImportedModule> &Loaded,
3249 unsigned ClientLoadCapabilities) {
3250 BitstreamCursor &Stream = F.
Stream;
3253 Error(std::move(Err));
3263 bool HasReadUnhashedControlBlock =
false;
3264 auto readUnhashedControlBlockOnce = [&]() {
3265 if (!HasReadUnhashedControlBlock) {
3266 HasReadUnhashedControlBlock =
true;
3267 if (ASTReadResult
Result =
3268 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
3274 bool DisableValidation = shouldDisableValidationForFile(F);
3278 unsigned NumInputs = 0;
3279 unsigned NumUserInputs = 0;
3280 StringRef BaseDirectoryAsWritten;
3282 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3284 Error(MaybeEntry.takeError());
3287 llvm::BitstreamEntry Entry = MaybeEntry.get();
3289 switch (Entry.Kind) {
3290 case llvm::BitstreamEntry::Error:
3291 Error(
"malformed block record in AST file");
3293 case llvm::BitstreamEntry::EndBlock: {
3296 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3300 const HeaderSearchOptions &HSOpts =
3301 PP.getHeaderSearchInfo().getHeaderSearchOpts();
3309 !canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities);
3315 unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
3321 N = ForceValidateUserInputs ? NumUserInputs : 0;
3323 ForceValidateUserInputs
3329 Diag(diag::remark_module_validation)
3332 for (
unsigned I = 0; I < N; ++I) {
3333 InputFile IF = getInputFile(F, I+1, Complain);
3347 for (
unsigned I = 0; I < N; ++I) {
3348 bool IsSystem = I >= NumUserInputs;
3350 auto FilenameAsRequested = ResolveImportedPath(
3353 *FilenameAsRequested, IsSystem, FI.
Overridden,
3361 case llvm::BitstreamEntry::SubBlock:
3365 if (llvm::Error Err = Stream.SkipBlock()) {
3366 Error(std::move(Err));
3370 Error(
"malformed block record in AST file");
3380 if (Listener && !ImportedBy) {
3386 bool AllowCompatibleConfigurationMismatch =
3390 ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
3391 AllowCompatibleConfigurationMismatch, *Listener,
3392 SuggestedPredefines);
3394 Error(
"malformed block record in AST file");
3398 if (DisableValidation ||
3399 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
3407 }
else if (llvm::Error Err = Stream.SkipBlock()) {
3408 Error(std::move(Err));
3414 if (llvm::Error Err = Stream.SkipBlock()) {
3415 Error(std::move(Err));
3421 case llvm::BitstreamEntry::Record:
3429 Expected<unsigned> MaybeRecordType =
3430 Stream.readRecord(Entry.ID,
Record, &Blob);
3431 if (!MaybeRecordType) {
3432 Error(MaybeRecordType.takeError());
3438 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3440 : diag::err_ast_file_version_too_new)
3445 bool hasErrors =
Record[7];
3446 if (hasErrors && !DisableValidation) {
3449 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
3450 canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3453 if (!AllowASTWithCompilerErrors) {
3454 Diag(diag::err_ast_file_with_compiler_errors)
3460 Diags.ErrorOccurred =
true;
3461 Diags.UncompilableErrorOccurred =
true;
3462 Diags.UnrecoverableErrorOccurred =
true;
3475 StringRef ASTBranch = Blob;
3476 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
3477 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
3478 Diag(diag::err_ast_file_different_branch)
3490 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3500 auto [ImportLoc, ImportModuleFileIndex] =
3501 ReadUntranslatedSourceLocation(
Record[Idx++]);
3503 assert(ImportModuleFileIndex == 0);
3505 StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
3507 bool IsImportingStdCXXModule =
Record[Idx++];
3509 off_t StoredSize = 0;
3510 time_t StoredModTime = 0;
3511 unsigned FileNameKind = 0;
3512 ASTFileSignature StoredSignature;
3513 ModuleFileName ImportedFile;
3514 std::string StoredFile;
3515 bool IgnoreImportedByNote =
false;
3524 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
3525 ImportedName, !IsImportingStdCXXModule);
3527 if (IsImportingStdCXXModule && ImportedFile.
empty()) {
3528 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3532 if (!IsImportingStdCXXModule) {
3533 StoredSize = (off_t)
Record[Idx++];
3534 StoredModTime = (time_t)
Record[Idx++];
3535 FileNameKind = (unsigned)
Record[Idx++];
3539 SignatureBytes.end());
3542 StoredFile = ReadPathBlob(BaseDirectoryAsWritten,
Record, Idx, Blob);
3543 if (ImportedFile.
empty()) {
3545 }
else if (!getDiags().isIgnored(
3546 diag::warn_module_file_mapping_mismatch,
3547 CurrentImportLoc)) {
3548 auto ImportedFileRef =
3549 PP.getFileManager().getOptionalFileRef(ImportedFile);
3550 auto StoredFileRef =
3551 PP.getFileManager().getOptionalFileRef(StoredFile);
3552 if ((ImportedFileRef && StoredFileRef) &&
3553 (*ImportedFileRef != *StoredFileRef)) {
3554 Diag(diag::warn_module_file_mapping_mismatch)
3555 << ImportedFile << StoredFile;
3556 Diag(diag::note_module_file_imported_by)
3558 IgnoreImportedByNote =
true;
3565 unsigned Capabilities = ClientLoadCapabilities;
3566 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
3567 Capabilities &= ~ARR_Missing;
3570 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
3571 Loaded, StoredSize, StoredModTime,
3572 StoredSignature, Capabilities);
3577 if (IsImportingStdCXXModule) {
3578 if (
const auto *Imported =
3579 getModuleManager().lookupByFileName(ImportedFile);
3580 Imported !=
nullptr && Imported->ModuleName != ImportedName) {
3581 Diag(diag::err_failed_to_find_module_file) << ImportedName;
3587 bool recompilingFinalized =
Result == OutOfDate &&
3588 (Capabilities & ARR_OutOfDate) &&
3591 .getInMemoryModuleCache()
3593 if (!IgnoreImportedByNote &&
3595 Diag(diag::note_module_file_imported_by)
3602 case OutOfDate:
return OutOfDate;
3604 case ConfigurationMismatch:
return ConfigurationMismatch;
3605 case HadErrors:
return HadErrors;
3624 Diag(diag::remark_module_import)
3626 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
3632 if (ASTReadResult
Result = readUnhashedControlBlockOnce())
3640 BaseDirectoryAsWritten = Blob;
3642 "MODULE_DIRECTORY found before MODULE_NAME");
3645 auto [MaybeM, IgnoreError] =
3646 getModuleForRelocationChecks(F,
true);
3647 if (!MaybeM.has_value())
3650 Module *M = MaybeM.value();
3662 auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
3663 if (BuildDir && (*BuildDir == M->
Directory)) {
3667 Diag(diag::remark_module_relocated)
3670 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
3671 Diag(diag::err_imported_module_relocated)
3677 if (ASTReadResult
Result =
3678 ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
3684 NumUserInputs =
Record[1];
3686 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3695llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
3696 unsigned ClientLoadCapabilities) {
3697 BitstreamCursor &Stream = F.
Stream;
3699 if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
3706 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
3708 return MaybeEntry.takeError();
3709 llvm::BitstreamEntry Entry = MaybeEntry.get();
3711 switch (Entry.Kind) {
3712 case llvm::BitstreamEntry::Error:
3713 return llvm::createStringError(
3714 std::errc::illegal_byte_sequence,
3715 "error at end of module block in AST file");
3716 case llvm::BitstreamEntry::EndBlock:
3722 if (ASTContext *Ctx = ContextObj) {
3723 DeclContext *DC = Ctx->getTranslationUnitDecl();
3728 return llvm::Error::success();
3729 case llvm::BitstreamEntry::SubBlock:
3737 if (llvm::Error Err = Stream.SkipBlock())
3739 if (llvm::Error Err = ReadBlockAbbrevs(
3746 if (!PP.getExternalSource())
3747 PP.setExternalSource(
this);
3749 if (llvm::Error Err = Stream.SkipBlock())
3751 if (llvm::Error Err =
3760 if (llvm::Error Err = Stream.SkipBlock()) {
3769 if (!PP.getPreprocessingRecord())
3770 PP.createPreprocessingRecord();
3771 if (!PP.getPreprocessingRecord()->getExternalSource())
3772 PP.getPreprocessingRecord()->SetExternalSource(*
this);
3776 if (llvm::Error Err = ReadSourceManagerBlock(F))
3782 if (llvm::Error Err = Stream.SkipBlock())
3784 if (llvm::Error Err =
3791 BitstreamCursor
C = Stream;
3793 if (llvm::Error Err = Stream.SkipBlock())
3797 CommentsCursors.push_back(std::make_pair(
C, &F));
3802 if (llvm::Error Err = Stream.SkipBlock())
3808 case llvm::BitstreamEntry::Record:
3816 Expected<unsigned> MaybeRecordType =
3817 Stream.readRecord(Entry.ID,
Record, &Blob);
3818 if (!MaybeRecordType)
3819 return MaybeRecordType.takeError();
3824 switch (RecordType) {
3846 switch (RecordType) {
3856 (
const llvm::support::unaligned_uint64_t *)Blob.data();
3860 GlobalSubmoduleMap.insert(
3861 std::make_pair(getTotalNumSubmodules() + 1, &F));
3872 auto ReadSubmodule = [&](
unsigned LocalID) ->
Module * {
3873 return getSubmodule(getGlobalSubmoduleID(F, LocalID));
3876 if (PP.getHeaderSearchInfo().getModuleMap().findModule(F.
ModuleName)) {
3882 ReadSubmodule(LocalID);
3896 return llvm::createStringError(
3897 std::errc::illegal_byte_sequence,
3898 "duplicate TYPE_OFFSET record in AST file");
3911 return llvm::createStringError(
3912 std::errc::illegal_byte_sequence,
3913 "duplicate DECL_OFFSET record in AST file");
3925 DeclContext *TU = ContextObj->getTranslationUnitDecl();
3926 LexicalContents Contents(
3928 static_cast<unsigned int>(Blob.size() /
sizeof(
DeclID)));
3929 TULexicalDecls.push_back(std::make_pair(&F, Contents));
3936 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3937 auto *
Data = (
const unsigned char*)Blob.data();
3938 PendingVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3941 if (Decl *D = GetExistingDecl(ID))
3942 PendingUpdateRecords.push_back(
3943 PendingUpdateRecord(ID, D,
false));
3949 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3950 auto *
Data = (
const unsigned char *)Blob.data();
3951 PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F,
Data});
3954 if (Decl *D = GetExistingDecl(ID))
3955 PendingUpdateRecords.push_back(
3956 PendingUpdateRecord(ID, D,
false));
3964 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3965 auto *
Data = (
const unsigned char *)Blob.data();
3966 TULocalUpdates[
ID].push_back(UpdateData{&F,
Data});
3969 if (Decl *D = GetExistingDecl(ID))
3970 PendingUpdateRecords.push_back(
3971 PendingUpdateRecord(ID, D,
false));
3977 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3978 auto *
Data = (
const unsigned char *)Blob.data();
3979 PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3982 if (Decl *D = GetExistingDecl(ID))
3983 PendingUpdateRecords.push_back(
3984 PendingUpdateRecord(ID, D,
false));
3990 GlobalDeclID
ID = ReadDeclID(F,
Record, Idx);
3991 auto *
Data = (
const unsigned char *)Blob.data();
3992 PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F,
Data});
3995 if (Decl *D = GetExistingDecl(ID))
3996 PendingUpdateRecords.push_back(
3997 PendingUpdateRecord(ID, D,
false));
4003 reinterpret_cast<const unsigned char *
>(Blob.data());
4009 ASTIdentifierLookupTrait(*
this, F));
4011 PP.getIdentifierTable().setExternalIdentifierLookup(
this);
4017 return llvm::createStringError(
4018 std::errc::illegal_byte_sequence,
4019 "duplicate IDENTIFIER_OFFSET record in AST file");
4025 IdentifiersLoaded.resize(IdentifiersLoaded.size()
4037 for (
unsigned I = 0, N =
Record.size(); I != N; )
4038 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
4045 getContext().getLangOpts().BuildingPCHWithObjectFile)
4046 for (
unsigned I = 0, N =
Record.size(); I != N; )
4047 EagerlyDeserializedDecls.push_back(ReadDeclID(F,
Record, I));
4051 if (SpecialTypes.empty()) {
4052 for (
unsigned I = 0, N =
Record.size(); I != N; ++I)
4053 SpecialTypes.push_back(getGlobalTypeID(F,
Record[I]));
4060 if (SpecialTypes.size() !=
Record.size())
4061 return llvm::createStringError(std::errc::illegal_byte_sequence,
4062 "invalid special-types record");
4064 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4066 if (!SpecialTypes[I])
4067 SpecialTypes[I] =
ID;
4074 TotalNumStatements +=
Record[0];
4075 TotalNumMacros +=
Record[1];
4076 TotalLexicalDeclContexts +=
Record[2];
4077 TotalVisibleDeclContexts +=
Record[3];
4078 TotalModuleLocalVisibleDeclContexts +=
Record[4];
4079 TotalTULocalVisibleDeclContexts +=
Record[5];
4083 for (
unsigned I = 0, N =
Record.size(); I != N; )
4084 UnusedFileScopedDecls.push_back(ReadDeclID(F,
Record, I));
4088 for (
unsigned I = 0, N =
Record.size(); I != N; )
4089 DelegatingCtorDecls.push_back(ReadDeclID(F,
Record, I));
4093 if (
Record.size() % 3 != 0)
4094 return llvm::createStringError(std::errc::illegal_byte_sequence,
4095 "invalid weak identifiers record");
4099 WeakUndeclaredIdentifiers.clear();
4102 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4103 WeakUndeclaredIdentifiers.push_back(
4104 getGlobalIdentifierID(F,
Record[I++]));
4105 WeakUndeclaredIdentifiers.push_back(
4106 getGlobalIdentifierID(F,
Record[I++]));
4107 WeakUndeclaredIdentifiers.push_back(
4108 ReadSourceLocation(F,
Record, I).getRawEncoding());
4113 if (
Record.size() % 3 != 0)
4114 return llvm::createStringError(std::errc::illegal_byte_sequence,
4115 "invalid extname identifiers record");
4119 ExtnameUndeclaredIdentifiers.clear();
4123 for (
unsigned I = 0, N =
Record.size(); I < N; ) {
4124 ExtnameUndeclaredIdentifiers.push_back(
4125 getGlobalIdentifierID(F,
Record[I++]));
4126 ExtnameUndeclaredIdentifiers.push_back(
4127 getGlobalIdentifierID(F,
Record[I++]));
4128 ExtnameUndeclaredIdentifiers.push_back(
4129 ReadSourceLocation(F,
Record, I).getRawEncoding());
4136 unsigned LocalBaseSelectorID =
Record[1];
4142 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
4147 std::make_pair(LocalBaseSelectorID,
4159 = ASTSelectorLookupTable::Create(
4162 ASTSelectorLookupTrait(*
this, F));
4163 TotalNumMethodPoolEntries +=
Record[1];
4168 for (
unsigned Idx = 0, N =
Record.size() - 1; Idx < N; ) {
4169 ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
4171 ReferencedSelectorsData.push_back(ReadSourceLocation(F,
Record, Idx).
4180 PP.setPreambleRecordedPragmaAssumeNonNullLoc(
4181 ReadSourceLocation(F,
Record, Idx));
4187 SmallVector<SourceLocation, 64> SrcLocs;
4189 while (Idx <
Record.size())
4190 SrcLocs.push_back(ReadSourceLocation(F,
Record, Idx));
4191 PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
4198 unsigned Idx = 0, End =
Record.size() - 1;
4199 bool ReachedEOFWhileSkipping =
Record[Idx++];
4200 std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
4201 if (ReachedEOFWhileSkipping) {
4202 SourceLocation HashToken = ReadSourceLocation(F,
Record, Idx);
4203 SourceLocation IfTokenLoc = ReadSourceLocation(F,
Record, Idx);
4204 bool FoundNonSkipPortion =
Record[Idx++];
4205 bool FoundElse =
Record[Idx++];
4206 SourceLocation ElseLoc = ReadSourceLocation(F,
Record, Idx);
4207 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
4208 FoundElse, ElseLoc);
4210 SmallVector<PPConditionalInfo, 4> ConditionalStack;
4212 auto Loc = ReadSourceLocation(F,
Record, Idx);
4213 bool WasSkipping =
Record[Idx++];
4214 bool FoundNonSkip =
Record[Idx++];
4215 bool FoundElse =
Record[Idx++];
4216 ConditionalStack.push_back(
4217 {Loc, WasSkipping, FoundNonSkip, FoundElse});
4219 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
4224 if (!
Record.empty() && Listener)
4242 Diags.Report(SourceLocation(), diag::remark_sloc_usage);
4243 SourceMgr.noteSLocAddressSpaceUsage(Diags);
4244 return llvm::createStringError(std::errc::invalid_argument,
4245 "ran out of source locations");
4250 unsigned RangeStart =
4252 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
4257 GlobalSLocOffsetMap.insert(
4259 - SLocSpaceSize,&F));
4270 ParseLineTable(F,
Record);
4274 for (
unsigned I = 0, N =
Record.size(); I != N; )
4275 ExtVectorDecls.push_back(ReadDeclID(F,
Record, I));
4279 if (
Record.size() % 3 != 0)
4280 return llvm::createStringError(std::errc::illegal_byte_sequence,
4281 "Invalid VTABLE_USES record");
4288 for (
unsigned Idx = 0, N =
Record.size(); Idx != N; ) {
4289 VTableUses.push_back(
4290 {ReadDeclID(F,
Record, Idx),
4291 ReadSourceLocation(F,
Record, Idx).getRawEncoding(),
4298 if (
Record.size() % 2 != 0)
4299 return llvm::createStringError(
4300 std::errc::illegal_byte_sequence,
4301 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
4306 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4307 PendingInstantiations.push_back(
4308 {ReadDeclID(F,
Record, I),
4309 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4316 return llvm::createStringError(std::errc::illegal_byte_sequence,
4317 "Invalid SEMA_DECL_REFS block");
4318 for (
unsigned I = 0, N =
Record.size(); I != N; )
4319 SemaDeclRefs.push_back(ReadDeclID(F,
Record, I));
4327 unsigned StartingID;
4328 if (!PP.getPreprocessingRecord())
4329 PP.createPreprocessingRecord();
4330 if (!PP.getPreprocessingRecord()->getExternalSource())
4331 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4333 = PP.getPreprocessingRecord()
4340 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
4351 if (!PP.getPreprocessingRecord())
4352 PP.createPreprocessingRecord();
4353 if (!PP.getPreprocessingRecord()->getExternalSource())
4354 PP.getPreprocessingRecord()->SetExternalSource(*
this);
4359 GlobalSkippedRangeMap.insert(
4365 if (
Record.size() % 2 != 0)
4366 return llvm::createStringError(
4367 std::errc::illegal_byte_sequence,
4368 "invalid DECL_UPDATE_OFFSETS block in AST file");
4369 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4370 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4371 DeclUpdateOffsets[
ID].push_back(std::make_pair(&F,
Record[I++]));
4375 if (Decl *D = GetExistingDecl(ID))
4376 PendingUpdateRecords.push_back(
4377 PendingUpdateRecord(ID, D,
false));
4382 if (
Record.size() % 5 != 0)
4383 return llvm::createStringError(
4384 std::errc::illegal_byte_sequence,
4385 "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST "
4387 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4388 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4391 assert(BaseOffset &&
"Invalid DeclsBlockStartOffset for module file!");
4394 LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
4397 LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
4400 LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
4403 TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
4405 DelayedNamespaceOffsetMap[
ID] = {
4406 {VisibleOffset, ModuleLocalOffset, TULocalOffset}, LexicalOffset};
4408 assert(!GetExistingDecl(ID) &&
4409 "We shouldn't load the namespace in the front of delayed "
4410 "namespace lexical and visible block");
4416 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4417 GlobalDeclID
ID = ReadDeclID(F,
Record, I);
4418 auto &RelatedDecls = RelatedDeclsMap[
ID];
4419 unsigned NN =
Record[I++];
4420 RelatedDecls.reserve(NN);
4421 for (
unsigned II = 0; II < NN; II++)
4422 RelatedDecls.push_back(ReadDeclID(F,
Record, I));
4428 return llvm::createStringError(
4429 std::errc::illegal_byte_sequence,
4430 "duplicate OBJC_CATEGORIES_MAP record in AST file");
4443 CUDASpecialDeclRefs.clear();
4444 for (
unsigned I = 0, N =
Record.size(); I != N; )
4445 CUDASpecialDeclRefs.push_back(ReadDeclID(F,
Record, I));
4455 HeaderFileInfoTrait(*
this, F));
4457 PP.getHeaderSearchInfo().SetExternalSource(
this);
4458 if (!PP.getHeaderSearchInfo().getExternalLookup())
4459 PP.getHeaderSearchInfo().SetExternalLookup(
this);
4465 FPPragmaOptions.swap(
Record);
4469 for (
unsigned I = 0, N =
Record.size(); I != N; )
4470 DeclsWithEffectsToVerify.push_back(ReadDeclID(F,
Record, I));
4474 for (
unsigned I = 0, E =
Record.size(); I != E; ) {
4475 auto Name = ReadString(
Record, I);
4476 auto &OptInfo = OpenCLExtensions.OptMap[Name];
4477 OptInfo.Supported =
Record[I++] != 0;
4478 OptInfo.Enabled =
Record[I++] != 0;
4479 OptInfo.WithPragma =
Record[I++] != 0;
4480 OptInfo.Avail =
Record[I++];
4481 OptInfo.Core =
Record[I++];
4482 OptInfo.Opt =
Record[I++];
4487 for (
unsigned I = 0, N =
Record.size(); I != N; )
4488 TentativeDefinitions.push_back(ReadDeclID(F,
Record, I));
4492 for (
unsigned I = 0, N =
Record.size(); I != N; )
4493 KnownNamespaces.push_back(ReadDeclID(F,
Record, I));
4497 if (
Record.size() % 2 != 0)
4498 return llvm::createStringError(std::errc::illegal_byte_sequence,
4499 "invalid undefined-but-used record");
4500 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4501 UndefinedButUsed.push_back(
4502 {ReadDeclID(F,
Record, I),
4503 ReadSourceLocation(F,
Record, I).getRawEncoding()});
4508 for (
unsigned I = 0, N =
Record.size(); I != N;) {
4509 DelayedDeleteExprs.push_back(ReadDeclID(F,
Record, I).getRawValue());
4511 DelayedDeleteExprs.push_back(Count);
4512 for (uint64_t
C = 0;
C < Count; ++
C) {
4513 DelayedDeleteExprs.push_back(ReadSourceLocation(F,
Record, I).getRawEncoding());
4514 bool IsArrayForm =
Record[I++] == 1;
4515 DelayedDeleteExprs.push_back(IsArrayForm);
4522 getContext().getLangOpts().BuildingPCHWithObjectFile)
4523 for (
unsigned I = 0, N =
Record.size(); I != N;)
4524 VTablesToEmit.push_back(ReadDeclID(F,
Record, I));
4532 for (
unsigned I = 0, N =
Record.size(); I != N; ) {
4533 unsigned GlobalID = getGlobalSubmoduleID(F,
Record[I++]);
4534 SourceLocation Loc = ReadSourceLocation(F,
Record, I);
4536 PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
4537 if (DeserializationListener)
4538 DeserializationListener->ModuleImportRead(GlobalID, Loc);
4546 return llvm::createStringError(
4547 std::errc::illegal_byte_sequence,
4548 "duplicate MACRO_OFFSET record in AST file");
4560 LateParsedTemplates.emplace_back(
4561 std::piecewise_construct, std::forward_as_tuple(&F),
4567 return llvm::createStringError(std::errc::illegal_byte_sequence,
4568 "invalid pragma optimize record");
4569 OptimizeOffPragmaLocation = ReadSourceLocation(F,
Record[0]);
4574 return llvm::createStringError(std::errc::illegal_byte_sequence,
4575 "invalid pragma ms_struct record");
4576 PragmaMSStructState =
Record[0];
4581 return llvm::createStringError(
4582 std::errc::illegal_byte_sequence,
4583 "invalid pragma pointers to members record");
4584 PragmaMSPointersToMembersState =
Record[0];
4585 PointersToMembersPragmaLocation = ReadSourceLocation(F,
Record[1]);
4589 for (
unsigned I = 0, N =
Record.size(); I != N; )
4590 UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F,
Record, I));
4595 return llvm::createStringError(std::errc::illegal_byte_sequence,
4596 "invalid cuda pragma options record");
4597 ForceHostDeviceDepth =
Record[0];
4602 return llvm::createStringError(std::errc::illegal_byte_sequence,
4603 "invalid pragma pack record");
4604 PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
4605 PragmaAlignPackCurrentLocation = ReadSourceLocation(F,
Record[1]);
4606 unsigned NumStackEntries =
Record[2];
4609 PragmaAlignPackStack.clear();
4610 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4611 PragmaAlignPackStackEntry Entry;
4612 Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
4613 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4614 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4615 PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
4616 Entry.SlotLabel = PragmaAlignPackStrings.back();
4617 PragmaAlignPackStack.push_back(Entry);
4624 return llvm::createStringError(std::errc::illegal_byte_sequence,
4625 "invalid pragma float control record");
4627 FpPragmaCurrentLocation = ReadSourceLocation(F,
Record[1]);
4628 unsigned NumStackEntries =
Record[2];
4631 FpPragmaStack.clear();
4632 for (
unsigned I = 0; I < NumStackEntries; ++I) {
4633 FpPragmaStackEntry Entry;
4635 Entry.Location = ReadSourceLocation(F,
Record[Idx++]);
4636 Entry.PushLocation = ReadSourceLocation(F,
Record[Idx++]);
4637 FpPragmaStrings.push_back(ReadString(
Record, Idx));
4638 Entry.SlotLabel = FpPragmaStrings.back();
4639 FpPragmaStack.push_back(Entry);
4645 for (
unsigned I = 0, N =
Record.size(); I != N; )
4646 DeclsToCheckForDeferredDiags.insert(ReadDeclID(F,
Record, I));
4650 unsigned NumRecords =
Record.front();
4652 if (
Record.size() - 1 != NumRecords)
4653 return llvm::createStringError(std::errc::illegal_byte_sequence,
4654 "invalid rvv intrinsic pragma record");
4656 if (RISCVVecIntrinsicPragma.empty())
4657 RISCVVecIntrinsicPragma.append(NumRecords, 0);
4660 for (
unsigned i = 0; i < NumRecords; ++i)
4661 RISCVVecIntrinsicPragma[i] |=
Record[i + 1];
4668void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
const {
4681 assert(ImportedModuleVector.empty());
4683 while (
Data < DataEnd) {
4687 using namespace llvm::support;
4689 endian::readNext<uint8_t, llvm::endianness::little>(
Data));
4690 uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
4691 StringRef Name = StringRef((
const char*)
Data, Len);
4696 ? ModuleMgr.lookupByModuleName(Name)
4701 std::string Msg =
"refers to unknown module, cannot find ";
4702 Msg.append(std::string(Name));
4707 ImportedModuleVector.push_back(OM);
4710 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4712 endian::readNext<uint32_t, llvm::endianness::little>(
Data);
4715 RemapBuilder &Remap) {
4716 constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
4718 Remap.insert(std::make_pair(Offset,
4719 static_cast<int>(BaseOffset - Offset)));
4730 unsigned ClientLoadCapabilities) {
4739 "MODULE_NAME should come before MODULE_MAP_FILE");
4740 auto [MaybeM, IgnoreError] =
4741 getModuleForRelocationChecks(F,
false);
4742 if (MaybeM.has_value()) {
4745 Module *M = MaybeM.value();
4746 auto &Map = PP.getHeaderSearchInfo().getModuleMap();
4748 M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
4749 if (!IgnoreError && !ModMap) {
4751 Diag(diag::remark_module_relocated)
4754 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
4757 Diag(diag::err_module_file_conflict)
4762 Diag(diag::err_imported_module_not_found)
4769 if (ImportedBy && ImportedBy->
Kind ==
MK_PCH)
4770 Diag(diag::note_imported_by_pch_module_not_found)
4777 assert(M && M->
Name == F.
ModuleName &&
"found module with different name");
4781 if (!StoredModMap || *StoredModMap != ModMap) {
4782 assert(ModMap &&
"found module is missing module map file");
4784 "top-level import should be verified");
4786 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4787 Diag(diag::err_imported_module_modmap_changed)
4794 for (
unsigned I = 0, N =
Record[Idx++]; I < N; ++I) {
4796 std::string Filename = ReadPath(F,
Record, Idx);
4799 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4800 Error(
"could not find file '" + Filename +
"' referenced by AST file");
4803 AdditionalStoredMaps.insert(*SF);
4808 if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
4809 for (FileEntryRef ModMap : *AdditionalModuleMaps) {
4812 if (!AdditionalStoredMaps.erase(ModMap)) {
4813 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4814 Diag(diag::err_module_different_modmap)
4823 for (FileEntryRef ModMap : AdditionalStoredMaps) {
4824 if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
4825 Diag(diag::err_module_different_modmap)
4839 SemaObjC::GlobalMethodPool::iterator Known =
4845 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
4846 : Known->second.second;
4850 if (List->getMethod() == Method) {
4858 if (List->getNext())
4859 List->setMethod(List->getNext()->getMethod());
4861 List->setMethod(Method);
4867 for (
Decl *D : Names) {
4871 if (wasHidden && SemaObj) {
4884 Stack.push_back(Mod);
4885 while (!Stack.empty()) {
4886 Mod = Stack.pop_back_val();
4888 if (NameVisibility <= Mod->NameVisibility) {
4904 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
4905 if (Hidden != HiddenNamesMap.end()) {
4906 auto HiddenNames = std::move(*Hidden);
4907 HiddenNamesMap.erase(Hidden);
4909 assert(!HiddenNamesMap.contains(Mod) &&
4910 "making names visible added hidden names");
4917 I = Exports.begin(), E = Exports.end(); I != E; ++I) {
4919 if (Visited.insert(Exported).second)
4920 Stack.push_back(Exported);
4938 PendingMergedDefinitionsToDeduplicate.insert(Def);
4947 if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
4948 !PP.getLangOpts().Modules)
4952 TriedLoadingGlobalIndex =
true;
4953 StringRef SpecificModuleCachePath =
4955 std::pair<GlobalModuleIndex *, llvm::Error>
Result =
4957 if (llvm::Error Err = std::move(
Result.second)) {
4959 consumeError(std::move(Err));
4963 GlobalIndex.reset(
Result.first);
4964 ModuleMgr.setGlobalIndex(GlobalIndex.get());
4969 return PP.getLangOpts().Modules && UseGlobalIndex &&
4981 consumeError(MaybeEntry.takeError());
4984 llvm::BitstreamEntry Entry = MaybeEntry.get();
4986 switch (Entry.Kind) {
4987 case llvm::BitstreamEntry::Error:
4988 case llvm::BitstreamEntry::EndBlock:
4991 case llvm::BitstreamEntry::Record:
4997 consumeError(Skipped.takeError());
5001 case llvm::BitstreamEntry::SubBlock:
5002 if (Entry.ID == BlockID) {
5003 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
5005 consumeError(std::move(Err));
5012 if (llvm::Error Err = Cursor.SkipBlock()) {
5014 consumeError(std::move(Err));
5024 unsigned ClientLoadCapabilities,
5026 llvm::TimeTraceScope scope(
"ReadAST",
FileName);
5030 CurrentDeserializingModuleKind,
Type);
5036 unsigned PreviousGeneration = 0;
5040 unsigned NumModules = ModuleMgr.size();
5045 ClientLoadCapabilities)) {
5046 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
5050 GlobalIndex.reset();
5051 ModuleMgr.setGlobalIndex(
nullptr);
5055 if (NewLoadedModuleFile && !Loaded.empty())
5056 *NewLoadedModuleFile = Loaded.back().Mod;
5069 llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
5072 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
5073 Error(std::move(Err));
5079 Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
5085 if (llvm::Error Err = ReadExtensionBlock(F)) {
5086 Error(std::move(Err));
5115 if (!PP.getLangOpts().CPlusPlus) {
5122 auto It = PP.getIdentifierTable().find(Key);
5123 if (It == PP.getIdentifierTable().end())
5132 II = &PP.getIdentifierTable().getOwn(Key);
5150 for (
auto &Id : PP.getIdentifierTable())
5151 Id.second->setOutOfDate(
true);
5154 for (
const auto &Sel : SelectorGeneration)
5155 SelectorOutOfDate[Sel.first] =
true;
5162 ModuleMgr.moduleFileAccepted(&F);
5184 if (DeserializationListener)
5185 DeserializationListener->ReaderInitialized(
this);
5187 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
5202 for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
5203 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
5204 ObjCClassesLoaded[I], PreviousGeneration);
5209 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5214 for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
5233 if (!Stream.canSkipToPos(4))
5234 return llvm::createStringError(
5235 std::errc::illegal_byte_sequence,
5236 "file too small to contain precompiled file magic");
5237 for (
unsigned C : {
'C',
'P',
'C',
'H'})
5240 return llvm::createStringError(
5241 std::errc::illegal_byte_sequence,
5242 "file doesn't start with precompiled file magic");
5244 return Res.takeError();
5245 return llvm::Error::success();
5260 llvm_unreachable(
"unknown module kind");
5266 off_t ExpectedSize, time_t ExpectedModTime,
5268 auto Result = ModuleMgr.addModule(
5273 switch (
Result.getKind()) {
5275 Diag(diag::remark_module_import)
5277 << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
5292 Diag(diag::err_ast_file_not_found)
5294 if (!
Result.getBufferError().empty())
5295 Diag(diag::note_ast_file_buffer_failed) <<
Result.getBufferError();
5305 Diag(diag::err_ast_file_out_of_date)
5307 for (
const auto &
C :
Result.getChanges()) {
5308 Diag(diag::note_fe_ast_file_modified)
5309 <<
C.Kind << (
C.Old &&
C.New) << llvm::itostr(
C.Old.value_or(0))
5310 << llvm::itostr(
C.New.value_or(0));
5312 Diag(diag::note_ast_file_input_files_validation_status)
5313 <<
Result.getValidationStatus();
5314 if (!
Result.getSignatureError().empty())
5315 Diag(diag::note_ast_file_signature_failed) <<
Result.getSignatureError();
5319 llvm_unreachable(
"Unexpected value from adding module.");
5322 assert(M &&
"Missing module file");
5324 bool ShouldFinalizePCM =
false;
5325 llvm::scope_exit FinalizeOrDropPCM([&]() {
5327 if (ShouldFinalizePCM)
5333 BitstreamCursor &Stream = F.
Stream;
5334 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
5335 F.SizeInBits = F.Buffer->getBufferSize() * 8;
5339 Diag(diag::err_ast_file_invalid)
5345 bool HaveReadControlBlock =
false;
5349 Error(MaybeEntry.takeError());
5352 llvm::BitstreamEntry Entry = MaybeEntry.get();
5354 switch (Entry.Kind) {
5355 case llvm::BitstreamEntry::Error:
5356 case llvm::BitstreamEntry::Record:
5357 case llvm::BitstreamEntry::EndBlock:
5358 Error(
"invalid record at top-level of AST file");
5361 case llvm::BitstreamEntry::SubBlock:
5367 HaveReadControlBlock =
true;
5368 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
5376 F.ModuleName.empty()) {
5395 if (!HaveReadControlBlock) {
5397 Diag(diag::err_ast_file_version_too_old)
5404 ShouldFinalizePCM =
true;
5408 if (llvm::Error Err = Stream.SkipBlock()) {
5409 Error(std::move(Err));
5416 llvm_unreachable(
"unexpected break; expected return");
5420ASTReader::readUnhashedControlBlock(
ModuleFile &F,
bool WasImportedBy,
5421 unsigned ClientLoadCapabilities) {
5423 PP.getHeaderSearchInfo().getHeaderSearchOpts();
5424 bool AllowCompatibleConfigurationMismatch =
5426 bool DisableValidation = shouldDisableValidationForFile(F);
5428 ASTReadResult
Result = readUnhashedControlBlockImpl(
5430 AllowCompatibleConfigurationMismatch, Listener.get(),
5435 if (DisableValidation || WasImportedBy ||
5436 (AllowConfigurationMismatch &&
Result == ConfigurationMismatch))
5440 Error(
"malformed block record in AST file");
5463 if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
5465 Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
5474 ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
5475 unsigned ClientLoadCapabilities,
bool AllowCompatibleConfigurationMismatch,
5476 ASTReaderListener *Listener,
bool ValidateDiagnosticOptions) {
5478 BitstreamCursor Stream(StreamData);
5483 consumeError(std::move(Err));
5495 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5498 consumeError(MaybeEntry.takeError());
5501 llvm::BitstreamEntry Entry = MaybeEntry.get();
5503 switch (Entry.Kind) {
5504 case llvm::BitstreamEntry::Error:
5505 case llvm::BitstreamEntry::SubBlock:
5508 case llvm::BitstreamEntry::EndBlock:
5511 case llvm::BitstreamEntry::Record:
5519 Expected<unsigned> MaybeRecordType =
5520 Stream.readRecord(Entry.ID,
Record, &Blob);
5521 if (!MaybeRecordType) {
5530 "Dummy AST file signature not backpatched in ASTWriter.");
5537 "Dummy AST block hash not backpatched in ASTWriter.");
5541 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
5542 if (Listener && ValidateDiagnosticOptions &&
5543 !AllowCompatibleConfigurationMismatch &&
5544 ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
5549 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
5550 if (Listener && !AllowCompatibleConfigurationMismatch &&
5551 ParseHeaderSearchPaths(
Record, Complain, *Listener))
5552 Result = ConfigurationMismatch;
5581 if (
Record.size() < 4)
return true;
5586 unsigned BlockNameLen =
Record[2];
5587 unsigned UserInfoLen =
Record[3];
5589 if (BlockNameLen + UserInfoLen > Blob.size())
return true;
5591 Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
5592 Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
5593 Blob.data() + BlockNameLen + UserInfoLen);
5597llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
5598 BitstreamCursor &Stream = F.
Stream;
5602 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5604 return MaybeEntry.takeError();
5605 llvm::BitstreamEntry Entry = MaybeEntry.get();
5607 switch (Entry.Kind) {
5608 case llvm::BitstreamEntry::SubBlock:
5609 if (llvm::Error Err = Stream.SkipBlock())
5612 case llvm::BitstreamEntry::EndBlock:
5613 return llvm::Error::success();
5614 case llvm::BitstreamEntry::Error:
5615 return llvm::createStringError(std::errc::illegal_byte_sequence,
5616 "malformed block record in AST file");
5617 case llvm::BitstreamEntry::Record:
5623 Expected<unsigned> MaybeRecCode =
5624 Stream.readRecord(Entry.ID,
Record, &Blob);
5626 return MaybeRecCode.takeError();
5627 switch (MaybeRecCode.get()) {
5629 ModuleFileExtensionMetadata Metadata;
5631 return llvm::createStringError(
5632 std::errc::illegal_byte_sequence,
5633 "malformed EXTENSION_METADATA in AST file");
5636 auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
5637 if (Known == ModuleFileExtensions.end())
break;
5640 if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
5650 llvm_unreachable(
"ReadExtensionBlock should return from while loop");
5654 assert(ContextObj &&
"no context to initialize");
5658 if (DeserializationListener)
5659 DeserializationListener->DeclRead(
5661 Context.getTranslationUnitDecl());
5669 if (!Context.CFConstantStringTypeDecl)
5670 Context.setCFConstantStringType(
GetType(String));
5675 if (FileType.isNull()) {
5676 Error(
"FILE type is NULL");
5680 if (!Context.FILEDecl) {
5682 Context.setFILEDecl(
Typedef->getDecl());
5684 const TagType *Tag = FileType->getAs<TagType>();
5686 Error(
"Invalid FILE type in AST file");
5689 Context.setFILEDecl(Tag->getDecl());
5696 if (Jmp_bufType.
isNull()) {
5697 Error(
"jmp_buf type is NULL");
5701 if (!Context.jmp_bufDecl) {
5703 Context.setjmp_bufDecl(
Typedef->getDecl());
5705 const TagType *Tag = Jmp_bufType->
getAs<TagType>();
5707 Error(
"Invalid jmp_buf type in AST file");
5710 Context.setjmp_bufDecl(Tag->getDecl());
5717 if (Sigjmp_bufType.
isNull()) {
5718 Error(
"sigjmp_buf type is NULL");
5722 if (!Context.sigjmp_bufDecl) {
5724 Context.setsigjmp_bufDecl(
Typedef->getDecl());
5726 const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
5727 assert(Tag &&
"Invalid sigjmp_buf type in AST file");
5728 Context.setsigjmp_bufDecl(Tag->getDecl());
5734 if (Context.ObjCIdRedefinitionType.isNull())
5735 Context.ObjCIdRedefinitionType =
GetType(ObjCIdRedef);
5738 if (
TypeID ObjCClassRedef =
5740 if (Context.ObjCClassRedefinitionType.isNull())
5741 Context.ObjCClassRedefinitionType =
GetType(ObjCClassRedef);
5744 if (
TypeID ObjCSelRedef =
5746 if (Context.ObjCSelRedefinitionType.isNull())
5747 Context.ObjCSelRedefinitionType =
GetType(ObjCSelRedef);
5752 if (Ucontext_tType.
isNull()) {
5753 Error(
"ucontext_t type is NULL");
5757 if (!Context.ucontext_tDecl) {
5759 Context.setucontext_tDecl(
Typedef->getDecl());
5761 const TagType *Tag = Ucontext_tType->
getAs<TagType>();
5762 assert(Tag &&
"Invalid ucontext_t type in AST file");
5763 Context.setucontext_tDecl(Tag->getDecl());
5772 if (!CUDASpecialDeclRefs.empty()) {
5773 assert(CUDASpecialDeclRefs.size() == 3 &&
"More decl refs than expected!");
5774 Context.setcudaConfigureCallDecl(
5775 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[0])));
5776 Context.setcudaGetParameterBufferDecl(
5777 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[1])));
5778 Context.setcudaLaunchDeviceDecl(
5779 cast_or_null<FunctionDecl>(
GetDecl(CUDASpecialDeclRefs[2])));
5784 for (
auto &Import : PendingImportedModules) {
5788 if (Import.ImportLoc.isValid())
5789 PP.makeModuleVisible(Imported, Import.ImportLoc);
5796 PendingImportedModulesSema.append(PendingImportedModules);
5797 PendingImportedModules.clear();
5807 BitstreamCursor Stream(
PCH);
5810 consumeError(std::move(Err));
5822 Stream.advanceSkippingSubblocks();
5825 consumeError(MaybeEntry.takeError());
5828 llvm::BitstreamEntry Entry = MaybeEntry.get();
5830 if (Entry.Kind != llvm::BitstreamEntry::Record)
5838 consumeError(MaybeRecord.takeError());
5844 "Dummy AST file signature not backpatched in ASTWriter.");
5854 const std::string &ASTFileName,
FileManager &FileMgr,
5857 auto Buffer = FileMgr.getBufferForFile(ASTFileName,
false,
5862 Diags.Report(diag::err_fe_unable_to_read_pch_file)
5863 << ASTFileName << Buffer.getError().message();
5864 return std::string();
5868 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
5872 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
5873 return std::string();
5878 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5879 return std::string();
5886 Stream.advanceSkippingSubblocks();
5889 consumeError(MaybeEntry.takeError());
5890 return std::string();
5892 llvm::BitstreamEntry Entry = MaybeEntry.get();
5894 if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
5895 return std::string();
5897 if (Entry.Kind != llvm::BitstreamEntry::Record) {
5898 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
5899 return std::string();
5907 consumeError(MaybeRecord.takeError());
5908 return std::string();
5923 std::string ExistingSpecificModuleCachePath;
5925 bool StrictOptionMatches;
5928 SimplePCHValidator(
const LangOptions &ExistingLangOpts,
5933 StringRef ExistingSpecificModuleCachePath,
5935 : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
5936 ExistingTargetOpts(ExistingTargetOpts),
5937 ExistingPPOpts(ExistingPPOpts), ExistingHSOpts(ExistingHSOpts),
5938 ExistingSpecificModuleCachePath(ExistingSpecificModuleCachePath),
5941 bool ReadLanguageOptions(
const LangOptions &LangOpts,
5942 StringRef ModuleFilename,
bool Complain,
5943 bool AllowCompatibleDifferences)
override {
5945 nullptr, AllowCompatibleDifferences);
5948 bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
5949 StringRef ModuleFilename,
bool Complain,
5950 bool AllowCompatibleDifferences)
override {
5952 nullptr, AllowCompatibleDifferences);
5955 bool ReadTargetOptions(
const TargetOptions &TargetOpts,
5956 StringRef ModuleFilename,
bool Complain,
5957 bool AllowCompatibleDifferences)
override {
5959 nullptr, AllowCompatibleDifferences);
5962 bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
5963 StringRef ASTFilename, StringRef ContextHash,
5964 bool Complain)
override {
5966 FileMgr, ContextHash, ExistingSpecificModuleCachePath, ASTFilename,
5967 nullptr, ExistingLangOpts, ExistingPPOpts, ExistingHSOpts, HSOpts);
5970 bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
5971 StringRef ModuleFilename,
bool ReadMacros,
5973 std::string &SuggestedPredefines)
override {
5975 PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
nullptr,
5976 FileMgr, SuggestedPredefines, ExistingLangOpts,
5988 unsigned ClientLoadCapabilities) {
5992 std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
5993 llvm::MemoryBuffer *Buffer =
6002 auto Entry = Filename ==
"-" ? FileMgr.getSTDIN()
6003 : FileMgr.getFileRef(Filename,
6008 llvm::consumeError(Entry.takeError());
6012 FileMgr.getBufferForFile(*Entry,
6019 OwnedBuffer = std::move(*BufferOrErr);
6020 Buffer = OwnedBuffer.get();
6024 StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
6025 BitstreamCursor Stream(Bytes);
6029 consumeError(std::move(Err));
6037 bool NeedsInputFiles = Listener.needsInputFileVisitation();
6038 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
6039 bool NeedsImports = Listener.needsImportVisitation();
6040 BitstreamCursor InputFilesCursor;
6041 uint64_t InputFilesOffsetBase = 0;
6044 std::string ModuleDir;
6045 bool DoneWithControlBlock =
false;
6047 PathBuf.reserve(256);
6052 AdditionalPathBuf.reserve(256);
6053 while (!DoneWithControlBlock) {
6057 consumeError(MaybeEntry.takeError());
6060 llvm::BitstreamEntry Entry = MaybeEntry.get();
6062 switch (Entry.Kind) {
6063 case llvm::BitstreamEntry::SubBlock: {
6066 std::string IgnoredSuggestedPredefines;
6067 if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
6069 Listener, IgnoredSuggestedPredefines) !=
Success)
6075 InputFilesCursor = Stream;
6076 if (llvm::Error Err = Stream.SkipBlock()) {
6078 consumeError(std::move(Err));
6081 if (NeedsInputFiles &&
6084 InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
6088 if (llvm::Error Err = Stream.SkipBlock()) {
6090 consumeError(std::move(Err));
6099 case llvm::BitstreamEntry::EndBlock:
6100 DoneWithControlBlock =
true;
6103 case llvm::BitstreamEntry::Error:
6106 case llvm::BitstreamEntry::Record:
6110 if (DoneWithControlBlock)
break;
6115 Stream.readRecord(Entry.ID,
Record, &Blob);
6116 if (!MaybeRecCode) {
6124 if (Listener.ReadFullVersionInformation(Blob))
6128 Listener.ReadModuleName(Blob);
6131 ModuleDir = std::string(Blob);
6137 Listener.ReadModuleMapFile(*Path);
6141 if (!NeedsInputFiles)
6144 unsigned NumInputFiles =
Record[0];
6145 unsigned NumUserFiles =
Record[1];
6146 const llvm::support::unaligned_uint64_t *InputFileOffs =
6147 (
const llvm::support::unaligned_uint64_t *)Blob.data();
6148 for (
unsigned I = 0; I != NumInputFiles; ++I) {
6150 bool isSystemFile = I >= NumUserFiles;
6152 if (isSystemFile && !NeedsSystemInputFiles)
6155 BitstreamCursor &Cursor = InputFilesCursor;
6157 if (llvm::Error Err =
6158 Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
6160 consumeError(std::move(Err));
6166 consumeError(MaybeCode.takeError());
6168 unsigned Code = MaybeCode.get();
6172 bool shouldContinue =
false;
6174 Cursor.readRecord(Code,
Record, &Blob);
6175 if (!MaybeRecordType) {
6177 consumeError(MaybeRecordType.takeError());
6183 time_t StoredTime =
static_cast<time_t
>(
Record[2]);
6184 bool Overridden =
static_cast<bool>(
Record[3]);
6185 auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
6188 PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
6190 if (UnresolvedFilename.empty())
6191 Filename = *FilenameAsRequestedBuf;
6194 AdditionalPathBuf, UnresolvedFilename, ModuleDir);
6195 Filename = *FilenameBuf;
6197 shouldContinue = Listener.visitInputFileAsRequested(
6198 *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
6202 if (!shouldContinue)
6223 bool IsStandardCXXModule =
Record[Idx++];
6227 if (IsStandardCXXModule) {
6228 Listener.visitImport(ModuleName,
"");
6239 Listener.visitImport(ModuleName, *Filename);
6250 if (FindModuleFileExtensions) {
6251 BitstreamCursor SavedStream = Stream;
6253 bool DoneWithExtensionBlock =
false;
6254 while (!DoneWithExtensionBlock) {
6260 llvm::BitstreamEntry Entry = MaybeEntry.get();
6262 switch (Entry.Kind) {
6263 case llvm::BitstreamEntry::SubBlock:
6264 if (llvm::Error Err = Stream.SkipBlock()) {
6266 consumeError(std::move(Err));
6271 case llvm::BitstreamEntry::EndBlock:
6272 DoneWithExtensionBlock =
true;
6275 case llvm::BitstreamEntry::Error:
6278 case llvm::BitstreamEntry::Record:
6285 Stream.readRecord(Entry.ID,
Record, &Blob);
6286 if (!MaybeRecCode) {
6290 switch (MaybeRecCode.get()) {
6296 Listener.readModuleFileExtension(Metadata);
6302 Stream = std::move(SavedStream);
6306 if (readUnhashedControlBlockImpl(
6307 nullptr, Bytes, Filename, ClientLoadCapabilities,
6309 ValidateDiagnosticOptions) !=
Success)
6320 StringRef SpecificModuleCachePath,
bool RequireStrictOptionMatches) {
6321 SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts, HSOpts,
6322 SpecificModuleCachePath, FileMgr,
6323 RequireStrictOptionMatches);
6331 assert(GlobalID == 0 &&
"Unhandled global submodule ID");
6336 if (GlobalIndex >= SubmodulesLoaded.size()) {
6337 Error(
"submodule ID out of range in AST file");
6341 if (SubmodulesLoaded[GlobalIndex])
6342 return SubmodulesLoaded[GlobalIndex];
6345 assert(It != GlobalSubmoduleMap.end());
6348 [[maybe_unused]]
unsigned LocalID =
6355 Error(std::move(Err));
6359 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
6364 auto CreateModule = !KnowsTopLevelModule
6368 Module *CurrentModule =
nullptr;
6373 Error(MaybeEntry.takeError());
6376 llvm::BitstreamEntry Entry = MaybeEntry.get();
6378 switch (Entry.Kind) {
6379 case llvm::BitstreamEntry::SubBlock:
6380 case llvm::BitstreamEntry::Error:
6381 case llvm::BitstreamEntry::EndBlock: {
6382 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6383 "malformed block record in AST file"));
6386 case llvm::BitstreamEntry::Record:
6396 Error(MaybeKind.takeError());
6403 if (!CurrentModule) {
6404 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6405 "malformed module definition"));
6408 return CurrentModule;
6411 if (
Record.size() < 13) {
6412 Error(llvm::createStringError(std::errc::illegal_byte_sequence,
6413 "malformed module definition"));
6417 StringRef Name = Blob;
6419 [[maybe_unused]]
unsigned ReadLocalID =
Record[Idx++];
6420 assert(LocalID == ReadLocalID);
6426 bool IsFramework =
Record[Idx++];
6427 bool IsExplicit =
Record[Idx++];
6428 bool IsSystem =
Record[Idx++];
6429 bool IsExternC =
Record[Idx++];
6430 bool InferSubmodules =
Record[Idx++];
6431 bool InferExplicitSubmodules =
Record[Idx++];
6432 bool InferExportWildcard =
Record[Idx++];
6433 bool ConfigMacrosExhaustive =
Record[Idx++];
6434 bool ModuleMapIsPrivate =
Record[Idx++];
6435 bool NamedModuleHasInit =
Record[Idx++];
6437 Module *ParentModule =
nullptr;
6444 CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
6445 IsFramework, IsExplicit);
6447 if (!ParentModule) {
6451 if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
6453 assert(*CurFileKey != F.
FileKey &&
6454 "ModuleManager did not de-duplicate");
6456 Diag(diag::err_module_file_conflict)
6460 auto CurModMapFile =
6462 auto ModMapFile = FileMgr.getOptionalFileRef(F.
ModuleMapPath);
6463 if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
6464 Diag(diag::note_module_file_conflict)
6465 << CurModMapFile->getName() << ModMapFile->getName();
6476 CurrentModule->
Kind = Kind;
6486 if (InferredAllowedBy.
isValid())
6498 if (
auto Dir = FileMgr.getOptionalDirectoryRef(F.
BaseDirectory))
6500 }
else if (ParentModule && ParentModule->
Directory) {
6505 if (DeserializationListener)
6506 DeserializationListener->ModuleRead(GlobalID, CurrentModule);
6508 SubmodulesLoaded[GlobalIndex] = CurrentModule;
6532 CurrentModule, Blob.str(), RelativePathName)) {
6568 PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
6578 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6585 for (
unsigned Idx = 0; Idx !=
Record.size(); ++Idx) {
6593 for (
unsigned Idx = 0; Idx + 1 <
Record.size(); Idx += 2) {
6595 bool IsWildcard =
Record[Idx + 1];
6598 if (ExportedMod || IsWildcard)
6599 CurrentModule->
Exports.push_back({ExportedMod, IsWildcard});
6609 PP.getTargetInfo());
6626 Conflict.
Message = Blob.str();
6627 CurrentModule->
Conflicts.push_back(Conflict);
6637 for (
unsigned I = 0; I <
Record.size(); )
6639 ContextObj->addLazyModuleInitializers(CurrentModule,
Inits);
6666bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
6667 StringRef ModuleFilename,
bool Complain,
6669 bool AllowCompatibleDifferences) {
6673#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
6674 LangOpts.Name = Record[Idx++];
6675#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
6676 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++]));
6677#include "clang/Basic/LangOptions.def"
6678#define SANITIZER(NAME, ID) \
6679 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]);
6680#include "clang/Basic/Sanitizers.def"
6682 for (
unsigned N =
Record[Idx++]; N; --N)
6686 VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
6692 for (
unsigned N =
Record[Idx++]; N; --N) {
6694 ReadString(
Record, Idx));
6699 for (
unsigned N =
Record[Idx++]; N; --N) {
6706 AllowCompatibleDifferences);
6709bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
6710 StringRef ModuleFilename,
bool Complain,
6711 ASTReaderListener &Listener,
6712 bool AllowCompatibleDifferences) {
6714 CodeGenOptions CGOpts;
6716#define CODEGENOPT(Name, Bits, Default, Compatibility) \
6717 if constexpr (CK::Compatibility != CK::Benign) \
6718 CGOpts.Name = static_cast<unsigned>(Record[Idx++]);
6719#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
6720 if constexpr (CK::Compatibility != CK::Benign) \
6721 CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++]));
6722#define DEBUGOPT(Name, Bits, Default, Compatibility)
6723#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
6724#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
6725#include "clang/Basic/CodeGenOptions.def"
6728 AllowCompatibleDifferences);
6731bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
6732 StringRef ModuleFilename,
bool Complain,
6733 ASTReaderListener &Listener,
6734 bool AllowCompatibleDifferences) {
6736 TargetOptions TargetOpts;
6738 TargetOpts.
CPU = ReadString(
Record, Idx);
6740 TargetOpts.
ABI = ReadString(
Record, Idx);
6741 for (
unsigned N =
Record[Idx++]; N; --N) {
6744 for (
unsigned N =
Record[Idx++]; N; --N) {
6749 AllowCompatibleDifferences);
6752bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
6753 StringRef ModuleFilename,
bool Complain,
6754 ASTReaderListener &Listener) {
6755 DiagnosticOptions DiagOpts;
6757#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++];
6758#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
6759 DiagOpts.set##Name(static_cast<Type>(Record[Idx++]));
6760#include "clang/Basic/DiagnosticOptions.def"
6762 for (
unsigned N =
Record[Idx++]; N; --N)
6764 for (
unsigned N =
Record[Idx++]; N; --N)
6770bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record,
bool Complain,
6771 ASTReaderListener &Listener) {
6772 FileSystemOptions FSOpts;
6778bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
6779 StringRef ModuleFilename,
6781 ASTReaderListener &Listener) {
6782 HeaderSearchOptions HSOpts;
6797 std::string ContextHash = ReadString(
Record, Idx);
6803bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record,
bool Complain,
6804 ASTReaderListener &Listener) {
6805 HeaderSearchOptions HSOpts;
6809 for (
unsigned N =
Record[Idx++]; N; --N) {
6810 std::string Path = ReadString(
Record, Idx);
6813 bool IsFramework =
Record[Idx++];
6814 bool IgnoreSysRoot =
Record[Idx++];
6815 HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
6820 for (
unsigned N =
Record[Idx++]; N; --N) {
6821 std::string Prefix = ReadString(
Record, Idx);
6822 bool IsSystemHeader =
Record[Idx++];
6827 for (
unsigned N =
Record[Idx++]; N; --N) {
6828 std::string VFSOverlayFile = ReadString(
Record, Idx);
6835bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
6836 StringRef ModuleFilename,
6838 ASTReaderListener &Listener,
6839 std::string &SuggestedPredefines) {
6840 PreprocessorOptions PPOpts;
6844 bool ReadMacros =
Record[Idx++];
6846 for (
unsigned N =
Record[Idx++]; N; --N) {
6848 bool IsUndef =
Record[Idx++];
6849 PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
6854 for (
unsigned N =
Record[Idx++]; N; --N) {
6859 for (
unsigned N =
Record[Idx++]; N; --N) {
6868 SuggestedPredefines.clear();
6870 Complain, SuggestedPredefines);
6873std::pair<ModuleFile *, unsigned>
6874ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
6875 GlobalPreprocessedEntityMapType::iterator
6876 I = GlobalPreprocessedEntityMap.find(GlobalIndex);
6877 assert(I != GlobalPreprocessedEntityMap.end() &&
6878 "Corrupted global preprocessed entity map");
6881 return std::make_pair(M, LocalIndex);
6884llvm::iterator_range<PreprocessingRecord::iterator>
6885ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
const {
6886 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
6890 return llvm::make_range(PreprocessingRecord::iterator(),
6891 PreprocessingRecord::iterator());
6894bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
6895 unsigned int ClientLoadCapabilities) {
6896 return ClientLoadCapabilities & ARR_OutOfDate &&
6899 .getInMemoryModuleCache()
6900 .isPCMFinal(ModuleFileName);
6903llvm::iterator_range<ASTReader::ModuleDeclIterator>
6905 return llvm::make_range(
6912 auto I = GlobalSkippedRangeMap.find(GlobalIndex);
6913 assert(I != GlobalSkippedRangeMap.end() &&
6914 "Corrupted global skipped range map");
6917 assert(LocalIndex < M->NumPreprocessedSkippedRanges);
6921 assert(Range.isValid());
6927 unsigned ModuleFileIndex = ID >> 32;
6928 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
6929 assert(getModuleManager().size() > ModuleFileIndex - 1);
6930 ModuleFile &MF = getModuleManager()[ModuleFileIndex - 1];
6932 ID &= llvm::maskTrailingOnes<PreprocessedEntityID>(32);
6937 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
6939 unsigned LocalIndex = PPInfo.second;
6944 if (!PP.getPreprocessingRecord()) {
6945 Error(
"no preprocessing record");
6952 Error(std::move(Err));
6959 Error(MaybeEntry.takeError());
6962 llvm::BitstreamEntry Entry = MaybeEntry.get();
6964 if (Entry.Kind != llvm::BitstreamEntry::Record)
6975 if (!MaybeRecType) {
6976 Error(MaybeRecType.takeError());
6981 bool isBuiltin =
Record[0];
6989 unsigned Index = translatePreprocessedEntityIDToIndex(GlobalID);
7009 if (DeserializationListener)
7010 DeserializationListener->MacroDefinitionRead(PPID, MD);
7016 const char *FullFileNameStart = Blob.data() +
Record[0];
7017 StringRef FullFileName(FullFileNameStart, Blob.size() -
Record[0]);
7019 if (!FullFileName.empty())
7020 File = PP.getFileManager().getOptionalFileRef(FullFileName);
7027 StringRef(Blob.data(),
Record[0]),
7035 llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
7044unsigned ASTReader::findNextPreprocessedEntity(
7045 GlobalSLocOffsetMapType::const_iterator SLocMapI)
const {
7047 for (GlobalSLocOffsetMapType::const_iterator
7048 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
7054 return getTotalNumPreprocessedEntities();
7059struct PPEntityComp {
7060 const ASTReader &Reader;
7063 PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
7065 bool operator()(
const PPEntityOffset &L,
const PPEntityOffset &R)
const {
7066 SourceLocation LHS = getLoc(L);
7067 SourceLocation RHS = getLoc(R);
7071 bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
const {
7072 SourceLocation LHS = getLoc(L);
7076 bool operator()(SourceLocation LHS,
const PPEntityOffset &R)
const {
7077 SourceLocation RHS = getLoc(R);
7081 SourceLocation getLoc(
const PPEntityOffset &PPE)
const {
7088unsigned ASTReader::findPreprocessedEntity(SourceLocation Loc,
7089 bool EndsAfter)
const {
7090 if (SourceMgr.isLocalSourceLocation(Loc))
7091 return getTotalNumPreprocessedEntities();
7093 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
7094 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
7095 assert(SLocMapI != GlobalSLocOffsetMap.end() &&
7096 "Corrupted global sloc offset map");
7098 if (SLocMapI->second->NumPreprocessedEntities == 0)
7099 return findNextPreprocessedEntity(SLocMapI);
7110 pp_iterator
First = pp_begin;
7114 PPI = std::upper_bound(pp_begin, pp_end, Loc,
7115 PPEntityComp(*
this, M));
7124 std::advance(PPI,
Half);
7125 if (SourceMgr.isBeforeInTranslationUnit(
7126 ReadSourceLocation(M, PPI->getEnd()), Loc)) {
7129 Count = Count -
Half - 1;
7136 return findNextPreprocessedEntity(SLocMapI);
7143std::pair<unsigned, unsigned>
7145 if (Range.isInvalid())
7146 return std::make_pair(0,0);
7147 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
7149 unsigned BeginID = findPreprocessedEntity(Range.getBegin(),
false);
7150 unsigned EndID = findPreprocessedEntity(Range.getEnd(),
true);
7151 return std::make_pair(BeginID, EndID);
7161 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
7163 unsigned LocalIndex = PPInfo.second;
7170 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
7179 class HeaderFileInfoVisitor {
7181 std::optional<HeaderFileInfo> HFI;
7184 explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
7193 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
7194 if (Pos == Table->end())
7201 std::optional<HeaderFileInfo> getHeaderFileInfo()
const {
return HFI; }
7207 HeaderFileInfoVisitor Visitor(FE);
7208 ModuleMgr.visit(Visitor);
7209 if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
7216 using DiagState = DiagnosticsEngine::DiagState;
7227 auto ReadDiagState = [&](
const DiagState &BasedOn,
7228 bool IncludeNonPragmaStates) {
7229 unsigned BackrefID =
Record[Idx++];
7231 return DiagStates[BackrefID - 1];
7234 Diag.DiagStates.push_back(BasedOn);
7235 DiagState *NewState = &
Diag.DiagStates.back();
7236 DiagStates.push_back(NewState);
7237 unsigned Size =
Record[Idx++];
7238 assert(Idx + Size * 2 <=
Record.size() &&
7239 "Invalid data, not enough diag/map pairs");
7241 unsigned DiagID =
Record[Idx++];
7244 if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
7257 Mapping = NewMapping;
7263 DiagState *FirstState;
7268 FirstState =
Diag.DiagStatesByLoc.FirstDiagState;
7269 DiagStates.push_back(FirstState);
7273 "Invalid data, unexpected backref in initial state");
7275 assert(Idx <
Record.size() &&
7276 "Invalid data, not enough state change pairs in initial state");
7281 unsigned Flags =
Record[Idx++];
7282 DiagState Initial(*
Diag.getDiagnosticIDs());
7283 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
7284 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
7285 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
7286 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
7287 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
7289 FirstState = ReadDiagState(Initial,
true);
7297 .StateTransitions.push_back({FirstState, 0});
7302 FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState,
false);
7306 unsigned NumLocations =
Record[Idx++];
7307 while (NumLocations--) {
7308 assert(Idx <
Record.size() &&
7309 "Invalid data, missing pragma diagnostic states");
7311 assert(FID.
isValid() &&
"invalid FileID for transition");
7312 unsigned Transitions =
Record[Idx++];
7318 auto &F =
Diag.DiagStatesByLoc.Files[FID];
7319 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
7320 for (
unsigned I = 0; I != Transitions; ++I) {
7321 unsigned Offset =
Record[Idx++];
7322 auto *State = ReadDiagState(*FirstState,
false);
7323 F.StateTransitions.push_back({State, Offset});
7328 assert(Idx <
Record.size() &&
7329 "Invalid data, missing final pragma diagnostic state");
7331 auto *CurState = ReadDiagState(*FirstState,
false);
7334 Diag.DiagStatesByLoc.CurDiagState = CurState;
7335 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
7340 auto &
T =
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
7342 T.push_back({CurState, 0});
7344 T[0].State = CurState;
7350 assert(Idx <
Record.size() &&
7351 "Invalid data, missing diagnostic push stack");
7352 unsigned NumPushes =
Record[Idx++];
7353 for (
unsigned I = 0; I != NumPushes; ++I) {
7354 auto *State = ReadDiagState(*FirstState,
false);
7356 Diag.DiagStateOnPushStack.push_back(State);
7365ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
7366 auto [M, Index] = translateTypeIDToIndex(ID);
7373#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
7374 case TYPE_##CODE_ID: return Type::CLASS_ID;
7375#include "clang/Serialization/TypeBitCodes.def"
7377 return std::nullopt;
7387QualType ASTReader::readTypeRecord(
TypeID ID) {
7388 assert(ContextObj &&
"reading type with no AST context");
7389 ASTContext &Context = *ContextObj;
7390 RecordLocation Loc = TypeCursorForIndex(ID);
7391 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
7395 SavedStreamPosition SavedPosition(DeclsCursor);
7397 ReadingKindTracker ReadingKind(Read_Type, *
this);
7400 Deserializing AType(
this);
7402 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
7403 Error(std::move(Err));
7406 Expected<unsigned> RawCode = DeclsCursor.ReadCode();
7408 Error(RawCode.takeError());
7412 ASTRecordReader
Record(*
this, *Loc.F);
7413 Expected<unsigned> Code =
Record.readRecord(DeclsCursor, RawCode.get());
7415 Error(Code.takeError());
7419 QualType baseType =
Record.readQualType();
7420 Qualifiers quals =
Record.readQualifiers();
7426 Error(
"Unexpected code for type");
7430 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
7431 return TypeReader.read(*maybeClass);
7439 SourceLocation readSourceLocation() {
return Reader.readSourceLocation(); }
7440 SourceRange readSourceRange() {
return Reader.readSourceRange(); }
7443 return Reader.readTypeSourceInfo();
7447 return Reader.readNestedNameSpecifierLoc();
7451 return Reader.readAttr();
7460#define ABSTRACT_TYPELOC(CLASS, PARENT)
7461#define TYPELOC(CLASS, PARENT) \
7462 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
7463#include "clang/AST/TypeLocNodes.def"
7472void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
7476void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
7486void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
7490void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
7494void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
7498void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
7502void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
7506void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
7510void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
7514void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
7518void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
7522void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
7530 if (Reader.readBool())
7537 VisitArrayTypeLoc(TL);
7541 VisitArrayTypeLoc(TL);
7544void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
7545 VisitArrayTypeLoc(TL);
7548void TypeLocReader::VisitDependentSizedArrayTypeLoc(
7549 DependentSizedArrayTypeLoc TL) {
7550 VisitArrayTypeLoc(TL);
7553void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
7554 DependentAddressSpaceTypeLoc TL) {
7561void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
7562 DependentSizedExtVectorTypeLoc TL) {
7566void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
7570void TypeLocReader::VisitDependentVectorTypeLoc(
7571 DependentVectorTypeLoc TL) {
7575void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
7579void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
7586void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
7587 DependentSizedMatrixTypeLoc TL) {
7600 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
7606 VisitFunctionTypeLoc(TL);
7610 VisitFunctionTypeLoc(TL);
7613void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
7614 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7615 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7616 SourceLocation NameLoc = readSourceLocation();
7617 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7620void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
7621 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7622 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7623 SourceLocation NameLoc = readSourceLocation();
7624 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7627void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
7628 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7629 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7630 SourceLocation NameLoc = readSourceLocation();
7631 TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
7634void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
7640void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
7647void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
7652void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
7656void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
7670 getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
7675void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
7677 if (Reader.readBool())
7679 if (Reader.readBool())
7683void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
7697 VisitTagTypeLoc(TL);
7701 VisitTagTypeLoc(TL);
7704void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
7706void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
7710void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
7714void TypeLocReader::VisitLateParsedAttrTypeLoc(LateParsedAttrTypeLoc TL) {
7716 "should be replaced with a concrete type before serialization");
7719void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
7723void TypeLocReader::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
7727void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
7728 HLSLAttributedResourceTypeLoc TL) {
7732void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
7736void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
7740void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
7741 SubstTemplateTypeParmTypeLoc TL) {
7745void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
7746 SubstTemplateTypeParmPackTypeLoc TL) {
7750void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
7751 SubstBuiltinTemplatePackTypeLoc TL) {
7755void TypeLocReader::VisitTemplateSpecializationTypeLoc(
7756 TemplateSpecializationTypeLoc TL) {
7757 SourceLocation ElaboratedKeywordLoc = readSourceLocation();
7758 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
7759 SourceLocation TemplateKeywordLoc = readSourceLocation();
7760 SourceLocation NameLoc = readSourceLocation();
7761 SourceLocation LAngleLoc = readSourceLocation();
7762 SourceLocation RAngleLoc = readSourceLocation();
7763 TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
7764 LAngleLoc, RAngleLoc);
7765 MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
7766 for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
7767 Args[I] = Reader.readTemplateArgumentLocInfo(
7768 TL.
getTypePtr()->template_arguments()[I].getKind());
7771void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
7776void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
7782void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
7786void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
7791void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
7800void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
7812void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
7816void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
7822void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
7826void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
7830void TypeLocReader::VisitDependentBitIntTypeLoc(
7831 clang::DependentBitIntTypeLoc TL) {
7835void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
7869std::pair<ModuleFile *, unsigned>
7872 "Predefined type shouldn't be in TypesLoaded");
7874 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
7876 ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
7877 assert(OwningModuleFile &&
7878 "untranslated type ID or local type ID shouldn't be in TypesLoaded");
7880 return {OwningModuleFile,
7885 assert(ContextObj &&
"reading type with no AST context");
7896 llvm_unreachable(
"Invalid predefined type");
7912 T = Context.UnsignedCharTy;
7915 T = Context.UnsignedShortTy;
7918 T = Context.UnsignedIntTy;
7921 T = Context.UnsignedLongTy;
7924 T = Context.UnsignedLongLongTy;
7927 T = Context.UnsignedInt128Ty;
7930 T = Context.SignedCharTy;
7933 T = Context.WCharTy;
7936 T = Context.ShortTy;
7945 T = Context.LongLongTy;
7948 T = Context.Int128Ty;
7951 T = Context.BFloat16Ty;
7957 T = Context.FloatTy;
7960 T = Context.DoubleTy;
7963 T = Context.LongDoubleTy;
7966 T = Context.ShortAccumTy;
7969 T = Context.AccumTy;
7972 T = Context.LongAccumTy;
7975 T = Context.UnsignedShortAccumTy;
7978 T = Context.UnsignedAccumTy;
7981 T = Context.UnsignedLongAccumTy;
7984 T = Context.ShortFractTy;
7987 T = Context.FractTy;
7990 T = Context.LongFractTy;
7993 T = Context.UnsignedShortFractTy;
7996 T = Context.UnsignedFractTy;
7999 T = Context.UnsignedLongFractTy;
8002 T = Context.SatShortAccumTy;
8005 T = Context.SatAccumTy;
8008 T = Context.SatLongAccumTy;
8011 T = Context.SatUnsignedShortAccumTy;
8014 T = Context.SatUnsignedAccumTy;
8017 T = Context.SatUnsignedLongAccumTy;
8020 T = Context.SatShortFractTy;
8023 T = Context.SatFractTy;
8026 T = Context.SatLongFractTy;
8029 T = Context.SatUnsignedShortFractTy;
8032 T = Context.SatUnsignedFractTy;
8035 T = Context.SatUnsignedLongFractTy;
8038 T = Context.Float16Ty;
8041 T = Context.Float128Ty;
8044 T = Context.Ibm128Ty;
8047 T = Context.OverloadTy;
8050 T = Context.UnresolvedTemplateTy;
8053 T = Context.BoundMemberTy;
8056 T = Context.PseudoObjectTy;
8059 T = Context.DependentTy;
8062 T = Context.UnknownAnyTy;
8065 T = Context.NullPtrTy;
8068 T = Context.Char8Ty;
8071 T = Context.Char16Ty;
8074 T = Context.Char32Ty;
8077 T = Context.ObjCBuiltinIdTy;
8080 T = Context.ObjCBuiltinClassTy;
8083 T = Context.ObjCBuiltinSelTy;
8085#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
8086 case PREDEF_TYPE_##Id##_ID: \
8087 T = Context.SingletonId; \
8089#include "clang/Basic/OpenCLImageTypes.def"
8090#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
8091 case PREDEF_TYPE_##Id##_ID: \
8092 T = Context.Id##Ty; \
8094#include "clang/Basic/OpenCLExtensionTypes.def"
8096 T = Context.OCLSamplerTy;
8099 T = Context.OCLEventTy;
8102 T = Context.OCLClkEventTy;
8105 T = Context.OCLQueueTy;
8108 T = Context.OCLReserveIDTy;
8111 T = Context.getAutoDeductType();
8114 T = Context.getAutoRRefDeductType();
8117 T = Context.ARCUnbridgedCastTy;
8120 T = Context.BuiltinFnTy;
8123 T = Context.IncompleteMatrixIdxTy;
8126 T = Context.ArraySectionTy;
8129 T = Context.OMPArrayShapingTy;
8132 T = Context.OMPIteratorTy;
8134#define SVE_TYPE(Name, Id, SingletonId) \
8135 case PREDEF_TYPE_##Id##_ID: \
8136 T = Context.SingletonId; \
8138#include "clang/Basic/AArch64ACLETypes.def"
8139#define PPC_VECTOR_TYPE(Name, Id, Size) \
8140 case PREDEF_TYPE_##Id##_ID: \
8141 T = Context.Id##Ty; \
8143#include "clang/Basic/PPCTypes.def"
8144#define RVV_TYPE(Name, Id, SingletonId) \
8145 case PREDEF_TYPE_##Id##_ID: \
8146 T = Context.SingletonId; \
8148#include "clang/Basic/RISCVVTypes.def"
8149#define WASM_TYPE(Name, Id, SingletonId) \
8150 case PREDEF_TYPE_##Id##_ID: \
8151 T = Context.SingletonId; \
8153#include "clang/Basic/WebAssemblyReferenceTypes.def"
8154#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
8155 case PREDEF_TYPE_##Id##_ID: \
8156 T = Context.SingletonId; \
8158#include "clang/Basic/AMDGPUTypes.def"
8159#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
8160 case PREDEF_TYPE_##Id##_ID: \
8161 T = Context.SingletonId; \
8163#include "clang/Basic/HLSLIntangibleTypes.def"
8166 assert(!
T.isNull() &&
"Unknown predefined type");
8167 return T.withFastQualifiers(FastQuals);
8170 unsigned Index = translateTypeIDToIndex(ID).second;
8172 assert(Index < TypesLoaded.size() &&
"Type index out-of-range");
8173 if (TypesLoaded[Index].isNull()) {
8174 TypesLoaded[Index] = readTypeRecord(ID);
8175 if (TypesLoaded[Index].isNull())
8178 TypesLoaded[Index]->setFromAST();
8179 if (DeserializationListener)
8181 TypesLoaded[Index]);
8184 return TypesLoaded[Index].withFastQualifiers(FastQuals);
8197 ReadModuleOffsetMap(F);
8200 LocalID &= llvm::maskTrailingOnes<TypeID>(32);
8202 if (ModuleFileIndex == 0)
8207 ModuleFileIndex = MF.
Index + 1;
8208 return ((uint64_t)ModuleFileIndex << 32) | LocalID;
8227 TemplateNameLoc, EllipsisLoc);
8238 llvm_unreachable(
"unexpected template argument loc");
8255 unsigned NumArgsAsWritten =
readInt();
8256 for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
8270 if (NumCurrentElementsDeserializing) {
8275 PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
8298 auto *II = Name.getAsIdentifierInfo();
8299 assert(II &&
"non-identifier name in C?");
8300 if (II->isOutOfDate())
8317 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
8318 Template = CTSD->getSpecializedTemplate();
8319 Args = CTSD->getTemplateArgs().asArray();
8320 }
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
8321 Template = VTSD->getSpecializedTemplate();
8322 Args = VTSD->getTemplateArgs().asArray();
8323 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
8324 if (
auto *Tmplt = FD->getPrimaryTemplate()) {
8326 Args = FD->getTemplateSpecializationArgs()->asArray();
8331 Template->loadLazySpecializationsImpl(Args);
8336 RecordLocation Loc = getLocalBitOffset(Offset);
8339 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8340 Error(std::move(Err));
8343 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8348 Error(MaybeCode.takeError());
8351 unsigned Code = MaybeCode.get();
8355 if (!MaybeRecCode) {
8356 Error(MaybeRecCode.takeError());
8360 Error(
"malformed AST file: missing C++ ctor initializers");
8364 return Record.readCXXCtorInitializers();
8368 assert(ContextObj &&
"reading base specifiers with no AST context");
8371 RecordLocation Loc = getLocalBitOffset(Offset);
8374 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
8375 Error(std::move(Err));
8378 ReadingKindTracker ReadingKind(Read_Decl, *
this);
8383 Error(MaybeCode.takeError());
8386 unsigned Code = MaybeCode.get();
8390 if (!MaybeRecCode) {
8391 Error(MaybeCode.takeError());
8394 unsigned RecCode = MaybeRecCode.get();
8397 Error(
"malformed AST file: missing C++ base specifiers");
8401 unsigned NumBases =
Record.readInt();
8404 for (
unsigned I = 0; I != NumBases; ++I)
8405 Bases[I] =
Record.readCXXBaseSpecifier();
8418 ReadModuleOffsetMap(F);
8421 OwningModuleFileIndex == 0
8425 if (OwningModuleFileIndex == 0)
8428 uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
8437 unsigned ModuleFileIndex = ID.getModuleFileIndex();
8438 return M.
Index == ModuleFileIndex - 1;
8446 uint64_t ModuleFileIndex = ID.getModuleFileIndex();
8447 assert(ModuleFileIndex &&
"Untranslated Local Decl?");
8467 DeclCursorForID(ID, Loc);
8472 assert(ContextObj &&
"reading predefined decl without AST context");
8474 Decl *NewLoaded =
nullptr;
8480 return Context.getTranslationUnitDecl();
8483 if (Context.ObjCIdDecl)
8484 return Context.ObjCIdDecl;
8485 NewLoaded = Context.getObjCIdDecl();
8489 if (Context.ObjCSelDecl)
8490 return Context.ObjCSelDecl;
8491 NewLoaded = Context.getObjCSelDecl();
8495 if (Context.ObjCClassDecl)
8496 return Context.ObjCClassDecl;
8497 NewLoaded = Context.getObjCClassDecl();
8501 if (Context.ObjCProtocolClassDecl)
8502 return Context.ObjCProtocolClassDecl;
8503 NewLoaded = Context.getObjCProtocolDecl();
8507 if (Context.Int128Decl)
8508 return Context.Int128Decl;
8509 NewLoaded = Context.getInt128Decl();
8513 if (Context.UInt128Decl)
8514 return Context.UInt128Decl;
8515 NewLoaded = Context.getUInt128Decl();
8519 if (Context.ObjCInstanceTypeDecl)
8520 return Context.ObjCInstanceTypeDecl;
8521 NewLoaded = Context.getObjCInstanceTypeDecl();
8525 if (Context.BuiltinVaListDecl)
8526 return Context.BuiltinVaListDecl;
8527 NewLoaded = Context.getBuiltinVaListDecl();
8531 if (Context.VaListTagDecl)
8532 return Context.VaListTagDecl;
8533 NewLoaded = Context.getVaListTagDecl();
8537 if (Context.BuiltinMSVaListDecl)
8538 return Context.BuiltinMSVaListDecl;
8539 NewLoaded = Context.getBuiltinMSVaListDecl();
8543 if (Context.BuiltinZOSVaListDecl)
8544 return Context.BuiltinZOSVaListDecl;
8545 NewLoaded = Context.getBuiltinZOSVaListDecl();
8550 return Context.getMSGuidTagDecl();
8553 if (Context.ExternCContext)
8554 return Context.ExternCContext;
8555 NewLoaded = Context.getExternCContextDecl();
8559 if (Context.CFConstantStringTypeDecl)
8560 return Context.CFConstantStringTypeDecl;
8561 NewLoaded = Context.getCFConstantStringDecl();
8565 if (Context.CFConstantStringTagDecl)
8566 return Context.CFConstantStringTagDecl;
8567 NewLoaded = Context.getCFConstantStringTagDecl();
8571 return Context.getMSTypeInfoTagDecl();
8573#define BuiltinTemplate(BTName) \
8574 case PREDEF_DECL##BTName##_ID: \
8575 if (Context.Decl##BTName) \
8576 return Context.Decl##BTName; \
8577 NewLoaded = Context.get##BTName##Decl(); \
8579#include "clang/Basic/BuiltinTemplates.inc"
8582 llvm_unreachable(
"Invalid decl ID");
8586 assert(NewLoaded &&
"Failed to load predefined decl?");
8588 if (DeserializationListener)
8589 DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
8594unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
const {
8595 ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
8596 if (!OwningModuleFile) {
8605 assert(ContextObj &&
"reading decl with no AST context");
8614 Merged.push_back(ID);
8619 unsigned Index = translateGlobalDeclIDToIndex(ID);
8621 if (Index >= DeclsLoaded.size()) {
8622 assert(0 &&
"declaration ID out-of-range for AST file");
8623 Error(
"declaration ID out-of-range for AST file");
8627 return DeclsLoaded[Index];
8634 unsigned Index = translateGlobalDeclIDToIndex(ID);
8636 if (Index >= DeclsLoaded.size()) {
8637 assert(0 &&
"declaration ID out-of-range for AST file");
8638 Error(
"declaration ID out-of-range for AST file");
8642 if (!DeclsLoaded[Index]) {
8644 if (DeserializationListener)
8645 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
8648 return DeclsLoaded[Index];
8657 ReadModuleOffsetMap(M);
8667 uint64_t OrignalModuleFileIndex = 0;
8670 OrignalModuleFileIndex = I + 1;
8674 if (!OrignalModuleFileIndex)
8682 if (Idx >=
Record.size()) {
8683 Error(
"Corrupted AST file");
8700 RecordLocation Loc = getLocalBitOffset(Offset);
8701 if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
8702 Error(std::move(Err));
8705 assert(NumCurrentElementsDeserializing == 0 &&
8706 "should not be called while already deserializing");
8708 return ReadStmtFromStream(*Loc.F);
8711bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
8715 auto It = SpecLookups.find(D);
8716 if (It == SpecLookups.end())
8722 It->second.Table.findAll();
8726 SpecLookups.erase(It);
8728 bool NewSpecsFound =
false;
8729 Deserializing LookupResults(
this);
8730 for (
auto &Info : Infos) {
8731 if (GetExistingDecl(Info))
8733 NewSpecsFound =
true;
8737 return NewSpecsFound;
8744 bool NewSpecsFound =
8745 LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
8747 return NewSpecsFound;
8749 NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
8750 return NewSpecsFound;
8753bool ASTReader::LoadExternalSpecializationsImpl(
8754 SpecLookupTableTy &SpecLookups,
const Decl *D,
8758 auto It = SpecLookups.find(D);
8759 if (It == SpecLookups.end())
8762 Deserializing LookupResults(
this);
8766 It->second.Table.find(HashValue);
8768 llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
8770 llvm::raw_string_ostream OS(Name);
8777 bool NewSpecsFound =
false;
8778 for (
auto &Info : Infos) {
8779 if (GetExistingDecl(Info))
8781 NewSpecsFound =
true;
8785 return NewSpecsFound;
8792 bool NewDeclsFound = LoadExternalSpecializationsImpl(
8793 PartialSpecializationsLookups, D, TemplateArgs);
8795 LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
8797 return NewDeclsFound;
8805 auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
8806 assert(LexicalDecls.size() % 2 == 0 &&
"expected an even number of entries");
8807 for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
8809 if (!IsKindWeWant(K))
8812 auto ID = (
DeclID) + LexicalDecls[I + 1];
8817 if (PredefsVisited[ID])
8820 PredefsVisited[ID] =
true;
8824 assert(D->
getKind() == K &&
"wrong kind for lexical decl");
8832 for (
const auto &Lexical : TULexicalDecls)
8833 Visit(Lexical.first, Lexical.second);
8835 auto I = LexicalDecls.find(DC);
8836 if (I != LexicalDecls.end())
8837 Visit(I->second.first, I->second.second);
8840 ++NumLexicalDeclContextsRead;
8845class UnalignedDeclIDComp {
8851 : Reader(Reader), Mod(M) {}
8860 SourceLocation RHS = getLocation(R);
8865 SourceLocation LHS = getLocation(L);
8879 unsigned Offset,
unsigned Length,
8883 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
8884 if (I == FileDeclIDs.end())
8887 FileDeclsInfo &DInfo = I->second;
8888 if (DInfo.Decls.empty())
8892 BeginLoc =
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
8895 UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
8897 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
8898 if (BeginIt != DInfo.Decls.begin())
8904 while (BeginIt != DInfo.Decls.begin() &&
8907 ->isTopLevelDeclInObjCContainer())
8911 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
8912 if (EndIt != DInfo.Decls.end())
8925 "DeclContext has no visible decls in storage");
8932 auto Find = [&,
this](
auto &&Table,
auto &&Key) {
8954 if (
auto It = Lookups.find(DC); It != Lookups.end()) {
8955 ++NumVisibleDeclContextsRead;
8956 Find(It->second.Table, Name);
8959 auto FindModuleLocalLookup = [&,
this](
Module *NamedModule) {
8960 if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
8961 ++NumModuleLocalVisibleDeclContexts;
8962 Find(It->second.Table, std::make_pair(Name, NamedModule));
8965 if (
auto *NamedModule =
8966 OriginalDC ?
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
8968 FindModuleLocalLookup(NamedModule);
8973 if (ContextObj && ContextObj->getCurrentNamedModule())
8974 FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
8976 if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
8977 ++NumTULocalVisibleDeclContexts;
8978 Find(It->second.Table, Name);
8991 auto findAll = [&](
auto &LookupTables,
unsigned &NumRead) {
8992 auto It = LookupTables.find(DC);
8993 if (It == LookupTables.end())
9015 findAll(Lookups, NumVisibleDeclContextsRead);
9016 findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
9017 findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
9019 for (
auto &[Name, DS] : Decls)
9022 const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
9027 auto I = Lookups.find(Primary);
9028 return I == Lookups.end() ?
nullptr : &I->second;
9033 auto I = ModuleLocalLookups.find(Primary);
9034 return I == ModuleLocalLookups.end() ?
nullptr : &I->second;
9039 auto I = TULocalLookups.find(Primary);
9040 return I == TULocalLookups.end() ?
nullptr : &I->second;
9047 IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
9048 auto I = LookupTable.find(D);
9049 return I == LookupTable.end() ?
nullptr : &I->second;
9054 return PartialSpecializationsLookups.contains(D) ||
9055 SpecializationsLookups.contains(D);
9064 assert(ImplD && Consumer);
9066 for (
auto *I : ImplD->
methods())
9072void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
9073 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
9076 Consumer->HandleInterestingDecl(DeclGroupRef(D));
9079void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
9080 Consumer->HandleVTable(RD);
9084 this->Consumer = Consumer;
9087 PassInterestingDeclsToConsumer();
9089 if (DeserializationListener)
9090 DeserializationListener->ReaderInitialized(
this);
9094 std::fprintf(
stderr,
"*** AST File Statistics:\n");
9096 unsigned NumTypesLoaded =
9097 TypesLoaded.size() - llvm::count(TypesLoaded.materialized(),
QualType());
9098 unsigned NumDeclsLoaded =
9099 DeclsLoaded.size() -
9100 llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
9101 unsigned NumIdentifiersLoaded =
9102 IdentifiersLoaded.size() -
9104 unsigned NumMacrosLoaded =
9105 MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
9106 unsigned NumSelectorsLoaded =
9107 SelectorsLoaded.size() - llvm::count(SelectorsLoaded,
Selector());
9110 std::fprintf(
stderr,
" %u/%u source location entries read (%f%%)\n",
9111 NumSLocEntriesRead, TotalNumSLocEntries,
9112 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
9113 if (!TypesLoaded.empty())
9114 std::fprintf(
stderr,
" %u/%u types read (%f%%)\n",
9115 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
9116 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
9117 if (!DeclsLoaded.empty())
9118 std::fprintf(
stderr,
" %u/%u declarations read (%f%%)\n",
9119 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
9120 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
9121 if (!IdentifiersLoaded.empty())
9122 std::fprintf(
stderr,
" %u/%u identifiers read (%f%%)\n",
9123 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
9124 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
9125 if (!MacrosLoaded.empty())
9126 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9127 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
9128 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
9129 if (!SelectorsLoaded.empty())
9130 std::fprintf(
stderr,
" %u/%u selectors read (%f%%)\n",
9131 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
9132 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
9133 if (TotalNumStatements)
9134 std::fprintf(
stderr,
" %u/%u statements read (%f%%)\n",
9135 NumStatementsRead, TotalNumStatements,
9136 ((
float)NumStatementsRead/TotalNumStatements * 100));
9138 std::fprintf(
stderr,
" %u/%u macros read (%f%%)\n",
9139 NumMacrosRead, TotalNumMacros,
9140 ((
float)NumMacrosRead/TotalNumMacros * 100));
9141 if (TotalLexicalDeclContexts)
9142 std::fprintf(
stderr,
" %u/%u lexical declcontexts read (%f%%)\n",
9143 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
9144 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
9146 if (TotalVisibleDeclContexts)
9147 std::fprintf(
stderr,
" %u/%u visible declcontexts read (%f%%)\n",
9148 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
9149 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
9151 if (TotalModuleLocalVisibleDeclContexts)
9153 stderr,
" %u/%u module local visible declcontexts read (%f%%)\n",
9154 NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
9155 ((
float)NumModuleLocalVisibleDeclContexts /
9156 TotalModuleLocalVisibleDeclContexts * 100));
9157 if (TotalTULocalVisibleDeclContexts)
9158 std::fprintf(
stderr,
" %u/%u visible declcontexts in GMF read (%f%%)\n",
9159 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
9160 ((
float)NumTULocalVisibleDeclContexts /
9161 TotalTULocalVisibleDeclContexts * 100));
9162 if (TotalNumMethodPoolEntries)
9163 std::fprintf(
stderr,
" %u/%u method pool entries read (%f%%)\n",
9164 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
9165 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
9167 if (NumMethodPoolLookups)
9168 std::fprintf(
stderr,
" %u/%u method pool lookups succeeded (%f%%)\n",
9169 NumMethodPoolHits, NumMethodPoolLookups,
9170 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
9171 if (NumMethodPoolTableLookups)
9172 std::fprintf(
stderr,
" %u/%u method pool table lookups succeeded (%f%%)\n",
9173 NumMethodPoolTableHits, NumMethodPoolTableLookups,
9174 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
9176 if (NumIdentifierLookupHits)
9178 " %u / %u identifier table lookups succeeded (%f%%)\n",
9179 NumIdentifierLookupHits, NumIdentifierLookups,
9180 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
9183 std::fprintf(
stderr,
"\n");
9184 GlobalIndex->printStats();
9187 std::fprintf(
stderr,
"\n");
9189 std::fprintf(
stderr,
"\n");
9192template<
typename Key,
typename ModuleFile,
unsigned InitialCapacity>
9193LLVM_DUMP_METHOD
static void
9196 InitialCapacity> &Map) {
9197 if (Map.begin() == Map.end())
9202 llvm::errs() << Name <<
":\n";
9203 for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
9205 llvm::errs() <<
" " << (
DeclID)I->first <<
" -> " << I->second->FileName
9210 llvm::errs() <<
"*** PCH/ModuleFile Remappings:\n";
9212 dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
9216 GlobalPreprocessedEntityMap);
9218 llvm::errs() <<
"\n*** PCH/Modules Loaded:";
9227 if (llvm::MemoryBuffer *buf = I.Buffer) {
9228 size_t bytes = buf->getBufferSize();
9229 switch (buf->getBufferKind()) {
9230 case llvm::MemoryBuffer::MemoryBuffer_Malloc:
9233 case llvm::MemoryBuffer::MemoryBuffer_MMap:
9254 if (!FPPragmaOptions.empty()) {
9255 assert(FPPragmaOptions.size() == 1 &&
"Wrong number of FP_PRAGMA_OPTIONS");
9258 SemaObj->CurFPFeatures =
9264 if (
auto *FD = dyn_cast<FunctionDecl>(D))
9265 SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
9266 else if (
auto *BD = dyn_cast<BlockDecl>(D))
9267 SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
9269 llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
9271 DeclsWithEffectsToVerify.clear();
9273 SemaObj->OpenCLFeatures = OpenCLExtensions;
9279 assert(SemaObj &&
"no Sema to update");
9283 if (!SemaDeclRefs.empty()) {
9284 assert(SemaDeclRefs.size() % 3 == 0);
9285 for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
9286 if (!SemaObj->StdNamespace)
9287 SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
9288 if (!SemaObj->StdBadAlloc)
9289 SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
9290 if (!SemaObj->StdAlignValT)
9291 SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
9293 SemaDeclRefs.clear();
9298 if(OptimizeOffPragmaLocation.isValid())
9299 SemaObj->ActOnPragmaOptimize(
false, OptimizeOffPragmaLocation);
9300 if (PragmaMSStructState != -1)
9302 if (PointersToMembersPragmaLocation.isValid()) {
9303 SemaObj->ActOnPragmaMSPointersToMembers(
9305 PragmaMSPointersToMembersState,
9306 PointersToMembersPragmaLocation);
9308 SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
9309 if (!RISCVVecIntrinsicPragma.empty()) {
9310 assert(RISCVVecIntrinsicPragma.size() == 3 &&
9311 "Wrong number of RISCVVecIntrinsicPragma");
9312 SemaObj->RISCV().DeclareRVVBuiltins = RISCVVecIntrinsicPragma[0];
9313 SemaObj->RISCV().DeclareSiFiveVectorBuiltins = RISCVVecIntrinsicPragma[1];
9314 SemaObj->RISCV().DeclareAndesVectorBuiltins = RISCVVecIntrinsicPragma[2];
9317 if (PragmaAlignPackCurrentValue) {
9321 bool DropFirst =
false;
9322 if (!PragmaAlignPackStack.empty() &&
9323 PragmaAlignPackStack.front().Location.isInvalid()) {
9324 assert(PragmaAlignPackStack.front().Value ==
9325 SemaObj->AlignPackStack.DefaultValue &&
9326 "Expected a default alignment value");
9327 SemaObj->AlignPackStack.Stack.emplace_back(
9328 PragmaAlignPackStack.front().SlotLabel,
9329 SemaObj->AlignPackStack.CurrentValue,
9330 SemaObj->AlignPackStack.CurrentPragmaLocation,
9331 PragmaAlignPackStack.front().PushLocation);
9334 for (
const auto &Entry :
9335 llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
9336 SemaObj->AlignPackStack.Stack.emplace_back(
9337 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9339 if (PragmaAlignPackCurrentLocation.isInvalid()) {
9340 assert(*PragmaAlignPackCurrentValue ==
9341 SemaObj->AlignPackStack.DefaultValue &&
9342 "Expected a default align and pack value");
9345 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
9346 SemaObj->AlignPackStack.CurrentPragmaLocation =
9347 PragmaAlignPackCurrentLocation;
9350 if (FpPragmaCurrentValue) {
9354 bool DropFirst =
false;
9355 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
9356 assert(FpPragmaStack.front().Value ==
9357 SemaObj->FpPragmaStack.DefaultValue &&
9358 "Expected a default pragma float_control value");
9359 SemaObj->FpPragmaStack.Stack.emplace_back(
9360 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
9361 SemaObj->FpPragmaStack.CurrentPragmaLocation,
9362 FpPragmaStack.front().PushLocation);
9365 for (
const auto &Entry :
9367 SemaObj->FpPragmaStack.Stack.emplace_back(
9368 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
9369 if (FpPragmaCurrentLocation.isInvalid()) {
9370 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
9371 "Expected a default pragma float_control value");
9374 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
9375 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
9380 for (
auto &Import : PendingImportedModulesSema) {
9381 if (Import.ImportLoc.isInvalid())
9384 SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
9387 PendingImportedModulesSema.clear();
9394 IdentifierLookupVisitor Visitor(Name, 0,
9395 NumIdentifierLookups,
9396 NumIdentifierLookupHits);
9402 if (PP.getLangOpts().CPlusPlus) {
9403 for (
auto *F : ModuleMgr.pch_modules())
9412 if (GlobalIndex->lookupIdentifier(Name, Hits)) {
9417 ModuleMgr.visit(Visitor, HitsPtr);
9439 ASTIdentifierLookupTable::key_iterator Current;
9443 ASTIdentifierLookupTable::key_iterator End;
9450 bool SkipModules =
false);
9452 StringRef
Next()
override;
9459 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
9463 while (Current == End) {
9475 Current = IdTable->key_begin();
9476 End = IdTable->key_end();
9481 StringRef
Result = *Current;
9490 std::unique_ptr<IdentifierIterator> Current;
9491 std::unique_ptr<IdentifierIterator> Queued;
9494 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator>
First,
9495 std::unique_ptr<IdentifierIterator> Second)
9496 : Current(
std::move(
First)), Queued(
std::move(Second)) {}
9498 StringRef
Next()
override {
9502 StringRef result = Current->Next();
9503 if (!result.empty())
9508 std::swap(Current, Queued);
9517 std::unique_ptr<IdentifierIterator> ReaderIter(
9519 std::unique_ptr<IdentifierIterator> ModulesIter(
9520 GlobalIndex->createIdentifierIterator());
9521 return new ChainedIdentifierIterator(std::move(ReaderIter),
9522 std::move(ModulesIter));
9534 unsigned PriorGeneration;
9535 unsigned InstanceBits = 0;
9536 unsigned FactoryBits = 0;
9537 bool InstanceHasMoreThanOneDecl =
false;
9538 bool FactoryHasMoreThanOneDecl =
false;
9544 unsigned PriorGeneration)
9545 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
9555 ++Reader.NumMethodPoolTableLookups;
9558 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
9559 if (Pos == PoolTable->end())
9562 ++Reader.NumMethodPoolTableHits;
9563 ++Reader.NumSelectorsRead;
9567 ++Reader.NumMethodPoolEntriesRead;
9569 if (Reader.DeserializationListener)
9570 Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
9575 InstanceMethods.append(
Data.Instance.rbegin(),
Data.Instance.rend());
9576 FactoryMethods.append(
Data.Factory.rbegin(),
Data.Factory.rend());
9577 InstanceBits =
Data.InstanceBits;
9578 FactoryBits =
Data.FactoryBits;
9579 InstanceHasMoreThanOneDecl =
Data.InstanceHasMoreThanOneDecl;
9580 FactoryHasMoreThanOneDecl =
Data.FactoryHasMoreThanOneDecl;
9586 return InstanceMethods;
9591 return FactoryMethods;
9598 return InstanceHasMoreThanOneDecl;
9616 unsigned &Generation = SelectorGeneration[Sel];
9617 unsigned PriorGeneration = Generation;
9619 SelectorOutOfDate[Sel] =
false;
9622 ++NumMethodPoolLookups;
9624 ModuleMgr.visit(Visitor);
9630 ++NumMethodPoolHits;
9651 if (SelectorOutOfDate[Sel])
9659 for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
9661 = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
9662 Namespaces.push_back(Namespace);
9667 llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
9668 for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
9669 UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
9672 Undefined.insert(std::make_pair(D, Loc));
9674 UndefinedButUsed.clear();
9680 for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
9683 uint64_t Count = DelayedDeleteExprs[Idx++];
9684 for (uint64_t
C = 0;
C < Count; ++
C) {
9687 const bool IsArrayForm = DelayedDeleteExprs[Idx++];
9688 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
9695 for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
9696 VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
9698 TentativeDefs.push_back(Var);
9700 TentativeDefinitions.clear();
9705 for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
9707 = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
9711 UnusedFileScopedDecls.clear();
9716 for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
9718 = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
9722 DelegatingCtorDecls.clear();
9726 for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
9728 = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
9732 ExtVectorDecls.clear();
9736 llvm::SmallPtrSetImpl<const TypedefNameDecl *> &Decls) {
9737 for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
9740 GetDecl(UnusedLocalTypedefNameCandidates[I]));
9744 UnusedLocalTypedefNameCandidates.clear();
9749 for (
auto I : DeclsToCheckForDeferredDiags) {
9750 auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
9754 DeclsToCheckForDeferredDiags.clear();
9759 if (ReferencedSelectorsData.empty())
9764 unsigned int DataSize = ReferencedSelectorsData.size()-1;
9766 while (I < DataSize) {
9770 Sels.push_back(std::make_pair(Sel, SelLoc));
9772 ReferencedSelectorsData.clear();
9777 if (WeakUndeclaredIdentifiers.empty())
9780 for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
9788 WeakIDs.push_back(std::make_pair(WeakId, WI));
9790 WeakUndeclaredIdentifiers.clear();
9794 SmallVectorImpl<std::pair<IdentifierInfo *, AsmLabelAttr *>> &ExtnameIDs) {
9795 if (ExtnameUndeclaredIdentifiers.empty())
9798 for (
unsigned I = 0, N = ExtnameUndeclaredIdentifiers.size(); I < N; I += 3) {
9805 AsmLabelAttr *
Attr = AsmLabelAttr::CreateImplicit(
9809 ExtnameIDs.push_back(std::make_pair(NameId,
Attr));
9811 ExtnameUndeclaredIdentifiers.clear();
9815 for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
9817 VTableUse &TableInfo = VTableUses[Idx++];
9818 VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
9821 VTables.push_back(VT);
9829 for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
9830 PendingInstantiation &Inst = PendingInstantiations[Idx++];
9834 Pending.push_back(std::make_pair(D, Loc));
9836 PendingInstantiations.clear();
9840 llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
9842 for (
auto &LPT : LateParsedTemplates) {
9845 for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
9849 auto LT = std::make_unique<LateParsedTemplate>();
9850 LT->D =
ReadDecl(*FMod, LateParsed, Idx);
9854 assert(F &&
"No module");
9856 unsigned TokN = LateParsed[Idx++];
9857 LT->Toks.reserve(TokN);
9858 for (
unsigned T = 0;
T < TokN; ++
T)
9859 LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
9861 LPTMap.insert(std::make_pair(FD, std::move(LT)));
9865 LateParsedTemplates.clear();
9877 if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
9878 Iter != LambdaDeclarationsForMerging.end() &&
9879 Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
9888 LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
9897 assert(ID &&
"Non-zero identifier ID required");
9898 unsigned Index = translateIdentifierIDToIndex(ID).second;
9899 assert(Index < IdentifiersLoaded.size() &&
"identifier ID out of range");
9900 IdentifiersLoaded[Index] = II;
9901 if (DeserializationListener)
9902 DeserializationListener->IdentifierRead(ID, II);
9924 if (NumCurrentElementsDeserializing && !Decls) {
9925 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
9929 for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
9942 Decls->push_back(D);
9949 pushExternalDeclIntoScope(D, II);
9953std::pair<ModuleFile *, unsigned>
9954ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
const {
9956 return {
nullptr, 0};
9958 unsigned ModuleFileIndex = ID >> 32;
9959 unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
9961 assert(ModuleFileIndex &&
"not translating loaded IdentifierID?");
9973 if (IdentifiersLoaded.empty()) {
9974 Error(
"no identifier table in AST file");
9978 auto [M, Index] = translateIdentifierIDToIndex(ID);
9979 if (!IdentifiersLoaded[Index]) {
9980 assert(M !=
nullptr &&
"Untranslated Identifier ID?");
9983 const unsigned char *
Data =
9989 auto &II = PP.getIdentifierTable().get(Key);
9990 IdentifiersLoaded[Index] = &II;
9993 if (DeserializationListener)
9994 DeserializationListener->IdentifierRead(ID, &II);
9997 return IdentifiersLoaded[Index];
10009 ReadModuleOffsetMap(M);
10011 unsigned ModuleFileIndex = LocalID >> 32;
10012 LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
10015 assert(MF &&
"malformed identifier ID encoding?");
10017 if (!ModuleFileIndex)
10023std::pair<ModuleFile *, unsigned>
10024ASTReader::translateMacroIDToIndex(
MacroID ID)
const {
10026 return {
nullptr, 0};
10028 unsigned ModuleFileIndex = ID >> 32;
10029 assert(ModuleFileIndex &&
"not translating loaded MacroID?");
10033 unsigned LocalID = ID & llvm::maskTrailingOnes<MacroID>(32);
10042 if (MacrosLoaded.empty()) {
10043 Error(
"no macro table in AST file");
10047 auto [M, Index] = translateMacroIDToIndex(ID);
10048 if (!MacrosLoaded[Index]) {
10049 assert(M !=
nullptr &&
"Untranslated Macro ID?");
10055 if (DeserializationListener)
10056 DeserializationListener->MacroRead(ID, MacrosLoaded[Index]);
10059 return MacrosLoaded[Index];
10067 ReadModuleOffsetMap(M);
10069 unsigned ModuleFileIndex = LocalID >> 32;
10070 LocalID &= llvm::maskTrailingOnes<MacroID>(32);
10073 assert(MF &&
"malformed identifier ID encoding?");
10075 if (!ModuleFileIndex) {
10080 return (
static_cast<MacroID>(MF->
Index + 1) << 32) | LocalID;
10089 ReadModuleOffsetMap(M);
10094 &&
"Invalid index into submodule index remap");
10096 return LocalID + I->second;
10107 return I == GlobalSubmoduleMap.end() ?
nullptr : I->second;
10110 int IndexFromEnd =
static_cast<int>(ID >> 1);
10111 assert(IndexFromEnd &&
"got reference to unknown module file");
10128 auto I = llvm::find(PCHModules, M);
10129 assert(I != PCHModules.end() &&
"emitting reference to unknown file");
10130 return std::distance(I, PCHModules.end()) << 1;
10139 const auto &PCHChain = ModuleMgr.pch_modules();
10140 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
10141 ModuleFile &MF = ModuleMgr.getPrimaryModule();
10145 llvm::sys::path::parent_path(MF.
FileName),
10148 return std::nullopt;
10152 auto I = DefinitionSource.find(FD);
10153 if (I == DefinitionSource.end())
10159 return ThisDeclarationWasADefinitionSet.contains(FD);
10170 if (ID > SelectorsLoaded.size()) {
10171 Error(
"selector ID out of range in AST file");
10175 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() ==
nullptr) {
10178 assert(I != GlobalSelectorMap.end() &&
"Corrupted global selector map");
10182 SelectorsLoaded[ID - 1] =
10184 if (DeserializationListener)
10185 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
10188 return SelectorsLoaded[ID - 1];
10206 ReadModuleOffsetMap(M);
10211 &&
"Invalid index into selector index remap");
10213 return LocalID + I->second;
10244 NameInfo.
setName(readDeclarationName());
10258 SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType,
Value);
10259 assert(Op.isValid());
10265 unsigned NumTPLists =
readInt();
10270 for (
unsigned i = 0; i != NumTPLists; ++i)
10281 unsigned NumParams =
readInt();
10283 Params.reserve(NumParams);
10284 while (NumParams--)
10287 bool HasRequiresClause =
readBool();
10288 Expr *RequiresClause = HasRequiresClause ?
readExpr() :
nullptr;
10291 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
10292 return TemplateParams;
10297 bool Canonicalize) {
10298 unsigned NumTemplateArgs =
readInt();
10299 TemplArgs.reserve(NumTemplateArgs);
10300 while (NumTemplateArgs--)
10306 unsigned NumDecls =
readInt();
10308 while (NumDecls--) {
10320 bool inheritConstructors =
readBool();
10326 Result.setInheritConstructors(inheritConstructors);
10333 unsigned NumInitializers =
readInt();
10334 assert(NumInitializers &&
"wrote ctor initializers but have no inits");
10336 for (
unsigned i = 0; i != NumInitializers; ++i) {
10338 bool IsBaseVirtual =
false;
10369 BOMInit =
new (Context)
10371 RParenLoc, MemberOrEllipsisLoc);
10373 BOMInit =
new (Context)
10376 BOMInit =
new (Context)
10380 BOMInit =
new (Context)
10382 LParenLoc,
Init, RParenLoc);
10385 unsigned SourceOrder =
readInt();
10389 CtorInitializers[i] = BOMInit;
10392 return CtorInitializers;
10400 for (
unsigned I = 0; I != N; ++I) {
10401 auto Kind = readNestedNameSpecifierKind();
10406 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
10415 Builder.Make(Context,
T->getTypeLoc(), ColonColonLoc);
10421 Builder.MakeGlobal(Context, ColonColonLoc);
10428 Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
10433 llvm_unreachable(
"unexpected null nested name specifier");
10448 const StringRef Blob) {
10449 unsigned Count =
Record[0];
10450 const char *Byte = Blob.data();
10451 llvm::BitVector Ret = llvm::BitVector(Count,
false);
10452 for (
unsigned I = 0; I < Count; ++Byte)
10453 for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
10454 if (*Byte & (1 << Bit))
10461 return llvm::APFloat(Sem,
readAPInt());
10466 unsigned Len =
Record[Idx++];
10474 unsigned Len =
Record[Idx++];
10475 StringRef
Result = Blob.substr(0, Len);
10476 Blob = Blob.substr(Len);
10500 unsigned Major =
Record[Idx++];
10501 unsigned Minor =
Record[Idx++];
10502 unsigned Subminor =
Record[Idx++];
10504 return VersionTuple(Major);
10506 return VersionTuple(Major, Minor - 1);
10507 return VersionTuple(Major, Minor - 1, Subminor - 1);
10518 return Diag(CurrentImportLoc, DiagID);
10522 return Diags.Report(Loc, DiagID);
10526 llvm::function_ref<
void()> Fn) {
10529 SemaObj->runWithSufficientStackSpace(Loc, Fn);
10533 StackHandler.runWithSufficientStackSpace(Loc, Fn);
10539 return PP.getIdentifierTable();
10545 assert((*CurrSwitchCaseStmts)[ID] ==
nullptr &&
10546 "Already have a SwitchCase with this ID");
10547 (*CurrSwitchCaseStmts)[ID] = SC;
10552 assert((*CurrSwitchCaseStmts)[ID] !=
nullptr &&
"No SwitchCase with this ID");
10553 return (*CurrSwitchCaseStmts)[ID];
10557 CurrSwitchCaseStmts->clear();
10562 std::vector<RawComment *> Comments;
10569 BitstreamCursor &Cursor = I->first;
10576 Cursor.advanceSkippingSubblocks(
10577 BitstreamCursor::AF_DontPopBlockAtEnd);
10579 Error(MaybeEntry.takeError());
10582 llvm::BitstreamEntry Entry = MaybeEntry.get();
10584 switch (Entry.Kind) {
10585 case llvm::BitstreamEntry::SubBlock:
10586 case llvm::BitstreamEntry::Error:
10587 Error(
"malformed block record in AST file");
10589 case llvm::BitstreamEntry::EndBlock:
10591 case llvm::BitstreamEntry::Record:
10599 if (!MaybeComment) {
10600 Error(MaybeComment.takeError());
10609 bool IsTrailingComment =
Record[Idx++];
10610 bool IsAlmostTrailingComment =
Record[Idx++];
10611 Comments.push_back(
new (Context)
RawComment(
10612 SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
10622 if (Loc.first.isValid())
10623 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second,
C);
10636 assert(NumUserInputs <= NumInputs);
10637 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10638 for (
unsigned I = 0; I < N; ++I) {
10639 bool IsSystem = I >= NumUserInputs;
10641 Visitor(IFI, IsSystem);
10646 bool IncludeSystem,
bool Complain,
10648 bool isSystem)> Visitor) {
10651 assert(NumUserInputs <= NumInputs);
10652 unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
10653 for (
unsigned I = 0; I < N; ++I) {
10654 bool IsSystem = I >= NumUserInputs;
10655 InputFile IF = getInputFile(MF, I+1, Complain);
10656 Visitor(IF, IsSystem);
10664 for (
unsigned I = 0; I < NumInputs; ++I) {
10667 if (
auto FE = getInputFile(MF, I + 1).getFile())
10672void ASTReader::finishPendingActions() {
10673 while (!PendingIdentifierInfos.empty() ||
10674 !PendingDeducedFunctionTypes.empty() ||
10675 !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
10676 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
10677 !PendingUpdateRecords.empty() ||
10678 !PendingObjCExtensionIvarRedeclarations.empty()) {
10681 using TopLevelDeclsMap =
10682 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
10683 TopLevelDeclsMap TopLevelDecls;
10685 while (!PendingIdentifierInfos.empty()) {
10688 std::move(PendingIdentifierInfos.back().second);
10689 PendingIdentifierInfos.pop_back();
10696 for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
10697 auto *FD = PendingDeducedFunctionTypes[I].first;
10698 FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
10700 if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
10703 if (DT->isDeduced()) {
10704 PendingDeducedTypeUpdates.insert(
10705 {FD->getCanonicalDecl(), FD->getReturnType()});
10712 PendingUndeducedFunctionDecls.push_back(FD);
10716 PendingDeducedFunctionTypes.clear();
10720 for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
10721 auto *VD = PendingDeducedVarTypes[I].first;
10722 VD->setType(
GetType(PendingDeducedVarTypes[I].second));
10724 PendingDeducedVarTypes.clear();
10727 for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
10728 loadPendingDeclChain(PendingDeclChains[I].first,
10729 PendingDeclChains[I].second);
10730 PendingDeclChains.clear();
10733 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
10734 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
10735 IdentifierInfo *II = TLD->first;
10736 for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
10742 for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
10743 IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
10744 SmallVector<PendingMacroInfo, 2> GlobalIDs;
10745 GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
10747 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10749 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10750 if (!Info.M->isModule())
10754 for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
10756 const PendingMacroInfo &Info = GlobalIDs[IDIdx];
10757 if (Info.M->isModule())
10761 PendingMacroIDs.clear();
10765 while (!PendingDeclContextInfos.empty()) {
10766 PendingDeclContextInfo Info = PendingDeclContextInfos.front();
10767 PendingDeclContextInfos.pop_front();
10770 Info.D->setDeclContextsImpl(SemaDC, LexicalDC,
getContext());
10774 while (!PendingUpdateRecords.empty()) {
10775 auto Update = PendingUpdateRecords.pop_back_val();
10776 ReadingKindTracker ReadingKind(Read_Decl, *
this);
10777 loadDeclUpdateRecords(
Update);
10780 while (!PendingObjCExtensionIvarRedeclarations.empty()) {
10781 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
10782 auto DuplicateIvars =
10783 PendingObjCExtensionIvarRedeclarations.back().second;
10785 StructuralEquivalenceContext Ctx(
10786 ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
10787 ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
10791 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
10793 for (
auto IvarPair : DuplicateIvars) {
10794 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
10796 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
10802 ExtensionsPair.first->setInvalidDecl();
10803 ExtensionsPair.second->getClassInterface()
10805 ->setIvarList(
nullptr);
10807 for (
auto IvarPair : DuplicateIvars) {
10808 Diag(IvarPair.first->getLocation(),
10809 diag::err_duplicate_ivar_declaration)
10810 << IvarPair.first->getIdentifier();
10811 Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
10814 PendingObjCExtensionIvarRedeclarations.pop_back();
10820 assert(PendingFakeDefinitionData.empty() &&
10821 "faked up a class definition but never saw the real one");
10827 for (Decl *D : PendingDefinitions) {
10828 if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10829 if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
10830 for (
auto *R = getMostRecentExistingDecl(RD);
R;
10831 R =
R->getPreviousDecl()) {
10834 "declaration thinks it's the definition but it isn't");
10842 if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
10847 for (
auto *R = getMostRecentExistingDecl(ID);
R;
R =
R->getPreviousDecl())
10853 if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
10854 for (
auto *R = getMostRecentExistingDecl(PD);
R;
R =
R->getPreviousDecl())
10861 for (
auto *R = getMostRecentExistingDecl(RTD);
R;
R =
R->getPreviousDecl())
10864 PendingDefinitions.clear();
10866 for (
auto [D,
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
10867 auto hasDefinitionImpl = [
this](
Decl *D,
auto hasDefinitionImpl) {
10868 if (
auto *VD = dyn_cast<VarDecl>(D))
10869 return VD->isThisDeclarationADefinition() ||
10870 VD->isThisDeclarationADemotedDefinition();
10872 if (
auto *TD = dyn_cast<TagDecl>(D))
10873 return TD->isThisDeclarationADefinition() ||
10874 TD->isThisDeclarationADemotedDefinition();
10876 if (
auto *FD = dyn_cast<FunctionDecl>(D))
10877 return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
10879 if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
10880 return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
10887 return hasDefinitionImpl(D, hasDefinitionImpl);
10903 PendingWarningForDuplicatedDefsInModuleUnits.clear();
10909 for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
10910 PBEnd = PendingBodies.end();
10911 PB != PBEnd; ++PB) {
10912 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
10914 const FunctionDecl *Defn =
nullptr;
10915 if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
10916 FD->setLazyBody(PB->second);
10918 auto *NonConstDefn =
const_cast<FunctionDecl*
>(Defn);
10921 if (!FD->isLateTemplateParsed() &&
10922 !NonConstDefn->isLateTemplateParsed() &&
10927 FD->getODRHash() != NonConstDefn->getODRHash()) {
10929 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10930 }
else if (FD->getLexicalParent()->isFileContext() &&
10931 NonConstDefn->getLexicalParent()->isFileContext()) {
10935 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
10946 PendingBodies.clear();
10949 for (
auto [RD, MD] : PendingAddedClassMembers) {
10950 RD->addedMember(MD);
10952 PendingAddedClassMembers.clear();
10955 for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
10957 PendingMergedDefinitionsToDeduplicate.clear();
10961 for (Decl *D : PendingIncompleteDeclChains)
10962 markIncompleteDeclChain(D);
10963 PendingIncompleteDeclChains.clear();
10965 assert(PendingIdentifierInfos.empty() &&
10966 "Should be empty at the end of finishPendingActions");
10967 assert(PendingDeducedFunctionTypes.empty() &&
10968 "Should be empty at the end of finishPendingActions");
10969 assert(PendingDeducedVarTypes.empty() &&
10970 "Should be empty at the end of finishPendingActions");
10971 assert(PendingDeclChains.empty() &&
10972 "Should be empty at the end of finishPendingActions");
10973 assert(PendingMacroIDs.empty() &&
10974 "Should be empty at the end of finishPendingActions");
10975 assert(PendingDeclContextInfos.empty() &&
10976 "Should be empty at the end of finishPendingActions");
10977 assert(PendingUpdateRecords.empty() &&
10978 "Should be empty at the end of finishPendingActions");
10979 assert(PendingObjCExtensionIvarRedeclarations.empty() &&
10980 "Should be empty at the end of finishPendingActions");
10981 assert(PendingFakeDefinitionData.empty() &&
10982 "Should be empty at the end of finishPendingActions");
10983 assert(PendingDefinitions.empty() &&
10984 "Should be empty at the end of finishPendingActions");
10985 assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
10986 "Should be empty at the end of finishPendingActions");
10987 assert(PendingBodies.empty() &&
10988 "Should be empty at the end of finishPendingActions");
10989 assert(PendingAddedClassMembers.empty() &&
10990 "Should be empty at the end of finishPendingActions");
10991 assert(PendingMergedDefinitionsToDeduplicate.empty() &&
10992 "Should be empty at the end of finishPendingActions");
10993 assert(PendingIncompleteDeclChains.empty() &&
10994 "Should be empty at the end of finishPendingActions");
10997void ASTReader::diagnoseOdrViolations() {
10998 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
10999 PendingRecordOdrMergeFailures.empty() &&
11000 PendingFunctionOdrMergeFailures.empty() &&
11001 PendingEnumOdrMergeFailures.empty() &&
11002 PendingObjCInterfaceOdrMergeFailures.empty() &&
11003 PendingObjCProtocolOdrMergeFailures.empty())
11010 auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
11011 PendingOdrMergeFailures.clear();
11012 for (
auto &Merge : OdrMergeFailures) {
11013 Merge.first->buildLookup();
11014 Merge.first->decls_begin();
11015 Merge.first->bases_begin();
11016 Merge.first->vbases_begin();
11017 for (
auto &RecordPair : Merge.second) {
11018 auto *RD = RecordPair.first;
11026 auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
11027 PendingRecordOdrMergeFailures.clear();
11028 for (
auto &Merge : RecordOdrMergeFailures) {
11029 Merge.first->decls_begin();
11030 for (
auto &D : Merge.second)
11035 auto ObjCInterfaceOdrMergeFailures =
11036 std::move(PendingObjCInterfaceOdrMergeFailures);
11037 PendingObjCInterfaceOdrMergeFailures.clear();
11038 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11039 Merge.first->decls_begin();
11040 for (
auto &InterfacePair : Merge.second)
11041 InterfacePair.first->decls_begin();
11045 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
11046 PendingFunctionOdrMergeFailures.clear();
11047 for (
auto &Merge : FunctionOdrMergeFailures) {
11048 Merge.first->buildLookup();
11049 Merge.first->decls_begin();
11050 Merge.first->getBody();
11051 for (
auto &FD : Merge.second) {
11059 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
11060 PendingEnumOdrMergeFailures.clear();
11061 for (
auto &Merge : EnumOdrMergeFailures) {
11062 Merge.first->decls_begin();
11063 for (
auto &
Enum : Merge.second) {
11064 Enum->decls_begin();
11069 auto ObjCProtocolOdrMergeFailures =
11070 std::move(PendingObjCProtocolOdrMergeFailures);
11071 PendingObjCProtocolOdrMergeFailures.clear();
11072 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11073 Merge.first->decls_begin();
11074 for (
auto &ProtocolPair : Merge.second)
11075 ProtocolPair.first->decls_begin();
11084 while (!PendingOdrMergeChecks.empty()) {
11085 NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
11096 bool Found =
false;
11099 for (
auto *RI : D->
redecls()) {
11100 if (RI->getLexicalDeclContext() == CanonDef) {
11114 llvm::SmallVector<const NamedDecl*, 4> Candidates;
11115 for (
auto *CanonMember : CanonDef->
decls()) {
11116 if (CanonMember->getCanonicalDecl() == DCanon) {
11125 if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
11127 Candidates.push_back(ND);
11140 std::string CanonDefModule =
11145 << CanonDef << CanonDefModule.empty() << CanonDefModule;
11147 if (Candidates.empty())
11149 diag::note_module_odr_violation_no_possible_decls) << D;
11151 for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
11152 Diag(Candidates[I]->getLocation(),
11153 diag::note_module_odr_violation_possible_decl)
11157 DiagnosedOdrMergeFailures.insert(CanonDef);
11161 if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
11162 FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
11163 ObjCInterfaceOdrMergeFailures.empty() &&
11164 ObjCProtocolOdrMergeFailures.empty())
11167 ODRDiagsEmitter DiagsEmitter(Diags,
getContext(),
11171 for (
auto &Merge : OdrMergeFailures) {
11174 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11177 bool Diagnosed =
false;
11178 CXXRecordDecl *FirstRecord = Merge.first;
11179 for (
auto &RecordPair : Merge.second) {
11180 if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
11181 RecordPair.second)) {
11194 Diag(Merge.first->getLocation(),
11195 diag::err_module_odr_violation_different_instantiations)
11202 for (
auto &Merge : RecordOdrMergeFailures) {
11205 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11208 RecordDecl *FirstRecord = Merge.first;
11209 bool Diagnosed =
false;
11210 for (
auto *SecondRecord : Merge.second) {
11211 if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
11217 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11221 for (
auto &Merge : FunctionOdrMergeFailures) {
11222 FunctionDecl *FirstFunction = Merge.first;
11223 bool Diagnosed =
false;
11224 for (
auto &SecondFunction : Merge.second) {
11225 if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
11231 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11235 for (
auto &Merge : EnumOdrMergeFailures) {
11238 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11241 EnumDecl *FirstEnum = Merge.first;
11242 bool Diagnosed =
false;
11243 for (
auto &SecondEnum : Merge.second) {
11244 if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
11250 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11253 for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
11256 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11259 bool Diagnosed =
false;
11260 ObjCInterfaceDecl *FirstID = Merge.first;
11261 for (
auto &InterfacePair : Merge.second) {
11262 if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
11263 InterfacePair.second)) {
11269 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11272 for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
11275 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
11278 ObjCProtocolDecl *FirstProtocol = Merge.first;
11279 bool Diagnosed =
false;
11280 for (
auto &ProtocolPair : Merge.second) {
11281 if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
11282 ProtocolPair.second)) {
11288 assert(Diagnosed &&
"Unable to emit ODR diagnostic.");
11293 if (llvm::Timer *
T = ReadTimer.get();
11294 ++NumCurrentElementsDeserializing == 1 &&
T)
11295 ReadTimeRegion.emplace(
T);
11299 assert(NumCurrentElementsDeserializing &&
11300 "FinishedDeserializing not paired with StartedDeserializing");
11301 if (NumCurrentElementsDeserializing == 1) {
11304 finishPendingActions();
11306 --NumCurrentElementsDeserializing;
11308 if (NumCurrentElementsDeserializing == 0) {
11312 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
11320 while (!PendingExceptionSpecUpdates.empty() ||
11321 !PendingDeducedTypeUpdates.empty() ||
11322 !PendingUndeducedFunctionDecls.empty()) {
11323 auto ESUpdates = std::move(PendingExceptionSpecUpdates);
11324 PendingExceptionSpecUpdates.clear();
11325 for (
auto Update : ESUpdates) {
11326 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11329 if (
auto *Listener =
getContext().getASTMutationListener())
11331 for (
auto *Redecl :
Update.second->redecls())
11335 auto DTUpdates = std::move(PendingDeducedTypeUpdates);
11336 PendingDeducedTypeUpdates.clear();
11337 for (
auto Update : DTUpdates) {
11338 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
11345 auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
11346 PendingUndeducedFunctionDecls.clear();
11350 (void)UndeducedFD->getMostRecentDecl();
11353 ReadTimeRegion.reset();
11355 diagnoseOdrViolations();
11361 PassInterestingDeclsToConsumer();
11368 auto It = PendingFakeLookupResults.find(II);
11369 if (It != PendingFakeLookupResults.end()) {
11370 for (
auto *ND : It->second)
11375 It->second.clear();
11379 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
11380 SemaObj->TUScope->AddDecl(D);
11381 }
else if (SemaObj->TUScope) {
11385 if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
11386 SemaObj->TUScope->AddDecl(D);
11394 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11395 StringRef isysroot,
11397 bool AllowASTWithCompilerErrors,
11398 bool AllowConfigurationMismatch,
bool ValidateSystemInputs,
11399 bool ForceValidateUserInputs,
11400 bool ValidateASTInputFilesContent,
bool UseGlobalIndex,
11401 std::unique_ptr<llvm::Timer> ReadTimer)
11406 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
11407 StackHandler(Diags), PP(PP), ContextObj(Context),
11408 CodeGenOpts(CodeGenOpts),
11410 PP.getHeaderSearchInfo()),
11411 DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
11412 DisableValidationKind(DisableValidationKind),
11413 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
11414 AllowConfigurationMismatch(AllowConfigurationMismatch),
11415 ValidateSystemInputs(ValidateSystemInputs),
11416 ForceValidateUserInputs(ForceValidateUserInputs),
11417 ValidateASTInputFilesContent(ValidateASTInputFilesContent),
11418 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
11419 SourceMgr.setExternalSLocEntrySource(
this);
11421 PathBuf.reserve(256);
11423 for (
const auto &Ext : Extensions) {
11424 auto BlockName = Ext->getExtensionMetadata().BlockName;
11425 auto Known = ModuleFileExtensions.find(BlockName);
11426 if (Known != ModuleFileExtensions.end()) {
11427 Diags.Report(diag::warn_duplicate_module_file_extension)
11432 ModuleFileExtensions.insert({BlockName, Ext});
11437 if (OwnsDeserializationListener)
11438 delete DeserializationListener;
11442 return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
11446 unsigned AbbrevID) {
11449 return Cursor.readRecord(AbbrevID, Record);
11465 : Record(Record), Context(Record.getContext()) {}
11466#define GEN_CLANG_CLAUSE_CLASS
11467#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C);
11468#include "llvm/Frontend/OpenMP/OMP.inc"
11482 switch (llvm::omp::Clause(Record.readInt())) {
11483 case llvm::omp::OMPC_if:
11486 case llvm::omp::OMPC_final:
11489 case llvm::omp::OMPC_num_threads:
11492 case llvm::omp::OMPC_safelen:
11495 case llvm::omp::OMPC_simdlen:
11498 case llvm::omp::OMPC_sizes: {
11499 unsigned NumSizes = Record.readInt();
11503 case llvm::omp::OMPC_counts: {
11504 unsigned NumCounts = Record.readInt();
11508 case llvm::omp::OMPC_permutation: {
11509 unsigned NumLoops = Record.readInt();
11513 case llvm::omp::OMPC_full:
11516 case llvm::omp::OMPC_partial:
11519 case llvm::omp::OMPC_looprange:
11522 case llvm::omp::OMPC_allocator:
11525 case llvm::omp::OMPC_collapse:
11528 case llvm::omp::OMPC_default:
11531 case llvm::omp::OMPC_proc_bind:
11532 C =
new (Context) OMPProcBindClause();
11534 case llvm::omp::OMPC_schedule:
11535 C =
new (Context) OMPScheduleClause();
11537 case llvm::omp::OMPC_ordered:
11538 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt());
11540 case llvm::omp::OMPC_nowait:
11541 C =
new (Context) OMPNowaitClause();
11543 case llvm::omp::OMPC_untied:
11544 C =
new (Context) OMPUntiedClause();
11546 case llvm::omp::OMPC_mergeable:
11547 C =
new (Context) OMPMergeableClause();
11549 case llvm::omp::OMPC_threadset:
11552 case llvm::omp::OMPC_transparent:
11553 C =
new (Context) OMPTransparentClause();
11555 case llvm::omp::OMPC_read:
11556 C =
new (Context) OMPReadClause();
11558 case llvm::omp::OMPC_write:
11559 C =
new (Context) OMPWriteClause();
11561 case llvm::omp::OMPC_update:
11562 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
11564 case llvm::omp::OMPC_capture:
11565 C =
new (Context) OMPCaptureClause();
11567 case llvm::omp::OMPC_compare:
11568 C =
new (Context) OMPCompareClause();
11570 case llvm::omp::OMPC_fail:
11571 C =
new (Context) OMPFailClause();
11573 case llvm::omp::OMPC_seq_cst:
11574 C =
new (Context) OMPSeqCstClause();
11576 case llvm::omp::OMPC_acq_rel:
11577 C =
new (Context) OMPAcqRelClause();
11579 case llvm::omp::OMPC_absent: {
11580 unsigned NumKinds = Record.readInt();
11581 C = OMPAbsentClause::CreateEmpty(Context, NumKinds);
11584 case llvm::omp::OMPC_holds:
11585 C =
new (Context) OMPHoldsClause();
11587 case llvm::omp::OMPC_contains: {
11588 unsigned NumKinds = Record.readInt();
11589 C = OMPContainsClause::CreateEmpty(Context, NumKinds);
11592 case llvm::omp::OMPC_no_openmp:
11593 C =
new (Context) OMPNoOpenMPClause();
11595 case llvm::omp::OMPC_no_openmp_routines:
11596 C =
new (Context) OMPNoOpenMPRoutinesClause();
11598 case llvm::omp::OMPC_no_openmp_constructs:
11599 C =
new (Context) OMPNoOpenMPConstructsClause();
11601 case llvm::omp::OMPC_no_parallelism:
11602 C =
new (Context) OMPNoParallelismClause();
11604 case llvm::omp::OMPC_acquire:
11605 C =
new (Context) OMPAcquireClause();
11607 case llvm::omp::OMPC_release:
11608 C =
new (Context) OMPReleaseClause();
11610 case llvm::omp::OMPC_relaxed:
11611 C =
new (Context) OMPRelaxedClause();
11613 case llvm::omp::OMPC_weak:
11614 C =
new (Context) OMPWeakClause();
11616 case llvm::omp::OMPC_threads:
11619 case llvm::omp::OMPC_simd:
11622 case llvm::omp::OMPC_nogroup:
11625 case llvm::omp::OMPC_unified_address:
11626 C =
new (Context) OMPUnifiedAddressClause();
11628 case llvm::omp::OMPC_unified_shared_memory:
11629 C =
new (Context) OMPUnifiedSharedMemoryClause();
11631 case llvm::omp::OMPC_reverse_offload:
11632 C =
new (Context) OMPReverseOffloadClause();
11634 case llvm::omp::OMPC_dynamic_allocators:
11635 C =
new (Context) OMPDynamicAllocatorsClause();
11637 case llvm::omp::OMPC_atomic_default_mem_order:
11638 C =
new (Context) OMPAtomicDefaultMemOrderClause();
11640 case llvm::omp::OMPC_self_maps:
11641 C =
new (Context) OMPSelfMapsClause();
11643 case llvm::omp::OMPC_at:
11644 C =
new (Context) OMPAtClause();
11646 case llvm::omp::OMPC_severity:
11647 C =
new (Context) OMPSeverityClause();
11649 case llvm::omp::OMPC_message:
11650 C =
new (Context) OMPMessageClause();
11652 case llvm::omp::OMPC_private:
11653 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt());
11655 case llvm::omp::OMPC_firstprivate:
11656 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt());
11658 case llvm::omp::OMPC_lastprivate:
11659 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt());
11661 case llvm::omp::OMPC_shared:
11662 C = OMPSharedClause::CreateEmpty(Context, Record.readInt());
11664 case llvm::omp::OMPC_reduction: {
11665 unsigned N = Record.readInt();
11667 C = OMPReductionClause::CreateEmpty(Context, N, Modifier);
11670 case llvm::omp::OMPC_task_reduction:
11671 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt());
11673 case llvm::omp::OMPC_in_reduction:
11674 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt());
11676 case llvm::omp::OMPC_linear:
11677 C = OMPLinearClause::CreateEmpty(Context, Record.readInt());
11679 case llvm::omp::OMPC_aligned:
11682 case llvm::omp::OMPC_copyin:
11685 case llvm::omp::OMPC_copyprivate:
11688 case llvm::omp::OMPC_flush:
11691 case llvm::omp::OMPC_depobj:
11694 case llvm::omp::OMPC_depend: {
11695 unsigned NumVars = Record.readInt();
11696 unsigned NumLoops = Record.readInt();
11700 case llvm::omp::OMPC_device:
11703 case llvm::omp::OMPC_map: {
11705 Sizes.
NumVars = Record.readInt();
11712 case llvm::omp::OMPC_num_teams:
11715 case llvm::omp::OMPC_thread_limit:
11718 case llvm::omp::OMPC_priority:
11721 case llvm::omp::OMPC_grainsize:
11724 case llvm::omp::OMPC_num_tasks:
11727 case llvm::omp::OMPC_hint:
11730 case llvm::omp::OMPC_dist_schedule:
11733 case llvm::omp::OMPC_defaultmap:
11736 case llvm::omp::OMPC_to: {
11738 Sizes.
NumVars = Record.readInt();
11745 case llvm::omp::OMPC_from: {
11747 Sizes.
NumVars = Record.readInt();
11754 case llvm::omp::OMPC_use_device_ptr: {
11756 Sizes.
NumVars = Record.readInt();
11763 case llvm::omp::OMPC_use_device_addr: {
11765 Sizes.
NumVars = Record.readInt();
11772 case llvm::omp::OMPC_is_device_ptr: {
11774 Sizes.
NumVars = Record.readInt();
11781 case llvm::omp::OMPC_has_device_addr: {
11783 Sizes.
NumVars = Record.readInt();
11790 case llvm::omp::OMPC_allocate:
11793 case llvm::omp::OMPC_nontemporal:
11796 case llvm::omp::OMPC_inclusive:
11799 case llvm::omp::OMPC_exclusive:
11802 case llvm::omp::OMPC_order:
11805 case llvm::omp::OMPC_init: {
11806 unsigned VarListSize = Record.readInt();
11807 unsigned NumAttrs = Record.readInt();
11812 case llvm::omp::OMPC_use:
11815 case llvm::omp::OMPC_destroy:
11818 case llvm::omp::OMPC_novariants:
11821 case llvm::omp::OMPC_nocontext:
11824 case llvm::omp::OMPC_detach:
11827 case llvm::omp::OMPC_uses_allocators:
11830 case llvm::omp::OMPC_affinity:
11833 case llvm::omp::OMPC_filter:
11836 case llvm::omp::OMPC_bind:
11839 case llvm::omp::OMPC_align:
11842 case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
11845 case llvm::omp::OMPC_dyn_groupprivate:
11848 case llvm::omp::OMPC_doacross: {
11849 unsigned NumVars = Record.readInt();
11850 unsigned NumLoops = Record.readInt();
11854 case llvm::omp::OMPC_ompx_attribute:
11857 case llvm::omp::OMPC_ompx_bare:
11860#define OMP_CLAUSE_NO_CLASS(Enum, Str) \
11861 case llvm::omp::Enum: \
11863#include "llvm/Frontend/OpenMP/OMPKinds.def"
11867 assert(
C &&
"Unknown OMPClause type");
11870 C->setLocStart(Record.readSourceLocation());
11871 C->setLocEnd(Record.readSourceLocation());
11877 C->setPreInitStmt(Record.readSubStmt(),
11883 C->setPostUpdateExpr(Record.readSubExpr());
11886void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
11889 C->setNameModifierLoc(
Record.readSourceLocation());
11890 C->setColonLoc(
Record.readSourceLocation());
11891 C->setCondition(
Record.readSubExpr());
11892 C->setLParenLoc(
Record.readSourceLocation());
11897 C->setCondition(
Record.readSubExpr());
11898 C->setLParenLoc(
Record.readSourceLocation());
11904 C->setNumThreads(Record.readSubExpr());
11905 C->setModifierLoc(Record.readSourceLocation());
11906 C->setLParenLoc(Record.readSourceLocation());
11910 C->setSafelen(Record.readSubExpr());
11911 C->setLParenLoc(Record.readSourceLocation());
11915 C->setSimdlen(Record.readSubExpr());
11916 C->setLParenLoc(Record.readSourceLocation());
11920 for (Expr *&E :
C->getSizesRefs())
11921 E = Record.readSubExpr();
11922 C->setLParenLoc(Record.readSourceLocation());
11926 bool HasFill = Record.readBool();
11928 C->setOmpFillIndex(Record.readInt());
11929 C->setOmpFillLoc(Record.readSourceLocation());
11930 for (Expr *&E :
C->getCountsRefs())
11931 E = Record.readSubExpr();
11932 C->setLParenLoc(Record.readSourceLocation());
11936 for (Expr *&E :
C->getArgsRefs())
11937 E = Record.readSubExpr();
11938 C->setLParenLoc(Record.readSourceLocation());
11944 C->setFactor(Record.readSubExpr());
11945 C->setLParenLoc(Record.readSourceLocation());
11949 C->setFirst(Record.readSubExpr());
11950 C->setCount(Record.readSubExpr());
11951 C->setLParenLoc(Record.readSourceLocation());
11952 C->setFirstLoc(Record.readSourceLocation());
11953 C->setCountLoc(Record.readSourceLocation());
11957 C->setAllocator(Record.readExpr());
11958 C->setLParenLoc(Record.readSourceLocation());
11962 C->setNumForLoops(Record.readSubExpr());
11963 C->setLParenLoc(Record.readSourceLocation());
11967 C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
11968 C->setLParenLoc(Record.readSourceLocation());
11969 C->setDefaultKindKwLoc(Record.readSourceLocation());
11970 C->setDefaultVariableCategory(
11972 C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
11978 C->setLParenLoc(Record.readSourceLocation());
11979 SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
11980 C->setThreadsetKindLoc(ThreadsetKindLoc);
11983 C->setThreadsetKind(TKind);
11986void OMPClauseReader::VisitOMPTransparentClause(OMPTransparentClause *
C) {
11987 C->setLParenLoc(Record.readSourceLocation());
11988 C->setImpexTypeKind(Record.readSubExpr());
11991void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *
C) {
11992 C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
11993 C->setLParenLoc(Record.readSourceLocation());
11994 C->setProcBindKindKwLoc(Record.readSourceLocation());
11997void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *
C) {
11999 C->setScheduleKind(
12001 C->setFirstScheduleModifier(
12003 C->setSecondScheduleModifier(
12005 C->setChunkSize(Record.readSubExpr());
12006 C->setLParenLoc(Record.readSourceLocation());
12007 C->setFirstScheduleModifierLoc(Record.readSourceLocation());
12008 C->setSecondScheduleModifierLoc(Record.readSourceLocation());
12009 C->setScheduleKindLoc(Record.readSourceLocation());
12010 C->setCommaLoc(Record.readSourceLocation());
12013void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *
C) {
12014 C->setNumForLoops(Record.readSubExpr());
12015 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
12016 C->setLoopNumIterations(I, Record.readSubExpr());
12017 for (
unsigned I = 0, E =
C->NumberOfLoops; I < E; ++I)
12018 C->setLoopCounter(I, Record.readSubExpr());
12019 C->setLParenLoc(Record.readSourceLocation());
12022void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *
C) {
12023 C->setEventHandler(Record.readSubExpr());
12024 C->setLParenLoc(Record.readSourceLocation());
12027void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *
C) {
12028 C->setCondition(Record.readSubExpr());
12029 C->setLParenLoc(Record.readSourceLocation());
12032void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
12034void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
12036void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
12038void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
12040void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *
C) {
12041 if (
C->isExtended()) {
12042 C->setLParenLoc(Record.readSourceLocation());
12043 C->setArgumentLoc(Record.readSourceLocation());
12048void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
12050void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {}
12054void OMPClauseReader::VisitOMPFailClause(OMPFailClause *
C) {
12055 C->setLParenLoc(Record.readSourceLocation());
12056 SourceLocation FailParameterLoc = Record.readSourceLocation();
12057 C->setFailParameterLoc(FailParameterLoc);
12059 C->setFailParameter(CKind);
12062void OMPClauseReader::VisitOMPAbsentClause(OMPAbsentClause *
C) {
12063 unsigned Count =
C->getDirectiveKinds().size();
12064 C->setLParenLoc(Record.readSourceLocation());
12065 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12066 DKVec.reserve(Count);
12067 for (
unsigned I = 0; I < Count; I++) {
12070 C->setDirectiveKinds(DKVec);
12073void OMPClauseReader::VisitOMPHoldsClause(OMPHoldsClause *
C) {
12074 C->setExpr(Record.readExpr());
12075 C->setLParenLoc(Record.readSourceLocation());
12078void OMPClauseReader::VisitOMPContainsClause(OMPContainsClause *
C) {
12079 unsigned Count =
C->getDirectiveKinds().size();
12080 C->setLParenLoc(Record.readSourceLocation());
12081 llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
12082 DKVec.reserve(Count);
12083 for (
unsigned I = 0; I < Count; I++) {
12086 C->setDirectiveKinds(DKVec);
12089void OMPClauseReader::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
12091void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
12092 OMPNoOpenMPRoutinesClause *) {}
12094void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
12095 OMPNoOpenMPConstructsClause *) {}
12097void OMPClauseReader::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
12099void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
12101void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
12103void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {}
12105void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {}
12107void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
12109void OMPClauseReader::VisitOMPWeakClause(OMPWeakClause *) {}
12111void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
12113void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
12115void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
12117void OMPClauseReader::VisitOMPInitClause(OMPInitClause *
C) {
12118 unsigned NumVars =
C->varlist_size();
12119 SmallVector<Expr *, 16> Vars;
12120 Vars.reserve(NumVars);
12121 for (
unsigned I = 0; I != NumVars; ++I)
12122 Vars.push_back(Record.readSubExpr());
12123 C->setVarRefs(Vars);
12124 C->setIsTarget(Record.readBool());
12125 C->setIsTargetSync(Record.readBool());
12126 C->setHasPreferAttrs(Record.readBool());
12128 unsigned NumPrefs =
C->varlist_size() - 1;
12129 SmallVector<unsigned, 4> Counts;
12130 SmallVector<Expr *, 8> Attrs;
12131 Counts.reserve(NumPrefs);
12132 for (
unsigned I = 0; I < NumPrefs; ++I) {
12133 unsigned NA = Record.readInt();
12134 Counts.push_back(NA);
12135 for (
unsigned J = 0; J < NA; ++J)
12136 Attrs.push_back(Record.readSubExpr());
12138 C->setAttrs(Counts, Attrs);
12140 C->setLParenLoc(Record.readSourceLocation());
12141 C->setVarLoc(Record.readSourceLocation());
12144void OMPClauseReader::VisitOMPUseClause(OMPUseClause *
C) {
12145 C->setInteropVar(Record.readSubExpr());
12146 C->setLParenLoc(Record.readSourceLocation());
12147 C->setVarLoc(Record.readSourceLocation());
12150void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *
C) {
12151 C->setInteropVar(Record.readSubExpr());
12152 C->setLParenLoc(Record.readSourceLocation());
12153 C->setVarLoc(Record.readSourceLocation());
12156void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
12158 C->setCondition(Record.readSubExpr());
12159 C->setLParenLoc(Record.readSourceLocation());
12162void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *
C) {
12164 C->setCondition(Record.readSubExpr());
12165 C->setLParenLoc(Record.readSourceLocation());
12168void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
12170void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
12171 OMPUnifiedSharedMemoryClause *) {}
12173void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
12176OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
12179void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
12180 OMPAtomicDefaultMemOrderClause *
C) {
12181 C->setAtomicDefaultMemOrderKind(
12183 C->setLParenLoc(Record.readSourceLocation());
12184 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
12187void OMPClauseReader::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
12189void OMPClauseReader::VisitOMPAtClause(OMPAtClause *
C) {
12191 C->setLParenLoc(Record.readSourceLocation());
12192 C->setAtKindKwLoc(Record.readSourceLocation());
12195void OMPClauseReader::VisitOMPSeverityClause(OMPSeverityClause *
C) {
12197 C->setLParenLoc(Record.readSourceLocation());
12198 C->setSeverityKindKwLoc(Record.readSourceLocation());
12201void OMPClauseReader::VisitOMPMessageClause(OMPMessageClause *
C) {
12203 C->setMessageString(Record.readSubExpr());
12204 C->setLParenLoc(Record.readSourceLocation());
12207void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *
C) {
12208 C->setLParenLoc(Record.readSourceLocation());
12209 unsigned NumVars =
C->varlist_size();
12210 SmallVector<Expr *, 16> Vars;
12211 Vars.reserve(NumVars);
12212 for (
unsigned i = 0; i != NumVars; ++i)
12213 Vars.push_back(Record.readSubExpr());
12214 C->setVarRefs(Vars);
12216 for (
unsigned i = 0; i != NumVars; ++i)
12217 Vars.push_back(Record.readSubExpr());
12218 C->setPrivateCopies(Vars);
12221void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
12223 C->setLParenLoc(Record.readSourceLocation());
12224 unsigned NumVars =
C->varlist_size();
12225 SmallVector<Expr *, 16> Vars;
12226 Vars.reserve(NumVars);
12227 for (
unsigned i = 0; i != NumVars; ++i)
12228 Vars.push_back(Record.readSubExpr());
12229 C->setVarRefs(Vars);
12231 for (
unsigned i = 0; i != NumVars; ++i)
12232 Vars.push_back(Record.readSubExpr());
12233 C->setPrivateCopies(Vars);
12235 for (
unsigned i = 0; i != NumVars; ++i)
12236 Vars.push_back(Record.readSubExpr());
12240void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
12242 C->setLParenLoc(Record.readSourceLocation());
12244 C->setKindLoc(Record.readSourceLocation());
12245 C->setColonLoc(Record.readSourceLocation());
12246 unsigned NumVars =
C->varlist_size();
12247 SmallVector<Expr *, 16> Vars;
12248 Vars.reserve(NumVars);
12249 for (
unsigned i = 0; i != NumVars; ++i)
12250 Vars.push_back(Record.readSubExpr());
12251 C->setVarRefs(Vars);
12253 for (
unsigned i = 0; i != NumVars; ++i)
12254 Vars.push_back(Record.readSubExpr());
12255 C->setPrivateCopies(Vars);
12257 for (
unsigned i = 0; i != NumVars; ++i)
12258 Vars.push_back(Record.readSubExpr());
12259 C->setSourceExprs(Vars);
12261 for (
unsigned i = 0; i != NumVars; ++i)
12262 Vars.push_back(Record.readSubExpr());
12263 C->setDestinationExprs(Vars);
12265 for (
unsigned i = 0; i != NumVars; ++i)
12266 Vars.push_back(Record.readSubExpr());
12267 C->setAssignmentOps(Vars);
12270void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *
C) {
12271 C->setLParenLoc(Record.readSourceLocation());
12272 unsigned NumVars =
C->varlist_size();
12273 SmallVector<Expr *, 16> Vars;
12274 Vars.reserve(NumVars);
12275 for (
unsigned i = 0; i != NumVars; ++i)
12276 Vars.push_back(Record.readSubExpr());
12277 C->setVarRefs(Vars);
12280void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *
C) {
12282 C->setLParenLoc(Record.readSourceLocation());
12283 C->setModifierLoc(Record.readSourceLocation());
12284 C->setColonLoc(Record.readSourceLocation());
12285 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12286 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12287 C->setQualifierLoc(NNSL);
12288 C->setNameInfo(DNI);
12290 unsigned NumVars =
C->varlist_size();
12291 SmallVector<Expr *, 16> Vars;
12292 Vars.reserve(NumVars);
12293 for (
unsigned i = 0; i != NumVars; ++i)
12294 Vars.push_back(Record.readSubExpr());
12295 C->setVarRefs(Vars);
12297 for (
unsigned i = 0; i != NumVars; ++i)
12298 Vars.push_back(Record.readSubExpr());
12299 C->setPrivates(Vars);
12301 for (
unsigned i = 0; i != NumVars; ++i)
12302 Vars.push_back(Record.readSubExpr());
12303 C->setLHSExprs(Vars);
12305 for (
unsigned i = 0; i != NumVars; ++i)
12306 Vars.push_back(Record.readSubExpr());
12307 C->setRHSExprs(Vars);
12309 for (
unsigned i = 0; i != NumVars; ++i)
12310 Vars.push_back(Record.readSubExpr());
12311 C->setReductionOps(Vars);
12312 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
12314 for (
unsigned i = 0; i != NumVars; ++i)
12315 Vars.push_back(Record.readSubExpr());
12316 C->setInscanCopyOps(Vars);
12318 for (
unsigned i = 0; i != NumVars; ++i)
12319 Vars.push_back(Record.readSubExpr());
12320 C->setInscanCopyArrayTemps(Vars);
12322 for (
unsigned i = 0; i != NumVars; ++i)
12323 Vars.push_back(Record.readSubExpr());
12324 C->setInscanCopyArrayElems(Vars);
12326 unsigned NumFlags = Record.readInt();
12327 SmallVector<bool, 16> Flags;
12328 Flags.reserve(NumFlags);
12329 for ([[maybe_unused]]
unsigned I : llvm::seq<unsigned>(NumFlags))
12330 Flags.push_back(Record.readInt());
12331 C->setPrivateVariableReductionFlags(Flags);
12334void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
12336 C->setLParenLoc(Record.readSourceLocation());
12337 C->setColonLoc(Record.readSourceLocation());
12338 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12339 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12340 C->setQualifierLoc(NNSL);
12341 C->setNameInfo(DNI);
12343 unsigned NumVars =
C->varlist_size();
12344 SmallVector<Expr *, 16> Vars;
12345 Vars.reserve(NumVars);
12346 for (
unsigned I = 0; I != NumVars; ++I)
12347 Vars.push_back(Record.readSubExpr());
12348 C->setVarRefs(Vars);
12350 for (
unsigned I = 0; I != NumVars; ++I)
12351 Vars.push_back(Record.readSubExpr());
12352 C->setPrivates(Vars);
12354 for (
unsigned I = 0; I != NumVars; ++I)
12355 Vars.push_back(Record.readSubExpr());
12356 C->setLHSExprs(Vars);
12358 for (
unsigned I = 0; I != NumVars; ++I)
12359 Vars.push_back(Record.readSubExpr());
12360 C->setRHSExprs(Vars);
12362 for (
unsigned I = 0; I != NumVars; ++I)
12363 Vars.push_back(Record.readSubExpr());
12364 C->setReductionOps(Vars);
12367void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *
C) {
12369 C->setLParenLoc(Record.readSourceLocation());
12370 C->setColonLoc(Record.readSourceLocation());
12371 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
12372 DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
12373 C->setQualifierLoc(NNSL);
12374 C->setNameInfo(DNI);
12376 unsigned NumVars =
C->varlist_size();
12377 SmallVector<Expr *, 16> Vars;
12378 Vars.reserve(NumVars);
12379 for (
unsigned I = 0; I != NumVars; ++I)
12380 Vars.push_back(Record.readSubExpr());
12381 C->setVarRefs(Vars);
12383 for (
unsigned I = 0; I != NumVars; ++I)
12384 Vars.push_back(Record.readSubExpr());
12385 C->setPrivates(Vars);
12387 for (
unsigned I = 0; I != NumVars; ++I)
12388 Vars.push_back(Record.readSubExpr());
12389 C->setLHSExprs(Vars);
12391 for (
unsigned I = 0; I != NumVars; ++I)
12392 Vars.push_back(Record.readSubExpr());
12393 C->setRHSExprs(Vars);
12395 for (
unsigned I = 0; I != NumVars; ++I)
12396 Vars.push_back(Record.readSubExpr());
12397 C->setReductionOps(Vars);
12399 for (
unsigned I = 0; I != NumVars; ++I)
12400 Vars.push_back(Record.readSubExpr());
12401 C->setTaskgroupDescriptors(Vars);
12404void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *
C) {
12406 C->setLParenLoc(Record.readSourceLocation());
12407 C->setColonLoc(Record.readSourceLocation());
12409 C->setModifierLoc(Record.readSourceLocation());
12410 unsigned NumVars =
C->varlist_size();
12411 SmallVector<Expr *, 16> Vars;
12412 Vars.reserve(NumVars);
12413 for (
unsigned i = 0; i != NumVars; ++i)
12414 Vars.push_back(Record.readSubExpr());
12415 C->setVarRefs(Vars);
12417 for (
unsigned i = 0; i != NumVars; ++i)
12418 Vars.push_back(Record.readSubExpr());
12419 C->setPrivates(Vars);
12421 for (
unsigned i = 0; i != NumVars; ++i)
12422 Vars.push_back(Record.readSubExpr());
12425 for (
unsigned i = 0; i != NumVars; ++i)
12426 Vars.push_back(Record.readSubExpr());
12427 C->setUpdates(Vars);
12429 for (
unsigned i = 0; i != NumVars; ++i)
12430 Vars.push_back(Record.readSubExpr());
12431 C->setFinals(Vars);
12432 C->setStep(Record.readSubExpr());
12433 C->setCalcStep(Record.readSubExpr());
12435 for (
unsigned I = 0; I != NumVars + 1; ++I)
12436 Vars.push_back(Record.readSubExpr());
12437 C->setUsedExprs(Vars);
12440void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *
C) {
12441 C->setLParenLoc(Record.readSourceLocation());
12442 C->setColonLoc(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);
12449 C->setAlignment(Record.readSubExpr());
12452void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *
C) {
12453 C->setLParenLoc(Record.readSourceLocation());
12454 unsigned NumVars =
C->varlist_size();
12455 SmallVector<Expr *, 16> Exprs;
12456 Exprs.reserve(NumVars);
12457 for (
unsigned i = 0; i != NumVars; ++i)
12458 Exprs.push_back(Record.readSubExpr());
12459 C->setVarRefs(Exprs);
12461 for (
unsigned i = 0; i != NumVars; ++i)
12462 Exprs.push_back(Record.readSubExpr());
12463 C->setSourceExprs(Exprs);
12465 for (
unsigned i = 0; i != NumVars; ++i)
12466 Exprs.push_back(Record.readSubExpr());
12467 C->setDestinationExprs(Exprs);
12469 for (
unsigned i = 0; i != NumVars; ++i)
12470 Exprs.push_back(Record.readSubExpr());
12471 C->setAssignmentOps(Exprs);
12474void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
12475 C->setLParenLoc(Record.readSourceLocation());
12476 unsigned NumVars =
C->varlist_size();
12477 SmallVector<Expr *, 16> Exprs;
12478 Exprs.reserve(NumVars);
12479 for (
unsigned i = 0; i != NumVars; ++i)
12480 Exprs.push_back(Record.readSubExpr());
12481 C->setVarRefs(Exprs);
12483 for (
unsigned i = 0; i != NumVars; ++i)
12484 Exprs.push_back(Record.readSubExpr());
12485 C->setSourceExprs(Exprs);
12487 for (
unsigned i = 0; i != NumVars; ++i)
12488 Exprs.push_back(Record.readSubExpr());
12489 C->setDestinationExprs(Exprs);
12491 for (
unsigned i = 0; i != NumVars; ++i)
12492 Exprs.push_back(Record.readSubExpr());
12493 C->setAssignmentOps(Exprs);
12496void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *
C) {
12497 C->setLParenLoc(Record.readSourceLocation());
12498 unsigned NumVars =
C->varlist_size();
12499 SmallVector<Expr *, 16> Vars;
12500 Vars.reserve(NumVars);
12501 for (
unsigned i = 0; i != NumVars; ++i)
12502 Vars.push_back(Record.readSubExpr());
12503 C->setVarRefs(Vars);
12506void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *
C) {
12507 C->setDepobj(Record.readSubExpr());
12508 C->setLParenLoc(Record.readSourceLocation());
12511void OMPClauseReader::VisitOMPDependClause(OMPDependClause *
C) {
12512 C->setLParenLoc(Record.readSourceLocation());
12513 C->setModifier(Record.readSubExpr());
12514 C->setDependencyKind(
12516 C->setDependencyLoc(Record.readSourceLocation());
12517 C->setColonLoc(Record.readSourceLocation());
12518 C->setOmpAllMemoryLoc(Record.readSourceLocation());
12519 unsigned NumVars =
C->varlist_size();
12520 SmallVector<Expr *, 16> Vars;
12521 Vars.reserve(NumVars);
12522 for (
unsigned I = 0; I != NumVars; ++I)
12523 Vars.push_back(Record.readSubExpr());
12524 C->setVarRefs(Vars);
12525 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
12526 C->setLoopData(I, Record.readSubExpr());
12529void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *
C) {
12532 C->setDevice(Record.readSubExpr());
12533 C->setModifierLoc(Record.readSourceLocation());
12534 C->setLParenLoc(Record.readSourceLocation());
12537void OMPClauseReader::VisitOMPMapClause(OMPMapClause *
C) {
12538 C->setLParenLoc(Record.readSourceLocation());
12539 bool HasIteratorModifier =
false;
12541 C->setMapTypeModifier(
12543 C->setMapTypeModifierLoc(I, Record.readSourceLocation());
12544 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
12545 HasIteratorModifier =
true;
12547 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12548 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12551 C->setMapLoc(Record.readSourceLocation());
12552 C->setColonLoc(Record.readSourceLocation());
12553 auto NumVars =
C->varlist_size();
12554 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12555 auto TotalLists =
C->getTotalComponentListNum();
12556 auto TotalComponents =
C->getTotalComponentsNum();
12558 SmallVector<Expr *, 16> Vars;
12559 Vars.reserve(NumVars);
12560 for (
unsigned i = 0; i != NumVars; ++i)
12561 Vars.push_back(Record.readExpr());
12562 C->setVarRefs(Vars);
12564 SmallVector<Expr *, 16> UDMappers;
12565 UDMappers.reserve(NumVars);
12566 for (
unsigned I = 0; I < NumVars; ++I)
12567 UDMappers.push_back(Record.readExpr());
12568 C->setUDMapperRefs(UDMappers);
12570 if (HasIteratorModifier)
12571 C->setIteratorModifier(Record.readExpr());
12573 SmallVector<ValueDecl *, 16> Decls;
12574 Decls.reserve(UniqueDecls);
12575 for (
unsigned i = 0; i < UniqueDecls; ++i)
12576 Decls.push_back(Record.readDeclAs<ValueDecl>());
12577 C->setUniqueDecls(Decls);
12579 SmallVector<unsigned, 16> ListsPerDecl;
12580 ListsPerDecl.reserve(UniqueDecls);
12581 for (
unsigned i = 0; i < UniqueDecls; ++i)
12582 ListsPerDecl.push_back(Record.readInt());
12583 C->setDeclNumLists(ListsPerDecl);
12585 SmallVector<unsigned, 32> ListSizes;
12586 ListSizes.reserve(TotalLists);
12587 for (
unsigned i = 0; i < TotalLists; ++i)
12588 ListSizes.push_back(Record.readInt());
12589 C->setComponentListSizes(ListSizes);
12591 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12592 Components.reserve(TotalComponents);
12593 for (
unsigned i = 0; i < TotalComponents; ++i) {
12594 Expr *AssociatedExprPr = Record.readExpr();
12595 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12596 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12599 C->setComponents(Components, ListSizes);
12605 C->setLParenLoc(Record.readSourceLocation());
12606 C->setColonLoc(Record.readSourceLocation());
12607 C->setAllocator(Record.readSubExpr());
12608 C->setAlignment(Record.readSubExpr());
12609 unsigned NumVars =
C->varlist_size();
12610 SmallVector<Expr *, 16> Vars;
12611 Vars.reserve(NumVars);
12612 for (
unsigned i = 0; i != NumVars; ++i)
12613 Vars.push_back(Record.readSubExpr());
12614 C->setVarRefs(Vars);
12617void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
12619 C->setModifierLoc(Record.readSourceLocation());
12620 C->setModifierExpr(Record.readSubExpr());
12622 C->setLParenLoc(Record.readSourceLocation());
12623 unsigned NumVars =
C->varlist_size();
12624 SmallVector<Expr *, 16> Vars;
12625 Vars.reserve(NumVars);
12626 for (
unsigned I = 0; I != NumVars; ++I)
12627 Vars.push_back(Record.readSubExpr());
12628 C->setVarRefs(Vars);
12631void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
12633 C->setModifierLoc(Record.readSourceLocation());
12634 C->setModifierExpr(Record.readSubExpr());
12636 C->setLParenLoc(Record.readSourceLocation());
12637 unsigned NumVars =
C->varlist_size();
12638 SmallVector<Expr *, 16> Vars;
12639 Vars.reserve(NumVars);
12640 for (
unsigned I = 0; I != NumVars; ++I)
12641 Vars.push_back(Record.readSubExpr());
12642 C->setVarRefs(Vars);
12645void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *
C) {
12647 C->setPriority(Record.readSubExpr());
12648 C->setLParenLoc(Record.readSourceLocation());
12651void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
12654 C->setGrainsize(Record.readSubExpr());
12655 C->setModifierLoc(Record.readSourceLocation());
12656 C->setLParenLoc(Record.readSourceLocation());
12659void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
12662 C->setNumTasks(Record.readSubExpr());
12663 C->setModifierLoc(Record.readSourceLocation());
12664 C->setLParenLoc(Record.readSourceLocation());
12667void OMPClauseReader::VisitOMPHintClause(OMPHintClause *
C) {
12668 C->setHint(Record.readSubExpr());
12669 C->setLParenLoc(Record.readSourceLocation());
12672void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
12674 C->setDistScheduleKind(
12676 C->setChunkSize(Record.readSubExpr());
12677 C->setLParenLoc(Record.readSourceLocation());
12678 C->setDistScheduleKindLoc(Record.readSourceLocation());
12679 C->setCommaLoc(Record.readSourceLocation());
12682void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
12683 C->setDefaultmapKind(
12685 C->setDefaultmapModifier(
12687 C->setLParenLoc(Record.readSourceLocation());
12688 C->setDefaultmapModifierLoc(Record.readSourceLocation());
12689 C->setDefaultmapKindLoc(Record.readSourceLocation());
12692void OMPClauseReader::VisitOMPToClause(OMPToClause *
C) {
12693 C->setLParenLoc(Record.readSourceLocation());
12695 C->setMotionModifier(
12697 C->setMotionModifierLoc(I, Record.readSourceLocation());
12698 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12699 C->setIteratorModifier(Record.readExpr());
12701 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12702 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12703 C->setColonLoc(Record.readSourceLocation());
12704 auto NumVars =
C->varlist_size();
12705 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12706 auto TotalLists =
C->getTotalComponentListNum();
12707 auto TotalComponents =
C->getTotalComponentsNum();
12709 SmallVector<Expr *, 16> Vars;
12710 Vars.reserve(NumVars);
12711 for (
unsigned i = 0; i != NumVars; ++i)
12712 Vars.push_back(Record.readSubExpr());
12713 C->setVarRefs(Vars);
12715 SmallVector<Expr *, 16> UDMappers;
12716 UDMappers.reserve(NumVars);
12717 for (
unsigned I = 0; I < NumVars; ++I)
12718 UDMappers.push_back(Record.readSubExpr());
12719 C->setUDMapperRefs(UDMappers);
12721 SmallVector<ValueDecl *, 16> Decls;
12722 Decls.reserve(UniqueDecls);
12723 for (
unsigned i = 0; i < UniqueDecls; ++i)
12724 Decls.push_back(Record.readDeclAs<ValueDecl>());
12725 C->setUniqueDecls(Decls);
12727 SmallVector<unsigned, 16> ListsPerDecl;
12728 ListsPerDecl.reserve(UniqueDecls);
12729 for (
unsigned i = 0; i < UniqueDecls; ++i)
12730 ListsPerDecl.push_back(Record.readInt());
12731 C->setDeclNumLists(ListsPerDecl);
12733 SmallVector<unsigned, 32> ListSizes;
12734 ListSizes.reserve(TotalLists);
12735 for (
unsigned i = 0; i < TotalLists; ++i)
12736 ListSizes.push_back(Record.readInt());
12737 C->setComponentListSizes(ListSizes);
12739 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12740 Components.reserve(TotalComponents);
12741 for (
unsigned i = 0; i < TotalComponents; ++i) {
12742 Expr *AssociatedExprPr = Record.readSubExpr();
12743 bool IsNonContiguous = Record.readBool();
12744 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12745 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12747 C->setComponents(Components, ListSizes);
12750void OMPClauseReader::VisitOMPFromClause(OMPFromClause *
C) {
12751 C->setLParenLoc(Record.readSourceLocation());
12753 C->setMotionModifier(
12755 C->setMotionModifierLoc(I, Record.readSourceLocation());
12756 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
12757 C->setIteratorModifier(Record.readExpr());
12759 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
12760 C->setMapperIdInfo(Record.readDeclarationNameInfo());
12761 C->setColonLoc(Record.readSourceLocation());
12762 auto NumVars =
C->varlist_size();
12763 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12764 auto TotalLists =
C->getTotalComponentListNum();
12765 auto TotalComponents =
C->getTotalComponentsNum();
12767 SmallVector<Expr *, 16> Vars;
12768 Vars.reserve(NumVars);
12769 for (
unsigned i = 0; i != NumVars; ++i)
12770 Vars.push_back(Record.readSubExpr());
12771 C->setVarRefs(Vars);
12773 SmallVector<Expr *, 16> UDMappers;
12774 UDMappers.reserve(NumVars);
12775 for (
unsigned I = 0; I < NumVars; ++I)
12776 UDMappers.push_back(Record.readSubExpr());
12777 C->setUDMapperRefs(UDMappers);
12779 SmallVector<ValueDecl *, 16> Decls;
12780 Decls.reserve(UniqueDecls);
12781 for (
unsigned i = 0; i < UniqueDecls; ++i)
12782 Decls.push_back(Record.readDeclAs<ValueDecl>());
12783 C->setUniqueDecls(Decls);
12785 SmallVector<unsigned, 16> ListsPerDecl;
12786 ListsPerDecl.reserve(UniqueDecls);
12787 for (
unsigned i = 0; i < UniqueDecls; ++i)
12788 ListsPerDecl.push_back(Record.readInt());
12789 C->setDeclNumLists(ListsPerDecl);
12791 SmallVector<unsigned, 32> ListSizes;
12792 ListSizes.reserve(TotalLists);
12793 for (
unsigned i = 0; i < TotalLists; ++i)
12794 ListSizes.push_back(Record.readInt());
12795 C->setComponentListSizes(ListSizes);
12797 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12798 Components.reserve(TotalComponents);
12799 for (
unsigned i = 0; i < TotalComponents; ++i) {
12800 Expr *AssociatedExprPr = Record.readSubExpr();
12801 bool IsNonContiguous = Record.readBool();
12802 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12803 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
12805 C->setComponents(Components, ListSizes);
12808void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
12809 C->setLParenLoc(Record.readSourceLocation());
12811 C->setFallbackModifierLoc(Record.readSourceLocation());
12812 auto NumVars =
C->varlist_size();
12813 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12814 auto TotalLists =
C->getTotalComponentListNum();
12815 auto TotalComponents =
C->getTotalComponentsNum();
12817 SmallVector<Expr *, 16> Vars;
12818 Vars.reserve(NumVars);
12819 for (
unsigned i = 0; i != NumVars; ++i)
12820 Vars.push_back(Record.readSubExpr());
12821 C->setVarRefs(Vars);
12823 for (
unsigned i = 0; i != NumVars; ++i)
12824 Vars.push_back(Record.readSubExpr());
12825 C->setPrivateCopies(Vars);
12827 for (
unsigned i = 0; i != NumVars; ++i)
12828 Vars.push_back(Record.readSubExpr());
12831 SmallVector<ValueDecl *, 16> Decls;
12832 Decls.reserve(UniqueDecls);
12833 for (
unsigned i = 0; i < UniqueDecls; ++i)
12834 Decls.push_back(Record.readDeclAs<ValueDecl>());
12835 C->setUniqueDecls(Decls);
12837 SmallVector<unsigned, 16> ListsPerDecl;
12838 ListsPerDecl.reserve(UniqueDecls);
12839 for (
unsigned i = 0; i < UniqueDecls; ++i)
12840 ListsPerDecl.push_back(Record.readInt());
12841 C->setDeclNumLists(ListsPerDecl);
12843 SmallVector<unsigned, 32> ListSizes;
12844 ListSizes.reserve(TotalLists);
12845 for (
unsigned i = 0; i < TotalLists; ++i)
12846 ListSizes.push_back(Record.readInt());
12847 C->setComponentListSizes(ListSizes);
12849 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12850 Components.reserve(TotalComponents);
12851 for (
unsigned i = 0; i < TotalComponents; ++i) {
12852 auto *AssociatedExprPr = Record.readSubExpr();
12853 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12854 Components.emplace_back(AssociatedExprPr, AssociatedDecl,
12857 C->setComponents(Components, ListSizes);
12860void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
12861 C->setLParenLoc(Record.readSourceLocation());
12862 auto NumVars =
C->varlist_size();
12863 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12864 auto TotalLists =
C->getTotalComponentListNum();
12865 auto TotalComponents =
C->getTotalComponentsNum();
12867 SmallVector<Expr *, 16> Vars;
12868 Vars.reserve(NumVars);
12869 for (
unsigned i = 0; i != NumVars; ++i)
12870 Vars.push_back(Record.readSubExpr());
12871 C->setVarRefs(Vars);
12873 SmallVector<ValueDecl *, 16> Decls;
12874 Decls.reserve(UniqueDecls);
12875 for (
unsigned i = 0; i < UniqueDecls; ++i)
12876 Decls.push_back(Record.readDeclAs<ValueDecl>());
12877 C->setUniqueDecls(Decls);
12879 SmallVector<unsigned, 16> ListsPerDecl;
12880 ListsPerDecl.reserve(UniqueDecls);
12881 for (
unsigned i = 0; i < UniqueDecls; ++i)
12882 ListsPerDecl.push_back(Record.readInt());
12883 C->setDeclNumLists(ListsPerDecl);
12885 SmallVector<unsigned, 32> ListSizes;
12886 ListSizes.reserve(TotalLists);
12887 for (
unsigned i = 0; i < TotalLists; ++i)
12888 ListSizes.push_back(Record.readInt());
12889 C->setComponentListSizes(ListSizes);
12891 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12892 Components.reserve(TotalComponents);
12893 for (
unsigned i = 0; i < TotalComponents; ++i) {
12894 Expr *AssociatedExpr = Record.readSubExpr();
12895 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12896 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12899 C->setComponents(Components, ListSizes);
12902void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
12903 C->setLParenLoc(Record.readSourceLocation());
12904 auto NumVars =
C->varlist_size();
12905 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12906 auto TotalLists =
C->getTotalComponentListNum();
12907 auto TotalComponents =
C->getTotalComponentsNum();
12909 SmallVector<Expr *, 16> Vars;
12910 Vars.reserve(NumVars);
12911 for (
unsigned i = 0; i != NumVars; ++i)
12912 Vars.push_back(Record.readSubExpr());
12913 C->setVarRefs(Vars);
12916 SmallVector<ValueDecl *, 16> Decls;
12917 Decls.reserve(UniqueDecls);
12918 for (
unsigned i = 0; i < UniqueDecls; ++i)
12919 Decls.push_back(Record.readDeclAs<ValueDecl>());
12920 C->setUniqueDecls(Decls);
12922 SmallVector<unsigned, 16> ListsPerDecl;
12923 ListsPerDecl.reserve(UniqueDecls);
12924 for (
unsigned i = 0; i < UniqueDecls; ++i)
12925 ListsPerDecl.push_back(Record.readInt());
12926 C->setDeclNumLists(ListsPerDecl);
12928 SmallVector<unsigned, 32> ListSizes;
12929 ListSizes.reserve(TotalLists);
12930 for (
unsigned i = 0; i < TotalLists; ++i)
12931 ListSizes.push_back(Record.readInt());
12932 C->setComponentListSizes(ListSizes);
12934 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12935 Components.reserve(TotalComponents);
12936 for (
unsigned i = 0; i < TotalComponents; ++i) {
12937 Expr *AssociatedExpr = Record.readSubExpr();
12938 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12939 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12942 C->setComponents(Components, ListSizes);
12945void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
12946 C->setLParenLoc(Record.readSourceLocation());
12947 auto NumVars =
C->varlist_size();
12948 auto UniqueDecls =
C->getUniqueDeclarationsNum();
12949 auto TotalLists =
C->getTotalComponentListNum();
12950 auto TotalComponents =
C->getTotalComponentsNum();
12952 SmallVector<Expr *, 16> Vars;
12953 Vars.reserve(NumVars);
12954 for (
unsigned I = 0; I != NumVars; ++I)
12955 Vars.push_back(Record.readSubExpr());
12956 C->setVarRefs(Vars);
12959 SmallVector<ValueDecl *, 16> Decls;
12960 Decls.reserve(UniqueDecls);
12961 for (
unsigned I = 0; I < UniqueDecls; ++I)
12962 Decls.push_back(Record.readDeclAs<ValueDecl>());
12963 C->setUniqueDecls(Decls);
12965 SmallVector<unsigned, 16> ListsPerDecl;
12966 ListsPerDecl.reserve(UniqueDecls);
12967 for (
unsigned I = 0; I < UniqueDecls; ++I)
12968 ListsPerDecl.push_back(Record.readInt());
12969 C->setDeclNumLists(ListsPerDecl);
12971 SmallVector<unsigned, 32> ListSizes;
12972 ListSizes.reserve(TotalLists);
12973 for (
unsigned i = 0; i < TotalLists; ++i)
12974 ListSizes.push_back(Record.readInt());
12975 C->setComponentListSizes(ListSizes);
12977 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
12978 Components.reserve(TotalComponents);
12979 for (
unsigned I = 0; I < TotalComponents; ++I) {
12980 Expr *AssociatedExpr = Record.readSubExpr();
12981 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
12982 Components.emplace_back(AssociatedExpr, AssociatedDecl,
12985 C->setComponents(Components, ListSizes);
12988void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
12989 C->setLParenLoc(Record.readSourceLocation());
12990 unsigned NumVars =
C->varlist_size();
12991 SmallVector<Expr *, 16> Vars;
12992 Vars.reserve(NumVars);
12993 for (
unsigned i = 0; i != NumVars; ++i)
12994 Vars.push_back(Record.readSubExpr());
12995 C->setVarRefs(Vars);
12997 Vars.reserve(NumVars);
12998 for (
unsigned i = 0; i != NumVars; ++i)
12999 Vars.push_back(Record.readSubExpr());
13000 C->setPrivateRefs(Vars);
13003void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
13004 C->setLParenLoc(Record.readSourceLocation());
13005 unsigned NumVars =
C->varlist_size();
13006 SmallVector<Expr *, 16> Vars;
13007 Vars.reserve(NumVars);
13008 for (
unsigned i = 0; i != NumVars; ++i)
13009 Vars.push_back(Record.readSubExpr());
13010 C->setVarRefs(Vars);
13013void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
13014 C->setLParenLoc(Record.readSourceLocation());
13015 unsigned NumVars =
C->varlist_size();
13016 SmallVector<Expr *, 16> Vars;
13017 Vars.reserve(NumVars);
13018 for (
unsigned i = 0; i != NumVars; ++i)
13019 Vars.push_back(Record.readSubExpr());
13020 C->setVarRefs(Vars);
13023void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
13024 C->setLParenLoc(Record.readSourceLocation());
13025 unsigned NumOfAllocators =
C->getNumberOfAllocators();
13026 SmallVector<OMPUsesAllocatorsClause::Data, 4>
Data;
13027 Data.reserve(NumOfAllocators);
13028 for (
unsigned I = 0; I != NumOfAllocators; ++I) {
13029 OMPUsesAllocatorsClause::Data &D =
Data.emplace_back();
13032 D.
LParenLoc = Record.readSourceLocation();
13033 D.
RParenLoc = Record.readSourceLocation();
13035 C->setAllocatorsData(
Data);
13038void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *
C) {
13039 C->setLParenLoc(Record.readSourceLocation());
13040 C->setModifier(Record.readSubExpr());
13041 C->setColonLoc(Record.readSourceLocation());
13042 unsigned NumOfLocators =
C->varlist_size();
13043 SmallVector<Expr *, 4> Locators;
13044 Locators.reserve(NumOfLocators);
13045 for (
unsigned I = 0; I != NumOfLocators; ++I)
13046 Locators.push_back(Record.readSubExpr());
13047 C->setVarRefs(Locators);
13050void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *
C) {
13053 C->setLParenLoc(Record.readSourceLocation());
13054 C->setKindKwLoc(Record.readSourceLocation());
13055 C->setModifierKwLoc(Record.readSourceLocation());
13058void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *
C) {
13060 C->setThreadID(Record.readSubExpr());
13061 C->setLParenLoc(Record.readSourceLocation());
13064void OMPClauseReader::VisitOMPBindClause(OMPBindClause *
C) {
13066 C->setLParenLoc(Record.readSourceLocation());
13067 C->setBindKindLoc(Record.readSourceLocation());
13071 C->setAlignment(Record.readExpr());
13072 C->setLParenLoc(Record.readSourceLocation());
13075void OMPClauseReader::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
13077 C->setSize(Record.readSubExpr());
13078 C->setLParenLoc(Record.readSourceLocation());
13081void OMPClauseReader::VisitOMPDynGroupprivateClause(
13082 OMPDynGroupprivateClause *
C) {
13084 C->setDynGroupprivateModifier(
13086 C->setDynGroupprivateFallbackModifier(
13088 C->setSize(Record.readSubExpr());
13089 C->setLParenLoc(Record.readSourceLocation());
13090 C->setDynGroupprivateModifierLoc(Record.readSourceLocation());
13091 C->setDynGroupprivateFallbackModifierLoc(Record.readSourceLocation());
13094void OMPClauseReader::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
13095 C->setLParenLoc(Record.readSourceLocation());
13096 C->setDependenceType(
13098 C->setDependenceLoc(Record.readSourceLocation());
13099 C->setColonLoc(Record.readSourceLocation());
13100 unsigned NumVars =
C->varlist_size();
13101 SmallVector<Expr *, 16> Vars;
13102 Vars.reserve(NumVars);
13103 for (
unsigned I = 0; I != NumVars; ++I)
13104 Vars.push_back(Record.readSubExpr());
13105 C->setVarRefs(Vars);
13106 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
13107 C->setLoopData(I, Record.readSubExpr());
13110void OMPClauseReader::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
13112 Record.readAttributes(Attrs);
13113 C->setAttrs(Attrs);
13114 C->setLocStart(Record.readSourceLocation());
13115 C->setLParenLoc(Record.readSourceLocation());
13116 C->setLocEnd(Record.readSourceLocation());
13119void OMPClauseReader::VisitOMPXBareClause(OMPXBareClause *
C) {}
13129 Selector.ScoreOrCondition =
nullptr;
13131 Selector.ScoreOrCondition = readExprRef();
13143 if (Reader->ReadingKind == ASTReader::Read_Stmt) {
13148 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
13150 Data->setClauses(Clauses);
13151 if (
Data->hasAssociatedStmt())
13153 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
13158 unsigned NumVars =
readInt();
13160 for (
unsigned I = 0; I < NumVars; ++I)
13166 unsigned NumExprs =
readInt();
13168 for (
unsigned I = 0; I < NumExprs; ++I)
13178 switch (ClauseKind) {
13193 bool isConditionExprClause =
readBool();
13194 if (isConditionExprClause) {
13199 unsigned NumVars =
readInt();
13201 for (
unsigned I = 0; I < NumVars; ++I)
13208 unsigned NumClauses =
readInt();
13210 for (
unsigned I = 0; I < NumClauses; ++I)
13244 for (
unsigned I = 0; I < VarList.size(); ++I) {
13247 RecipeList.push_back({Alloca});
13251 VarList, RecipeList, EndLoc);
13269 for (
unsigned I = 0; I < VarList.size(); ++I) {
13273 RecipeList.push_back({Recipe, RecipeTemp});
13277 VarList, RecipeList, EndLoc);
13328 LParenLoc, ModList, VarList, EndLoc);
13337 LParenLoc, ModList, VarList, EndLoc);
13346 LParenLoc, ModList, VarList, EndLoc);
13355 LParenLoc, ModList, VarList, EndLoc);
13361 AsyncExpr, EndLoc);
13369 DevNumExpr, QueuesLoc, QueueIdExprs,
13376 unsigned NumArchs =
readInt();
13378 for (
unsigned I = 0; I < NumArchs; ++I) {
13381 Archs.emplace_back(Loc, Ident);
13385 LParenLoc, Archs, EndLoc);
13393 for (
unsigned I = 0; I < VarList.size(); ++I) {
13397 3 *
sizeof(
int *));
13400 unsigned NumCombiners =
readInt();
13401 for (
unsigned I = 0; I < NumCombiners; ++I) {
13406 Combiners.push_back({LHS, RHS, Op});
13409 RecipeList.push_back({Recipe, Combiners});
13413 VarList, RecipeList, EndLoc);
13432 HasForce, LoopCount, EndLoc);
13436 unsigned NumClauses =
readInt();
13438 for (
unsigned I = 0; I < NumClauses; ++I)
13441 SizeExprs, EndLoc);
13445 unsigned NumExprs =
readInt();
13448 for (
unsigned I = 0; I < NumExprs; ++I) {
13454 GangKinds, Exprs, EndLoc);
13460 WorkerExpr, EndLoc);
13466 VectorExpr, EndLoc);
13478 LParenLoc, VarList, EndLoc);
13492 llvm_unreachable(
"Clause serialization not yet implemented");
13494 llvm_unreachable(
"Invalid Clause Kind");
13499 for (
unsigned I = 0; I < Clauses.size(); ++I)
13504 unsigned NumVars =
readInt();
13505 A->Clauses.resize(NumVars);
13512 llvm::FoldingSetNodeID ID;
13513 ID.AddString(PrimaryModuleName);
13514 return ID.computeStableHash();
13519 return std::nullopt;
13522 return std::nullopt;
13525 return std::nullopt;
Defines the clang::ASTContext interface.
static unsigned moduleKindForDiagnostic(ModuleKind Kind)
static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, ASTConsumer *Consumer)
Under non-PCH compilation the consumer receives the objc methods before receiving the implementation,...
static bool checkCodegenOptions(const CodeGenOptions &CGOpts, const CodeGenOptions &ExistingCGOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream)
Whether Stream doesn't start with the AST file magic number 'CPCH'.
static std::vector< std::string > accumulateFeaturesAsWritten(std::vector< std::string > FeaturesAsWritten)
static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionValueMismatch(DiagnosticsEngine *Diags, StringRef Description, StringRef ModuleFilename)
static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags)
static std::pair< bool, bool > wasValidatedInBuildSession(const ModuleFile &MF, const HeaderSearchOptions &HSOpts)
Returns {build-session validation applies, MF was validated this session}.
static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID)
static void collectMacroDefinitions(const PreprocessorOptions &PPOpts, MacroDefinitionsMap &Macros, SmallVectorImpl< StringRef > *MacroNames=nullptr)
Collect the macro definitions provided by the given preprocessor options.
static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II, bool IsModule)
static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method)
Move the given method to the back of the global list of methods.
static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps)
static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)
Whether the given identifier is "interesting".
static bool parseModuleFileExtensionMetadata(const SmallVectorImpl< uint64_t > &Record, StringRef Blob, ModuleFileExtensionMetadata &Metadata)
Parse a record and blob containing module file extension metadata.
static Module * getTopImportImplicitModule(ModuleManager &ModuleMgr, Preprocessor &PP)
Return the top import module if it is implicit, nullptr otherwise.
static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename, bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr, std::string &SuggestedPredefines, const LangOptions &LangOpts, OptionValidation Validation=OptionValidateContradictions)
Check the preprocessor options deserialized from the control block against the preprocessor options i...
static LLVM_ATTRIBUTE_NOINLINE bool diagnoseLanguageOptionFlagMismatch(DiagnosticsEngine *Diags, StringRef Description, bool SerializedValue, bool CurrentValue, StringRef ModuleFilename)
static void addMethodsToPool(Sema &S, ArrayRef< ObjCMethodDecl * > Methods, ObjCMethodList &List)
Add the given set of methods to the method list.
static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool IsSystem, bool SystemHeaderWarningsInModule, bool Complain)
static bool isPredefinedType(serialization::TypeID ID)
static bool readBit(unsigned &Bits)
static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool Complain)
static std::optional< Type::TypeClass > getTypeClassForCode(TypeCode code)
static std::pair< unsigned, unsigned > readULEBKeyDataLength(const unsigned char *&P)
Read ULEB-encoded key length and data length.
static unsigned getStableHashForModuleName(StringRef PrimaryModuleName)
static LLVM_DUMP_METHOD void dumpModuleIDMap(StringRef Name, const ContinuousRangeMap< Key, ModuleFile *, InitialCapacity > &Map)
@ OptionValidateStrictMatches
@ OptionValidateContradictions
static bool checkTargetOptions(const TargetOptions &TargetOpts, const TargetOptions &ExistingTargetOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of target options against an existing set of target options.
static bool checkLanguageOptions(const LangOptions &LangOpts, const LangOptions &ExistingLangOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of language options against an existing set of language options.
static std::pair< StringRef, StringRef > getUnresolvedInputFilenames(const ASTReader::RecordData &Record, const StringRef InputBlob)
#define CHECK_TARGET_OPT(Field, Name)
static ASTFileSignature readASTFileSignature(StringRef PCH)
Reads and return the signature record from PCH's control block, or else returns 0.
static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID)
Given a cursor at the start of an AST file, scan ahead and drop the cursor into the start of the give...
static unsigned getIndexForTypeID(serialization::TypeID ID)
static uint64_t readULEB(const unsigned char *&P)
static bool checkModuleCachePath(FileManager &FileMgr, StringRef ContextHash, StringRef ExistingSpecificModuleCachePath, StringRef ASTFilename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, const HeaderSearchOptions &ASTFileHSOpts)
Check that the specified and the existing module cache paths are equivalent.
Defines the clang::ASTSourceDescriptor class, which abstracts clang modules and precompiled header fi...
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines the Diagnostic-related interfaces.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the Diagnostic IDs-related interfaces.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::FileManager interface and associated types.
Defines the clang::FileSystemOptions interface.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
Defines some OpenACC-specific enums and functions.
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
Defines an enumeration for C++ overloaded operators.
Defines the clang::Preprocessor interface.
Defines the clang::SanitizerKind enum.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for Objective-C.
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 NumPrefs, unsigned NumAttrs)
Creates an empty clause sized for NumPrefs pref-specs and NumAttrs total attr() exprs across them.
static OMPIsDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPMapClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars original expressions, NumUniqueDeclarations declar...
This represents 'nocontext' clause in the 'pragma omp ...' directive.
This represents 'nogroup' clause in the 'pragma omp ...' directive.
static OMPNontemporalClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'novariants' clause in the 'pragma omp ...' directive.
This represents 'num_tasks' clause in the 'pragma omp ...' directive.
static OMPNumTeamsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'order' clause in the 'pragma omp ...' directive.
This represents 'priority' clause in the 'pragma omp ...' directive.
This represents 'simd' clause in the 'pragma omp ...' directive.
static OMPThreadLimitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'threads' clause in the 'pragma omp ...' directive.
static OMPToClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
This represents the 'use' clause in 'pragma omp ...' directives.
static OMPUseDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPUseDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
static OMPUsesAllocatorsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N allocators.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the 'pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the 'pragma omp target ...' directive.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
virtual void HandleInterestingDecl(DeclGroupRef D)
HandleInterestingDecl - Handle the specified interesting declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
const clang::PrintingPolicy & getPrintingPolicy() const
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
ASTIdentifierIterator(const ASTReader &Reader, bool SkipModules=false)
StringRef Next() override
Retrieve the next string in the identifier table and advances the iterator for the following string.
Abstract interface for callback invocations by the ASTReader.
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain)
Receives the header search options.
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
virtual void visitModuleFile(ModuleFileName Filename, serialization::ModuleKind Kind, bool DirectlyImported)
This is called for each AST file loaded.
virtual ~ASTReaderListener()
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
virtual void ReadModuleName(StringRef ModuleName)
virtual void ReadCounter(const serialization::ModuleFile &M, uint32_t Value)
Receives COUNTER value.
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the codegen options.
Reads an AST files chain containing the contents of a translation unit.
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const
Retrieve the global submodule ID given a module and its local ID number.
ExtKind hasExternalDefinitions(const Decl *D) override
IdentifierTable & getIdentifierTable()
Retrieve the identifier table associated with the preprocessor.
ModuleManager & getModuleManager()
Retrieve the module manager.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallPtrSetImpl< const TypedefNameDecl * > &Decls) override
Read the set of potentially unused typedefs known to the source.
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx)
void ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector< Decl *, 4 > &Decls) override
Read the set of decls to be checked for deferred diags.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
@ ARR_VersionMismatch
The client can handle an AST file that cannot load because it was built with a different version of C...
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &Exprs) override
void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls) override
Get the decls that are contained in a file in the Offset/Length range.
std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record, unsigned &Idx, StringRef &Blob)
SourceRange ReadSkippedRange(unsigned Index) override
Read a preallocated skipped range from the external source.
serialization::TypeID getGlobalTypeID(ModuleFile &F, serialization::LocalTypeID LocalID) const
Map a local type ID within a given AST file into a global type ID.
void dump()
Dump information about the AST reader to standard error.
MacroInfo * ReadMacroRecord(ModuleFile &F, uint64_t Offset)
Reads the macro record located at the given offset.
SmallVector< std::pair< llvm::BitstreamCursor, serialization::ModuleFile * >, 8 > CommentsCursors
Cursors for comments blocks.
Selector getLocalSelector(ModuleFile &M, unsigned LocalID)
Retrieve a selector from the given module with its local ID number.
void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Decls) override
Read all of the declarations lexically stored in a declaration context.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
std::optional< ASTSourceDescriptor > getSourceDescriptor(unsigned ID) override
Return a descriptor for the corresponding module.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ReadExtnameUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, AsmLabelAttr * > > &ExtnameIDs) override
Read the set of pragma redefine_extname'd, undeclared identifiers known to the external Sema source.
void ClearSwitchCaseIDs()
void SetGloballyVisibleDecls(IdentifierInfo *II, const SmallVectorImpl< GlobalDeclID > &DeclIDs, SmallVectorImpl< Decl * > *Decls=nullptr)
Set the globally-visible declarations associated with the given identifier.
serialization::ModuleKind ModuleKind
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility, SourceLocation ImportLoc)
Make the entities in the given module and any of its (non-explicit) submodules visible to name lookup...
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a source range.
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
ASTReadResult ReadASTCore(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, ModuleFile *ImportedBy, SmallVectorImpl< ImportedModule > &Loaded, off_t ExpectedSize, time_t ExpectedModTime, ASTFileSignature ExpectedSignature, unsigned ClientLoadCapabilities)
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
static std::string ResolveImportedPathAndAllocate(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx, StringRef &Blob)
CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
Read the contents of a CXXCtorInitializer array.
void visitInputFileInfos(serialization::ModuleFile &MF, bool IncludeSystem, llvm::function_ref< void(const serialization::InputFileInfo &IFI, bool IsSystem)> Visitor)
Visit all the input file infos of the given module file.
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo)
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs) override
Read the set of tentative definitions known to the external Sema source.
Decl * GetExternalDecl(GlobalDeclID ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
serialization::MacroID ReadMacroID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a macro ID from the given position in a record in the given module.
GlobalDeclID ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a declaration ID from the given position in a record in the given module.
llvm::Expected< SourceLocation::UIntTy > readSLocOffset(ModuleFile *F, unsigned Index)
Try to read the offset of the SLocEntry at the given index in the given module file.
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
friend class PCHValidator
friend class serialization::ReadMethodPoolVisitor
void CompleteRedeclChain(const Decl *D) override
If any redeclarations of D have been imported since it was last checked, this digs out those redeclar...
SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile, SourceLocation Loc) const
Translate a source location from another module file's source location space into ours.
static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID, uint64_t *StartOfBlockOffset=nullptr)
ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the specified cursor.
void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II)
std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range) override
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
IdentifierInfo * get(StringRef Name) override
Retrieve the IdentifierInfo for the named identifier.
IdentifierInfo * getLocalIdentifier(ModuleFile &M, uint64_t LocalID)
void visitInputFiles(serialization::ModuleFile &MF, bool IncludeSystem, bool Complain, llvm::function_ref< void(const serialization::InputFile &IF, bool isSystem)> Visitor)
Visit all the input files of the given module file.
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
llvm::iterator_range< ModuleDeclIterator > getModuleFileLevelDecls(ModuleFile &Mod)
Stmt * GetExternalDeclStmt(uint64_t Offset) override
Resolve the offset of a statement into a statement.
Selector GetExternalSelector(serialization::SelectorID ID) override
Resolve a selector ID into a selector.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
MacroInfo * getMacro(serialization::MacroID ID)
Retrieve the macro with the given ID.
void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined) override
Load the set of used but not defined functions or variables with internal linkage,...
void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls) override
Read the set of delegating constructors known to the external Sema source.
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
void addPendingMacro(IdentifierInfo *II, ModuleFile *M, uint32_t MacroDirectivesOffset)
Add a macro to deserialize its macro directive history.
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.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
Module * getSubmodule(uint32_t GlobalID) override
Retrieve the submodule that corresponds to a global submodule ID.
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
SmallVector< GlobalDeclID, 16 > PreloadedDeclIDs
std::pair< SourceLocation, StringRef > getModuleImportLoc(int ID) override
Retrieve the module import location and module name for the given source manager entry ID.
void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls) override
Read the set of unused file-scope declarations known to the external Sema source.
void ReadReferencedSelectors(SmallVectorImpl< std::pair< Selector, SourceLocation > > &Sels) override
Read the set of referenced selectors known to the external Sema source.
Selector DecodeSelector(serialization::SelectorID Idx)
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
friend class serialization::reader::ASTIdentifierLookupTrait
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
Decl * getKeyDeclaration(Decl *D)
Returns the first key declaration for the given declaration.
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC) override
Finds all the visible declarations with a given name.
IdentifierInfo * DecodeIdentifierInfo(serialization::IdentifierID ID)
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
@ Success
The control block was read successfully.
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
@ Failure
The AST file itself appears corrupted.
@ VersionMismatch
The AST file was written by a different version of Clang.
@ HadErrors
The AST file has errors.
@ Missing
The AST file was missing.
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx)
Reads a token out of a record.
SwitchCase * getSwitchCaseWithID(unsigned ID)
Retrieve the switch-case statement with the given ID.
serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID)
FileID TranslateFileID(ModuleFile &F, FileID FID) const
Translate a FileID from another module file's FileID space into ours.
void ReadLateParsedTemplates(llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > &LPTMap) override
Read the set of late parsed template functions for this source.
IdentifierIterator * getIdentifiers() override
Retrieve an iterator into the set of all identifiers in all loaded AST files.
void ReadUsedVTables(SmallVectorImpl< ExternalVTableUse > &VTables) override
Read the set of used vtables known to the external Sema source.
bool isGlobalIndexUnavailable() const
Determine whether we tried to load the global index, but failed, e.g., because it is out-of-date or d...
uint32_t GetNumExternalSelectors() override
Returns the number of selectors known to the external AST source.
static TemporarilyOwnedStringRef ResolveImportedPath(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
void updateOutOfDateSelector(Selector Sel) override
Load the contents of the global method pool for a given selector if necessary.
Decl * GetExistingDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration.
static llvm::BitVector ReadBitVector(const RecordData &Record, const StringRef Blob)
ModuleFile * getLocalModuleFile(ModuleFile &M, unsigned ID) const
Retrieve the module file with a given local ID within the specified ModuleFile.
ASTReader(Preprocessor &PP, ModuleCache &ModCache, ASTContext *Context, const PCHContainerReader &PCHContainerRdr, const CodeGenOptions &CodeGenOpts, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, StringRef isysroot="", DisableValidationForModuleKind DisableValidationKind=DisableValidationForModuleKind::None, bool AllowASTWithCompilerErrors=false, bool AllowConfigurationMismatch=false, bool ValidateSystemInputs=false, bool ForceValidateUserInputs=true, bool ValidateASTInputFilesContent=false, bool UseGlobalIndex=true, std::unique_ptr< llvm::Timer > ReadTimer={})
Load the AST file and validate its contents against the given Preprocessor.
void LoadSelector(Selector Sel)
Load a selector from disk, registering its ID if it exists.
void ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag)
void makeNamesVisible(const HiddenNames &Names, Module *Owner)
Make the names within this set of hidden names visible.
void UpdateSema()
Update the state of Sema after loading some additional modules.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Decl * GetLocalDecl(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override
Get the index ID for the loaded SourceLocation offset.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
void ReadPendingInstantiations(SmallVectorImpl< std::pair< ValueDecl *, SourceLocation > > &Pending) override
Read the set of pending instantiations known to the external Sema source.
Preprocessor & getPreprocessor() const
Retrieve the preprocessor.
serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)
Get the loaded specializations lookup tables for D, if any.
CXXTemporary * ReadCXXTemporary(ModuleFile &F, const RecordData &Record, unsigned &Idx)
void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces) override
Load the set of namespaces that are known to the external source, which will be used during typo corr...
void PrintStats() override
Print some statistics about AST usage.
static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts, const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts, const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, bool RequireStrictOptionMatches=false)
Determine whether the given AST file is acceptable to load into a translation unit with the given lan...
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
serialization::SelectorID getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const
Retrieve the global selector ID that corresponds to this the local selector ID in a given module.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
SmallVector< uint64_t, 64 > RecordData
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
serialization::MacroID getGlobalMacroID(ModuleFile &M, serialization::MacroID LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
FileManager & getFileManager() const
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
ASTReadResult ReadAST(ModuleFileName FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::ModuleFile ModuleFile
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, serialization::PreprocessedEntityID LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
void setKWLoc(SourceLocation Loc)
Attr - This represents one attribute.
void setAttr(const Attr *A)
void setConceptReference(ConceptReference *CR)
void setRParenLoc(SourceLocation Loc)
void setCaretLoc(SourceLocation Loc)
void setWrittenTypeSpec(TypeSpecifierType written)
bool needsExtraLocalData() const
void setModeAttr(bool written)
void setBuiltinLoc(SourceLocation Loc)
void setWrittenWidthSpec(TypeSpecifierWidth written)
void setWrittenSignSpec(TypeSpecifierSign written)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
void setSourceOrder(int Pos)
Set the source order of this initializer.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
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.
Keeps track of options that affect how file operations are performed.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
Wrapper for source info for functions.
unsigned getNumParams() const
void setLocalRangeBegin(SourceLocation L)
void setLParenLoc(SourceLocation Loc)
void setParam(unsigned i, ParmVarDecl *VD)
void setRParenLoc(SourceLocation Loc)
void setLocalRangeEnd(SourceLocation L)
void setExceptionSpecRange(SourceRange R)
llvm::SmallPtrSet< ModuleFile *, 4 > HitSet
A set of module files in which we found a result.
static std::pair< GlobalModuleIndex *, llvm::Error > readIndex(llvm::StringRef Path)
Read a global index file for the given directory.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isCPlusPlusOperatorKeyword() const
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
bool isPoisoned() const
Return true if this token has been poisoned.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
tok::NotableIdentifierKind getNotableIdentifierID() const
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
void setObjCOrBuiltinID(unsigned ID)
void revertTokenIDToIdentifier()
Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2 compatibility.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
void * getFETokenInfo() const
Get and set FETokenInfo.
StringRef getName() const
Return the actual identifier string.
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
An iterator that walks over all of the known identifiers in the lookup table.
IdentifierIterator()=default
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
Implements an efficient mapping from strings to IdentifierInfo nodes.
llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename, off_t &Size, time_t &ModTime) const
Get a pointer to the PCM if it exists and set Size and ModTime to its on-disk size and modification t...
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
Represents a field injected from an anonymous union/struct into the parent scope.
Wrapper for source info for injected class names of class templates.
void setAmpLoc(SourceLocation Loc)
PragmaMSPointersToMembersKind
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
LangStandard::Kind LangStd
The used language standard.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
An UnresolvedSet-like class that might not have been loaded from the external AST source yet.
unsigned getLineTableFilenameID(StringRef Str)
void AddEntry(FileID FID, const std::vector< LineEntry > &Entries)
Add a new line entry that has already been encoded into the internal representation of the line table...
static LocalDeclID get(ASTReader &Reader, serialization::ModuleFile &MF, DeclID ID)
Record the location of a macro definition.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
void setPrevious(MacroDirective *Prev)
Set previous definition of the macro with the same name.
Records the location of a macro expansion.
Encapsulates the data about a macro definition (e.g.
void setUsedForHeaderGuard(bool Val)
void setHasCommaPasting()
void setDefinitionEndLoc(SourceLocation EndLoc)
Set the location of the last token in the macro.
void setParameterList(ArrayRef< IdentifierInfo * > List, llvm::BumpPtrAllocator &PPAllocator)
Set the specified list of identifiers as the parameter list for this macro.
llvm::MutableArrayRef< Token > allocateTokens(unsigned NumTokens, llvm::BumpPtrAllocator &PPAllocator)
void setIsFunctionLike()
Function/Object-likeness.
void setIsC99Varargs()
Varargs querying methods. This can only be set for function-like macros.
void setIsUsed(bool Val)
Set the value of the IsUsed flag.
void setExpansionLoc(SourceLocation Loc)
void setAttrRowOperand(Expr *e)
void setAttrColumnOperand(Expr *e)
void setAttrOperandParensRange(SourceRange range)
void setAttrNameLoc(SourceLocation loc)
void setStarLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
The module cache used for compiling modules implicitly.
virtual InMemoryModuleCache & getInMemoryModuleCache()=0
Returns this process's view of the module cache.
Deduplication key for a loaded module file in ModuleManager.
Identifies a module file to be loaded.
bool empty() const
Checks whether the module file name is empty.
static ModuleFileName makeExplicit(std::string Name)
Creates a file name for an explicit module.
static ModuleFileName makeInMemory(StringRef Name)
Creates a file name for an in-memory module.
StringRef str() const
Returns the plain module file name.
static ModuleFileName makeFromRaw(StringRef Name, unsigned RawKind)
Creates a file name from the raw kind value.
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella header of the given module to the given header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false, SourceLocation Loc=SourceLocation())
Adds this header to the given module.
OptionalFileEntryRef findUmbrellaHeaderForModule(Module *M, std::string NameAsWritten, SmallVectorImpl< char > &RelativePathName)
Find the FileEntry for an umbrella header in a module as if it was written in the module map as a hea...
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory, SourceLocation Loc=SourceLocation())
Sets the umbrella directory of the given module to the given directory.
llvm::DenseSet< FileEntryRef > AdditionalModMapsSet
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
ModuleHeaderRole
Flags describing the role of a module header.
Reference to a module that consists of either an existing/materialized Module object,...
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
void addRequirement(StringRef Feature, bool RequiredState, const LangOptions &LangOpts, const TargetInfo &Target)
Add the given feature requirement to the list of features required by this module.
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
NameVisibilityKind
Describes the visibility of the various names within a particular module.
@ Hidden
All of the names in this module are hidden.
@ AllVisible
All of the names in this module are visible.
const ModuleFileKey * getASTFileKey() const
The serialized AST file key for this module, if one was created.
SourceLocation DefinitionLoc
The location of the module definition.
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
ModuleKind Kind
The kind of this module.
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
bool isUnimportable() const
Determine whether this module has been declared unimportable.
void setASTFileNameAndKey(ModuleFileName NewName, ModuleFileKey NewKey)
Set the serialized module file for the top-level module of this module.
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
std::string Name
The name of this module.
const ModuleFileName * getASTFileName() const
The serialized AST file name for this module, if one was created.
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
OptionalDirectoryEntryRef Directory
The build directory of this module.
llvm::SmallVector< ModuleRef, 2 > AffectingClangModules
The set of top-level modules that affected the compilation of this module, but were not imported.
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
ASTFileSignature Signature
The module signature.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
unsigned IsAvailable
Whether this module is available in the current translation unit.
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
void addSubmodule(StringRef Name, Module *Submodule)
Add a child submodule.
llvm::SmallVector< ModuleRef, 2 > Imports
The set of modules imported by this module, and on which this module depends.
std::vector< Conflict > Conflicts
The list of conflicts.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Represent a C++ namespace.
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
static std::string getOwningModuleNameForDiagnostic(const Decl *D)
Get the best name we know for the module that owns the given declaration, or an empty string if the d...
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'allocate' in the 'pragma omp ...' directives.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'allocator' clause in the 'pragma omp ...' directive.
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C)
OMPClauseReader(ASTRecordReader &Record)
void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C)
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This is a basic class for representing single OpenMP clause.
This represents 'collapse' clause in the 'pragma omp ...' directive.
This represents the 'counts' clause in the 'pragma omp split' directive.
static OMPCountsClause * CreateEmpty(const ASTContext &C, unsigned NumCounts)
Build an empty 'counts' AST node for deserialization.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents '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)
The basic abstraction for the target Objective-C runtime.
Kind
The basic Objective-C runtimes that we know about.
unsigned getNumProtocols() const
void setProtocolLoc(unsigned i, SourceLocation Loc)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
static OpenACCAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCAttachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCAutoClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
This is the base type for all OpenACC Clauses.
static OpenACCCollapseClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, bool HasForce, Expr *LoopCount, SourceLocation EndLoc)
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDefaultAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDefaultClause * Create(const ASTContext &C, OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static OpenACCDeleteClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDetachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceNumClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCFinalizeClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCFirstPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCFirstPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCGangClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< OpenACCGangKind > GangKinds, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCHostClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCIfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCIfPresentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCIndependentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoCreateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCNumGangsClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCNumWorkersClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCReductionClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCReductionOperator Operator, ArrayRef< Expr * > VarList, ArrayRef< OpenACCReductionRecipeWithStorage > Recipes, SourceLocation EndLoc)
static OpenACCSelfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCTileClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > SizeExprs, SourceLocation EndLoc)
static OpenACCUseDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCVectorLengthClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWaitClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef< Expr * > QueueIdExprs, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
void setAttrLoc(SourceLocation loc)
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
void ReadCounter(const serialization::ModuleFile &M, uint32_t Value) override
Receives COUNTER value.
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef ContextHash, bool Complain) override
Receives the header search options.
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void setEllipsisLoc(SourceLocation Loc)
void setEllipsisLoc(SourceLocation Loc)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
Represents a parameter to a function.
void setKWLoc(SourceLocation Loc)
void setStarLoc(SourceLocation Loc)
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
std::string PCHThroughHeader
If non-empty, the filename used in an include directive in the primary source file (or command-line p...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool AllowPCHWithDifferentModulesCachePath
When true, a PCH with modules cache path different to the current compilation will not be rejected.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
HeaderSearch & getHeaderSearchInfo() const
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
@ FastWidth
The width of the "fast" qualifier mask.
@ FastMask
The fast qualifier mask.
void setAmpAmpLoc(SourceLocation Loc)
Wrapper for source info for record types.
Declaration of a redeclarable template.
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.
uint64_t SubmodulesOffsetBase
Absolute offset of the start of the submodules block.
int SLocEntryBaseID
The base ID in the source manager's view of this module.
ModuleFileKey FileKey
The key ModuleManager used for the module file.
serialization::IdentifierID BaseIdentifierID
Base identifier ID for identifiers local to this module.
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
const llvm::support::unaligned_uint64_t * SubmoduleOffsets
Relative offsets for all submodule entries in the AST file.
const unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
llvm::BitstreamCursor SubmodulesCursor
The cursor to the start of the submodules block.
uint64_t SLocEntryOffsetsBase
Base file offset for the offsets in SLocEntryOffsets.
llvm::BitstreamCursor InputFilesCursor
The cursor to the start of the input-files block.
std::vector< InputFile > InputFilesLoaded
The input files that have been loaded from this AST file.
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
llvm::SetVector< ModuleFile * > ImportedBy
List of modules which depend on this module.
const char * HeaderFileInfoTableData
Actual data for the on-disk hash table of header file information.
SourceLocation ImportLoc
The source location where this module was first imported.
const serialization::unaligned_decl_id_t * FileSortedDecls
Array of file-level DeclIDs sorted by file.
const uint32_t * SLocEntryOffsets
Offsets for all of the source location entries in the AST file.
llvm::BitstreamCursor MacroCursor
The cursor to the start of the preprocessor block, which stores all of the macro definitions.
FileID OriginalSourceFileID
The file ID for the original source file that was used to build this AST file.
time_t ModTime
Modification of the module file.
std::string ActualOriginalSourceFileName
The actual original source file name that was used to build this AST file.
uint64_t PreprocessorDetailStartOffset
The offset of the start of the preprocessor detail cursor.
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
unsigned LocalNumSubmodules
The number of submodules in this module.
SourceLocation FirstLoc
The first source location in this module.
unsigned LocalTopLevelSubmoduleID
Local submodule ID of the top-level module.
ASTFileSignature ASTBlockHash
The signature of the AST block of the module file, this can be used to unique module files based on A...
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
std::string OriginalSourceFileName
The original source file name that was used to build the primary AST file, which may have been modifi...
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
bool HasTimestamps
Whether timestamps are included in this module file.
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
unsigned NumPreprocessedEntities
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
unsigned NumFileSortedDecls
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
unsigned Index
The index of this module in the list of modules.
unsigned NumUserInputFiles
llvm::BitstreamCursor Stream
The main bitstream cursor for the main block.
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
uint64_t SizeInBits
The size of this file, in bits.
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
bool StandardCXXModule
Whether this module file is a standard C++ module.
unsigned LocalNumTypes
The number of types in this AST file.
StringRef ModuleOffsetMap
The module offset map data for this file.
const PPSkippedRange * PreprocessedSkippedRangeOffsets
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
bool isDirectlyImported() const
Determine whether this module was directly imported at any point during translation.
std::string ModuleMapPath
unsigned LocalBaseSubmoduleID
Base submodule ID for submodules local to this module within its own address space.
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
unsigned LocalNumMacros
The number of macros in this AST file.
unsigned NumPreprocessedSkippedRanges
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
InputFilesValidation InputFilesValidationStatus
Captures the high-level result of validating input files.
unsigned Generation
The generation of which this module file is a part.
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
ModuleFileName FileName
The file name of the module file.
ContinuousRangeMap< uint32_t, int, 2 > SubmoduleRemap
Remapping table for submodule IDs in this module.
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
unsigned LocalNumSelectors
The number of selectors new to this file.
ModuleKind Kind
The type of this module.
std::string ModuleName
The name of the module.
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
std::string BaseDirectory
The base directory of the module.
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Manages the set of modules loaded by an AST reader.
llvm::iterator_range< SmallVectorImpl< ModuleFile * >::const_iterator > pch_modules() const
A range covering the PCH and preamble module files loaded.
ModuleReverseIterator rbegin()
Reverse iterator to traverse all loaded modules.
unsigned size() const
Number of modules loaded.
Source range/offset of a preprocessed entity.
uint32_t getOffset() const
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
Source range of a skipped preprocessor region.
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
unsigned getFactoryBits() const
ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, unsigned PriorGeneration)
ArrayRef< ObjCMethodDecl * > getInstanceMethods() const
Retrieve the instance methods found by this visitor.
ArrayRef< ObjCMethodDecl * > getFactoryMethods() const
Retrieve the instance methods found by this visitor.
bool instanceHasMoreThanOneDecl() const
bool operator()(ModuleFile &M)
bool factoryHasMoreThanOneDecl() const
unsigned getInstanceBits() const
static TypeIdx fromTypeID(TypeID ID)
32 aligned uint64_t in the AST file.
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
void ReadDataIntoImpl(const unsigned char *d, unsigned DataLen, data_type_builder &Val)
file_type ReadFileRef(const unsigned char *&d)
DeclarationNameKey ReadKeyBase(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
DeclarationNameKey internal_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(const internal_key_type &a)
StringRef internal_key_type
static internal_key_type ReadKey(const unsigned char *d, unsigned n)
Class that performs lookup for an identifier stored in an AST file.
IdentifierID ReadIdentifierID(const unsigned char *d)
data_type ReadData(const internal_key_type &k, const unsigned char *d, unsigned DataLen)
Class that performs lookup for a selector's entries in the global method pool stored in an AST file.
internal_key_type ReadKey(const unsigned char *d, unsigned)
data_type ReadData(Selector, const unsigned char *d, unsigned DataLen)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(Selector Sel)
external_key_type internal_key_type
Class that performs lookup to specialized decls.
file_type ReadFileRef(const unsigned char *&d)
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
unsigned internal_key_type
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
std::pair< DeclarationName, const Module * > external_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
std::pair< DeclarationNameKey, unsigned > internal_key_type
internal_key_type ReadKey(const unsigned char *d, unsigned)
static hash_value_type ComputeHash(const internal_key_type &Key)
static internal_key_type GetInternalKey(const external_key_type &Key)
PredefinedTypeIDs
Predefined type IDs.
CtorInitializerType
The different kinds of data that can occur in a CtorInitializer.
const unsigned NUM_PREDEF_TYPE_IDS
The number of predefined type IDs that are reserved for the PREDEF_TYPE_* constants.
const unsigned NumSpecialTypeIDs
The number of special type IDs.
TypeCode
Record codes for each kind of type.
@ PREDEF_TYPE_LONG_ACCUM_ID
The 'long _Accum' type.
@ PREDEF_TYPE_SAMPLER_ID
OpenCL sampler type.
@ PREDEF_TYPE_INT128_ID
The '__int128_t' type.
@ PREDEF_TYPE_CHAR32_ID
The C++ 'char32_t' type.
@ PREDEF_TYPE_SAT_SHORT_ACCUM_ID
The '_Sat short _Accum' type.
@ PREDEF_TYPE_IBM128_ID
The '__ibm128' type.
@ PREDEF_TYPE_SHORT_FRACT_ID
The 'short _Fract' type.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_BOUND_MEMBER
The placeholder type for bound member functions.
@ PREDEF_TYPE_LONGLONG_ID
The (signed) 'long long' type.
@ PREDEF_TYPE_FRACT_ID
The '_Fract' type.
@ PREDEF_TYPE_ARC_UNBRIDGED_CAST
ARC's unbridged-cast placeholder type.
@ PREDEF_TYPE_USHORT_FRACT_ID
The 'unsigned short _Fract' type.
@ PREDEF_TYPE_SAT_ULONG_FRACT_ID
The '_Sat unsigned long _Fract' type.
@ PREDEF_TYPE_BOOL_ID
The 'bool' or '_Bool' type.
@ PREDEF_TYPE_SAT_LONG_ACCUM_ID
The '_Sat long _Accum' type.
@ PREDEF_TYPE_SAT_LONG_FRACT_ID
The '_Sat long _Fract' type.
@ PREDEF_TYPE_SAT_SHORT_FRACT_ID
The '_Sat short _Fract' type.
@ PREDEF_TYPE_CHAR_U_ID
The 'char' type, when it is unsigned.
@ PREDEF_TYPE_RESERVE_ID_ID
OpenCL reserve_id type.
@ PREDEF_TYPE_SAT_ACCUM_ID
The '_Sat _Accum' type.
@ PREDEF_TYPE_BUILTIN_FN
The placeholder type for builtin functions.
@ PREDEF_TYPE_SHORT_ACCUM_ID
The 'short _Accum' type.
@ PREDEF_TYPE_FLOAT_ID
The 'float' type.
@ PREDEF_TYPE_QUEUE_ID
OpenCL queue type.
@ PREDEF_TYPE_INT_ID
The (signed) 'int' type.
@ PREDEF_TYPE_OBJC_SEL
The ObjC 'SEL' type.
@ PREDEF_TYPE_BFLOAT16_ID
The '__bf16' type.
@ PREDEF_TYPE_WCHAR_ID
The C++ 'wchar_t' type.
@ PREDEF_TYPE_UCHAR_ID
The 'unsigned char' type.
@ PREDEF_TYPE_UACCUM_ID
The 'unsigned _Accum' type.
@ PREDEF_TYPE_SCHAR_ID
The 'signed char' type.
@ PREDEF_TYPE_CHAR_S_ID
The 'char' type, when it is signed.
@ PREDEF_TYPE_NULLPTR_ID
The type of 'nullptr'.
@ PREDEF_TYPE_ULONG_FRACT_ID
The 'unsigned long _Fract' type.
@ PREDEF_TYPE_FLOAT16_ID
The '_Float16' type.
@ PREDEF_TYPE_UINT_ID
The 'unsigned int' type.
@ PREDEF_TYPE_FLOAT128_ID
The '__float128' type.
@ PREDEF_TYPE_OBJC_ID
The ObjC 'id' type.
@ PREDEF_TYPE_CHAR16_ID
The C++ 'char16_t' type.
@ PREDEF_TYPE_ARRAY_SECTION
The placeholder type for an array section.
@ PREDEF_TYPE_ULONGLONG_ID
The 'unsigned long long' type.
@ PREDEF_TYPE_SAT_UFRACT_ID
The '_Sat unsigned _Fract' type.
@ PREDEF_TYPE_USHORT_ID
The 'unsigned short' type.
@ PREDEF_TYPE_SHORT_ID
The (signed) 'short' type.
@ PREDEF_TYPE_OMP_ARRAY_SHAPING
The placeholder type for OpenMP array shaping operation.
@ PREDEF_TYPE_DEPENDENT_ID
The placeholder type for dependent types.
@ PREDEF_TYPE_LONGDOUBLE_ID
The 'long double' type.
@ PREDEF_TYPE_DOUBLE_ID
The 'double' type.
@ PREDEF_TYPE_UINT128_ID
The '__uint128_t' type.
@ PREDEF_TYPE_HALF_ID
The OpenCL 'half' / ARM NEON __fp16 type.
@ PREDEF_TYPE_VOID_ID
The void type.
@ PREDEF_TYPE_SAT_USHORT_FRACT_ID
The '_Sat unsigned short _Fract' type.
@ PREDEF_TYPE_ACCUM_ID
The '_Accum' type.
@ PREDEF_TYPE_SAT_FRACT_ID
The '_Sat _Fract' type.
@ PREDEF_TYPE_NULL_ID
The NULL type.
@ PREDEF_TYPE_USHORT_ACCUM_ID
The 'unsigned short _Accum' type.
@ PREDEF_TYPE_CHAR8_ID
The C++ 'char8_t' type.
@ PREDEF_TYPE_UFRACT_ID
The 'unsigned _Fract' type.
@ PREDEF_TYPE_OVERLOAD_ID
The placeholder type for overloaded function sets.
@ PREDEF_TYPE_INCOMPLETE_MATRIX_IDX
A placeholder type for incomplete matrix index operations.
@ PREDEF_TYPE_UNRESOLVED_TEMPLATE
The placeholder type for unresolved templates.
@ PREDEF_TYPE_SAT_USHORT_ACCUM_ID
The '_Sat unsigned short _Accum' type.
@ PREDEF_TYPE_LONG_ID
The (signed) 'long' type.
@ PREDEF_TYPE_SAT_ULONG_ACCUM_ID
The '_Sat unsigned long _Accum' type.
@ PREDEF_TYPE_LONG_FRACT_ID
The 'long _Fract' type.
@ PREDEF_TYPE_UNKNOWN_ANY
The 'unknown any' placeholder type.
@ PREDEF_TYPE_OMP_ITERATOR
The placeholder type for OpenMP iterator expression.
@ PREDEF_TYPE_PSEUDO_OBJECT
The pseudo-object placeholder type.
@ PREDEF_TYPE_OBJC_CLASS
The ObjC 'Class' type.
@ PREDEF_TYPE_ULONG_ID
The 'unsigned long' type.
@ PREDEF_TYPE_SAT_UACCUM_ID
The '_Sat unsigned _Accum' type.
@ PREDEF_TYPE_CLK_EVENT_ID
OpenCL clk event type.
@ PREDEF_TYPE_EVENT_ID
OpenCL event type.
@ PREDEF_TYPE_ULONG_ACCUM_ID
The 'unsigned long _Accum' type.
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
@ CTOR_INITIALIZER_MEMBER
@ CTOR_INITIALIZER_DELEGATING
@ CTOR_INITIALIZER_INDIRECT_MEMBER
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ TYPE_EXT_QUAL
An ExtQualType record.
@ SPECIAL_TYPE_OBJC_SEL_REDEFINITION
Objective-C "SEL" redefinition type.
@ SPECIAL_TYPE_UCONTEXT_T
C ucontext_t typedef type.
@ SPECIAL_TYPE_JMP_BUF
C jmp_buf typedef type.
@ SPECIAL_TYPE_FILE
C FILE typedef type.
@ SPECIAL_TYPE_SIGJMP_BUF
C sigjmp_buf typedef type.
@ SPECIAL_TYPE_OBJC_CLASS_REDEFINITION
Objective-C "Class" redefinition type.
@ SPECIAL_TYPE_CF_CONSTANT_STRING
CFConstantString type.
@ SPECIAL_TYPE_OBJC_ID_REDEFINITION
Objective-C "id" redefinition type.
Defines the clang::TargetInfo interface.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
internal::Matcher< T > findAll(const internal::Matcher< T > &Matcher)
Matches if the node or any descendant matches.
@ ModuleFile
The module file (.pcm). Required.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
llvm::OnDiskChainedHashTable< ASTSelectorLookupTrait > ASTSelectorLookupTable
The on-disk hash table used for the global method pool.
llvm::OnDiskChainedHashTable< HeaderFileInfoTrait > HeaderFileInfoLookupTable
The on-disk hash table used for known header files.
llvm::OnDiskIterableChainedHashTable< ASTIdentifierLookupTrait > ASTIdentifierLookupTable
The on-disk hash table used to contain information about all of the identifiers in the program.
GlobalDeclID LazySpecializationInfo
@ EXTENSION_METADATA
Metadata describing this particular extension.
SubmoduleRecordTypes
Record types used within a submodule description block.
@ SUBMODULE_EXCLUDED_HEADER
Specifies a header that has been explicitly excluded from this submodule.
@ SUBMODULE_TOPHEADER
Specifies a top-level header that falls into this (sub)module.
@ SUBMODULE_PRIVATE_TEXTUAL_HEADER
Specifies a header that is private to this submodule but must be textually included.
@ SUBMODULE_HEADER
Specifies a header that falls into this (sub)module.
@ SUBMODULE_EXPORT_AS
Specifies the name of the module that will eventually re-export the entities in this module.
@ SUBMODULE_UMBRELLA_DIR
Specifies an umbrella directory.
@ SUBMODULE_UMBRELLA_HEADER
Specifies the umbrella header used to create this module, if any.
@ SUBMODULE_REQUIRES
Specifies a required feature.
@ SUBMODULE_PRIVATE_HEADER
Specifies a header that is private to this submodule.
@ SUBMODULE_IMPORTS
Specifies the submodules that are imported by this submodule.
@ SUBMODULE_CONFLICT
Specifies a conflict with another module.
@ SUBMODULE_CHILD
Specifies a direct submodule by name and ID, enabling on-demand deserialization of children without l...
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_END
Defines the end of a single submodule. Sentinel record without any data.
@ SUBMODULE_DEFINITION
Defines the major attributes of a submodule, including its name and parent.
@ SUBMODULE_LINK_LIBRARY
Specifies a library or framework to link against.
@ SUBMODULE_CONFIG_MACRO
Specifies a configuration macro for this module.
@ SUBMODULE_EXPORTS
Specifies the submodules that are re-exported from this submodule.
@ SUBMODULE_TEXTUAL_HEADER
Specifies a header that is part of the module but must be textually included.
@ SUBMODULE_AFFECTING_MODULES
Specifies affecting modules that were not imported.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
@ SkippedInBuildSession
When the validation is skipped because it was already done in the current build session.
@ AllFiles
When the validation is done both for user files and system files.
@ Disabled
When the validation is disabled. For example, for a precompiled header.
@ UserFiles
When the validation is done only for user files as an optimization.
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
OptionsRecordTypes
Record types that occur within the options block inside the control block.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ CODEGEN_OPTIONS
Record code for the codegen options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
CommentRecordTypes
Record types used within a comments block.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
@ SM_SLOC_FILE_ENTRY
Describes a source location entry (SLocEntry) for a file.
@ SM_SLOC_BUFFER_BLOB_COMPRESSED
Describes a zlib-compressed blob that contains the data for a buffer entry.
@ SM_SLOC_BUFFER_ENTRY
Describes a source location entry (SLocEntry) for a buffer.
@ SM_SLOC_BUFFER_BLOB
Describes a blob that contains the data for a buffer entry.
@ SM_SLOC_EXPANSION_ENTRY
Describes a source location entry (SLocEntry) for a macro expansion.
const unsigned int NUM_PREDEF_SELECTOR_IDS
The number of predefined selector IDs.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
uint64_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
PreprocessorRecordTypes
Record types used within a preprocessor block.
@ PP_TOKEN
Describes one token.
@ PP_MACRO_FUNCTION_LIKE
A function-like macro definition.
@ PP_MACRO_OBJECT_LIKE
An object-like macro definition.
@ PP_MACRO_DIRECTIVE_HISTORY
The macro directives history for a particular identifier.
@ PP_MODULE_MACRO
A macro directive exported by a module.
ControlRecordTypes
Record types that occur within the control block.
@ MODULE_MAP_FILE
Record code for the module map file that was used to build this AST file.
@ MODULE_DIRECTORY
Record code for the module build directory.
@ ORIGINAL_FILE_ID
Record code for file ID of the file or buffer that was used to generate the AST file.
@ MODULE_NAME
Record code for the module name.
@ ORIGINAL_FILE
Record code for the original file that was used to generate the AST file, including both its file ID ...
@ IMPORT
Record code for another AST file imported by this AST file.
@ INPUT_FILE_OFFSETS
Offsets into the input-files block where input files reside.
@ METADATA
AST file metadata, including the AST file version number and information about the compiler used to b...
UnhashedControlBlockRecordTypes
Record codes for the unhashed control block.
@ DIAGNOSTIC_OPTIONS
Record code for the diagnostic options table.
@ HEADER_SEARCH_ENTRY_USAGE
Record code for the indices of used header search entries.
@ AST_BLOCK_HASH
Record code for the content hash of the AST block.
@ DIAG_PRAGMA_MAPPINGS
Record code for #pragma diagnostic mappings.
@ SIGNATURE
Record code for the signature that identifiers this AST file.
@ HEADER_SEARCH_PATHS
Record code for the headers search paths.
@ VFS_USAGE
Record code for the indices of used VFSs.
uint64_t MacroID
An ID number that refers to a macro in an AST file.
InputFileRecordTypes
Record types that occur within the input-files block inside the control block.
@ INPUT_FILE_HASH
The input file content hash.
@ INPUT_FILE
An input file.
uint64_t TypeID
An ID number that refers to a type in an AST file.
PreprocessorDetailRecordTypes
Record types used within a preprocessor detail block.
@ PPD_INCLUSION_DIRECTIVE
Describes an inclusion directive within the preprocessing record.
@ PPD_MACRO_EXPANSION
Describes a macro expansion within the preprocessing record.
@ PPD_MACRO_DEFINITION
Describes a macro definition within the preprocessing record.
ModuleKind
Specifies the kind of module that has been loaded.
@ MK_PCH
File is a PCH file treated as such.
@ MK_Preamble
File is a PCH file treated as the preamble.
@ MK_MainFile
File is a PCH file treated as the actual main file.
@ MK_ExplicitModule
File is an explicitly-loaded module.
@ MK_ImplicitModule
File is an implicitly-loaded module.
@ MK_PrebuiltModule
File is from a prebuilt module path.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
const unsigned int NUM_PREDEF_MACRO_IDS
The number of predefined macro IDs.
ASTRecordTypes
Record types that occur within the AST block itself.
@ DECL_UPDATE_OFFSETS
Record for offsets of DECL_UPDATES records for declarations that were modified after being deserializ...
@ STATISTICS
Record code for the extra statistics we gather while generating an AST file.
@ FLOAT_CONTROL_PRAGMA_OPTIONS
Record code for #pragma float_control options.
@ KNOWN_NAMESPACES
Record code for the set of known namespaces, which are used for typo correction.
@ SPECIAL_TYPES
Record code for the set of non-builtin, special types.
@ PENDING_IMPLICIT_INSTANTIATIONS
Record code for pending implicit instantiations.
@ CXX_ADDED_TEMPLATE_SPECIALIZATION
@ TYPE_OFFSET
Record code for the offsets of each type.
@ DELEGATING_CTORS
The list of delegating constructor declarations.
@ PP_ASSUME_NONNULL_LOC
ID 66 used to be the list of included files.
@ EXT_VECTOR_DECLS
Record code for the set of ext_vector type names.
@ OPENCL_EXTENSIONS
Record code for enabled OpenCL extensions.
@ FP_PRAGMA_OPTIONS
Record code for floating point #pragma options.
@ PP_UNSAFE_BUFFER_USAGE
Record code for #pragma clang unsafe_buffer_usage begin/end.
@ CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION
@ DECLS_WITH_EFFECTS_TO_VERIFY
Record code for Sema's vector of functions/blocks with effects to be verified.
@ VTABLE_USES
Record code for the array of VTable uses.
@ LATE_PARSED_TEMPLATE
Record code for late parsed template functions.
@ DECLS_TO_CHECK_FOR_DEFERRED_DIAGS
Record code for the Decls to be checked for deferred diags.
@ SUBMODULE_METADATA
Record that encodes the number of submodules, their base ID in the AST file, and for each module the ...
@ DECL_OFFSET
Record code for the offsets of each decl.
@ SOURCE_MANAGER_LINE_TABLE
Record code for the source manager line table information, which stores information about #line direc...
@ PP_COUNTER_VALUE
The value of the next COUNTER to dispense.
@ 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',...
OpenMPNumTeamsClauseModifier
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
OpenMPDynGroupprivateClauseFallbackModifier
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
@ Undefined
Keep undefined.
PredefinedDeclIDs
Predefined declaration IDs.
@ PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID
The internal '__NSConstantString' tag type.
@ PREDEF_DECL_TRANSLATION_UNIT_ID
The translation unit.
@ PREDEF_DECL_OBJC_CLASS_ID
The Objective-C 'Class' type.
@ PREDEF_DECL_BUILTIN_MS_GUID_ID
The predeclared '_GUID' struct.
@ PREDEF_DECL_BUILTIN_MS_TYPE_INFO_TAG_ID
The predeclared 'type_info' struct.
@ PREDEF_DECL_OBJC_INSTANCETYPE_ID
The internal 'instancetype' typedef.
@ PREDEF_DECL_OBJC_PROTOCOL_ID
The Objective-C 'Protocol' type.
@ PREDEF_DECL_UNSIGNED_INT_128_ID
The unsigned 128-bit integer type.
@ PREDEF_DECL_OBJC_SEL_ID
The Objective-C 'SEL' type.
@ NUM_PREDEF_DECL_IDS
The number of declaration IDs that are predefined.
@ PREDEF_DECL_INT_128_ID
The signed 128-bit integer type.
@ PREDEF_DECL_VA_LIST_TAG
The internal '__va_list_tag' struct, if any.
@ PREDEF_DECL_BUILTIN_MS_VA_LIST_ID
The internal '__builtin_ms_va_list' typedef.
@ PREDEF_DECL_CF_CONSTANT_STRING_ID
The internal '__NSConstantString' typedef.
@ PREDEF_DECL_NULL_ID
The NULL declaration.
@ PREDEF_DECL_BUILTIN_VA_LIST_ID
The internal '__builtin_va_list' typedef.
@ PREDEF_DECL_EXTERN_C_CONTEXT_ID
The extern "C" context.
@ PREDEF_DECL_OBJC_ID_ID
The Objective-C 'id' type.
@ PREDEF_DECL_BUILTIN_ZOS_VA_LIST_ID
The internal '__builtin_zos_va_list' typedef.
@ Property
The type of a property.
@ Result
The result type of a method or function.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
std::string createSpecificModuleCachePath(FileManager &FileMgr, StringRef ModuleCachePath, bool DisableModuleHash, std::string ContextHash)
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ Template
We are parsing a template declaration.
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
OpenMPUseDevicePtrFallbackModifier
OpenMP 6.1 use_device_ptr fallback modifier.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
TypeSpecifierWidth
Specifies the width of a type, e.g., short, long, or long long.
OpenMPMotionModifierKind
OpenMP modifier kind for 'to' or 'from' clause.
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
TypeSpecifierSign
Specifies the signedness of a type, e.g., signed or unsigned.
OpenMPDynGroupprivateClauseModifier
OpenMPThreadLimitClauseModifier
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ None
Perform validation, don't disable it.
@ PCH
Disable validation for a precompiled header and the modules it depends on.
@ Module
Disable validation for module files.
bool shouldSkipCheckingODR(const Decl *D)
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
OpenMPNumThreadsClauseModifier
OpenMPAtomicDefaultMemOrderClauseKind
OpenMP attributes for 'atomic_default_mem_order' clause.
U cast(CodeGen::Address addr)
@ 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.
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 uint16_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
__LIBC_ATTRS FILE * stderr
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponents
Total number of expression components.
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumVars
Number of expressions listed.
unsigned NumComponentLists
Number of component lists.
Expr * AllocatorTraits
Allocator traits.
Expr * Allocator
Allocator.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
The signature of a module, which is a hash of the AST content.
static constexpr size_t size
static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)
static ASTFileSignature createDummy()
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setInfo(const DeclarationNameLoc &Info)
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
A simple structure that captures a vtable use for the purposes of the ExternalSemaSource.
ExceptionSpecInfo ExceptionSpec
static LineEntry get(unsigned Offs, unsigned Line, int Filename, SrcMgr::CharacteristicKind FileKind, unsigned IncludeOffset)
A conflict between two modules.
std::string Message
The message provided to the user when there is a conflict.
ModuleRef Other
The module that this module conflicts with.
A library or framework to link against when an entity from this module is used.
a linked list of methods with the same selector name but different signatures.
ObjCMethodList * getNext() const
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
NestedNameSpecifierLoc QualifierLoc
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
SanitizerMask Mask
Bitmask of enabled sanitizers.
Helper class that saves the current stream position and then restores it when destroyed.
PragmaMsStackAction Action
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Location information for a TemplateArgument.
Describes a single change detected in a module file or input file.
Describes the categories of an Objective-C class.
void insert(GlobalDeclID ID)
void insert(LazySpecializationInfo Info)