86#include "llvm/ADT/APFloat.h"
87#include "llvm/ADT/APInt.h"
88#include "llvm/ADT/ArrayRef.h"
89#include "llvm/ADT/DenseMap.h"
90#include "llvm/ADT/DenseSet.h"
91#include "llvm/ADT/PointerIntPair.h"
92#include "llvm/ADT/STLExtras.h"
93#include "llvm/ADT/ScopeExit.h"
94#include "llvm/ADT/SmallPtrSet.h"
95#include "llvm/ADT/SmallString.h"
96#include "llvm/ADT/SmallVector.h"
97#include "llvm/ADT/StringRef.h"
98#include "llvm/Bitstream/BitCodes.h"
99#include "llvm/Bitstream/BitstreamWriter.h"
100#include "llvm/Support/Compression.h"
101#include "llvm/Support/DJB.h"
102#include "llvm/Support/EndianStream.h"
103#include "llvm/Support/ErrorHandling.h"
104#include "llvm/Support/LEB128.h"
105#include "llvm/Support/MemoryBuffer.h"
106#include "llvm/Support/OnDiskHashTable.h"
107#include "llvm/Support/Path.h"
108#include "llvm/Support/SHA1.h"
109#include "llvm/Support/TimeProfiler.h"
110#include "llvm/Support/VersionTuple.h"
111#include "llvm/Support/VirtualFileSystem.h"
112#include "llvm/Support/raw_ostream.h"
127using namespace clang;
130template <
typename T,
typename Allocator>
131static StringRef
bytes(
const std::vector<T, Allocator> &v) {
132 if (v.empty())
return StringRef();
133 return StringRef(
reinterpret_cast<const char*
>(&v[0]),
134 sizeof(
T) * v.size());
139 return StringRef(
reinterpret_cast<const char*
>(v.data()),
140 sizeof(
T) * v.size());
143static std::string
bytes(
const std::vector<bool> &
V) {
145 Str.reserve(
V.size() / 8);
146 for (
unsigned I = 0, E =
V.size(); I < E;) {
148 for (
unsigned Bit = 0; Bit < 8 && I < E; ++Bit, ++I)
161#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
162 case Type::CLASS_ID: return TYPE_##CODE_ID;
163#include "clang/Serialization/TypeBitCodes.def"
164 case Type::LateParsedAttr:
166 "should be replaced with a concrete type before serialization");
168 llvm_unreachable(
"shouldn't be serializing a builtin type this way");
170 llvm_unreachable(
"bad type kind");
175struct AffectingModuleMaps {
176 llvm::DenseSet<FileID> DefinitionFileIDs;
177 llvm::DenseSet<const FileEntry *> DefinitionFiles;
180std::optional<AffectingModuleMaps>
193 enum AffectedReason :
bool {
194 AR_TextualHeader = 0,
195 AR_ImportOrTextualHeader = 1,
197 auto AssignMostImportant = [](AffectedReason &LHS, AffectedReason RHS) {
198 LHS = std::max(LHS, RHS);
200 llvm::DenseMap<FileID, AffectedReason> ModuleMaps;
201 llvm::DenseMap<const Module *, AffectedReason> ProcessedModules;
202 auto CollectModuleMapsForHierarchy = [&](
const Module *M,
203 AffectedReason Reason) {
209 if (
auto [It, Inserted] = ProcessedModules.insert({M, Reason});
210 !Inserted && Reason <= It->second) {
216 std::queue<const Module *> Q;
219 const Module *Mod = Q.front();
225 AssignMostImportant(ModuleMaps[F], Reason);
230 AssignMostImportant(ModuleMaps[UniqF], Reason);
239 CollectModuleMapsForHierarchy(RootModule, AR_ImportOrTextualHeader);
241 std::queue<const Module *> Q;
244 const Module *CurrentModule = Q.front();
248 CollectModuleMapsForHierarchy(ImportedModule, AR_ImportOrTextualHeader);
250 CollectModuleMapsForHierarchy(UndeclaredModule, AR_ImportOrTextualHeader);
265 if (
const Module *M = KH.getModule())
266 CollectModuleMapsForHierarchy(M, AR_TextualHeader);
287 llvm::DenseSet<const FileEntry *> ModuleFileEntries;
288 llvm::DenseSet<FileID> ModuleFileIDs;
289 for (
auto [FID, Reason] : ModuleMaps) {
290 if (Reason == AR_ImportOrTextualHeader)
291 ModuleFileIDs.insert(FID);
293 ModuleFileEntries.insert(FE);
296 AffectingModuleMaps
R;
297 R.DefinitionFileIDs = std::move(ModuleFileIDs);
298 R.DefinitionFiles = std::move(ModuleFileEntries);
305 ASTRecordWriter BasicWriter;
308 ASTTypeWriter(ASTContext &Context, ASTWriter &Writer)
309 : Writer(Writer), BasicWriter(Context, Writer, Record) {}
312 if (
T.hasLocalNonFastQualifiers()) {
313 Qualifiers Qs =
T.getLocalQualifiers();
314 BasicWriter.writeQualType(
T.getLocalUnqualifiedType());
315 BasicWriter.writeQualifiers(Qs);
316 return BasicWriter.Emit(
TYPE_EXT_QUAL, Writer.getTypeExtQualAbbrev());
319 const Type *typePtr =
T.getTypePtr();
320 serialization::AbstractTypeWriter<ASTRecordWriter> atw(BasicWriter);
328 ASTRecordWriter &Record;
330 void addSourceLocation(SourceLocation Loc) { Record.AddSourceLocation(Loc); }
331 void addSourceRange(SourceRange Range) { Record.AddSourceRange(Range); }
334 TypeLocWriter(ASTRecordWriter &Record) : Record(Record) {}
336#define ABSTRACT_TYPELOC(CLASS, PARENT)
337#define TYPELOC(CLASS, PARENT) \
338 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
339#include "clang/AST/TypeLocNodes.def"
352void TypeLocWriter::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
362void TypeLocWriter::VisitComplexTypeLoc(ComplexTypeLoc TL) {
366void TypeLocWriter::VisitPointerTypeLoc(PointerTypeLoc TL) {
370void TypeLocWriter::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
374void TypeLocWriter::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
378void TypeLocWriter::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
382void TypeLocWriter::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
386void TypeLocWriter::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
390void TypeLocWriter::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
394void TypeLocWriter::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
399void TypeLocWriter::VisitArrayTypeLoc(ArrayTypeLoc TL) {
407void TypeLocWriter::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
408 VisitArrayTypeLoc(TL);
411void TypeLocWriter::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
412 VisitArrayTypeLoc(TL);
415void TypeLocWriter::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
416 VisitArrayTypeLoc(TL);
419void TypeLocWriter::VisitDependentSizedArrayTypeLoc(
420 DependentSizedArrayTypeLoc TL) {
421 VisitArrayTypeLoc(TL);
424void TypeLocWriter::VisitDependentAddressSpaceTypeLoc(
425 DependentAddressSpaceTypeLoc TL) {
428 addSourceLocation(
range.getBegin());
429 addSourceLocation(
range.getEnd());
433void TypeLocWriter::VisitDependentSizedExtVectorTypeLoc(
434 DependentSizedExtVectorTypeLoc TL) {
438void TypeLocWriter::VisitVectorTypeLoc(VectorTypeLoc TL) {
442void TypeLocWriter::VisitDependentVectorTypeLoc(
443 DependentVectorTypeLoc TL) {
447void TypeLocWriter::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
451void TypeLocWriter::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
454 addSourceLocation(
range.getBegin());
455 addSourceLocation(
range.getEnd());
460void TypeLocWriter::VisitDependentSizedMatrixTypeLoc(
461 DependentSizedMatrixTypeLoc TL) {
464 addSourceLocation(
range.getBegin());
465 addSourceLocation(
range.getEnd());
470void TypeLocWriter::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
476 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i)
480void TypeLocWriter::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
481 VisitFunctionTypeLoc(TL);
484void TypeLocWriter::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
485 VisitFunctionTypeLoc(TL);
488void TypeLocWriter::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
494void TypeLocWriter::VisitUsingTypeLoc(UsingTypeLoc TL) {
500void TypeLocWriter::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
506void TypeLocWriter::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
515void TypeLocWriter::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
521void TypeLocWriter::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
528void TypeLocWriter::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
533void TypeLocWriter::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
556void TypeLocWriter::VisitAutoTypeLoc(
AutoTypeLoc TL) {
561 Record.AddConceptReference(CR);
567void TypeLocWriter::VisitDeducedTemplateSpecializationTypeLoc(
568 DeducedTemplateSpecializationTypeLoc TL) {
574void TypeLocWriter::VisitTagTypeLoc(TagTypeLoc TL) {
580void TypeLocWriter::VisitRecordTypeLoc(RecordTypeLoc TL) {
584void TypeLocWriter::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
588void TypeLocWriter::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
590void TypeLocWriter::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
594void TypeLocWriter::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
598void TypeLocWriter::VisitLateParsedAttrTypeLoc(LateParsedAttrTypeLoc TL) {
600 "should be replaced with a concrete type before serialization");
603void TypeLocWriter::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
607void TypeLocWriter::VisitOverflowBehaviorTypeLoc(OverflowBehaviorTypeLoc TL) {
611void TypeLocWriter::VisitHLSLAttributedResourceTypeLoc(
612 HLSLAttributedResourceTypeLoc TL) {
616void TypeLocWriter::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
620void TypeLocWriter::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
624void TypeLocWriter::VisitSubstTemplateTypeParmTypeLoc(
625 SubstTemplateTypeParmTypeLoc TL) {
629void TypeLocWriter::VisitSubstTemplateTypeParmPackTypeLoc(
630 SubstTemplateTypeParmPackTypeLoc TL) {
634void TypeLocWriter::VisitSubstBuiltinTemplatePackTypeLoc(
635 SubstBuiltinTemplatePackTypeLoc TL) {
639void TypeLocWriter::VisitTemplateSpecializationTypeLoc(
640 TemplateSpecializationTypeLoc TL) {
647 for (
unsigned i = 0, e = TL.
getNumArgs(); i != e; ++i)
651void TypeLocWriter::VisitParenTypeLoc(ParenTypeLoc TL) {
656void TypeLocWriter::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
660void TypeLocWriter::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
666void TypeLocWriter::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
670void TypeLocWriter::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
675void TypeLocWriter::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
687void TypeLocWriter::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
691void TypeLocWriter::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
697void TypeLocWriter::VisitPipeTypeLoc(PipeTypeLoc TL) {
700void TypeLocWriter::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
703void TypeLocWriter::VisitDependentBitIntTypeLoc(
704 clang::DependentBitIntTypeLoc TL) {
708void TypeLocWriter::VisitPredefinedSugarTypeLoc(
709 clang::PredefinedSugarTypeLoc TL) {
713void ASTWriter::WriteTypeAbbrevs() {
714 using namespace llvm;
716 std::shared_ptr<BitCodeAbbrev> Abv;
719 Abv = std::make_shared<BitCodeAbbrev>();
721 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
722 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 3));
723 TypeExtQualAbbrev = Stream.EmitAbbrev(std::move(Abv));
731 llvm::BitstreamWriter &Stream,
735 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETBID,
Record);
738 if (!Name || Name[0] == 0)
742 Record.push_back(*Name++);
743 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_BLOCKNAME,
Record);
747 llvm::BitstreamWriter &Stream,
752 Record.push_back(*Name++);
753 Stream.EmitRecord(llvm::bitc::BLOCKINFO_CODE_SETRECORDNAME,
Record);
758#define RECORD(X) EmitRecordID(X, #X, Stream, Record)
891void ASTWriter::WriteBlockInfoBlock() {
893 Stream.EnterBlockInfoBlock();
895#define BLOCK(X) EmitBlockID(X ## _ID, #X, Stream, Record)
896#define RECORD(X) EmitRecordID(X, #X, Stream, Record)
899 BLOCK(CONTROL_BLOCK);
910 BLOCK(OPTIONS_BLOCK);
918 BLOCK(INPUT_FILES_BLOCK);
986 BLOCK(SOURCE_MANAGER_BLOCK);
994 BLOCK(PREPROCESSOR_BLOCK);
1002 BLOCK(SUBMODULE_BLOCK);
1025 BLOCK(COMMENTS_BLOCK);
1029 BLOCK(DECLTYPES_BLOCK);
1033 RECORD(TYPE_BLOCK_POINTER);
1034 RECORD(TYPE_LVALUE_REFERENCE);
1035 RECORD(TYPE_RVALUE_REFERENCE);
1036 RECORD(TYPE_MEMBER_POINTER);
1037 RECORD(TYPE_CONSTANT_ARRAY);
1038 RECORD(TYPE_INCOMPLETE_ARRAY);
1039 RECORD(TYPE_VARIABLE_ARRAY);
1042 RECORD(TYPE_FUNCTION_NO_PROTO);
1043 RECORD(TYPE_FUNCTION_PROTO);
1045 RECORD(TYPE_TYPEOF_EXPR);
1049 RECORD(TYPE_OBJC_INTERFACE);
1050 RECORD(TYPE_OBJC_OBJECT_POINTER);
1052 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM);
1053 RECORD(TYPE_UNRESOLVED_USING);
1054 RECORD(TYPE_INJECTED_CLASS_NAME);
1055 RECORD(TYPE_OBJC_OBJECT);
1056 RECORD(TYPE_TEMPLATE_TYPE_PARM);
1057 RECORD(TYPE_TEMPLATE_SPECIALIZATION);
1058 RECORD(TYPE_DEPENDENT_NAME);
1059 RECORD(TYPE_DEPENDENT_SIZED_ARRAY);
1061 RECORD(TYPE_MACRO_QUALIFIED);
1062 RECORD(TYPE_PACK_EXPANSION);
1064 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK);
1065 RECORD(TYPE_SUBST_BUILTIN_TEMPLATE_PACK);
1067 RECORD(TYPE_UNARY_TRANSFORM);
1071 RECORD(TYPE_OBJC_TYPE_PARAM);
1152 BLOCK(PREPROCESSOR_DETAIL_BLOCK);
1158 BLOCK(EXTENSION_BLOCK);
1161 BLOCK(UNHASHED_CONTROL_BLOCK);
1185 StringRef BaseDir) {
1186 if (BaseDir.empty())
1191 for (; Pos < Filename.size() && Pos < BaseDir.size(); ++Pos)
1192 if (Filename[Pos] != BaseDir[Pos])
1196 if (Pos == Filename.size()) {
1197 if (Pos != BaseDir.size())
1200 Filename.assign(1,
'.');
1206 if (!llvm::sys::path::is_separator(Filename[Pos])) {
1207 if (!llvm::sys::path::is_separator(BaseDir.back()))
1221 Filename.erase(Filename.begin(), Filename.begin() + Pos);
1225std::pair<ASTFileSignature, ASTFileSignature>
1226ASTWriter::createSignature()
const {
1227 StringRef AllBytes(Buffer.data(), Buffer.size());
1230 Hasher.update(AllBytes.slice(ASTBlockRange.first, ASTBlockRange.second));
1235 Hasher.update(AllBytes.slice(0, UnhashedControlBlockRange.first));
1238 AllBytes.slice(UnhashedControlBlockRange.second, ASTBlockRange.first));
1240 Hasher.update(AllBytes.substr(ASTBlockRange.second));
1243 return std::make_pair(ASTBlockHash, Signature);
1246ASTFileSignature ASTWriter::createSignatureForNamedModule()
const {
1248 Hasher.update(StringRef(Buffer.data(), Buffer.size()));
1250 assert(WritingModule);
1251 assert(WritingModule->isNamedModule());
1255 for (
auto [ExportImported, _] : WritingModule->Exports)
1256 Hasher.update(ExportImported->Signature);
1280 for (
Module *M : TouchedTopLevelModules)
1289 Stream.BackpatchByte(BitNo, Byte);
1294ASTFileSignature ASTWriter::backpatchSignature() {
1295 if (isWritingStdCXXNamedModules()) {
1296 ASTFileSignature Signature = createSignatureForNamedModule();
1301 if (!WritingModule ||
1306 ASTFileSignature ASTBlockHash;
1307 ASTFileSignature Signature;
1308 std::tie(ASTBlockHash, Signature) = createSignature();
1316void ASTWriter::writeUnhashedControlBlock(Preprocessor &PP) {
1317 using namespace llvm;
1320 Stream.FlushToWord();
1321 UnhashedControlBlockRange.first = Stream.GetCurrentBitNo() >> 3;
1329 if (isWritingStdCXXNamedModules() ||
1340 SmallString<128> Blob{Dummy.begin(), Dummy.end()};
1343 if (!isWritingStdCXXNamedModules()) {
1344 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1346 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1347 unsigned ASTBlockHashAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1350 Stream.EmitRecordWithBlob(ASTBlockHashAbbrev,
Record, Blob);
1351 ASTBlockHashOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1355 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1356 Abbrev->Add(BitCodeAbbrevOp(
SIGNATURE));
1357 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1358 unsigned SignatureAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1361 Stream.EmitRecordWithBlob(SignatureAbbrev,
Record, Blob);
1362 SignatureOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1371 if (!HSOpts.ModulesSkipDiagnosticOptions) {
1372#define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name);
1373#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
1374 Record.push_back(static_cast<unsigned>(DiagOpts.get##Name()));
1375#include "clang/Basic/DiagnosticOptions.def"
1377 for (
unsigned I = 0, N = DiagOpts.
Warnings.size(); I != N; ++I)
1380 for (
unsigned I = 0, N = DiagOpts.
Remarks.size(); I != N; ++I)
1389 if (!HSOpts.ModulesSkipHeaderSearchPaths) {
1391 Record.push_back(HSOpts.UserEntries.size());
1392 for (
unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) {
1393 const HeaderSearchOptions::Entry &Entry = HSOpts.UserEntries[I];
1395 Record.push_back(
static_cast<unsigned>(Entry.
Group));
1401 Record.push_back(HSOpts.SystemHeaderPrefixes.size());
1402 for (
unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) {
1403 AddString(HSOpts.SystemHeaderPrefixes[I].Prefix,
Record);
1404 Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader);
1408 Record.push_back(HSOpts.VFSOverlayFiles.size());
1409 for (StringRef VFSOverlayFile : HSOpts.VFSOverlayFiles)
1410 AddString(VFSOverlayFile,
Record);
1415 if (!HSOpts.ModulesSkipPragmaDiagnosticMappings)
1416 WritePragmaDiagnosticMappings(Diags, WritingModule);
1421 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1423 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1424 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1425 unsigned HSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1427 HSEntryUsage.size()};
1428 Stream.EmitRecordWithBlob(HSUsageAbbrevCode,
Record,
bytes(HSEntryUsage));
1434 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1435 Abbrev->Add(BitCodeAbbrevOp(
VFS_USAGE));
1436 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1437 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1438 unsigned VFSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1440 Stream.EmitRecordWithBlob(VFSUsageAbbrevCode,
Record,
bytes(VFSUsage));
1445 UnhashedControlBlockRange.second = Stream.GetCurrentBitNo() >> 3;
1449void ASTWriter::WriteControlBlock(Preprocessor &PP, StringRef isysroot) {
1450 using namespace llvm;
1459 auto MetadataAbbrev = std::make_shared<BitCodeAbbrev>();
1460 MetadataAbbrev->Add(BitCodeAbbrevOp(
METADATA));
1461 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1462 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1463 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1464 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1465 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1467 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1468 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1469 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1470 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1471 unsigned MetadataAbbrevCode = Stream.EmitAbbrev(std::move(MetadataAbbrev));
1472 assert((!WritingModule || isysroot.empty()) &&
1473 "writing module as a relocatable PCH?");
1478 CLANG_VERSION_MAJOR,
1479 CLANG_VERSION_MINOR,
1481 isWritingStdCXXNamedModules(),
1483 ASTHasCompilerErrors};
1484 Stream.EmitRecordWithBlob(MetadataAbbrevCode,
Record,
1488 if (WritingModule) {
1490 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1492 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1493 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1495 Stream.EmitRecordWithBlob(AbbrevCode,
Record, WritingModule->Name);
1497 auto BaseDir = [&]() -> std::optional<SmallString<128>> {
1503 if (WritingModule->Directory) {
1504 return WritingModule->Directory->getName();
1506 return std::nullopt;
1518 WritingModule->Directory->getName() !=
".")) {
1520 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1522 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1523 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1526 Stream.EmitRecordWithBlob(AbbrevCode,
Record, *BaseDir);
1530 BaseDirectory.assign(BaseDir->begin(), BaseDir->end());
1532 }
else if (!isysroot.empty()) {
1534 SmallString<128> CleanedSysroot(isysroot);
1536 BaseDirectory.assign(CleanedSysroot.begin(), CleanedSysroot.end());
1540 if (WritingModule && WritingModule->Kind == Module::ModuleMapModule) {
1544 AddPath(WritingModule->PresumedModuleMapFile.empty()
1545 ? Map.getModuleMapFileForUniquing(WritingModule)
1546 ->getNameAsRequested()
1547 : StringRef(WritingModule->PresumedModuleMapFile),
1551 if (
auto *AdditionalModMaps =
1552 Map.getAdditionalModuleMapFiles(WritingModule)) {
1553 Record.push_back(AdditionalModMaps->size());
1554 SmallVector<FileEntryRef, 1> ModMaps(AdditionalModMaps->begin(),
1555 AdditionalModMaps->end());
1556 llvm::sort(ModMaps, [](FileEntryRef A, FileEntryRef B) {
1559 for (FileEntryRef F : ModMaps)
1560 AddPath(F.getName(),
Record);
1568 if (WritingModule && !WritingModule->getDirectoryDependencies().empty()) {
1571 SmallVector<StringRef> Dirs(WritingModule->getDirectoryDependencies());
1573 Record.push_back(Dirs.size());
1574 for (StringRef Dir : Dirs)
1582 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1583 Abbrev->Add(BitCodeAbbrevOp(
IMPORT));
1584 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
1585 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1586 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1587 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1589 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1590 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1591 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1592 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1593 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1594 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1595 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1597 SmallString<128> Blob;
1599 for (ModuleFile &M : Chain->getModuleManager()) {
1601 if (!M.isDirectlyImported())
1609 AddSourceLocation(M.ImportLoc,
Record);
1610 AddStringBlob(M.ModuleName,
Record, Blob);
1611 Record.push_back(M.StandardCXXModule);
1615 const Module *ImportedModule =
1617 bool IsPrebuiltHeaderUnit =
1620 HSOpts.PrebuiltModuleFiles.count(M.ModuleName);
1622 bool IsCXX20ModuleOrPrebuiltHeaderUnit =
1623 M.StandardCXXModule || IsPrebuiltHeaderUnit;
1624 Record.push_back(IsCXX20ModuleOrPrebuiltHeaderUnit);
1626 if (IsCXX20ModuleOrPrebuiltHeaderUnit) {
1637 Record.push_back(M.FileName.getRawKind());
1641 AddPathBlob(M.FileName,
Record, Blob);
1644 Stream.EmitRecordWithBlob(AbbrevCode,
Record, Blob);
1655 const uint64_t LanguageOptionValues[] = {
1656#define LANGOPT(Name, Bits, Default, Compatibility, Description) LangOpts.Name,
1657#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
1658 static_cast<unsigned>(LangOpts.get##Name()),
1659#include "clang/Basic/LangOptions.def"
1660#define SANITIZER(NAME, ID) LangOpts.Sanitize.has(SanitizerKind::ID),
1661#include "clang/Basic/Sanitizers.def"
1663 llvm::append_range(
Record, LanguageOptionValues);
1684 AddString(
T.getTriple(),
Record);
1692 using CK = CodeGenOptions::CompatibilityKind;
1694 const CodeGenOptions &CGOpts = getCodeGenOpts();
1695#define CODEGENOPT(Name, Bits, Default, Compatibility) \
1696 if constexpr (CK::Compatibility != CK::Benign) \
1697 Record.push_back(static_cast<unsigned>(CGOpts.Name));
1698#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
1699 if constexpr (CK::Compatibility != CK::Benign) \
1700 Record.push_back(static_cast<unsigned>(CGOpts.get##Name()));
1701#define DEBUGOPT(Name, Bits, Default, Compatibility)
1702#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
1703#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
1704#include "clang/Basic/CodeGenOptions.def"
1720 for (
unsigned I = 0, N = TargetOpts.
Features.size(); I != N; ++I) {
1733 const HeaderSearchOptions &HSOpts =
1736 StringRef HSOpts_ModuleCachePath =
1741 AddString(HSOpts_ModuleCachePath,
Record);
1762 bool WriteMacros = !SkipMacros;
1763 Record.push_back(WriteMacros);
1767 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
1775 for (
unsigned I = 0, N = PPOpts.
Includes.size(); I != N; ++I)
1780 for (
unsigned I = 0, N = PPOpts.
MacroIncludes.size(); I != N; ++I)
1801 auto FileAbbrev = std::make_shared<BitCodeAbbrev>();
1803 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1804 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1805 unsigned FileAbbrevCode = Stream.EmitAbbrev(std::move(FileAbbrev));
1810 EmitRecordWithPath(FileAbbrevCode,
Record, MainFile->getName());
1817 WriteInputFiles(SourceMgr);
1824struct InputFileEntry {
1828 bool BufferOverridden;
1835 void trySetContentHash(
1837 llvm::function_ref<std::optional<llvm::MemoryBufferRef>()> GetMemBuff) {
1846 auto MemBuff = GetMemBuff();
1848 PP.
Diag(SourceLocation(), diag::err_module_unable_to_hash_content)
1853 uint64_t Hash = xxh3_64bits(MemBuff->getBuffer());
1855 ContentHash[1] =
uint32_t(Hash >> 32);
1861SourceLocation ASTWriter::getAffectingIncludeLoc(
const SourceManager &SourceMgr,
1862 const SrcMgr::FileInfo &
File) {
1863 SourceLocation IncludeLoc =
File.getIncludeLoc();
1865 FileID IncludeFID = SourceMgr.
getFileID(IncludeLoc);
1866 assert(IncludeFID.
isValid() &&
"IncludeLoc in invalid file");
1867 if (!IsSLocAffecting[IncludeFID.ID])
1868 IncludeLoc = SourceLocation();
1873void ASTWriter::WriteInputFiles(SourceManager &SourceMgr) {
1874 using namespace llvm;
1879 auto IFAbbrev = std::make_shared<BitCodeAbbrev>();
1881 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1882 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12));
1883 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
1884 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1885 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1886 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1887 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1888 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
1889 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1890 unsigned IFAbbrevCode = Stream.EmitAbbrev(std::move(IFAbbrev));
1893 auto IFHAbbrev = std::make_shared<BitCodeAbbrev>();
1895 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1896 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1897 unsigned IFHAbbrevCode = Stream.EmitAbbrev(std::move(IFHAbbrev));
1899 uint64_t InputFilesOffsetBase = Stream.GetCurrentBitNo();
1903 std::vector<InputFileEntry> SystemFiles;
1907 assert(&SourceMgr.
getSLocEntry(FileID::get(I)) == SLoc);
1916 if (!
Cache->OrigEntry ||
Cache->OrigEntry->isNamedPipe())
1920 if (!IsSLocFileEntryAffecting[I])
1923 InputFileEntry Entry(*
Cache->OrigEntry);
1924 Entry.IsSystemFile =
isSystem(
File.getFileCharacteristic());
1925 Entry.IsTransient =
Cache->IsTransient;
1926 Entry.BufferOverridden =
Cache->BufferOverridden;
1928 FileID IncludeFileID = SourceMgr.
getFileID(
File.getIncludeLoc());
1929 Entry.IsTopLevel = IncludeFileID.
isInvalid() || IncludeFileID.ID < 0 ||
1930 !IsSLocFileEntryAffecting[IncludeFileID.ID];
1933 Entry.trySetContentHash(*PP, [&] {
return Cache->getBufferIfLoaded(); });
1935 if (Entry.IsSystemFile)
1936 SystemFiles.push_back(Entry);
1945 if (!Sysroot.empty()) {
1946 SmallString<128> SDKSettingsJSON = Sysroot;
1947 llvm::sys::path::append(SDKSettingsJSON,
"SDKSettings.json");
1950 InputFileEntry Entry(*FE);
1951 Entry.IsSystemFile =
true;
1952 Entry.IsTransient =
false;
1953 Entry.BufferOverridden =
false;
1954 Entry.IsTopLevel =
true;
1955 Entry.IsModuleMap =
false;
1956 std::unique_ptr<MemoryBuffer> MB;
1957 Entry.trySetContentHash(*PP, [&]() -> std::optional<MemoryBufferRef> {
1959 MB = std::move(*MBOrErr);
1960 return MB->getMemBufferRef();
1962 return std::nullopt;
1964 SystemFiles.push_back(Entry);
1969 auto SortedFiles = llvm::concat<InputFileEntry>(std::move(
UserFiles),
1970 std::move(SystemFiles));
1972 unsigned UserFilesNum = 0;
1974 std::vector<uint64_t> InputFileOffsets;
1975 for (
const auto &Entry : SortedFiles) {
1976 uint32_t &InputFileID = InputFileIDs[Entry.File];
1977 if (InputFileID != 0)
1981 InputFileOffsets.push_back(Stream.GetCurrentBitNo() - InputFilesOffsetBase);
1983 InputFileID = InputFileOffsets.size();
1985 if (!Entry.IsSystemFile)
1991 SmallString<128> NameAsRequested = Entry.File.getNameAsRequested();
1992 SmallString<128> Name = Entry.File.getName();
1994 PreparePathForOutput(NameAsRequested);
1995 PreparePathForOutput(Name);
1997 if (Name == NameAsRequested)
2000 RecordData::value_type
Record[] = {
2002 InputFileOffsets.size(),
2004 (
uint64_t)getTimestampForOutput(Entry.File.getModificationTime()),
2005 Entry.BufferOverridden,
2009 NameAsRequested.size()};
2011 Stream.EmitRecordWithBlob(IFAbbrevCode,
Record,
2012 (NameAsRequested + Name).str());
2018 Entry.ContentHash[1]};
2019 Stream.EmitRecordWithAbbrev(IFHAbbrevCode,
Record);
2026 auto OffsetsAbbrev = std::make_shared<BitCodeAbbrev>();
2028 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2029 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2031 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2032 unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(std::move(OffsetsAbbrev));
2036 InputFileOffsets.size(), UserFilesNum};
2037 Stream.EmitRecordWithBlob(OffsetsAbbrevCode,
Record,
bytes(InputFileOffsets));
2047 using namespace llvm;
2049 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2051 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2052 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2053 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2054 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2056 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2057 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2058 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24));
2059 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2060 return Stream.EmitAbbrev(std::move(Abbrev));
2066 using namespace llvm;
2068 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2070 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2071 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2072 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2073 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2074 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2075 return Stream.EmitAbbrev(std::move(Abbrev));
2082 using namespace llvm;
2084 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2088 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2089 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2090 return Stream.EmitAbbrev(std::move(Abbrev));
2096 using namespace llvm;
2098 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2105 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2106 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2107 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2108 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2109 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2110 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2111 return Stream.EmitAbbrev(std::move(Abbrev));
2116static std::pair<unsigned, unsigned>
2118 llvm::encodeULEB128(KeyLen, Out);
2119 llvm::encodeULEB128(DataLen, Out);
2120 return std::make_pair(KeyLen, DataLen);
2126 class HeaderFileInfoTrait {
2130 HeaderFileInfoTrait(ASTWriter &Writer) : Writer(Writer) {}
2137 using key_type_ref =
const key_type &;
2139 using UnresolvedModule =
2140 llvm::PointerIntPair<Module *, 2, ModuleMap::ModuleHeaderRole>;
2143 data_type(
const HeaderFileInfo &HFI,
bool AlreadyIncluded,
2144 ArrayRef<ModuleMap::KnownHeader> KnownHeaders,
2146 : HFI(HFI), AlreadyIncluded(AlreadyIncluded),
2150 bool AlreadyIncluded;
2151 SmallVector<ModuleMap::KnownHeader, 1> KnownHeaders;
2154 using data_type_ref =
const data_type &;
2156 using hash_value_type = unsigned;
2157 using offset_type = unsigned;
2163 uint8_t buf[
sizeof(key.Size) +
sizeof(key.ModTime)];
2164 memcpy(buf, &key.Size,
sizeof(key.Size));
2165 memcpy(buf +
sizeof(key.Size), &key.ModTime,
sizeof(key.ModTime));
2166 return llvm::xxh3_64bits(buf);
2169 std::pair<unsigned, unsigned>
2170 EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref
Data) {
2171 unsigned KeyLen = key.Filename.size() + 1 + 8 + 8;
2173 for (
auto ModInfo :
Data.KnownHeaders)
2176 if (
Data.Unresolved.getPointer())
2181 void EmitKey(raw_ostream& Out, key_type_ref key,
unsigned KeyLen) {
2182 using namespace llvm::support;
2184 endian::Writer
LE(Out, llvm::endianness::little);
2189 Out.write(key.Filename.data(), KeyLen);
2192 void EmitData(raw_ostream &Out, key_type_ref key,
2193 data_type_ref
Data,
unsigned DataLen) {
2194 using namespace llvm::support;
2196 endian::Writer
LE(Out, llvm::endianness::little);
2199 unsigned char Flags = (
Data.AlreadyIncluded << 6)
2200 | (
Data.HFI.isImport << 5)
2202 Data.HFI.isPragmaOnce << 4)
2203 | (
Data.HFI.DirInfo << 1);
2206 if (
Data.HFI.LazyControllingMacro.isID())
2215 assert((
Value >> 3) == ModID &&
"overflow in header module info");
2220 for (
auto ModInfo :
Data.KnownHeaders)
2221 EmitModule(ModInfo.getModule(), ModInfo.getRole());
2222 if (
Data.Unresolved.getPointer())
2223 EmitModule(
Data.Unresolved.getPointer(),
Data.Unresolved.getInt());
2225 assert(
Out.tell() - Start == DataLen &&
"Wrong data length");
2234void ASTWriter::WriteHeaderSearch(
const HeaderSearch &HS) {
2235 HeaderFileInfoTrait GeneratorTrait(*
this);
2236 llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait>
Generator;
2237 SmallVector<const char *, 4> SavedStrings;
2238 unsigned NumHeaderSearchEntries = 0;
2244 const HeaderFileInfo
Empty;
2245 if (WritingModule) {
2246 llvm::SmallVector<Module *, 16> Worklist(1, WritingModule);
2247 while (!Worklist.empty()) {
2248 Module *M = Worklist.pop_back_val();
2265 if (!U.Size || (!U.ModTime && IncludeTimestamps)) {
2266 PP->
Diag(U.FileNameLoc, diag::err_module_no_size_mtime_for_header)
2267 << WritingModule->getFullModuleName() << U.Size.has_value()
2274 llvm::sys::path::append(Filename, U.FileName);
2275 PreparePathForOutput(Filename);
2277 StringRef FilenameDup = strdup(Filename.c_str());
2278 SavedStrings.push_back(FilenameDup.data());
2280 HeaderFileInfoTrait::key_type Key = {
2281 FilenameDup, *U.Size, IncludeTimestamps ? *U.ModTime : 0};
2282 HeaderFileInfoTrait::data_type
Data = {
2287 ++NumHeaderSearchEntries;
2290 Worklist.append(SubmodulesRange.begin(), SubmodulesRange.end());
2295 [&](FileEntryRef
File,
const HeaderFileInfo &HFI) {
2302 StringRef Filename =
File.getName();
2303 SmallString<128> FilenameTmp(Filename);
2304 if (PreparePathForOutput(FilenameTmp)) {
2307 Filename = StringRef(strdup(FilenameTmp.c_str()));
2308 SavedStrings.push_back(Filename.data());
2313 HeaderFileInfoTrait::key_type Key = {
2314 Filename,
File.getSize(),
2315 getTimestampForOutput(
File.getModificationTime())};
2316 HeaderFileInfoTrait::data_type
Data = {
2322 ++NumHeaderSearchEntries;
2326 SmallString<4096> TableData;
2329 using namespace llvm::support;
2331 llvm::raw_svector_ostream
Out(TableData);
2333 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
2334 BucketOffset =
Generator.Emit(Out, GeneratorTrait);
2338 using namespace llvm;
2340 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2342 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2343 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2344 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2345 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2346 unsigned TableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2350 NumHeaderSearchEntries, TableData.size()};
2351 Stream.EmitRecordWithBlob(TableAbbrev,
Record, TableData);
2354 for (
unsigned I = 0, N = SavedStrings.size(); I != N; ++I)
2355 free(
const_cast<char *
>(SavedStrings[I]));
2358static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob,
2359 unsigned SLocBufferBlobCompressedAbbrv,
2360 unsigned SLocBufferBlobAbbrv) {
2361 using RecordDataType = ASTWriter::RecordData::value_type;
2366 if (llvm::compression::zstd::isAvailable()) {
2367 llvm::compression::zstd::compress(
2368 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer, 9);
2370 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2371 llvm::toStringRef(CompressedBuffer));
2374 if (llvm::compression::zlib::isAvailable()) {
2375 llvm::compression::zlib::compress(
2376 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer);
2378 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2379 llvm::toStringRef(CompressedBuffer));
2384 Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv,
Record, Blob);
2395void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr) {
2400 const uint64_t SourceManagerBlockOffset = Stream.GetCurrentBitNo();
2406 unsigned SLocBufferBlobCompressedAbbrv =
2412 std::vector<uint32_t> SLocEntryOffsets;
2413 uint64_t SLocEntryOffsetsBase = Stream.GetCurrentBitNo();
2419 FileID FID = FileID::get(I);
2423 uint64_t Offset = Stream.GetCurrentBitNo() - SLocEntryOffsetsBase;
2424 assert((Offset >> 32) == 0 &&
"SLocEntry offset too large");
2430 if (
Cache->OrigEntry && !
Cache->OrigEntry->isNamedPipe()) {
2443 if (!IsSLocAffecting[I])
2445 SLocEntryOffsets.push_back(Offset);
2446 Record.push_back(getEntryOffset(*SLoc));
2447 AddSourceLocation(getAffectingIncludeLoc(SourceMgr,
File),
Record);
2448 Record.push_back(
File.getFileCharacteristic());
2451 bool EmitBlob =
false;
2454 "Writing to AST an overridden file is not supported");
2457 assert(InputFileIDs[*Content->
OrigEntry] != 0 &&
"Missed file entry");
2460 Record.push_back(getAdjustedNumCreatedFIDs(FID));
2462 FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);
2463 if (FDI != FileDeclIDs.end()) {
2464 Record.push_back(FDI->second->FirstDeclIndex);
2465 Record.push_back(FDI->second->DeclIDs.size());
2471 Stream.EmitRecordWithAbbrev(SLocFileAbbrv,
Record);
2482 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2484 StringRef Name = Buffer ? Buffer->getBufferIdentifier() :
"";
2485 Stream.EmitRecordWithBlob(SLocBufferAbbrv,
Record,
2486 StringRef(Name.data(), Name.size() + 1));
2493 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2496 Buffer = llvm::MemoryBufferRef(
"<<<INVALID BUFFER>>>",
"");
2497 StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1);
2498 emitBlob(Stream, Blob, SLocBufferBlobCompressedAbbrv,
2499 SLocBufferBlobAbbrv);
2503 const SrcMgr::ExpansionInfo &Expansion = SLoc->
getExpansion();
2504 SLocEntryOffsets.push_back(Offset);
2505 auto Chain = EmitEntryOffset(*SLoc,
Record);
2522 Record.push_back(getAdjustedOffset(NextOffset - SLoc->
getOffset()) - 1);
2523 Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv,
Record);
2529 if (SLocEntryOffsets.empty())
2534 using namespace llvm;
2536 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2538 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2539 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2540 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2541 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2542 unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2544 RecordData::value_type
Record[] = {
2547 SLocEntryOffsetsBase - SourceManagerBlockOffset};
2548 Stream.EmitRecordWithBlob(SLocOffsetsAbbrev,
Record,
2549 bytes(SLocEntryOffsets));
2560 llvm::DenseMap<int, int> FilenameMap;
2561 FilenameMap[-1] = -1;
2562 for (
const auto &L : LineTable) {
2565 for (
auto &LE : L.second) {
2566 if (FilenameMap.insert(std::make_pair(
LE.FilenameID,
2567 FilenameMap.size() - 1)).second)
2568 AddPath(LineTable.getFilename(
LE.FilenameID),
Record);
2574 for (
const auto &L : LineTable) {
2579 AddFileID(L.first,
Record);
2582 Record.push_back(L.second.size());
2583 for (
const auto &LE : L.second) {
2586 Record.push_back(FilenameMap[
LE.FilenameID]);
2587 Record.push_back((
unsigned)
LE.FileKind);
2588 Record.push_back(
LE.IncludeOffset);
2603 if (MI->isBuiltinMacro())
2619void ASTWriter::WritePreprocessor(
const Preprocessor &PP,
bool IsModule) {
2620 uint64_t MacroOffsetsBase = Stream.GetCurrentBitNo();
2624 WritePreprocessorDetail(*PPRec, MacroOffsetsBase);
2627 RecordData ModuleMacroRecord;
2637 SourceLocation AssumeNonNullLoc =
2639 if (AssumeNonNullLoc.
isValid()) {
2641 AddSourceLocation(AssumeNonNullLoc,
Record);
2651 AddSourceLocation(SkipInfo->HashTokenLoc,
Record);
2652 AddSourceLocation(SkipInfo->IfTokenLoc,
Record);
2653 Record.push_back(SkipInfo->FoundNonSkipPortion);
2654 Record.push_back(SkipInfo->FoundElse);
2655 AddSourceLocation(SkipInfo->ElseLoc,
Record);
2660 AddSourceLocation(Cond.IfLoc,
Record);
2661 Record.push_back(Cond.WasSkipping);
2662 Record.push_back(Cond.FoundNonSkip);
2663 Record.push_back(Cond.FoundElse);
2671 AddSourceLocation(S,
Record);
2681 PP.
Diag(SourceLocation(), diag::warn_module_uses_date_time) << IsModule;
2688 SmallVector<const IdentifierInfo *, 128> MacroIdentifiers;
2691 if (!isWritingStdCXXNamedModules())
2693 if (Id.second->hadMacroDefinition() &&
2694 (!Id.second->isFromAST() ||
2695 Id.second->hasChangedSinceDeserialization()))
2696 MacroIdentifiers.push_back(Id.second);
2699 llvm::sort(MacroIdentifiers, llvm::deref<std::less<>>());
2703 for (
const IdentifierInfo *Name : MacroIdentifiers) {
2705 uint64_t StartOffset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2706 assert((StartOffset >> 32) == 0 &&
"Macro identifiers offset too large");
2709 bool EmittedModuleMacros =
false;
2717 if (IsModule && WritingModule->isHeaderUnit()) {
2726 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2727 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2728 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2729 Record.push_back(VisMD->isPublic());
2731 ModuleMacroRecord.push_back(getSubmoduleID(WritingModule));
2732 AddMacroRef(MD->
getMacroInfo(), Name, ModuleMacroRecord);
2734 ModuleMacroRecord.clear();
2735 EmittedModuleMacros =
true;
2745 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2746 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2747 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2748 Record.push_back(VisMD->isPublic());
2754 SmallVector<ModuleMacro *, 8> Worklist(Leafs);
2755 llvm::DenseMap<ModuleMacro *, unsigned> Visits;
2756 while (!Worklist.empty()) {
2757 auto *
Macro = Worklist.pop_back_val();
2760 ModuleMacroRecord.push_back(getSubmoduleID(
Macro->getOwningModule()));
2761 AddMacroRef(
Macro->getMacroInfo(), Name, ModuleMacroRecord);
2762 for (
auto *M :
Macro->overrides())
2763 ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));
2766 ModuleMacroRecord.clear();
2769 for (
auto *M :
Macro->overrides())
2770 if (++Visits[M] == M->getNumOverridingMacros())
2771 Worklist.push_back(M);
2773 EmittedModuleMacros =
true;
2776 if (
Record.empty() && !EmittedModuleMacros)
2779 IdentMacroDirectivesOffsetMap[Name] = StartOffset;
2790 std::vector<uint32_t> MacroOffsets;
2792 for (
unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {
2793 const IdentifierInfo *Name = MacroInfosToEmit[I].Name;
2794 MacroInfo *MI = MacroInfosToEmit[I].MI;
2797 if (ID < FirstMacroID) {
2798 assert(0 &&
"Loaded MacroInfo entered MacroInfosToEmit ?");
2803 unsigned Index =
ID - FirstMacroID;
2804 if (Index >= MacroOffsets.size())
2805 MacroOffsets.resize(Index + 1);
2807 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2808 assert((Offset >> 32) == 0 &&
"Macro offset too large");
2809 MacroOffsets[Index] = Offset;
2811 AddIdentifierRef(Name,
Record);
2827 for (
const IdentifierInfo *Param : MI->
params())
2828 AddIdentifierRef(Param,
Record);
2836 Stream.EmitRecord(Code,
Record);
2840 for (
unsigned TokNo = 0, e = MI->
getNumTokens(); TokNo != e; ++TokNo) {
2855 using namespace llvm;
2857 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2859 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2860 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2861 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2863 unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2866 MacroOffsetsBase - ASTBlockStartOffset};
2867 Stream.EmitRecordWithBlob(MacroOffsetAbbrev,
Record,
bytes(MacroOffsets));
2871void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec,
2872 uint64_t MacroOffsetsBase) {
2876 SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets;
2882 unsigned NumPreprocessingRecords = 0;
2883 using namespace llvm;
2886 unsigned InclusionAbbrev = 0;
2888 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2890 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2891 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2892 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));
2893 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2894 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2895 InclusionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2899 unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
2901 for (PreprocessingRecord::iterator E = PPRec.
local_begin(),
2904 (
void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {
2907 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2908 assert((Offset >> 32) == 0 &&
"Preprocessed entity offset too large");
2909 SourceRange
R = getAdjustedRange((*E)->getSourceRange());
2910 PreprocessedEntityOffsets.emplace_back(
2911 getRawSourceLocationEncoding(
R.getBegin()),
2912 getRawSourceLocationEncoding(
R.getEnd()), Offset);
2914 if (
auto *MD = dyn_cast<MacroDefinitionRecord>(*E)) {
2916 MacroDefinitions[MD] = NextPreprocessorEntityID;
2918 AddIdentifierRef(MD->getName(),
Record);
2923 if (
auto *ME = dyn_cast<MacroExpansion>(*E)) {
2924 Record.push_back(ME->isBuiltinMacro());
2925 if (ME->isBuiltinMacro())
2926 AddIdentifierRef(ME->getName(),
Record);
2928 Record.push_back(MacroDefinitions[ME->getDefinition()]);
2933 if (
auto *ID = dyn_cast<InclusionDirective>(*E)) {
2935 Record.push_back(
ID->getFileName().size());
2936 Record.push_back(
ID->wasInQuotes());
2937 Record.push_back(
static_cast<unsigned>(
ID->getKind()));
2938 Record.push_back(
ID->importedModule());
2939 SmallString<64> Buffer;
2940 Buffer +=
ID->getFileName();
2944 Buffer +=
ID->getFile()->getName();
2945 Stream.EmitRecordWithBlob(InclusionAbbrev,
Record, Buffer);
2949 llvm_unreachable(
"Unhandled PreprocessedEntity in ASTWriter");
2954 if (NumPreprocessingRecords > 0) {
2955 assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);
2958 using namespace llvm;
2960 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2962 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2963 unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2966 Stream.EmitRecordWithBlob(PPEOffsetAbbrev,
Record,
2967 bytes(PreprocessedEntityOffsets));
2972 if (SkippedRanges.size() > 0) {
2973 std::vector<PPSkippedRange> SerializedSkippedRanges;
2974 SerializedSkippedRanges.reserve(SkippedRanges.size());
2975 for (
auto const &Range : SkippedRanges) {
2976 SourceRange
R = getAdjustedRange(Range);
2977 SerializedSkippedRanges.emplace_back(
2978 getRawSourceLocationEncoding(
R.getBegin()),
2979 getRawSourceLocationEncoding(
R.getEnd()));
2982 using namespace llvm;
2983 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2985 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2986 unsigned PPESkippedRangeAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2990 Stream.EmitRecordWithBlob(PPESkippedRangeAbbrev,
Record,
2991 bytes(SerializedSkippedRanges));
2999 auto Known = SubmoduleIDs.find(Mod);
3000 if (
Known != SubmoduleIDs.end())
3001 return Known->second;
3004 if (Top != WritingModule &&
3006 !Top->fullModuleNameIs(StringRef(
getLangOpts().CurrentModule))))
3009 return SubmoduleIDs[Mod] = NextSubmoduleID++;
3012unsigned ASTWriter::getSubmoduleID(
Module *Mod) {
3013 unsigned ID = getLocalOrImportedSubmoduleID(Mod);
3022void ASTWriter::WriteSubmodules(
Module *WritingModule,
ASTContext *Context) {
3027 using namespace llvm;
3029 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3031 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3032 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3033 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4));
3034 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3035 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));
3036 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3037 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3038 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3039 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3040 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3041 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3042 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3043 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3044 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3045 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3046 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3047 unsigned DefinitionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3049 Abbrev = std::make_shared<BitCodeAbbrev>();
3051 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3052 unsigned UmbrellaAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3054 Abbrev = std::make_shared<BitCodeAbbrev>();
3056 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3057 unsigned HeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3059 Abbrev = std::make_shared<BitCodeAbbrev>();
3061 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3062 unsigned TopHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3064 Abbrev = std::make_shared<BitCodeAbbrev>();
3066 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3067 unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3069 Abbrev = std::make_shared<BitCodeAbbrev>();
3071 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3072 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3073 unsigned RequiresAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3075 Abbrev = std::make_shared<BitCodeAbbrev>();
3077 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3078 unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3080 Abbrev = std::make_shared<BitCodeAbbrev>();
3082 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3083 unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3085 Abbrev = std::make_shared<BitCodeAbbrev>();
3087 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3088 unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3090 Abbrev = std::make_shared<BitCodeAbbrev>();
3092 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3093 unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3095 Abbrev = std::make_shared<BitCodeAbbrev>();
3097 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3098 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3099 unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3101 Abbrev = std::make_shared<BitCodeAbbrev>();
3103 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3104 unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3106 Abbrev = std::make_shared<BitCodeAbbrev>();
3108 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3109 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3110 unsigned ConflictAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3112 Abbrev = std::make_shared<BitCodeAbbrev>();
3114 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3115 unsigned ExportAsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3117 Abbrev = std::make_shared<BitCodeAbbrev>();
3119 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3120 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3121 unsigned ChildAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3124 uint64_t SubmoduleOffsetBase = Stream.GetCurrentBitNo();
3126 unsigned TopLevelID = getSubmoduleID(WritingModule);
3129 std::queue<Module *> Q;
3130 Q.push(WritingModule);
3131 while (!Q.empty()) {
3134 unsigned ID = getSubmoduleID(Mod);
3135 if (ID < FirstSubmoduleID) {
3136 assert(0 &&
"Loaded submodule entered WritingModule ?");
3141 unsigned Index =
ID - FirstSubmoduleID;
3142 if (Index >= SubmoduleOffsets.size())
3143 SubmoduleOffsets.resize(Index + 1);
3145 uint64_t Offset = Stream.GetCurrentBitNo() - SubmoduleOffsetBase;
3146 assert((Offset >> 32) == 0 &&
"Submodule offset too large");
3147 SubmoduleOffsets[Index] = Offset;
3151 assert(SubmoduleIDs[Mod->
Parent] &&
"Submodule parent not written?");
3152 ParentID = SubmoduleIDs[Mod->
Parent];
3156 getRawSourceLocationEncoding(getAdjustedLocation(Mod->
DefinitionLoc));
3159 FileID UnadjustedInferredFID;
3162 int InferredFID = getAdjustedFileID(UnadjustedInferredFID).
getOpaqueValue();
3169 (RecordData::value_type)Mod->
Kind,
3171 (RecordData::value_type)InferredFID,
3182 Stream.EmitRecordWithBlob(DefinitionAbbrev,
Record, Mod->
Name);
3188 Stream.EmitRecordWithBlob(RequiresAbbrev,
Record,
R.FeatureName);
3192 if (std::optional<Module::Header> UmbrellaHeader =
3195 Stream.EmitRecordWithBlob(UmbrellaAbbrev,
Record,
3196 UmbrellaHeader->NameAsWritten);
3197 }
else if (std::optional<Module::DirectoryName> UmbrellaDir =
3200 Stream.EmitRecordWithBlob(UmbrellaDirAbbrev,
Record,
3201 UmbrellaDir->NameAsWritten);
3206 unsigned RecordKind;
3208 Module::HeaderKind HeaderKind;
3214 Module::HK_PrivateTextual},
3217 for (
const auto &HL : HeaderLists) {
3218 RecordData::value_type
Record[] = {HL.RecordKind};
3219 for (
const auto &H : Mod->
getHeaders(HL.HeaderKind))
3220 Stream.EmitRecordWithBlob(HL.Abbrev,
Record, H.NameAsWritten);
3227 SmallString<128> HeaderName(H.getName());
3228 PreparePathForOutput(HeaderName);
3229 Stream.EmitRecordWithBlob(TopHeaderAbbrev,
Record, HeaderName);
3237 Record.push_back(getSubmoduleID(I));
3245 Record.push_back(getSubmoduleID(I));
3252 for (
const auto &E : Mod->
Exports) {
3255 Record.push_back(getSubmoduleID(E.first));
3256 Record.push_back(E.second);
3271 Stream.EmitRecordWithBlob(LinkLibraryAbbrev,
Record, LL.Library);
3279 getSubmoduleID(
C.Other)};
3280 Stream.EmitRecordWithBlob(ConflictAbbrev,
Record,
C.Message);
3286 Stream.EmitRecordWithBlob(ConfigMacroAbbrev,
Record, CM);
3291 if (Context && !GeneratingReducedBMI) {
3294 if (wasDeclEmitted(D))
3295 AddDeclRef(D,
Inits);
3310 getSubmoduleID(Child)};
3311 Stream.EmitRecordWithBlob(ChildAbbrev,
Record, Child->Name);
3327 assert((NextSubmoduleID - FirstSubmoduleID == SubmoduleOffsets.size()) &&
3328 "Wrong # of submodules; found a reference to a non-local, "
3329 "non-imported submodule?");
3331 Abbrev = std::make_shared<BitCodeAbbrev>();
3333 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3334 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3335 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3336 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3337 unsigned SubmoduleMetadataAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3339 RecordData::value_type
Record[] = {
3342 Stream.EmitRecordWithBlob(SubmoduleMetadataAbbrev,
Record,
3343 bytes(SubmoduleOffsets));
3346void ASTWriter::WritePragmaDiagnosticMappings(
const DiagnosticsEngine &
Diag,
3348 llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>
3350 unsigned CurrID = 0;
3353 auto EncodeDiagStateFlags =
3354 [](
const DiagnosticsEngine::DiagState *DS) ->
unsigned {
3355 unsigned Result = (unsigned)DS->ExtBehavior;
3357 {(unsigned)DS->IgnoreAllWarnings, (
unsigned)DS->EnableAllWarnings,
3358 (unsigned)DS->WarningsAsErrors, (
unsigned)DS->ErrorsAsFatal,
3359 (unsigned)DS->SuppressSystemWarnings})
3364 unsigned Flags = EncodeDiagStateFlags(
Diag.DiagStatesByLoc.FirstDiagState);
3367 auto AddDiagState = [&](
const DiagnosticsEngine::DiagState *State,
3368 bool IncludeNonPragmaStates) {
3371 assert(Flags == EncodeDiagStateFlags(State) &&
3372 "diag state flags vary in single AST file");
3376 assert(!IncludeNonPragmaStates ||
3377 State ==
Diag.DiagStatesByLoc.FirstDiagState);
3379 unsigned &DiagStateID = DiagStateIDMap[State];
3380 Record.push_back(DiagStateID);
3382 if (DiagStateID == 0) {
3383 DiagStateID = ++CurrID;
3384 SmallVector<std::pair<unsigned, DiagnosticMapping>> Mappings;
3387 auto SizeIdx =
Record.size();
3389 for (
const auto &I : *State) {
3391 if (!I.second.isPragma() && !IncludeNonPragmaStates)
3395 if (!I.second.isPragma() &&
3396 I.second ==
Diag.getDiagnosticIDs()->getDefaultMapping(I.first))
3398 Mappings.push_back(I);
3402 llvm::sort(Mappings, llvm::less_first());
3404 for (
const auto &I : Mappings) {
3405 Record.push_back(I.first);
3406 Record.push_back(I.second.serialize());
3413 AddDiagState(
Diag.DiagStatesByLoc.FirstDiagState, isModule);
3416 auto NumLocationsIdx =
Record.size();
3420 unsigned NumLocations = 0;
3421 for (
auto &FileIDAndFile :
Diag.DiagStatesByLoc.Files) {
3422 if (!FileIDAndFile.first.isValid() ||
3423 !FileIDAndFile.second.HasLocalTransitions)
3427 AddFileID(FileIDAndFile.first,
Record);
3429 Record.push_back(FileIDAndFile.second.StateTransitions.size());
3430 for (
auto &StatePoint : FileIDAndFile.second.StateTransitions) {
3431 Record.push_back(StatePoint.Offset);
3432 AddDiagState(StatePoint.State,
false);
3437 Record[NumLocationsIdx] = NumLocations;
3445 AddSourceLocation(
Diag.DiagStatesByLoc.CurDiagStateLoc,
Record);
3446 AddDiagState(
Diag.DiagStatesByLoc.CurDiagState,
false);
3451 Record.push_back(
Diag.DiagStateOnPushStack.size());
3452 for (
const auto *State :
Diag.DiagStateOnPushStack)
3453 AddDiagState(State,
false);
3463void ASTWriter::WriteType(ASTContext &Context, QualType
T) {
3464 TypeIdx &IdxRef = TypeIdxs[
T];
3466 IdxRef = TypeIdx(0, NextTypeID++);
3467 TypeIdx Idx = IdxRef;
3470 assert(Idx.
getValue() >= FirstTypeID &&
"Writing predefined type");
3474 ASTTypeWriter(Context, *
this).write(
T) - DeclTypesBlockStartOffset;
3478 if (TypeOffsets.size() == Index)
3479 TypeOffsets.emplace_back(Offset);
3480 else if (TypeOffsets.size() < Index) {
3481 TypeOffsets.resize(Index + 1);
3482 TypeOffsets[Index].set(Offset);
3484 llvm_unreachable(
"Types emitted in wrong order");
3493 auto *ND = dyn_cast<NamedDecl>(D);
3508uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context,
3509 const DeclContext *DC) {
3517 uint64_t Offset = Stream.GetCurrentBitNo();
3518 SmallVector<DeclID, 128> KindDeclPairs;
3519 for (
const auto *D : DC->
decls()) {
3520 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(D))
3528 if (GeneratingReducedBMI && !D->isFromExplicitGlobalModule() &&
3532 KindDeclPairs.push_back(D->getKind());
3533 KindDeclPairs.push_back(GetDeclRef(D).getRawValue());
3536 ++NumLexicalDeclContexts;
3538 Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev,
Record,
3539 bytes(KindDeclPairs));
3543void ASTWriter::WriteTypeDeclOffsets() {
3544 using namespace llvm;
3547 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3549 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3550 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3551 unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3554 Stream.EmitRecordWithBlob(TypeOffsetAbbrev,
Record,
bytes(TypeOffsets));
3558 Abbrev = std::make_shared<BitCodeAbbrev>();
3560 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3561 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3562 unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3565 Stream.EmitRecordWithBlob(DeclOffsetAbbrev,
Record,
bytes(DeclOffsets));
3569void ASTWriter::WriteFileDeclIDsMap() {
3570 using namespace llvm;
3572 SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs;
3573 SortedFileDeclIDs.reserve(FileDeclIDs.size());
3574 for (
const auto &P : FileDeclIDs)
3575 SortedFileDeclIDs.push_back(std::make_pair(P.first, P.second.get()));
3576 llvm::sort(SortedFileDeclIDs, llvm::less_first());
3579 SmallVector<DeclID, 256> FileGroupedDeclIDs;
3580 for (
auto &FileDeclEntry : SortedFileDeclIDs) {
3581 DeclIDInFileInfo &Info = *FileDeclEntry.second;
3582 Info.FirstDeclIndex = FileGroupedDeclIDs.size();
3583 llvm::stable_sort(Info.DeclIDs);
3584 for (
auto &LocDeclEntry : Info.DeclIDs)
3585 FileGroupedDeclIDs.push_back(LocDeclEntry.second.getRawValue());
3588 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3590 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3591 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3592 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
3594 FileGroupedDeclIDs.size()};
3595 Stream.EmitRecordWithBlob(AbbrevCode,
Record,
bytes(FileGroupedDeclIDs));
3598void ASTWriter::WriteComments(ASTContext &Context) {
3600 llvm::scope_exit _([
this] { Stream.ExitBlock(); });
3605 for (
const auto &FO : Context.
Comments.OrderedComments) {
3606 for (
const auto &OC : FO.second) {
3607 const RawComment *I = OC.second;
3625class ASTMethodPoolTrait {
3629 using key_type = Selector;
3630 using key_type_ref = key_type;
3634 ObjCMethodList Instance, Factory;
3636 using data_type_ref =
const data_type &;
3638 using hash_value_type = unsigned;
3639 using offset_type = unsigned;
3641 explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) {}
3643 static hash_value_type
ComputeHash(Selector Sel) {
3647 std::pair<unsigned, unsigned>
3648 EmitKeyDataLength(raw_ostream& Out, Selector Sel,
3649 data_type_ref Methods) {
3653 unsigned DataLen = 4 + 2 + 2;
3654 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3656 if (ShouldWriteMethodListNode(
Method))
3657 DataLen +=
sizeof(
DeclID);
3658 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3660 if (ShouldWriteMethodListNode(
Method))
3661 DataLen +=
sizeof(
DeclID);
3665 void EmitKey(raw_ostream& Out, Selector Sel,
unsigned) {
3666 using namespace llvm::support;
3668 endian::Writer
LE(Out, llvm::endianness::little);
3670 assert((Start >> 32) == 0 &&
"Selector key offset too large");
3676 for (
unsigned I = 0; I != N; ++I)
3681 void EmitData(raw_ostream& Out, key_type_ref,
3682 data_type_ref Methods,
unsigned DataLen) {
3683 using namespace llvm::support;
3685 endian::Writer
LE(Out, llvm::endianness::little);
3688 unsigned NumInstanceMethods = 0;
3689 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3691 if (ShouldWriteMethodListNode(
Method))
3692 ++NumInstanceMethods;
3694 unsigned NumFactoryMethods = 0;
3695 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3697 if (ShouldWriteMethodListNode(
Method))
3698 ++NumFactoryMethods;
3700 unsigned InstanceBits = Methods.Instance.getBits();
3701 assert(InstanceBits < 4);
3702 unsigned InstanceHasMoreThanOneDeclBit =
3703 Methods.Instance.hasMoreThanOneDecl();
3704 unsigned FullInstanceBits = (NumInstanceMethods << 3) |
3705 (InstanceHasMoreThanOneDeclBit << 2) |
3707 unsigned FactoryBits = Methods.Factory.getBits();
3708 assert(FactoryBits < 4);
3709 unsigned FactoryHasMoreThanOneDeclBit =
3710 Methods.Factory.hasMoreThanOneDecl();
3711 unsigned FullFactoryBits = (NumFactoryMethods << 3) |
3712 (FactoryHasMoreThanOneDeclBit << 2) |
3716 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3718 if (ShouldWriteMethodListNode(
Method))
3720 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3722 if (ShouldWriteMethodListNode(
Method))
3725 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
3729 static bool ShouldWriteMethodListNode(
const ObjCMethodList *Node) {
3741void ASTWriter::WriteSelectors(Sema &SemaRef) {
3742 using namespace llvm;
3747 unsigned NumTableEntries = 0;
3750 llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait>
Generator;
3751 ASTMethodPoolTrait Trait(*
this);
3755 SelectorOffsets.resize(NextSelectorID - FirstSelectorID);
3756 for (
auto &SelectorAndID : SelectorIDs) {
3757 Selector S = SelectorAndID.first;
3759 SemaObjC::GlobalMethodPool::iterator F =
3761 ASTMethodPoolTrait::data_type
Data = {
3767 Data.Instance = F->second.first;
3768 Data.Factory = F->second.second;
3772 if (Chain && ID < FirstSelectorID) {
3774 bool changed =
false;
3775 for (ObjCMethodList *M = &
Data.Instance; M && M->getMethod();
3777 if (!M->getMethod()->isFromASTFile()) {
3783 for (ObjCMethodList *M = &
Data.Factory; M && M->getMethod();
3785 if (!M->getMethod()->isFromASTFile()) {
3793 }
else if (
Data.Instance.getMethod() ||
Data.Factory.getMethod()) {
3801 SmallString<4096> MethodPool;
3804 using namespace llvm::support;
3806 ASTMethodPoolTrait Trait(*
this);
3807 llvm::raw_svector_ostream
Out(MethodPool);
3809 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
3810 BucketOffset =
Generator.Emit(Out, Trait);
3814 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3816 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3817 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3818 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3819 unsigned MethodPoolAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3825 Stream.EmitRecordWithBlob(MethodPoolAbbrev,
Record, MethodPool);
3829 Abbrev = std::make_shared<BitCodeAbbrev>();
3831 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3832 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3833 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3834 unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3838 RecordData::value_type
Record[] = {
3841 Stream.EmitRecordWithBlob(SelectorOffsetAbbrev,
Record,
3842 bytes(SelectorOffsets));
3848void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) {
3849 using namespace llvm;
3861 Selector Sel = SelectorAndLocation.first;
3862 SourceLocation Loc = SelectorAndLocation.second;
3863 Writer.AddSelectorRef(Sel);
3885 for (; Redecl; Redecl = Redecl->getPreviousDecl()) {
3887 if (!Redecl->isFromASTFile()) {
3891 if (!Redecl->getDeclContext()->getRedeclContext()->Equals(
3899 if (Redecl->getOwningModuleID() == 0)
3904 if (!
First->isFromASTFile())
3915bool IsInterestingIdentifier(
const IdentifierInfo *II, uint64_t MacroOffset,
3916 bool IsModule,
bool IsCPlusPlus) {
3917 bool NeedDecls = !IsModule || !IsCPlusPlus;
3919 bool IsInteresting =
3926 II->
isPoisoned() || (!IsModule && IsInteresting) ||
3934bool IsInterestingNonMacroIdentifier(
const IdentifierInfo *II,
3935 ASTWriter &Writer) {
3937 bool IsCPlusPlus = Writer.
getLangOpts().CPlusPlus;
3938 return IsInterestingIdentifier(II, 0, IsModule, IsCPlusPlus);
3941class ASTIdentifierTableTrait {
3944 IdentifierResolver *IdResolver;
3954 return IsInterestingIdentifier(II, MacroOffset, IsModule,
3959 using key_type =
const IdentifierInfo *;
3960 using key_type_ref = key_type;
3963 using data_type_ref = data_type;
3965 using hash_value_type = unsigned;
3966 using offset_type = unsigned;
3968 ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP,
3969 IdentifierResolver *IdResolver,
bool IsModule,
3971 : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),
3972 NeedDecls(!IsModule || !Writer.getLangOpts().
CPlusPlus),
3973 InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}
3975 bool needDecls()
const {
return NeedDecls; }
3977 static hash_value_type
ComputeHash(
const IdentifierInfo* II) {
3978 return llvm::djbHash(II->
getName());
3986 std::pair<unsigned, unsigned>
3987 EmitKeyDataLength(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID) {
3996 if (InterestingIdentifierOffsets &&
3998 InterestingIdentifierOffsets->push_back(
Out.tell());
4009 if (NeedDecls && IdResolver)
4010 DataLen += std::distance(IdResolver->
begin(II), IdResolver->
end()) *
4016 void EmitKey(raw_ostream &Out,
const IdentifierInfo *II,
unsigned KeyLen) {
4020 void EmitData(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID,
4022 using namespace llvm::support;
4024 endian::Writer
LE(Out, llvm::endianness::little);
4034 assert((Bits & 0xffff) == Bits &&
"ObjCOrBuiltinID too big for ASTReader.");
4037 bool HasMacroDefinition =
4040 Bits = (Bits << 1) |
unsigned(HasMacroDefinition);
4042 Bits = (Bits << 1) |
unsigned(II->
isPoisoned());
4047 if (HasMacroDefinition)
4050 if (NeedDecls && IdResolver) {
4057 SmallVector<NamedDecl *, 16> Decls(IdResolver->
decls(II));
4058 for (NamedDecl *D : llvm::reverse(Decls))
4076void ASTWriter::WriteIdentifierTable(Preprocessor &PP,
4077 IdentifierResolver *IdResolver,
4079 using namespace llvm;
4081 RecordData InterestingIdents;
4086 llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait>
Generator;
4087 ASTIdentifierTableTrait Trait(*
this, PP, IdResolver, IsModule,
4088 IsModule ? &InterestingIdents :
nullptr);
4092 IdentifierOffsets.resize(NextIdentID - FirstIdentID);
4093 for (
auto IdentIDPair : IdentifierIDs) {
4094 const IdentifierInfo *II = IdentIDPair.first;
4096 assert(II &&
"NULL identifier in identifier table");
4101 (Trait.needDecls() &&
4107 SmallString<4096> IdentifierTable;
4110 using namespace llvm::support;
4112 llvm::raw_svector_ostream
Out(IdentifierTable);
4114 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
4115 BucketOffset =
Generator.Emit(Out, Trait);
4119 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4121 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4122 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4123 unsigned IDTableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4127 Stream.EmitRecordWithBlob(IDTableAbbrev,
Record, IdentifierTable);
4131 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4133 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4134 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4135 unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4138 for (
unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)
4139 assert(IdentifierOffsets[I] &&
"Missing identifier offset?");
4143 IdentifierOffsets.size()};
4144 Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev,
Record,
4145 bytes(IdentifierOffsets));
4149 if (!InterestingIdents.empty())
4157 PendingEmittingVTables.push_back(RD);
4161 TouchedModuleFiles.insert(MF);
4170class ASTDeclContextNameLookupTraitBase {
4178 using data_type = std::pair<unsigned, unsigned>;
4179 using data_type_ref =
const data_type &;
4184 explicit ASTDeclContextNameLookupTraitBase(
ASTWriter &Writer)
4187 data_type getData(
const DeclIDsTy &LocalIDs) {
4188 unsigned Start = DeclIDs.size();
4189 for (
auto ID : LocalIDs)
4190 DeclIDs.push_back(ID);
4191 return std::make_pair(Start, DeclIDs.size());
4194 data_type ImportData(
const reader::ASTDeclContextNameLookupTrait::data_type &FromReader) {
4195 unsigned Start = DeclIDs.size();
4198 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.begin()),
4199 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.end()));
4200 return std::make_pair(Start, DeclIDs.size());
4203 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4205 "have reference to loaded module file but no chain?");
4207 using namespace llvm::support;
4210 llvm::endianness::little);
4213 std::pair<unsigned, unsigned> EmitKeyDataLengthBase(raw_ostream &Out,
4214 DeclarationNameKey Name,
4215 data_type_ref Lookup) {
4216 unsigned KeyLen = 1;
4239 unsigned DataLen =
sizeof(
DeclID) * (Lookup.second - Lookup.first);
4241 return {KeyLen, DataLen};
4244 void EmitKeyBase(raw_ostream &Out, DeclarationNameKey Name) {
4245 using namespace llvm::support;
4247 endian::Writer
LE(Out, llvm::endianness::little);
4262 "Invalid operator?");
4272 llvm_unreachable(
"Invalid name kind?");
4275 void EmitDataBase(raw_ostream &Out, data_type Lookup,
unsigned DataLen) {
4276 using namespace llvm::support;
4278 endian::Writer
LE(Out, llvm::endianness::little);
4280 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I)
4282 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4286class ModuleLevelNameLookupTrait :
public ASTDeclContextNameLookupTraitBase {
4288 using primary_module_hash_type = unsigned;
4290 using key_type = std::pair<DeclarationNameKey, primary_module_hash_type>;
4291 using key_type_ref = key_type;
4293 explicit ModuleLevelNameLookupTrait(ASTWriter &Writer)
4294 : ASTDeclContextNameLookupTraitBase(Writer) {}
4296 static bool EqualKey(key_type_ref a, key_type_ref b) {
return a == b; }
4299 llvm::FoldingSetNodeID
ID;
4300 ID.AddInteger(Key.first.getHash());
4301 ID.AddInteger(Key.second);
4302 return ID.computeStableHash();
4305 std::pair<unsigned, unsigned>
4306 EmitKeyDataLength(raw_ostream &Out, key_type Key, data_type_ref Lookup) {
4307 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Key.first, Lookup);
4308 KeyLen +=
sizeof(Key.second);
4312 void EmitKey(raw_ostream &Out, key_type Key,
unsigned) {
4313 EmitKeyBase(Out, Key.first);
4314 llvm::support::endian::Writer
LE(Out, llvm::endianness::little);
4315 LE.write<primary_module_hash_type>(Key.second);
4318 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4320 EmitDataBase(Out, Lookup, DataLen);
4324class ASTDeclContextNameTrivialLookupTrait
4325 :
public ASTDeclContextNameLookupTraitBase {
4327 using key_type = DeclarationNameKey;
4328 using key_type_ref = key_type;
4331 using ASTDeclContextNameLookupTraitBase::ASTDeclContextNameLookupTraitBase;
4333 using ASTDeclContextNameLookupTraitBase::getData;
4335 static bool EqualKey(key_type_ref a, key_type_ref b) {
return a == b; }
4337 hash_value_type
ComputeHash(key_type Name) {
return Name.getHash(); }
4339 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4340 DeclarationNameKey Name,
4341 data_type_ref Lookup) {
4342 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Name, Lookup);
4346 void EmitKey(raw_ostream &Out, DeclarationNameKey Name,
unsigned) {
4347 return EmitKeyBase(Out, Name);
4350 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4352 EmitDataBase(Out, Lookup, DataLen);
4356static bool isModuleLocalDecl(NamedDecl *D) {
4361 return isModuleLocalDecl(Parent);
4370 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
4388static bool isTULocalInNamedModules(NamedDecl *D) {
4411class ASTDeclContextNameLookupTrait
4412 :
public ASTDeclContextNameTrivialLookupTrait {
4414 using TULocalDeclsMapTy = llvm::DenseMap<key_type, DeclIDsTy>;
4416 using ModuleLevelDeclsMapTy =
4417 llvm::DenseMap<ModuleLevelNameLookupTrait::key_type, DeclIDsTy>;
4420 enum class LookupVisibility {
4430 LookupVisibility getLookupVisibility(NamedDecl *D)
const {
4433 return LookupVisibility::GenerallyVisibile;
4435 if (isModuleLocalDecl(D))
4436 return LookupVisibility::ModuleLocalVisible;
4437 if (isTULocalInNamedModules(D))
4438 return LookupVisibility::TULocal;
4450 if (
auto *ECD = dyn_cast<EnumConstantDecl>(D);
4451 ECD && DC.
isFileContext() && ECD->getTopLevelOwningNamedModule()) {
4456 return Found->isInvisibleOutsideTheOwningModule();
4458 return ECD->isFromExplicitGlobalModule() ||
4459 ECD->isInAnonymousNamespace()
4460 ? LookupVisibility::TULocal
4461 : LookupVisibility::ModuleLocalVisible;
4464 return LookupVisibility::GenerallyVisibile;
4468 ModuleLevelDeclsMapTy ModuleLocalDeclsMap;
4469 TULocalDeclsMapTy TULocalDeclsMap;
4472 using ASTDeclContextNameTrivialLookupTrait::
4473 ASTDeclContextNameTrivialLookupTrait;
4475 ASTDeclContextNameLookupTrait(ASTWriter &Writer, DeclContext &DC)
4476 : ASTDeclContextNameTrivialLookupTrait(Writer), DC(DC) {}
4478 template <
typename Coll> data_type getData(
const Coll &Decls) {
4479 unsigned Start = DeclIDs.size();
4480 auto AddDecl = [
this](NamedDecl *D) {
4481 NamedDecl *DeclForLocalLookup =
4497 switch (getLookupVisibility(DeclForLocalLookup)) {
4498 case LookupVisibility::ModuleLocalVisible:
4501 auto Key = std::make_pair(D->
getDeclName(), *PrimaryModuleHash);
4502 auto Iter = ModuleLocalDeclsMap.find(Key);
4503 if (Iter == ModuleLocalDeclsMap.end())
4504 ModuleLocalDeclsMap.insert({Key, DeclIDsTy{
ID}});
4506 Iter->second.push_back(ID);
4510 case LookupVisibility::TULocal: {
4511 auto Iter = TULocalDeclsMap.find(D->
getDeclName());
4512 if (Iter == TULocalDeclsMap.end())
4515 Iter->second.push_back(ID);
4518 case LookupVisibility::GenerallyVisibile:
4523 DeclIDs.push_back(ID);
4525 ASTReader *Chain = Writer.
getChain();
4526 for (NamedDecl *D : Decls) {
4537 for (
const auto &[_,
First] : Firsts)
4543 return std::make_pair(Start, DeclIDs.size());
4546 const ModuleLevelDeclsMapTy &getModuleLocalDecls() {
4547 return ModuleLocalDeclsMap;
4550 const TULocalDeclsMapTy &getTULocalDecls() {
return TULocalDeclsMap; }
4556class LazySpecializationInfoLookupTrait {
4558 llvm::SmallVector<serialization::reader::LazySpecializationInfo, 64> Specs;
4561 using key_type = unsigned;
4562 using key_type_ref = key_type;
4565 using data_type = std::pair<unsigned, unsigned>;
4566 using data_type_ref =
const data_type &;
4568 using hash_value_type = unsigned;
4569 using offset_type = unsigned;
4571 explicit LazySpecializationInfoLookupTrait(ASTWriter &Writer)
4574 template <
typename Col,
typename Col2>
4575 data_type getData(Col &&
C, Col2 &ExistingInfo) {
4576 unsigned Start = Specs.size();
4579 const_cast<NamedDecl *
>(D));
4584 Specs.push_back(Info);
4585 return std::make_pair(Start, Specs.size());
4588 data_type ImportData(
4590 unsigned Start = Specs.size();
4591 for (
auto ID : FromReader)
4592 Specs.push_back(ID);
4593 return std::make_pair(Start, Specs.size());
4596 static bool EqualKey(key_type_ref a, key_type_ref b) {
return a == b; }
4598 hash_value_type
ComputeHash(key_type Name) {
return Name; }
4600 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4602 "have reference to loaded module file but no chain?");
4604 using namespace llvm::support;
4607 llvm::endianness::little);
4610 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4612 data_type_ref Lookup) {
4614 unsigned KeyLen = 4;
4616 (Lookup.second - Lookup.first);
4621 void EmitKey(raw_ostream &Out, key_type HashValue,
unsigned) {
4622 using namespace llvm::support;
4624 endian::Writer
LE(Out, llvm::endianness::little);
4628 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4630 using namespace llvm::support;
4632 endian::Writer
LE(Out, llvm::endianness::little);
4635 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I) {
4636 LE.write<
DeclID>(Specs[I].getRawValue());
4638 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4642unsigned CalculateODRHashForSpecs(
const Decl *Spec) {
4643 ArrayRef<TemplateArgument> Args;
4644 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Spec))
4645 Args = CTSD->getTemplateArgs().asArray();
4646 else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Spec))
4647 Args = VTSD->getTemplateArgs().asArray();
4648 else if (
auto *FD = dyn_cast<FunctionDecl>(Spec))
4649 Args = FD->getTemplateSpecializationArgs()->asArray();
4651 llvm_unreachable(
"New Specialization Kind?");
4657void ASTWriter::GenerateSpecializationInfoLookupTable(
4658 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4659 llvm::SmallVectorImpl<char> &LookupTable,
bool IsPartial) {
4663 MultiOnDiskHashTableGenerator<reader::LazySpecializationInfoLookupTrait,
4664 LazySpecializationInfoLookupTrait>
4666 LazySpecializationInfoLookupTrait Trait(*
this);
4668 llvm::MapVector<unsigned, llvm::SmallVector<const NamedDecl *, 4>>
4674 auto Iter = SpecializationMaps.find(HashedValue);
4675 if (Iter == SpecializationMaps.end())
4676 Iter = SpecializationMaps
4677 .try_emplace(HashedValue,
4678 llvm::SmallVector<const NamedDecl *, 4>())
4688 for (
auto &[HashValue, Specs] : SpecializationMaps) {
4689 SmallVector<serialization::reader::LazySpecializationInfo, 16>
4699 ExisitingSpecs = Lookups->Table.find(HashValue);
4701 Generator.insert(HashValue, Trait.getData(Specs, ExisitingSpecs), Trait);
4711 auto *ToEmitMaybeMergedLookupTable =
4712 (!isGeneratingReducedBMI() && Lookups) ? &Lookups->
Table :
nullptr;
4713 Generator.emit(LookupTable, Trait, ToEmitMaybeMergedLookupTable);
4716uint64_t ASTWriter::WriteSpecializationInfoLookupTable(
4717 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4720 llvm::SmallString<4096> LookupTable;
4721 GenerateSpecializationInfoLookupTable(D, Specializations, LookupTable,
4724 uint64_t Offset = Stream.GetCurrentBitNo();
4725 RecordData::value_type
Record[] = {
static_cast<RecordData::value_type
>(
4727 Stream.EmitRecordWithBlob(IsPartial ? DeclPartialSpecializationsAbbrev
4728 : DeclSpecializationsAbbrev,
4740 for (
auto *D :
Result.getLookupResult()) {
4742 if (LocalD->isFromASTFile())
4760void ASTWriter::GenerateNameLookupTable(
4761 ASTContext &Context,
const DeclContext *ConstDC,
4762 llvm::SmallVectorImpl<char> &LookupTable,
4763 llvm::SmallVectorImpl<char> &ModuleLocalLookupTable,
4764 llvm::SmallVectorImpl<char> &TULookupTable) {
4765 assert(!ConstDC->hasLazyLocalLexicalLookups() &&
4766 !ConstDC->hasLazyExternalLexicalLookups() &&
4767 "must call buildLookups first");
4770 auto *DC =
const_cast<DeclContext*
>(ConstDC);
4774 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4775 ASTDeclContextNameLookupTrait>
4777 ASTDeclContextNameLookupTrait Trait(*
this, *DC);
4782 SmallVector<DeclarationName, 16> Names;
4786 bool IncludeConstructorNames =
false;
4787 bool IncludeConversionNames =
false;
4814 if (
Result.getLookupResult().empty())
4817 switch (Name.getNameKind()) {
4819 Names.push_back(Name);
4823 IncludeConstructorNames =
true;
4827 IncludeConversionNames =
true;
4835 if (IncludeConstructorNames || IncludeConversionNames) {
4840 llvm::SmallPtrSet<DeclarationName, 8> AddedNames;
4842 if (
auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
4843 auto Name = ChildND->getDeclName();
4844 switch (Name.getNameKind()) {
4849 if (!IncludeConstructorNames)
4854 if (!IncludeConversionNames)
4858 if (AddedNames.insert(Name).second)
4859 Names.push_back(Name);
4867 for (
auto &Name : Names)
4874 SmallVector<NamedDecl *, 8> ConstructorDecls;
4875 SmallVector<NamedDecl *, 8> ConversionDecls;
4879 for (
auto &Name : Names) {
4882 switch (Name.getNameKind()) {
4900 if (!ConstructorDecls.empty())
4901 Generator.insert(ConstructorDecls.front()->getDeclName(),
4902 Trait.getData(ConstructorDecls), Trait);
4903 if (!ConversionDecls.empty())
4904 Generator.insert(ConversionDecls.front()->getDeclName(),
4905 Trait.getData(ConversionDecls), Trait);
4917 auto *ToEmitMaybeMergedLookupTable =
4918 (!isGeneratingReducedBMI() && Lookups) ? &Lookups->
Table :
nullptr;
4919 Generator.emit(LookupTable, Trait, ToEmitMaybeMergedLookupTable);
4921 const auto &ModuleLocalDecls = Trait.getModuleLocalDecls();
4922 if (!ModuleLocalDecls.empty()) {
4923 MultiOnDiskHashTableGenerator<reader::ModuleLocalNameLookupTrait,
4924 ModuleLevelNameLookupTrait>
4925 ModuleLocalLookupGenerator;
4926 ModuleLevelNameLookupTrait ModuleLocalTrait(*
this);
4928 for (
const auto &ModuleLocalIter : ModuleLocalDecls) {
4929 const auto &Key = ModuleLocalIter.first;
4930 const auto &IDs = ModuleLocalIter.second;
4931 ModuleLocalLookupGenerator.insert(Key, ModuleLocalTrait.getData(IDs),
4937 auto *ModuleLocalLookups =
4938 (isGeneratingReducedBMI() && Chain &&
4942 ModuleLocalLookupGenerator.emit(ModuleLocalLookupTable, ModuleLocalTrait,
4943 ModuleLocalLookups);
4946 const auto &TULocalDecls = Trait.getTULocalDecls();
4947 if (!TULocalDecls.empty() && !isGeneratingReducedBMI()) {
4948 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4949 ASTDeclContextNameTrivialLookupTrait>
4951 ASTDeclContextNameTrivialLookupTrait TULocalTrait(*
this);
4953 for (
const auto &TULocalIter : TULocalDecls) {
4954 const auto &Key = TULocalIter.first;
4955 const auto &IDs = TULocalIter.second;
4956 TULookupGenerator.insert(Key, TULocalTrait.getData(IDs), TULocalTrait);
4961 auto *TULocalLookups =
4965 TULookupGenerator.emit(TULookupTable, TULocalTrait, TULocalLookups);
4974void ASTWriter::WriteDeclContextVisibleBlock(
4975 ASTContext &Context, DeclContext *DC, VisibleLookupBlockOffsets &Offsets) {
4985 Prev = Prev->getPreviousDecl())
4986 if (!Prev->isFromASTFile())
4996 SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16>
4999 LookupResults.reserve(Map->size());
5000 for (
auto &Entry : *Map)
5001 LookupResults.push_back(
5002 std::make_pair(Entry.first, Entry.second.getLookupResult()));
5005 llvm::sort(LookupResults, llvm::less_first());
5006 for (
auto &NameAndResult : LookupResults) {
5007 DeclarationName Name = NameAndResult.first;
5014 assert(
Result.empty() &&
"Cannot have a constructor or conversion "
5015 "function name in a namespace!");
5019 for (NamedDecl *ND :
Result) {
5023 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(ND))
5057 if (!Map || Map->empty())
5062 SmallString<4096> LookupTable;
5063 SmallString<4096> ModuleLocalLookupTable;
5064 SmallString<4096> TULookupTable;
5065 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
5070 Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev,
Record,
5072 ++NumVisibleDeclContexts;
5074 if (!ModuleLocalLookupTable.empty()) {
5078 RecordData::value_type ModuleLocalRecord[] = {
5080 Stream.EmitRecordWithBlob(DeclModuleLocalVisibleLookupAbbrev,
5081 ModuleLocalRecord, ModuleLocalLookupTable);
5082 ++NumModuleLocalDeclContexts;
5085 if (!TULookupTable.empty()) {
5088 RecordData::value_type TULocalDeclsRecord[] = {
5090 Stream.EmitRecordWithBlob(DeclTULocalLookupAbbrev, TULocalDeclsRecord,
5092 ++NumTULocalDeclContexts;
5102void ASTWriter::WriteDeclContextVisibleUpdate(ASTContext &Context,
5103 const DeclContext *DC) {
5105 if (!Map || Map->empty())
5109 SmallString<4096> LookupTable;
5110 SmallString<4096> ModuleLocalLookupTable;
5111 SmallString<4096> TULookupTable;
5112 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
5123 Stream.EmitRecordWithBlob(UpdateVisibleAbbrev,
Record, LookupTable);
5125 if (!ModuleLocalLookupTable.empty()) {
5127 RecordData::value_type ModuleLocalRecord[] = {
5129 Stream.EmitRecordWithBlob(ModuleLocalUpdateVisibleAbbrev, ModuleLocalRecord,
5130 ModuleLocalLookupTable);
5133 if (!TULookupTable.empty()) {
5134 RecordData::value_type GMFRecord[] = {
5136 Stream.EmitRecordWithBlob(TULocalUpdateVisibleAbbrev, GMFRecord,
5142void ASTWriter::WriteFPPragmaOptions(
const FPOptionsOverride &Opts) {
5148void ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) {
5154 for (
const auto &I:Opts.OptMap) {
5155 AddString(I.getKey(),
Record);
5156 auto V = I.getValue();
5157 Record.push_back(
V.Supported ? 1 : 0);
5158 Record.push_back(
V.Enabled ? 1 : 0);
5159 Record.push_back(
V.WithPragma ? 1 : 0);
5166void ASTWriter::WriteCUDAPragmas(Sema &SemaRef) {
5167 if (SemaRef.
CUDA().ForceHostDeviceDepth > 0) {
5168 RecordData::value_type
Record[] = {SemaRef.
CUDA().ForceHostDeviceDepth};
5173void ASTWriter::WriteObjCCategories() {
5174 if (ObjCClassesWithCategories.empty())
5177 SmallVector<ObjCCategoriesInfo, 2> CategoriesMap;
5178 RecordData Categories;
5180 for (
unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {
5182 unsigned StartIndex = Categories.size();
5184 ObjCInterfaceDecl *
Class = ObjCClassesWithCategories[I];
5187 Categories.push_back(0);
5191 Cat =
Class->known_categories_begin(),
5192 CatEnd =
Class->known_categories_end();
5193 Cat != CatEnd; ++Cat, ++Size) {
5194 assert(getDeclID(*Cat).isValid() &&
"Bogus category");
5195 AddDeclRef(*Cat, Categories);
5199 Categories[StartIndex] =
Size;
5202 ObjCCategoriesInfo CatInfo = { getDeclID(
Class), StartIndex };
5203 CategoriesMap.push_back(CatInfo);
5208 llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());
5211 using namespace llvm;
5213 auto Abbrev = std::make_shared<BitCodeAbbrev>();
5215 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
5216 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
5217 unsigned AbbrevID = Stream.EmitAbbrev(std::move(Abbrev));
5220 Stream.EmitRecordWithBlob(AbbrevID,
Record,
5221 reinterpret_cast<char *
>(CategoriesMap.data()),
5222 CategoriesMap.size() *
sizeof(ObjCCategoriesInfo));
5228void ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) {
5235 for (
auto &LPTMapEntry : LPTMap) {
5236 const FunctionDecl *FD = LPTMapEntry.first;
5237 LateParsedTemplate &LPT = *LPTMapEntry.second;
5243 for (
const auto &
Tok : LPT.
Toks) {
5251void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) {
5254 AddSourceLocation(PragmaLoc,
Record);
5259void ASTWriter::WriteMSStructPragmaOptions(Sema &SemaRef) {
5267void ASTWriter::WriteMSPointersToMembersPragmaOptions(Sema &SemaRef) {
5275void ASTWriter::WritePackPragmaOptions(Sema &SemaRef) {
5286 AddAlignPackInfo(StackEntry.Value,
Record);
5287 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5288 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5289 AddString(StackEntry.StackSlotLabel,
Record);
5295void ASTWriter::WriteFloatControlPragmaOptions(Sema &SemaRef) {
5305 for (
const auto &StackEntry : SemaRef.
FpPragmaStack.Stack) {
5306 Record.push_back(StackEntry.Value.getAsOpaqueInt());
5307 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5308 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5309 AddString(StackEntry.StackSlotLabel,
Record);
5315void ASTWriter::WriteDeclsWithEffectsToVerify(Sema &SemaRef) {
5326void ASTWriter::WriteOpenMPRequiresDecls(Sema &SemaRef) {
5331 for (
const OMPRequiresDecl *D : Decls)
5338void ASTWriter::WriteModuleFileExtension(Sema &SemaRef,
5339 ModuleFileExtensionWriter &Writer) {
5344 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
5346 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5347 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5348 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5349 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5350 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
5351 unsigned Abbrev = Stream.EmitAbbrev(std::move(Abv));
5357 Record.push_back(Metadata.MajorVersion);
5358 Record.push_back(Metadata.MinorVersion);
5359 Record.push_back(Metadata.BlockName.size());
5360 Record.push_back(Metadata.UserInfo.size());
5361 SmallString<64> Buffer;
5362 Buffer += Metadata.BlockName;
5363 Buffer += Metadata.UserInfo;
5364 Stream.EmitRecordWithBlob(Abbrev,
Record, Buffer);
5373void ASTWriter::WriteRISCVIntrinsicPragmas(Sema &SemaRef) {
5388 auto &Record = *
this;
5394 Writer->isWritingStdCXXHeaderUnit())))
5395 return Record.push_back(0);
5397 Record.push_back(A->
getKind() + 1);
5401 Record.AddSourceRange(A->
getRange());
5405 Record.push_back(A->getAttributeSpellingListIndexRaw());
5408#include "clang/Serialization/AttrPCHWrite.inc"
5414 for (
const auto *A : Attrs)
5425 if (
Tok.isAnnotation()) {
5427 switch (
Tok.getKind()) {
5428 case tok::annot_pragma_loop_hint: {
5432 Record.push_back(Info->Toks.size());
5433 for (
const auto &
T : Info->Toks)
5437 case tok::annot_pragma_pack: {
5440 Record.push_back(
static_cast<unsigned>(Info->Action));
5446 case tok::annot_pragma_openmp:
5447 case tok::annot_pragma_openmp_end:
5448 case tok::annot_pragma_unused:
5449 case tok::annot_pragma_openacc:
5450 case tok::annot_pragma_openacc_end:
5453 llvm_unreachable(
"missing serialization code for annotation token");
5464 Record.push_back(Str.size());
5465 llvm::append_range(
Record, Str);
5470 Record.push_back(Str.size());
5471 llvm::append_range(Blob, Str);
5475 assert(WritingAST &&
"can't prepare path for output when not writing AST");
5478 StringRef PathStr(Path.data(), Path.size());
5479 if (PathStr ==
"<built-in>" || PathStr ==
"<command line>")
5483 PP->getFileManager().makeAbsolutePath(Path,
true);
5507 Stream.EmitRecordWithBlob(Abbrev,
Record, FilePath);
5512 Record.push_back(Version.getMajor());
5513 if (std::optional<unsigned> Minor = Version.getMinor())
5514 Record.push_back(*Minor + 1);
5517 if (std::optional<unsigned> Subminor = Version.getSubminor())
5518 Record.push_back(*Subminor + 1);
5536 assert(ID < IdentifierOffsets.size());
5537 IdentifierOffsets[ID] = Offset;
5543 unsigned ID = SelectorIDs[Sel];
5544 assert(ID &&
"Unknown selector");
5547 if (ID < FirstSelectorID)
5549 SelectorOffsets[ID - FirstSelectorID] = Offset;
5555 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
5556 bool IncludeTimestamps,
bool BuildingImplicitModule,
5557 bool GeneratingReducedBMI)
5558 : Stream(Stream), Buffer(Buffer), ModCache(ModCache),
5559 CodeGenOpts(CodeGenOpts), IncludeTimestamps(IncludeTimestamps),
5560 BuildingImplicitModule(BuildingImplicitModule),
5561 GeneratingReducedBMI(GeneratingReducedBMI) {
5562 for (
const auto &Ext : Extensions) {
5563 if (
auto Writer = Ext->createExtensionWriter(*
this))
5564 ModuleFileExtensionWriters.push_back(std::move(Writer));
5571 assert(WritingAST &&
"can't determine lang opts when not writing AST");
5572 return PP->getLangOpts();
5576 return IncludeTimestamps ? ModTime : 0;
5581 StringRef OutputFile,
Module *WritingModule,
5582 StringRef isysroot) {
5583 llvm::TimeTraceScope scope(
"WriteAST", OutputFile);
5586 Sema *SemaPtr = dyn_cast<Sema *>(Subject);
5593 Stream.Emit((
unsigned)
'C', 8);
5594 Stream.Emit((
unsigned)
'P', 8);
5595 Stream.Emit((
unsigned)
'C', 8);
5596 Stream.Emit((
unsigned)
'H', 8);
5598 WriteBlockInfoBlock();
5601 this->WritingModule = WritingModule;
5602 ASTFileSignature Signature = WriteASTCore(SemaPtr, isysroot, WritingModule);
5604 this->WritingModule =
nullptr;
5605 this->BaseDirectory.clear();
5612template<
typename Vector>
5614 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5620template <
typename Vector>
5623 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5629void ASTWriter::computeNonAffectingInputFiles() {
5630 SourceManager &SrcMgr = PP->getSourceManager();
5633 IsSLocAffecting.resize(N,
true);
5634 IsSLocFileEntryAffecting.resize(N,
true);
5639 auto AffectingModuleMaps = GetAffectingModuleMaps(*PP, WritingModule);
5641 unsigned FileIDAdjustment = 0;
5642 unsigned OffsetAdjustment = 0;
5644 NonAffectingFileIDAdjustments.reserve(N);
5645 NonAffectingOffsetAdjustments.reserve(N);
5647 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5648 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5650 for (
unsigned I = 1; I != N; ++I) {
5652 FileID FID = FileID::get(I);
5659 if (!
Cache->OrigEntry)
5667 if (!AffectingModuleMaps)
5671 if (AffectingModuleMaps->DefinitionFileIDs.contains(FID))
5674 IsSLocAffecting[I] =
false;
5675 IsSLocFileEntryAffecting[I] =
5676 AffectingModuleMaps->DefinitionFiles.contains(*
Cache->OrigEntry);
5678 FileIDAdjustment += 1;
5684 if (!NonAffectingFileIDs.empty() &&
5685 NonAffectingFileIDs.back().ID == FID.ID - 1) {
5686 NonAffectingFileIDs.back() = FID;
5688 NonAffectingFileIDAdjustments.back() = FileIDAdjustment;
5689 NonAffectingOffsetAdjustments.back() = OffsetAdjustment;
5693 NonAffectingFileIDs.push_back(FID);
5696 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5697 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5700 if (!PP->getHeaderSearchInfo().getHeaderSearchOpts().ModulesIncludeVFSUsage)
5703 FileManager &FileMgr = PP->getFileManager();
5706 for (StringRef Path :
5707 PP->getHeaderSearchInfo().getHeaderSearchOpts().VFSOverlayFiles)
5709 for (
unsigned I = 1; I != N; ++I) {
5710 if (IsSLocAffecting[I]) {
5716 if (!
Cache->OrigEntry)
5719 Cache->OrigEntry->getNameAsRequested());
5725void ASTWriter::prepareLazyUpdates() {
5728 if (!GeneratingReducedBMI)
5731 DeclUpdateMap DeclUpdatesTmp;
5739 for (
auto &DeclUpdate : DeclUpdates) {
5740 const Decl *D = DeclUpdate.first;
5742 for (
auto &
Update : DeclUpdate.second) {
5745 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
5746 DeclUpdatesTmp[D].push_back(
5747 ASTWriter::DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
5749 DeclUpdatesLazy[D].push_back(
Update);
5752 DeclUpdates.swap(DeclUpdatesTmp);
5754 UpdatedDeclContextsLazy.swap(UpdatedDeclContexts);
5756 DeclsToEmitEvenIfUnreferenced.clear();
5759void ASTWriter::PrepareWritingSpecialDecls(
Sema &SemaRef) {
5760 ASTContext &Context = SemaRef.
Context;
5762 bool isModule = WritingModule !=
nullptr;
5764 prepareLazyUpdates();
5771 PredefinedDecls.insert(D);
5779 RegisterPredefDecl(Context.ObjCProtocolClassDecl,
5783 RegisterPredefDecl(Context.ObjCInstanceTypeDecl,
5787 RegisterPredefDecl(Context.BuiltinMSVaListDecl,
5789 RegisterPredefDecl(Context.BuiltinZOSVaListDecl,
5796 RegisterPredefDecl(Context.CFConstantStringTypeDecl,
5798 RegisterPredefDecl(Context.CFConstantStringTagDecl,
5800#define BuiltinTemplate(BTName) \
5801 RegisterPredefDecl(Context.Decl##BTName, PREDEF_DECL##BTName##_ID);
5802#include "clang/Basic/BuiltinTemplates.inc"
5814 if (GeneratingReducedBMI) {
5840 if (GeneratingReducedBMI)
5862 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I)
5867 SmallVector<const TypedefNameDecl *, 4> UnusedLocalTypedefs;
5869 for (
const TypedefNameDecl *TD : UnusedLocalTypedefs)
5876 "There are local ones at end of translation unit!");
5894 for (
const auto &I : SemaRef.KnownNamespaces)
5899 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
5907 for (
const auto &DeleteExprsInfo :
5914 for (
const auto *I : DeclsToEmitEvenIfUnreferenced)
5916 DeclsToEmitEvenIfUnreferenced.clear();
5921 llvm::SmallVector<const IdentifierInfo*, 256> IIs;
5923 const IdentifierInfo *II =
ID.second;
5929 llvm::sort(IIs, llvm::deref<std::less<>>());
5931 for (
const IdentifierInfo *II : IIs)
5942 for (CXXRecordDecl *RD : PendingEmittingVTables)
5945 PendingEmittingVTables.clear();
5948void ASTWriter::WriteSpecialDeclRecords(
Sema &SemaRef) {
5949 ASTContext &Context = SemaRef.
Context;
5951 bool isModule = WritingModule !=
nullptr;
5954 if (!EagerlyDeserializedDecls.empty())
5957 if (!ModularCodegenDecls.empty())
5963 TentativeDefinitions);
5964 if (!TentativeDefinitions.empty())
5971 UnusedFileScopedDecls);
5972 if (!UnusedFileScopedDecls.empty())
5978 if (!ExtVectorDecls.empty())
5984 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I) {
5985 CXXRecordDecl *D = SemaRef.
VTableUses[I].first;
5999 SmallVector<const TypedefNameDecl *, 4> SortedCandidates;
6001 for (
const TypedefNameDecl *TD : SortedCandidates)
6003 if (!UnusedLocalTypedefNameCandidates.empty())
6005 UnusedLocalTypedefNameCandidates);
6007 if (!GeneratingReducedBMI) {
6017 if (!PendingInstantiations.empty())
6021 auto AddEmittedDeclRefOrZero = [
this](
RecordData &Refs,
Decl *D) {
6035 if (!SemaDeclRefs.empty())
6043 if (!DeclsToCheckForDeferredDiags.empty())
6045 DeclsToCheckForDeferredDiags);
6052 CudaCallDecl || CudaGetParamDecl || CudaLaunchDecl) {
6053 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaCallDecl);
6054 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaGetParamDecl);
6055 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaLaunchDecl);
6063 DelegatingCtorDecls);
6064 if (!DelegatingCtorDecls.empty())
6069 for (
const auto &I : SemaRef.KnownNamespaces) {
6073 if (!KnownNamespaces.empty())
6078 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
6087 if (!UndefinedButUsed.empty())
6094 for (
const auto &DeleteExprsInfo :
6099 AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze);
6100 DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());
6101 for (
const auto &DeleteLoc : DeleteExprsInfo.second) {
6103 DeleteExprsToAnalyze.push_back(DeleteLoc.second);
6107 if (!DeleteExprsToAnalyze.empty())
6111 for (CXXRecordDecl *RD : PendingEmittingVTables) {
6118 if (!VTablesToEmit.empty())
6124 using namespace llvm;
6126 bool isModule = WritingModule !=
nullptr;
6130 Chain->finalizeForWriting();
6134 computeNonAffectingInputFiles();
6136 writeUnhashedControlBlock(*PP);
6149 IdentifierIDs.clear();
6160 SmallVector<const IdentifierInfo *, 128> IIs;
6161 for (
const auto &ID : PP->getIdentifierTable())
6162 if (IsInterestingNonMacroIdentifier(
ID.second, *
this))
6163 IIs.push_back(
ID.second);
6166 llvm::sort(IIs, llvm::deref<std::less<>>());
6167 for (
const IdentifierInfo *II : IIs)
6175 for (
const auto &WeakUndeclaredIdentifierList :
6177 const IdentifierInfo *
const II = WeakUndeclaredIdentifierList.first;
6178 for (
const auto &WI : WeakUndeclaredIdentifierList.second) {
6191 ASTContext &Context = SemaPtr->
Context;
6193 Context, *
this, ExtnameUndeclaredIdentifiers);
6195 ExtnameUndeclaredIdentifiersWriter.AddIdentifierRef(II);
6196 ExtnameUndeclaredIdentifiersWriter.AddIdentifierRef(
6198 ExtnameUndeclaredIdentifiersWriter.AddSourceLocation(AL->getLocation());
6205 ASTContext &Context = SemaPtr->
Context;
6210 AddTypeRef(Context, Context.ObjCIdRedefinitionType, SpecialTypes);
6211 AddTypeRef(Context, Context.ObjCClassRedefinitionType, SpecialTypes);
6212 AddTypeRef(Context, Context.ObjCSelRedefinitionType, SpecialTypes);
6217 PrepareWritingSpecialDecls(*SemaPtr);
6220 WriteControlBlock(*PP, isysroot);
6223 Stream.FlushToWord();
6224 ASTBlockRange.first = Stream.GetCurrentBitNo() >> 3;
6226 ASTBlockStartOffset = Stream.GetCurrentBitNo();
6243 llvm::SmallVector<Selector, 256> AllSelectors;
6244 for (
auto &SelectorAndID : SelectorIDs)
6245 AllSelectors.push_back(SelectorAndID.first);
6246 for (
auto &Selector : AllSelectors)
6270 auto Abbrev = std::make_shared<BitCodeAbbrev>();
6272 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
6273 unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
6274 SmallString<2048> Buffer;
6276 llvm::raw_svector_ostream
Out(Buffer);
6277 for (ModuleFile &M : Chain->ModuleMgr) {
6278 using namespace llvm::support;
6280 endian::Writer
LE(Out, llvm::endianness::little);
6288 Out.write(Name.data(), Name.size());
6294 auto writeBaseIDOrNone = [&](
auto BaseID,
bool ShouldWrite) {
6295 assert(BaseID < std::numeric_limits<uint32_t>::max() &&
"base id too high");
6309 Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev,
Record,
6310 Buffer.data(), Buffer.size());
6314 WriteDeclAndTypes(SemaPtr->
Context);
6316 WriteFileDeclIDsMap();
6317 WriteSourceManagerBlock(PP->getSourceManager());
6319 WriteComments(SemaPtr->
Context);
6320 WritePreprocessor(*PP, isModule);
6321 WriteHeaderSearch(PP->getHeaderSearchInfo());
6323 WriteSelectors(*SemaPtr);
6324 WriteReferencedSelectorsPool(*SemaPtr);
6325 WriteLateParsedTemplates(*SemaPtr);
6327 WriteIdentifierTable(*PP, SemaPtr ? &SemaPtr->
IdResolver :
nullptr, isModule);
6330 WriteOpenCLExtensions(*SemaPtr);
6331 WriteCUDAPragmas(*SemaPtr);
6332 WriteRISCVIntrinsicPragmas(*SemaPtr);
6337 WriteSubmodules(WritingModule, SemaPtr ? &SemaPtr->
Context :
nullptr);
6342 WriteSpecialDeclRecords(*SemaPtr);
6345 if (!WeakUndeclaredIdentifiers.empty())
6347 WeakUndeclaredIdentifiers);
6351 if (!ExtnameUndeclaredIdentifiers.empty())
6353 ExtnameUndeclaredIdentifiers);
6355 if (!WritingModule) {
6360 ModuleInfo(uint64_t ID,
Module *M) :
ID(
ID), M(M) {}
6362 llvm::SmallVector<ModuleInfo, 64> Imports;
6365 assert(SubmoduleIDs.contains(I->getImportedModule()));
6366 Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()],
6367 I->getImportedModule()));
6371 if (!Imports.empty()) {
6372 auto Cmp = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6375 auto Eq = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6376 return A.ID == B.ID;
6380 llvm::sort(Imports,
Cmp);
6381 Imports.erase(llvm::unique(Imports, Eq), Imports.end());
6384 for (
const auto &Import : Imports) {
6385 ImportedModules.push_back(
Import.ID);
6396 WriteObjCCategories();
6398 if (!WritingModule) {
6399 WriteOptimizePragmaOptions(*SemaPtr);
6400 WriteMSStructPragmaOptions(*SemaPtr);
6401 WriteMSPointersToMembersPragmaOptions(*SemaPtr);
6403 WritePackPragmaOptions(*SemaPtr);
6404 WriteFloatControlPragmaOptions(*SemaPtr);
6405 WriteDeclsWithEffectsToVerify(*SemaPtr);
6406 WriteOpenMPRequiresDecls(*SemaPtr);
6410 RecordData::value_type
Record[] = {NumStatements,
6412 NumLexicalDeclContexts,
6413 NumVisibleDeclContexts,
6414 NumModuleLocalDeclContexts,
6415 NumTULocalDeclContexts};
6418 Stream.FlushToWord();
6419 ASTBlockRange.second = Stream.GetCurrentBitNo() >> 3;
6423 for (
const auto &ExtWriter : ModuleFileExtensionWriters)
6424 WriteModuleFileExtension(*SemaPtr, *ExtWriter);
6426 return backpatchSignature();
6432void ASTWriter::AddedManglingNumber(
const Decl *D,
unsigned Number) {
6436 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::ManglingNumber, Number));
6438void ASTWriter::AddedStaticLocalNumbers(
const Decl *D,
unsigned Number) {
6442 DeclUpdates[D].push_back(
6443 DeclUpdate(DeclUpdateKind::StaticLocalNumber, Number));
6452 ASTWriter::UpdateRecord &
Record = DeclUpdates[TU];
6455 DeclUpdate(DeclUpdateKind::CXXAddedAnonymousNamespace, NS));
6459void ASTWriter::WriteDeclAndTypes(
ASTContext &Context) {
6464 DeclTypesBlockStartOffset = Stream.GetCurrentBitNo();
6468 WriteDeclUpdatesBlocks(Context, DeclUpdatesOffsetsRecord);
6469 while (!DeclTypesToEmit.empty()) {
6470 DeclOrType DOT = DeclTypesToEmit.front();
6471 DeclTypesToEmit.pop();
6473 WriteType(Context, DOT.getType());
6475 WriteDecl(Context, DOT.getDecl());
6477 }
while (!DeclUpdates.empty());
6479 DoneWritingDeclsAndTypes =
true;
6483 assert(DelayedNamespace.empty() || GeneratingReducedBMI);
6485 for (NamespaceDecl *NS : DelayedNamespace) {
6486 LookupBlockOffsets Offsets;
6488 Offsets.
LexicalOffset = WriteDeclContextLexicalBlock(Context, NS);
6489 WriteDeclContextVisibleBlock(Context, NS, Offsets);
6510 assert(DeclTypesToEmit.empty());
6511 assert(DeclUpdates.empty());
6516 WriteTypeDeclOffsets();
6517 if (!DeclUpdatesOffsetsRecord.empty())
6520 if (!DelayedNamespaceRecord.empty())
6522 DelayedNamespaceRecord);
6524 if (!RelatedDeclsMap.empty()) {
6528 for (
const auto &Pair : RelatedDeclsMap) {
6529 RelatedDeclsMapRecord.push_back(Pair.first.getRawValue());
6530 RelatedDeclsMapRecord.push_back(Pair.second.size());
6531 for (
const auto &Lambda : Pair.second)
6532 RelatedDeclsMapRecord.push_back(Lambda.getRawValue());
6535 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6537 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array));
6538 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6539 unsigned FunctionToLambdaMapAbbrev = Stream.EmitAbbrev(std::move(Abv));
6541 FunctionToLambdaMapAbbrev);
6544 if (!SpecializationsUpdates.empty()) {
6545 WriteSpecializationsUpdates(
false);
6546 SpecializationsUpdates.clear();
6549 if (!PartialSpecializationsUpdates.empty()) {
6550 WriteSpecializationsUpdates(
true);
6551 PartialSpecializationsUpdates.clear();
6557 SmallVector<DeclID, 128> NewGlobalKindDeclPairs;
6566 NewGlobalKindDeclPairs.push_back(D->
getKind());
6567 NewGlobalKindDeclPairs.push_back(
GetDeclRef(D).getRawValue());
6570 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6572 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6573 unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));
6576 Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev,
Record,
6577 bytes(NewGlobalKindDeclPairs));
6579 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6581 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6582 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6583 UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6585 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6587 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6588 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6589 ModuleLocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6591 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6593 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6594 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6595 TULocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6598 WriteDeclContextVisibleUpdate(Context, TU);
6601 if (Context.ExternCContext)
6602 WriteDeclContextVisibleUpdate(Context, Context.ExternCContext);
6605 for (
auto *DC : UpdatedDeclContexts)
6606 WriteDeclContextVisibleUpdate(Context, DC);
6609void ASTWriter::WriteSpecializationsUpdates(
bool IsPartial) {
6613 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6614 Abv->Add(llvm::BitCodeAbbrevOp(RecordType));
6615 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6616 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6617 auto UpdateSpecializationAbbrev = Stream.EmitAbbrev(std::move(Abv));
6620 IsPartial ? PartialSpecializationsUpdates : SpecializationsUpdates;
6621 for (
auto &SpecializationUpdate : SpecUpdates) {
6622 const NamedDecl *D = SpecializationUpdate.first;
6624 llvm::SmallString<4096> LookupTable;
6625 GenerateSpecializationInfoLookupTable(D, SpecializationUpdate.second,
6626 LookupTable, IsPartial);
6629 RecordData::value_type
Record[] = {
6630 static_cast<RecordData::value_type
>(RecordType),
6632 Stream.EmitRecordWithBlob(UpdateSpecializationAbbrev,
Record, LookupTable);
6636void ASTWriter::WriteDeclUpdatesBlocks(
ASTContext &Context,
6637 RecordDataImpl &OffsetsRecord) {
6638 if (DeclUpdates.empty())
6641 DeclUpdateMap LocalUpdates;
6642 LocalUpdates.swap(DeclUpdates);
6644 for (
auto &DeclUpdate : LocalUpdates) {
6645 const Decl *D = DeclUpdate.first;
6647 bool HasUpdatedBody =
false;
6648 bool HasAddedVarDefinition =
false;
6651 for (
auto &
Update : DeclUpdate.second) {
6656 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
6657 HasUpdatedBody =
true;
6658 else if (Kind == DeclUpdateKind::CXXAddedVarDefinition)
6659 HasAddedVarDefinition =
true;
6661 Record.push_back(llvm::to_underlying(Kind));
6664 case DeclUpdateKind::CXXAddedImplicitMember:
6665 case DeclUpdateKind::CXXAddedAnonymousNamespace:
6666 assert(
Update.getDecl() &&
"no decl to add?");
6669 case DeclUpdateKind::CXXAddedFunctionDefinition:
6670 case DeclUpdateKind::CXXAddedVarDefinition:
6673 case DeclUpdateKind::CXXPointOfInstantiation:
6678 case DeclUpdateKind::CXXInstantiatedDefaultArgument:
6683 case DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer:
6688 case DeclUpdateKind::CXXInstantiatedClassDefinition: {
6690 UpdatedDeclContexts.insert(RD->getPrimaryContext());
6691 Record.push_back(RD->isParamDestroyedInCallee());
6692 Record.push_back(llvm::to_underlying(RD->getArgPassingRestrictions()));
6693 Record.AddCXXDefinitionData(RD);
6694 Record.AddOffset(WriteDeclContextLexicalBlock(Context, RD));
6699 if (
auto *MSInfo = RD->getMemberSpecializationInfo()) {
6700 Record.push_back(MSInfo->getTemplateSpecializationKind());
6701 Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
6704 Record.push_back(Spec->getTemplateSpecializationKind());
6705 Record.AddSourceLocation(Spec->getPointOfInstantiation());
6709 auto From = Spec->getInstantiatedFrom();
6710 if (
auto PartialSpec =
6711 dyn_cast<ClassTemplatePartialSpecializationDecl *>(From)) {
6713 Record.AddDeclRef(PartialSpec);
6714 Record.AddTemplateArgumentList(
6715 &Spec->getTemplateInstantiationArgs());
6720 Record.push_back(llvm::to_underlying(RD->getTagKind()));
6721 Record.AddSourceLocation(RD->getLocation());
6722 Record.AddSourceLocation(RD->getBeginLoc());
6723 Record.AddSourceRange(RD->getBraceRange());
6734 case DeclUpdateKind::CXXResolvedDtorDelete:
6739 case DeclUpdateKind::CXXResolvedDtorGlobDelete:
6743 case DeclUpdateKind::CXXResolvedDtorArrayDelete:
6747 case DeclUpdateKind::CXXResolvedDtorGlobArrayDelete:
6751 case DeclUpdateKind::CXXResolvedExceptionSpec: {
6754 Record.writeExceptionSpecInfo(prototype->getExceptionSpecInfo());
6758 case DeclUpdateKind::CXXDeducedReturnType:
6762 case DeclUpdateKind::DeclMarkedUsed:
6765 case DeclUpdateKind::ManglingNumber:
6766 case DeclUpdateKind::StaticLocalNumber:
6770 case DeclUpdateKind::DeclMarkedOpenMPThreadPrivate:
6772 D->
getAttr<OMPThreadPrivateDeclAttr>()->getRange());
6775 case DeclUpdateKind::DeclMarkedOpenMPAllocate: {
6776 auto *A = D->
getAttr<OMPAllocateDeclAttr>();
6777 Record.push_back(A->getAllocatorType());
6778 Record.AddStmt(A->getAllocator());
6779 Record.AddStmt(A->getAlignment());
6780 Record.AddSourceRange(A->getRange());
6784 case DeclUpdateKind::DeclMarkedOpenMPIndirectCall:
6786 D->
getAttr<OMPTargetIndirectCallAttr>()->getRange());
6789 case DeclUpdateKind::DeclMarkedOpenMPDeclareTarget:
6790 Record.push_back(D->
getAttr<OMPDeclareTargetDeclAttr>()->getMapType());
6792 D->
getAttr<OMPDeclareTargetDeclAttr>()->getRange());
6795 case DeclUpdateKind::DeclExported:
6799 case DeclUpdateKind::AddedAttrToRecord:
6800 Record.AddAttributes(llvm::ArrayRef(
Update.getAttr()));
6808 if (HasUpdatedBody) {
6811 llvm::to_underlying(DeclUpdateKind::CXXAddedFunctionDefinition));
6812 Record.push_back(Def->isInlined());
6813 Record.AddSourceLocation(Def->getInnerLocStart());
6814 Record.AddFunctionDefinition(Def);
6815 }
else if (HasAddedVarDefinition) {
6818 llvm::to_underlying(DeclUpdateKind::CXXAddedVarDefinition));
6819 Record.push_back(VD->isInline());
6820 Record.push_back(VD->isInlineSpecified());
6821 Record.AddVarDeclInit(VD);
6838 NonAffectingFileIDs.empty())
6840 auto It = llvm::lower_bound(NonAffectingFileIDs, FID);
6841 unsigned Idx = std::distance(NonAffectingFileIDs.begin(), It);
6842 unsigned Offset = NonAffectingFileIDAdjustments[Idx];
6846unsigned ASTWriter::getAdjustedNumCreatedFIDs(
FileID FID)
const {
6852 unsigned AdjustedNumCreatedFIDs = 0;
6853 for (
unsigned I = FID.ID, N = I + NumCreatedFIDs; I != N; ++I)
6854 if (IsSLocAffecting[I])
6855 ++AdjustedNumCreatedFIDs;
6856 return AdjustedNumCreatedFIDs;
6866 return SourceRange(getAdjustedLocation(
Range.getBegin()),
6867 getAdjustedLocation(
Range.getEnd()));
6872 return Offset - getAdjustment(Offset);
6877 if (NonAffectingRanges.empty())
6880 if (PP->getSourceManager().isLoadedOffset(Offset))
6883 if (Offset > NonAffectingRanges.back().getEnd().getOffset())
6884 return NonAffectingOffsetAdjustments.back();
6886 if (Offset < NonAffectingRanges.front().getBegin().getOffset())
6890 return Range.getEnd().getOffset() < Offset;
6893 auto It = llvm::lower_bound(NonAffectingRanges, Offset, Contains);
6894 unsigned Idx = std::distance(NonAffectingRanges.begin(), It);
6895 return NonAffectingOffsetAdjustments[Idx];
6899 Record.push_back(getAdjustedFileID(FID).getOpaqueValue());
6905 unsigned ModuleFileIndex = 0;
6908 if (PP->getSourceManager().isLoadedSourceLocation(Loc) && Loc.
isValid()) {
6911 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6912 assert(SLocMapI !=
getChain()->GlobalSLocOffsetMap.end() &&
6913 "Corrupted global sloc offset map");
6918 ModuleFileIndex = F->
Index + 1;
6928 return getAdjustedOffset(SLoc.
getOffset()) - 2;
6935 Record.push_back(Offset);
6953 Loc = getAdjustedLocation(Loc);
6998 MacroInfoToEmitData Info = { Name, MI, ID };
6999 MacroInfosToEmit.push_back(Info);
7005 return IdentMacroDirectivesOffsetMap.lookup(Name);
7009 Record->push_back(Writer->getSelectorRef(SelRef));
7018 if (SID == 0 && Chain) {
7021 Chain->LoadSelector(Sel);
7022 SID = SelectorIDs[Sel];
7025 SID = NextSelectorID++;
7026 SelectorIDs[Sel] = SID;
7068 bool InfoHasSameExpr
7070 Record->push_back(InfoHasSameExpr);
7071 if (InfoHasSameExpr)
7088 TypeLocWriter TLW(*
this);
7098template <
typename IdxForTypeTy>
7100 IdxForTypeTy IdxForType) {
7104 unsigned FastQuals =
T.getLocalFastQualifiers();
7105 T.removeLocalFastQualifiers();
7107 if (
T.hasLocalNonFastQualifiers())
7108 return IdxForType(
T).asTypeID(FastQuals);
7110 assert(!
T.hasLocalQualifiers());
7112 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(
T.getTypePtr()))
7115 if (
T == Context.AutoDeductTy)
7117 if (
T == Context.AutoRRefDeductTy)
7120 return IdxForType(
T).asTypeID(FastQuals);
7127 assert(!
T.getLocalFastQualifiers());
7131 if (DoneWritingDeclsAndTypes) {
7132 assert(0 &&
"New type seen after serializing all the types to emit!");
7138 Idx =
TypeIdx(0, NextTypeID++);
7139 DeclTypesToEmit.push(
T);
7145llvm::MapVector<ModuleFile *, const Decl *>
7147 llvm::MapVector<ModuleFile *, const Decl *> Firsts;
7150 if (R->isFromASTFile())
7151 Firsts[Chain->getOwningModuleFile(R)] = R;
7152 else if (IncludeLocal)
7153 Firsts[
nullptr] = R;
7169 Record.push_back(MacroRef >> 32);
7170 Record.push_back(MacroRef & llvm::maskTrailingOnes<MacroID>(32));
7185 assert(WritingAST &&
"Cannot request a declaration ID before AST writing");
7202 assert(!(
reinterpret_cast<uintptr_t>(D) & 0x01) &&
"Invalid decl pointer");
7204 if (ID.isInvalid()) {
7205 if (DoneWritingDeclsAndTypes) {
7206 assert(0 &&
"New decl seen after serializing all the decls to emit!");
7213 DeclTypesToEmit.push(
const_cast<Decl *
>(D));
7228 assert(DeclIDs.contains(D) &&
"Declaration not emitted!");
7235 assert(DoneWritingDeclsAndTypes &&
7236 "wasDeclEmitted should only be called after writing declarations");
7241 bool Emitted = DeclIDs.contains(D);
7243 GeneratingReducedBMI) &&
7244 "The declaration within modules can only be omitted in reduced BMI.");
7248void ASTWriter::getLazyUpdates(
const Decl *D) {
7249 if (!GeneratingReducedBMI)
7252 if (
auto *Iter = DeclUpdatesLazy.find(D); Iter != DeclUpdatesLazy.end()) {
7253 for (DeclUpdate &
Update : Iter->second)
7254 DeclUpdates[D].push_back(
Update);
7255 DeclUpdatesLazy.erase(Iter);
7259 if (
auto *DC = dyn_cast<DeclContext>(D);
7260 DC && UpdatedDeclContextsLazy.count(DC)) {
7261 UpdatedDeclContexts.insert(DC);
7262 UpdatedDeclContextsLazy.remove(DC);
7267 assert(
ID.isValid());
7284 SourceManager &SM = PP->getSourceManager();
7291 assert(IsSLocAffecting[FID.ID]);
7293 std::unique_ptr<DeclIDInFileInfo> &Info = FileDeclIDs[FID];
7295 Info = std::make_unique<DeclIDInFileInfo>();
7297 std::pair<unsigned, LocalDeclID> LocDecl(Offset, ID);
7298 LocDeclIDsTy &Decls = Info->DeclIDs;
7299 Decls.push_back(LocDecl);
7304 "expected an anonymous declaration");
7308 auto It = AnonymousDeclarationNumbers.find(D);
7309 if (It == AnonymousDeclarationNumbers.end()) {
7312 AnonymousDeclarationNumbers[ND] = Number;
7315 It = AnonymousDeclarationNumbers.find(D);
7316 assert(It != AnonymousDeclarationNumbers.end() &&
7317 "declaration not found within its lexical context");
7372 while (QualifierLoc) {
7373 NestedNames.push_back(QualifierLoc);
7377 Record->push_back(NestedNames.size());
7378 while(!NestedNames.empty()) {
7379 QualifierLoc = NestedNames.pop_back_val();
7382 Record->push_back(llvm::to_underlying(Kind));
7385 AddDeclRef(Qualifier.getAsNamespaceAndPrefix().Namespace);
7407 llvm_unreachable(
"unexpected null nested name specifier");
7414 assert(TemplateParams &&
"No TemplateParams!");
7419 Record->push_back(TemplateParams->
size());
7420 for (
const auto &P : *TemplateParams)
7423 Record->push_back(
true);
7426 Record->push_back(
false);
7433 assert(TemplateArgs &&
"No TemplateArgs!");
7434 Record->push_back(TemplateArgs->
size());
7435 for (
int i = 0, e = TemplateArgs->
size(); i != e; ++i)
7441 assert(ASTTemplArgList &&
"No ASTTemplArgList!");
7451 Record->push_back(
Set.size());
7453 I =
Set.begin(), E =
Set.end(); I != E; ++I) {
7455 Record->push_back(I.getAccess());
7461 Record->push_back(
Base.isVirtual());
7462 Record->push_back(
Base.isBaseOfClass());
7463 Record->push_back(
Base.getAccessSpecifierAsWritten());
7464 Record->push_back(
Base.getInheritConstructors());
7477 for (
auto &
Base : Bases)
7495 for (
auto *
Init : CtorInits) {
7496 if (
Init->isBaseInitializer()) {
7500 }
else if (
Init->isDelegatingInitializer()) {
7503 }
else if (
Init->isMemberInitializer()){
7516 if (
Init->isWritten())
7530 auto &
Data = D->data();
7532 Record->push_back(
Data.IsLambda);
7536#define FIELD(Name, Width, Merge) \
7537 if (!DefinitionBits.canWriteNextNBits(Width)) { \
7538 Record->push_back(DefinitionBits); \
7539 DefinitionBits.reset(0); \
7541 DefinitionBits.addBits(Data.Name, Width);
7543#include "clang/AST/CXXRecordDeclDefinitionBits.def"
7546 Record->push_back(DefinitionBits);
7552 bool ModulesCodegen =
7557 Record->push_back(ModulesCodegen);
7559 Writer->AddDeclRef(D, Writer->ModularCodegenDecls);
7564 Record->push_back(
Data.ComputedVisibleConversions);
7565 if (
Data.ComputedVisibleConversions)
7569 if (!
Data.IsLambda) {
7570 Record->push_back(
Data.NumBases);
7571 if (
Data.NumBases > 0)
7575 Record->push_back(
Data.NumVBases);
7576 if (
Data.NumVBases > 0)
7581 auto &Lambda = D->getLambdaData();
7584 LambdaBits.
addBits(Lambda.DependencyKind, 2);
7585 LambdaBits.
addBit(Lambda.IsGenericLambda);
7586 LambdaBits.
addBits(Lambda.CaptureDefault, 2);
7587 LambdaBits.
addBits(Lambda.NumCaptures, 15);
7588 LambdaBits.
addBit(Lambda.HasKnownInternalLinkage);
7589 Record->push_back(LambdaBits);
7591 Record->push_back(Lambda.NumExplicitCaptures);
7592 Record->push_back(Lambda.ManglingNumber);
7597 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
7604 Record->push_back(CaptureBits);
7606 switch (
Capture.getCaptureKind()) {
7636 assert(ES->CheckedForSideEffects);
7637 Val |= (ES->HasConstantInitialization ? 2 : 0);
7638 Val |= (ES->HasConstantDestruction ? 4 : 0);
7652void ASTWriter::ReaderInitialized(
ASTReader *Reader) {
7653 assert(Reader &&
"Cannot remove chain");
7654 assert((!Chain || Chain == Reader) &&
"Cannot replace chain");
7655 assert(FirstDeclID == NextDeclID &&
7656 FirstTypeID == NextTypeID &&
7657 FirstIdentID == NextIdentID &&
7658 FirstMacroID == NextMacroID &&
7659 FirstSubmoduleID == NextSubmoduleID &&
7660 FirstSelectorID == NextSelectorID &&
7661 "Setting chain after writing has started.");
7667 NextSelectorID = FirstSelectorID;
7668 NextSubmoduleID = FirstSubmoduleID;
7678 unsigned OriginalModuleFileIndex = StoredID >> 32;
7682 if (OriginalModuleFileIndex == 0 && StoredID)
7693 MacroID &StoredID = MacroIDs[MI];
7694 unsigned OriginalModuleFileIndex = StoredID >> 32;
7697 if (OriginalModuleFileIndex == 0 && StoredID)
7706void ASTWriter::TypeRead(TypeIdx Idx,
QualType T) {
7718 TypeIdx &StoredIdx = TypeIdxs[
T];
7724 if (ModuleFileIndex == 0 && StoredIdx.
getValue())
7735 DeclIDs[D] = LocalDeclID(ID);
7736 PredefinedDecls.insert(D);
7748 assert(!MacroDefinitions.contains(MD));
7749 MacroDefinitions[MD] =
ID;
7753 assert(!SubmoduleIDs.contains(Mod));
7754 SubmoduleIDs[Mod] =
ID;
7757void ASTWriter::CompletedTagDefinition(
const TagDecl *D) {
7758 if (Chain && Chain->isProcessingUpdateRecords())
return;
7760 assert(!WritingAST &&
"Already writing the AST!");
7761 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
7763 if (RD->isFromASTFile()) {
7768 "completed a tag from another module but not by instantiation?");
7769 DeclUpdates[RD].push_back(
7770 DeclUpdate(DeclUpdateKind::CXXInstantiatedClassDefinition));
7784void ASTWriter::AddedVisibleDecl(
const DeclContext *DC,
const Decl *D) {
7785 if (Chain && Chain->isProcessingUpdateRecords())
return;
7787 "Should not add lookup results to non-lookup contexts!");
7808 assert(!WritingAST &&
"Already writing the AST!");
7809 if (UpdatedDeclContexts.insert(DC) && !
cast<Decl>(DC)->isFromASTFile()) {
7813 llvm::append_range(DeclsToEmitEvenIfUnreferenced, DC->
decls());
7815 DeclsToEmitEvenIfUnreferenced.push_back(D);
7819 if (Chain && Chain->isProcessingUpdateRecords())
return;
7832 assert(!WritingAST &&
"Already writing the AST!");
7833 DeclUpdates[RD].push_back(
7834 DeclUpdate(DeclUpdateKind::CXXAddedImplicitMember, D));
7837void ASTWriter::ResolvedExceptionSpec(
const FunctionDecl *FD) {
7838 if (Chain && Chain->isProcessingUpdateRecords())
return;
7839 assert(!DoneWritingDeclsAndTypes &&
"Already done writing updates!");
7841 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7846 ->castAs<FunctionProtoType>()
7847 ->getExceptionSpecType()))
7848 DeclUpdates[D].push_back(DeclUpdateKind::CXXResolvedExceptionSpec);
7853 if (Chain && Chain->isProcessingUpdateRecords())
return;
7854 assert(!WritingAST &&
"Already writing the AST!");
7856 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7857 DeclUpdates[D].push_back(
7858 DeclUpdate(DeclUpdateKind::CXXDeducedReturnType, ReturnType));
7865 if (Chain && Chain->isProcessingUpdateRecords())
return;
7866 assert(!WritingAST &&
"Already writing the AST!");
7867 assert(
Delete &&
"Not given an operator delete");
7869 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7870 DeclUpdates[D].push_back(
7871 DeclUpdate(DeclUpdateKind::CXXResolvedDtorDelete,
Delete));
7877 if (Chain && Chain->isProcessingUpdateRecords())
7879 assert(!WritingAST &&
"Already writing the AST!");
7880 assert(GlobDelete &&
"Not given an operator delete");
7883 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7884 DeclUpdates[D].push_back(
7885 DeclUpdate(DeclUpdateKind::CXXResolvedDtorGlobDelete, GlobDelete));
7891 if (Chain && Chain->isProcessingUpdateRecords())
7893 assert(!WritingAST &&
"Already writing the AST!");
7894 assert(ArrayDelete &&
"Not given an operator delete");
7897 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7898 DeclUpdates[D].push_back(
7899 DeclUpdate(DeclUpdateKind::CXXResolvedDtorArrayDelete, ArrayDelete));
7903void ASTWriter::ResolvedOperatorGlobArrayDelete(
7905 if (Chain && Chain->isProcessingUpdateRecords())
7907 assert(!WritingAST &&
"Already writing the AST!");
7908 assert(GlobArrayDelete &&
"Not given an operator delete");
7911 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7912 DeclUpdates[D].push_back(DeclUpdate(
7913 DeclUpdateKind::CXXResolvedDtorGlobArrayDelete, GlobArrayDelete));
7917void ASTWriter::CompletedImplicitDefinition(
const FunctionDecl *D) {
7918 if (Chain && Chain->isProcessingUpdateRecords())
return;
7919 assert(!WritingAST &&
"Already writing the AST!");
7928 DeclUpdates[D].push_back(
7929 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7932void ASTWriter::VariableDefinitionInstantiated(
const VarDecl *D) {
7933 if (Chain && Chain->isProcessingUpdateRecords())
return;
7934 assert(!WritingAST &&
"Already writing the AST!");
7938 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::CXXAddedVarDefinition));
7941void ASTWriter::FunctionDefinitionInstantiated(
const FunctionDecl *D) {
7942 if (Chain && Chain->isProcessingUpdateRecords())
return;
7943 assert(!WritingAST &&
"Already writing the AST!");
7951 DeclUpdates[D].push_back(
7952 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7955void ASTWriter::InstantiationRequested(
const ValueDecl *D) {
7956 if (Chain && Chain->isProcessingUpdateRecords())
return;
7957 assert(!WritingAST &&
"Already writing the AST!");
7964 if (
auto *VD = dyn_cast<VarDecl>(D))
7965 POI = VD->getPointOfInstantiation();
7968 DeclUpdates[D].push_back(
7969 DeclUpdate(DeclUpdateKind::CXXPointOfInstantiation, POI));
7972void ASTWriter::DefaultArgumentInstantiated(
const ParmVarDecl *D) {
7973 if (Chain && Chain->isProcessingUpdateRecords())
return;
7974 assert(!WritingAST &&
"Already writing the AST!");
7978 DeclUpdates[D].push_back(
7979 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultArgument, D));
7982void ASTWriter::DefaultMemberInitializerInstantiated(
const FieldDecl *D) {
7983 assert(!WritingAST &&
"Already writing the AST!");
7987 DeclUpdates[D].push_back(
7988 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer, D));
7993 if (Chain && Chain->isProcessingUpdateRecords())
return;
7994 assert(!WritingAST &&
"Already writing the AST!");
7998 assert(IFD->
getDefinition() &&
"Category on a class without a definition?");
7999 ObjCClassesWithCategories.insert(
8003void ASTWriter::DeclarationMarkedUsed(
const Decl *D) {
8004 if (Chain && Chain->isProcessingUpdateRecords())
return;
8005 assert(!WritingAST &&
"Already writing the AST!");
8014 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclMarkedUsed));
8017void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(
const Decl *D) {
8018 if (Chain && Chain->isProcessingUpdateRecords())
return;
8019 assert(!WritingAST &&
"Already writing the AST!");
8023 DeclUpdates[D].push_back(
8024 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPThreadPrivate));
8027void ASTWriter::DeclarationMarkedOpenMPAllocate(
const Decl *D,
const Attr *A) {
8028 if (Chain && Chain->isProcessingUpdateRecords())
return;
8029 assert(!WritingAST &&
"Already writing the AST!");
8033 DeclUpdates[D].push_back(
8034 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPAllocate, A));
8037void ASTWriter::DeclarationMarkedOpenMPIndirectCall(
const Decl *D) {
8038 if (Chain && Chain->isProcessingUpdateRecords())
8040 assert(!WritingAST &&
"Already writing the AST!");
8044 DeclUpdates[D].push_back(
8045 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPIndirectCall));
8048void ASTWriter::DeclarationMarkedOpenMPDeclareTarget(
const Decl *D,
8050 if (Chain && Chain->isProcessingUpdateRecords())
return;
8051 assert(!WritingAST &&
"Already writing the AST!");
8055 DeclUpdates[D].push_back(
8056 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPDeclareTarget, Attr));
8059void ASTWriter::RedefinedHiddenDefinition(
const NamedDecl *D,
Module *M) {
8060 if (Chain && Chain->isProcessingUpdateRecords())
return;
8061 assert(!WritingAST &&
"Already writing the AST!");
8063 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclExported, M));
8066void ASTWriter::AddedAttributeToRecord(
const Attr *
Attr,
8068 if (Chain && Chain->isProcessingUpdateRecords())
return;
8069 assert(!WritingAST &&
"Already writing the AST!");
8070 if (!
Record->isFromASTFile())
8072 DeclUpdates[
Record].push_back(
8073 DeclUpdate(DeclUpdateKind::AddedAttrToRecord, Attr));
8076void ASTWriter::AddedCXXTemplateSpecialization(
8078 assert(!WritingAST &&
"Already writing the AST!");
8082 if (Chain && Chain->isProcessingUpdateRecords())
8085 DeclsToEmitEvenIfUnreferenced.push_back(D);
8088void ASTWriter::AddedCXXTemplateSpecialization(
8090 assert(!WritingAST &&
"Already writing the AST!");
8094 if (Chain && Chain->isProcessingUpdateRecords())
8097 DeclsToEmitEvenIfUnreferenced.push_back(D);
8102 assert(!WritingAST &&
"Already writing the AST!");
8106 if (Chain && Chain->isProcessingUpdateRecords())
8109 DeclsToEmitEvenIfUnreferenced.push_back(D);
8118class OMPClauseWriter :
public OMPClauseVisitor<OMPClauseWriter> {
8123#define GEN_CLANG_CLAUSE_CLASS
8124#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
8125#include "llvm/Frontend/OpenMP/OMP.inc"
8134 OMPClauseWriter(*this).writeClause(
C);
8137void OMPClauseWriter::writeClause(
OMPClause *
C) {
8138 Record.push_back(
unsigned(
C->getClauseKind()));
8140 Record.AddSourceLocation(
C->getBeginLoc());
8141 Record.AddSourceLocation(
C->getEndLoc());
8145 Record.push_back(uint64_t(
C->getCaptureRegion()));
8146 Record.AddStmt(
C->getPreInitStmt());
8150 VisitOMPClauseWithPreInit(
C);
8151 Record.AddStmt(
C->getPostUpdateExpr());
8154void OMPClauseWriter::VisitOMPIfClause(
OMPIfClause *
C) {
8155 VisitOMPClauseWithPreInit(
C);
8157 Record.AddSourceLocation(
C->getNameModifierLoc());
8158 Record.AddSourceLocation(
C->getColonLoc());
8159 Record.AddStmt(
C->getCondition());
8160 Record.AddSourceLocation(
C->getLParenLoc());
8164 VisitOMPClauseWithPreInit(
C);
8165 Record.AddStmt(
C->getCondition());
8166 Record.AddSourceLocation(
C->getLParenLoc());
8170 Record.push_back(
C->varlist_size());
8171 Record.writeEnum(
C->getPrescriptivenessModifier());
8172 Record.AddSourceLocation(
C->getPrescriptivenessModifierLoc());
8173 Record.writeEnum(
C->getDimsModifier());
8174 Record.AddSourceLocation(
C->getDimsModifierLoc());
8175 Record.AddStmt(
C->getDimsModifierExpr());
8176 VisitOMPClauseWithPreInit(
C);
8177 Record.AddSourceLocation(
C->getLParenLoc());
8178 for (
auto *
VE :
C->varlist())
8183 Record.AddStmt(
C->getSafelen());
8184 Record.AddSourceLocation(
C->getLParenLoc());
8188 Record.AddStmt(
C->getSimdlen());
8189 Record.AddSourceLocation(
C->getLParenLoc());
8193 Record.push_back(
C->getNumSizes());
8194 for (
Expr *Size :
C->getSizesRefs())
8196 Record.AddSourceLocation(
C->getLParenLoc());
8200 Record.push_back(
C->getNumCounts());
8201 Record.push_back(
C->hasOmpFill());
8202 if (
C->hasOmpFill())
8203 Record.push_back(*
C->getOmpFillIndex());
8204 Record.AddSourceLocation(
C->getOmpFillLoc());
8205 for (
Expr *Count :
C->getCountsRefs())
8207 Record.AddSourceLocation(
C->getLParenLoc());
8211 Record.push_back(
C->getNumLoops());
8212 for (
Expr *Size :
C->getArgsRefs())
8214 Record.AddSourceLocation(
C->getLParenLoc());
8220 Record.AddStmt(
C->getFactor());
8221 Record.AddSourceLocation(
C->getLParenLoc());
8225 Record.AddStmt(
C->getDepth());
8226 Record.AddSourceLocation(
C->getLParenLoc());
8230 Record.AddStmt(
C->getFirst());
8231 Record.AddStmt(
C->getCount());
8232 Record.AddSourceLocation(
C->getLParenLoc());
8233 Record.AddSourceLocation(
C->getFirstLoc());
8234 Record.AddSourceLocation(
C->getCountLoc());
8238 Record.AddStmt(
C->getAllocator());
8239 Record.AddSourceLocation(
C->getLParenLoc());
8243 Record.AddStmt(
C->getNumForLoops());
8244 Record.AddSourceLocation(
C->getLParenLoc());
8247void OMPClauseWriter::VisitOMPDetachClause(OMPDetachClause *
C) {
8248 Record.AddStmt(
C->getEventHandler());
8249 Record.AddSourceLocation(
C->getLParenLoc());
8253 Record.push_back(
unsigned(
C->getDefaultKind()));
8254 Record.AddSourceLocation(
C->getLParenLoc());
8255 Record.AddSourceLocation(
C->getDefaultKindKwLoc());
8256 Record.push_back(
unsigned(
C->getDefaultVC()));
8257 Record.AddSourceLocation(
C->getDefaultVCLoc());
8261 Record.AddSourceLocation(
C->getLParenLoc());
8262 Record.AddSourceLocation(
C->getThreadsetKindLoc());
8263 Record.writeEnum(
C->getThreadsetKind());
8266void OMPClauseWriter::VisitOMPTransparentClause(OMPTransparentClause *
C) {
8267 Record.AddSourceLocation(
C->getLParenLoc());
8268 Record.AddStmt(
C->getImpexType());
8271void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *
C) {
8272 Record.push_back(
unsigned(
C->getProcBindKind()));
8273 Record.AddSourceLocation(
C->getLParenLoc());
8274 Record.AddSourceLocation(
C->getProcBindKindKwLoc());
8277void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *
C) {
8278 VisitOMPClauseWithPreInit(
C);
8279 Record.push_back(
C->getScheduleKind());
8280 Record.push_back(
C->getFirstScheduleModifier());
8281 Record.push_back(
C->getSecondScheduleModifier());
8282 Record.AddStmt(
C->getChunkSize());
8283 Record.AddSourceLocation(
C->getLParenLoc());
8284 Record.AddSourceLocation(
C->getFirstScheduleModifierLoc());
8285 Record.AddSourceLocation(
C->getSecondScheduleModifierLoc());
8286 Record.AddSourceLocation(
C->getScheduleKindLoc());
8287 Record.AddSourceLocation(
C->getCommaLoc());
8290void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *
C) {
8291 Record.push_back(
C->getLoopNumIterations().size());
8292 Record.AddStmt(
C->getNumForLoops());
8293 for (
Expr *NumIter :
C->getLoopNumIterations())
8295 for (
unsigned I = 0, E =
C->getLoopNumIterations().size(); I <E; ++I)
8296 Record.AddStmt(
C->getLoopCounter(I));
8297 Record.AddSourceLocation(
C->getLParenLoc());
8300void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *
C) {
8301 Record.AddStmt(
C->getCondition());
8302 Record.AddSourceLocation(
C->getLParenLoc());
8305void OMPClauseWriter::VisitOMPUntiedClause(OMPUntiedClause *) {}
8307void OMPClauseWriter::VisitOMPMergeableClause(OMPMergeableClause *) {}
8309void OMPClauseWriter::VisitOMPReadClause(OMPReadClause *) {}
8311void OMPClauseWriter::VisitOMPWriteClause(OMPWriteClause *) {}
8313void OMPClauseWriter::VisitOMPUpdateClause(OMPUpdateClause *) {}
8315void OMPClauseWriter::VisitOMPUpdateDependObjectsClause(
8316 OMPUpdateDependObjectsClause *
C) {
8317 Record.AddSourceLocation(
C->getLParenLoc());
8318 Record.AddSourceLocation(
C->getArgumentLoc());
8319 Record.writeEnum(
C->getDependencyKind());
8322void OMPClauseWriter::VisitOMPCaptureClause(OMPCaptureClause *) {}
8324void OMPClauseWriter::VisitOMPCompareClause(OMPCompareClause *) {}
8327void OMPClauseWriter::VisitOMPFailClause(OMPFailClause *
C) {
8328 Record.AddSourceLocation(
C->getLParenLoc());
8329 Record.AddSourceLocation(
C->getFailParameterLoc());
8330 Record.writeEnum(
C->getFailParameter());
8333void OMPClauseWriter::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
8335void OMPClauseWriter::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
8337void OMPClauseWriter::VisitOMPAbsentClause(OMPAbsentClause *
C) {
8338 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8339 Record.AddSourceLocation(
C->getLParenLoc());
8340 for (
auto K :
C->getDirectiveKinds()) {
8345void OMPClauseWriter::VisitOMPHoldsClause(OMPHoldsClause *
C) {
8347 Record.AddSourceLocation(
C->getLParenLoc());
8350void OMPClauseWriter::VisitOMPContainsClause(OMPContainsClause *
C) {
8351 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8352 Record.AddSourceLocation(
C->getLParenLoc());
8353 for (
auto K :
C->getDirectiveKinds()) {
8358void OMPClauseWriter::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
8360void OMPClauseWriter::VisitOMPNoOpenMPRoutinesClause(
8361 OMPNoOpenMPRoutinesClause *) {}
8363void OMPClauseWriter::VisitOMPNoOpenMPConstructsClause(
8364 OMPNoOpenMPConstructsClause *) {}
8366void OMPClauseWriter::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
8368void OMPClauseWriter::VisitOMPAcquireClause(OMPAcquireClause *) {}
8370void OMPClauseWriter::VisitOMPReleaseClause(OMPReleaseClause *) {}
8372void OMPClauseWriter::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
8374void OMPClauseWriter::VisitOMPWeakClause(OMPWeakClause *) {}
8376void OMPClauseWriter::VisitOMPThreadsClause(OMPThreadsClause *) {}
8378void OMPClauseWriter::VisitOMPSIMDClause(OMPSIMDClause *) {}
8380void OMPClauseWriter::VisitOMPNogroupClause(OMPNogroupClause *) {}
8382void OMPClauseWriter::VisitOMPInitClause(OMPInitClause *
C) {
8385 Record.push_back(
C->varlist_size());
8386 Record.push_back(
C->attrs().size());
8390 Record.writeBool(
C->getIsTarget());
8391 Record.writeBool(
C->getIsTargetSync());
8392 Record.writeBool(
C->hasPreferAttrs());
8394 for (OMPInitClause::PrefView P :
C->prefs()) {
8395 Record.push_back(P.Attrs.size());
8396 for (
Expr *A : P.Attrs)
8399 Record.AddSourceLocation(
C->getLParenLoc());
8400 Record.AddSourceLocation(
C->getVarLoc());
8403void OMPClauseWriter::VisitOMPUseClause(OMPUseClause *
C) {
8404 Record.AddStmt(
C->getInteropVar());
8405 Record.AddSourceLocation(
C->getLParenLoc());
8406 Record.AddSourceLocation(
C->getVarLoc());
8409void OMPClauseWriter::VisitOMPDestroyClause(OMPDestroyClause *
C) {
8410 Record.AddStmt(
C->getInteropVar());
8411 Record.AddSourceLocation(
C->getLParenLoc());
8412 Record.AddSourceLocation(
C->getVarLoc());
8415void OMPClauseWriter::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
8416 VisitOMPClauseWithPreInit(
C);
8417 Record.AddStmt(
C->getCondition());
8418 Record.AddSourceLocation(
C->getLParenLoc());
8421void OMPClauseWriter::VisitOMPNocontextClause(OMPNocontextClause *
C) {
8422 VisitOMPClauseWithPreInit(
C);
8423 Record.AddStmt(
C->getCondition());
8424 Record.AddSourceLocation(
C->getLParenLoc());
8427void OMPClauseWriter::VisitOMPFilterClause(OMPFilterClause *
C) {
8428 VisitOMPClauseWithPreInit(
C);
8429 Record.AddStmt(
C->getThreadID());
8430 Record.AddSourceLocation(
C->getLParenLoc());
8434 Record.AddStmt(
C->getAlignment());
8435 Record.AddSourceLocation(
C->getLParenLoc());
8438void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *
C) {
8439 Record.push_back(
C->varlist_size());
8440 Record.AddSourceLocation(
C->getLParenLoc());
8441 for (
auto *
VE :
C->varlist()) {
8444 for (
auto *
VE :
C->private_copies()) {
8449void OMPClauseWriter::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
8450 Record.push_back(
C->varlist_size());
8451 VisitOMPClauseWithPreInit(
C);
8452 Record.AddSourceLocation(
C->getLParenLoc());
8453 for (
auto *
VE :
C->varlist()) {
8456 for (
auto *
VE :
C->private_copies()) {
8459 for (
auto *
VE :
C->inits()) {
8464void OMPClauseWriter::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
8465 Record.push_back(
C->varlist_size());
8466 VisitOMPClauseWithPostUpdate(
C);
8467 Record.AddSourceLocation(
C->getLParenLoc());
8468 Record.writeEnum(
C->getKind());
8469 Record.AddSourceLocation(
C->getKindLoc());
8470 Record.AddSourceLocation(
C->getColonLoc());
8471 for (
auto *
VE :
C->varlist())
8473 for (
auto *E :
C->private_copies())
8475 for (
auto *E :
C->source_exprs())
8477 for (
auto *E :
C->destination_exprs())
8479 for (
auto *E :
C->assignment_ops())
8483void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *
C) {
8484 Record.push_back(
C->varlist_size());
8485 Record.AddSourceLocation(
C->getLParenLoc());
8486 for (
auto *
VE :
C->varlist())
8490void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *
C) {
8491 Record.push_back(
C->varlist_size());
8492 Record.writeEnum(
C->getModifier());
8493 VisitOMPClauseWithPostUpdate(
C);
8494 Record.AddSourceLocation(
C->getLParenLoc());
8495 Record.AddSourceLocation(
C->getModifierLoc());
8496 Record.AddSourceLocation(
C->getColonLoc());
8497 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8498 Record.AddDeclarationNameInfo(
C->getNameInfo());
8499 for (
auto *
VE :
C->varlist())
8501 for (
auto *
VE :
C->privates())
8503 for (
auto *E :
C->lhs_exprs())
8505 for (
auto *E :
C->rhs_exprs())
8507 for (
auto *E :
C->reduction_ops())
8509 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
8510 for (
auto *E :
C->copy_ops())
8512 for (
auto *E :
C->copy_array_temps())
8514 for (
auto *E :
C->copy_array_elems())
8517 auto PrivateFlags =
C->private_var_reduction_flags();
8518 Record.push_back(std::distance(PrivateFlags.begin(), PrivateFlags.end()));
8519 for (
bool Flag : PrivateFlags)
8523void OMPClauseWriter::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
8524 Record.push_back(
C->varlist_size());
8525 VisitOMPClauseWithPostUpdate(
C);
8526 Record.AddSourceLocation(
C->getLParenLoc());
8527 Record.AddSourceLocation(
C->getColonLoc());
8528 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8529 Record.AddDeclarationNameInfo(
C->getNameInfo());
8530 for (
auto *
VE :
C->varlist())
8532 for (
auto *
VE :
C->privates())
8534 for (
auto *E :
C->lhs_exprs())
8536 for (
auto *E :
C->rhs_exprs())
8538 for (
auto *E :
C->reduction_ops())
8542void OMPClauseWriter::VisitOMPInReductionClause(OMPInReductionClause *
C) {
8543 Record.push_back(
C->varlist_size());
8544 VisitOMPClauseWithPostUpdate(
C);
8545 Record.AddSourceLocation(
C->getLParenLoc());
8546 Record.AddSourceLocation(
C->getColonLoc());
8547 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8548 Record.AddDeclarationNameInfo(
C->getNameInfo());
8549 for (
auto *
VE :
C->varlist())
8551 for (
auto *
VE :
C->privates())
8553 for (
auto *E :
C->lhs_exprs())
8555 for (
auto *E :
C->rhs_exprs())
8557 for (
auto *E :
C->reduction_ops())
8559 for (
auto *E :
C->taskgroup_descriptors())
8563void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *
C) {
8564 Record.push_back(
C->varlist_size());
8565 VisitOMPClauseWithPostUpdate(
C);
8566 Record.AddSourceLocation(
C->getLParenLoc());
8567 Record.AddSourceLocation(
C->getColonLoc());
8568 Record.push_back(
C->getModifier());
8569 Record.AddSourceLocation(
C->getModifierLoc());
8570 for (
auto *
VE :
C->varlist()) {
8573 for (
auto *
VE :
C->privates()) {
8576 for (
auto *
VE :
C->inits()) {
8579 for (
auto *
VE :
C->updates()) {
8582 for (
auto *
VE :
C->finals()) {
8586 Record.AddStmt(
C->getCalcStep());
8587 for (
auto *
VE :
C->used_expressions())
8591void OMPClauseWriter::VisitOMPAlignedClause(OMPAlignedClause *
C) {
8592 Record.push_back(
C->varlist_size());
8593 Record.AddSourceLocation(
C->getLParenLoc());
8594 Record.AddSourceLocation(
C->getColonLoc());
8595 for (
auto *
VE :
C->varlist())
8597 Record.AddStmt(
C->getAlignment());
8600void OMPClauseWriter::VisitOMPCopyinClause(OMPCopyinClause *
C) {
8601 Record.push_back(
C->varlist_size());
8602 Record.AddSourceLocation(
C->getLParenLoc());
8603 for (
auto *
VE :
C->varlist())
8605 for (
auto *E :
C->source_exprs())
8607 for (
auto *E :
C->destination_exprs())
8609 for (
auto *E :
C->assignment_ops())
8613void OMPClauseWriter::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
8614 Record.push_back(
C->varlist_size());
8615 Record.AddSourceLocation(
C->getLParenLoc());
8616 for (
auto *
VE :
C->varlist())
8618 for (
auto *E :
C->source_exprs())
8620 for (
auto *E :
C->destination_exprs())
8622 for (
auto *E :
C->assignment_ops())
8626void OMPClauseWriter::VisitOMPFlushClause(OMPFlushClause *
C) {
8627 Record.push_back(
C->varlist_size());
8628 Record.AddSourceLocation(
C->getLParenLoc());
8629 for (
auto *
VE :
C->varlist())
8633void OMPClauseWriter::VisitOMPDepobjClause(OMPDepobjClause *
C) {
8634 Record.AddStmt(
C->getDepobj());
8635 Record.AddSourceLocation(
C->getLParenLoc());
8638void OMPClauseWriter::VisitOMPDependClause(OMPDependClause *
C) {
8639 Record.push_back(
C->varlist_size());
8640 Record.push_back(
C->getNumLoops());
8641 Record.AddSourceLocation(
C->getLParenLoc());
8642 Record.AddStmt(
C->getModifier());
8643 Record.push_back(
C->getDependencyKind());
8644 Record.AddSourceLocation(
C->getDependencyLoc());
8645 Record.AddSourceLocation(
C->getColonLoc());
8646 Record.AddSourceLocation(
C->getOmpAllMemoryLoc());
8647 for (
auto *
VE :
C->varlist())
8649 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8650 Record.AddStmt(
C->getLoopData(I));
8653void OMPClauseWriter::VisitOMPDeviceClause(OMPDeviceClause *
C) {
8654 VisitOMPClauseWithPreInit(
C);
8655 Record.writeEnum(
C->getModifier());
8656 Record.AddStmt(
C->getDevice());
8657 Record.AddSourceLocation(
C->getModifierLoc());
8658 Record.AddSourceLocation(
C->getLParenLoc());
8661void OMPClauseWriter::VisitOMPMapClause(OMPMapClause *
C) {
8662 Record.push_back(
C->varlist_size());
8663 Record.push_back(
C->getUniqueDeclarationsNum());
8664 Record.push_back(
C->getTotalComponentListNum());
8665 Record.push_back(
C->getTotalComponentsNum());
8666 Record.AddSourceLocation(
C->getLParenLoc());
8667 bool HasIteratorModifier =
false;
8669 Record.push_back(
C->getMapTypeModifier(I));
8670 Record.AddSourceLocation(
C->getMapTypeModifierLoc(I));
8671 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
8672 HasIteratorModifier =
true;
8674 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8675 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8676 Record.push_back(
C->getMapType());
8677 Record.AddSourceLocation(
C->getMapLoc());
8678 Record.AddSourceLocation(
C->getColonLoc());
8679 for (
auto *E :
C->varlist())
8681 for (
auto *E :
C->mapperlists())
8683 if (HasIteratorModifier)
8684 Record.AddStmt(
C->getIteratorModifier());
8685 for (
auto *D :
C->all_decls())
8687 for (
auto N :
C->all_num_lists())
8689 for (
auto N :
C->all_lists_sizes())
8691 for (
auto &M :
C->all_components()) {
8692 Record.AddStmt(M.getAssociatedExpression());
8693 Record.AddDeclRef(M.getAssociatedDeclaration());
8698 Record.push_back(
C->varlist_size());
8699 Record.writeEnum(
C->getFirstAllocateModifier());
8700 Record.writeEnum(
C->getSecondAllocateModifier());
8701 Record.AddSourceLocation(
C->getLParenLoc());
8702 Record.AddSourceLocation(
C->getColonLoc());
8703 Record.AddStmt(
C->getAllocator());
8704 Record.AddStmt(
C->getAlignment());
8705 for (
auto *
VE :
C->varlist())
8709void OMPClauseWriter::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
8710 Record.push_back(
C->varlist_size());
8711 Record.writeEnum(
C->getModifier());
8712 Record.AddSourceLocation(
C->getModifierLoc());
8713 Record.AddStmt(
C->getModifierExpr());
8714 VisitOMPClauseWithPreInit(
C);
8715 Record.AddSourceLocation(
C->getLParenLoc());
8716 for (
auto *
VE :
C->varlist())
8720void OMPClauseWriter::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
8721 Record.push_back(
C->varlist_size());
8722 Record.writeEnum(
C->getModifier());
8723 Record.AddSourceLocation(
C->getModifierLoc());
8724 Record.AddStmt(
C->getModifierExpr());
8725 VisitOMPClauseWithPreInit(
C);
8726 Record.AddSourceLocation(
C->getLParenLoc());
8727 for (
auto *
VE :
C->varlist())
8731void OMPClauseWriter::VisitOMPPriorityClause(OMPPriorityClause *
C) {
8732 VisitOMPClauseWithPreInit(
C);
8733 Record.AddStmt(
C->getPriority());
8734 Record.AddSourceLocation(
C->getLParenLoc());
8737void OMPClauseWriter::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
8738 VisitOMPClauseWithPreInit(
C);
8739 Record.writeEnum(
C->getModifier());
8740 Record.AddStmt(
C->getGrainsize());
8741 Record.AddSourceLocation(
C->getModifierLoc());
8742 Record.AddSourceLocation(
C->getLParenLoc());
8745void OMPClauseWriter::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
8746 VisitOMPClauseWithPreInit(
C);
8747 Record.writeEnum(
C->getModifier());
8748 Record.AddStmt(
C->getNumTasks());
8749 Record.AddSourceLocation(
C->getModifierLoc());
8750 Record.AddSourceLocation(
C->getLParenLoc());
8753void OMPClauseWriter::VisitOMPHintClause(OMPHintClause *
C) {
8755 Record.AddSourceLocation(
C->getLParenLoc());
8758void OMPClauseWriter::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
8759 VisitOMPClauseWithPreInit(
C);
8760 Record.push_back(
C->getDistScheduleKind());
8761 Record.AddStmt(
C->getChunkSize());
8762 Record.AddSourceLocation(
C->getLParenLoc());
8763 Record.AddSourceLocation(
C->getDistScheduleKindLoc());
8764 Record.AddSourceLocation(
C->getCommaLoc());
8767void OMPClauseWriter::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
8768 Record.push_back(
C->getDefaultmapKind());
8769 Record.push_back(
C->getDefaultmapModifier());
8770 Record.AddSourceLocation(
C->getLParenLoc());
8771 Record.AddSourceLocation(
C->getDefaultmapModifierLoc());
8772 Record.AddSourceLocation(
C->getDefaultmapKindLoc());
8775void OMPClauseWriter::VisitOMPToClause(OMPToClause *
C) {
8776 Record.push_back(
C->varlist_size());
8777 Record.push_back(
C->getUniqueDeclarationsNum());
8778 Record.push_back(
C->getTotalComponentListNum());
8779 Record.push_back(
C->getTotalComponentsNum());
8780 Record.AddSourceLocation(
C->getLParenLoc());
8782 Record.push_back(
C->getMotionModifier(I));
8783 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8784 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8785 Record.AddStmt(
C->getIteratorModifier());
8787 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8788 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8789 Record.AddSourceLocation(
C->getColonLoc());
8790 for (
auto *E :
C->varlist())
8792 for (
auto *E :
C->mapperlists())
8794 for (
auto *D :
C->all_decls())
8796 for (
auto N :
C->all_num_lists())
8798 for (
auto N :
C->all_lists_sizes())
8800 for (
auto &M :
C->all_components()) {
8801 Record.AddStmt(M.getAssociatedExpression());
8802 Record.writeBool(M.isNonContiguous());
8803 Record.AddDeclRef(M.getAssociatedDeclaration());
8807void OMPClauseWriter::VisitOMPFromClause(OMPFromClause *
C) {
8808 Record.push_back(
C->varlist_size());
8809 Record.push_back(
C->getUniqueDeclarationsNum());
8810 Record.push_back(
C->getTotalComponentListNum());
8811 Record.push_back(
C->getTotalComponentsNum());
8812 Record.AddSourceLocation(
C->getLParenLoc());
8814 Record.push_back(
C->getMotionModifier(I));
8815 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8816 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8817 Record.AddStmt(
C->getIteratorModifier());
8819 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8820 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8821 Record.AddSourceLocation(
C->getColonLoc());
8822 for (
auto *E :
C->varlist())
8824 for (
auto *E :
C->mapperlists())
8826 for (
auto *D :
C->all_decls())
8828 for (
auto N :
C->all_num_lists())
8830 for (
auto N :
C->all_lists_sizes())
8832 for (
auto &M :
C->all_components()) {
8833 Record.AddStmt(M.getAssociatedExpression());
8834 Record.writeBool(M.isNonContiguous());
8835 Record.AddDeclRef(M.getAssociatedDeclaration());
8839void OMPClauseWriter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
8840 Record.push_back(
C->varlist_size());
8841 Record.push_back(
C->getUniqueDeclarationsNum());
8842 Record.push_back(
C->getTotalComponentListNum());
8843 Record.push_back(
C->getTotalComponentsNum());
8844 Record.AddSourceLocation(
C->getLParenLoc());
8845 Record.writeEnum(
C->getFallbackModifier());
8846 Record.AddSourceLocation(
C->getFallbackModifierLoc());
8847 for (
auto *E :
C->varlist())
8849 for (
auto *
VE :
C->private_copies())
8851 for (
auto *
VE :
C->inits())
8853 for (
auto *D :
C->all_decls())
8855 for (
auto N :
C->all_num_lists())
8857 for (
auto N :
C->all_lists_sizes())
8859 for (
auto &M :
C->all_components()) {
8860 Record.AddStmt(M.getAssociatedExpression());
8861 Record.AddDeclRef(M.getAssociatedDeclaration());
8865void OMPClauseWriter::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
8866 Record.push_back(
C->varlist_size());
8867 Record.push_back(
C->getUniqueDeclarationsNum());
8868 Record.push_back(
C->getTotalComponentListNum());
8869 Record.push_back(
C->getTotalComponentsNum());
8870 Record.AddSourceLocation(
C->getLParenLoc());
8871 for (
auto *E :
C->varlist())
8873 for (
auto *D :
C->all_decls())
8875 for (
auto N :
C->all_num_lists())
8877 for (
auto N :
C->all_lists_sizes())
8879 for (
auto &M :
C->all_components()) {
8880 Record.AddStmt(M.getAssociatedExpression());
8881 Record.AddDeclRef(M.getAssociatedDeclaration());
8885void OMPClauseWriter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
8886 Record.push_back(
C->varlist_size());
8887 Record.push_back(
C->getUniqueDeclarationsNum());
8888 Record.push_back(
C->getTotalComponentListNum());
8889 Record.push_back(
C->getTotalComponentsNum());
8890 Record.AddSourceLocation(
C->getLParenLoc());
8891 for (
auto *E :
C->varlist())
8893 for (
auto *D :
C->all_decls())
8895 for (
auto N :
C->all_num_lists())
8897 for (
auto N :
C->all_lists_sizes())
8899 for (
auto &M :
C->all_components()) {
8900 Record.AddStmt(M.getAssociatedExpression());
8901 Record.AddDeclRef(M.getAssociatedDeclaration());
8905void OMPClauseWriter::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
8906 Record.push_back(
C->varlist_size());
8907 Record.push_back(
C->getUniqueDeclarationsNum());
8908 Record.push_back(
C->getTotalComponentListNum());
8909 Record.push_back(
C->getTotalComponentsNum());
8910 Record.AddSourceLocation(
C->getLParenLoc());
8911 for (
auto *E :
C->varlist())
8913 for (
auto *D :
C->all_decls())
8915 for (
auto N :
C->all_num_lists())
8917 for (
auto N :
C->all_lists_sizes())
8919 for (
auto &M :
C->all_components()) {
8920 Record.AddStmt(M.getAssociatedExpression());
8921 Record.AddDeclRef(M.getAssociatedDeclaration());
8925void OMPClauseWriter::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
8927void OMPClauseWriter::VisitOMPUnifiedSharedMemoryClause(
8928 OMPUnifiedSharedMemoryClause *) {}
8930void OMPClauseWriter::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
8933OMPClauseWriter::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
8936void OMPClauseWriter::VisitOMPAtomicDefaultMemOrderClause(
8937 OMPAtomicDefaultMemOrderClause *
C) {
8938 Record.push_back(
C->getAtomicDefaultMemOrderKind());
8939 Record.AddSourceLocation(
C->getLParenLoc());
8940 Record.AddSourceLocation(
C->getAtomicDefaultMemOrderKindKwLoc());
8943void OMPClauseWriter::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
8945void OMPClauseWriter::VisitOMPAtClause(OMPAtClause *
C) {
8946 Record.push_back(
C->getAtKind());
8947 Record.AddSourceLocation(
C->getLParenLoc());
8948 Record.AddSourceLocation(
C->getAtKindKwLoc());
8951void OMPClauseWriter::VisitOMPSeverityClause(OMPSeverityClause *
C) {
8952 Record.push_back(
C->getSeverityKind());
8953 Record.AddSourceLocation(
C->getLParenLoc());
8954 Record.AddSourceLocation(
C->getSeverityKindKwLoc());
8957void OMPClauseWriter::VisitOMPMessageClause(OMPMessageClause *
C) {
8958 VisitOMPClauseWithPreInit(
C);
8959 Record.AddStmt(
C->getMessageString());
8960 Record.AddSourceLocation(
C->getLParenLoc());
8963void OMPClauseWriter::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
8964 Record.push_back(
C->varlist_size());
8965 Record.AddSourceLocation(
C->getLParenLoc());
8966 for (
auto *
VE :
C->varlist())
8968 for (
auto *E :
C->private_refs())
8972void OMPClauseWriter::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
8973 Record.push_back(
C->varlist_size());
8974 Record.AddSourceLocation(
C->getLParenLoc());
8975 for (
auto *
VE :
C->varlist())
8979void OMPClauseWriter::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
8980 Record.push_back(
C->varlist_size());
8981 Record.AddSourceLocation(
C->getLParenLoc());
8982 for (
auto *
VE :
C->varlist())
8986void OMPClauseWriter::VisitOMPOrderClause(OMPOrderClause *
C) {
8987 Record.writeEnum(
C->getKind());
8988 Record.writeEnum(
C->getModifier());
8989 Record.AddSourceLocation(
C->getLParenLoc());
8990 Record.AddSourceLocation(
C->getKindKwLoc());
8991 Record.AddSourceLocation(
C->getModifierKwLoc());
8994void OMPClauseWriter::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
8995 Record.push_back(
C->getNumberOfAllocators());
8996 Record.AddSourceLocation(
C->getLParenLoc());
8997 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
8998 OMPUsesAllocatorsClause::Data
Data =
C->getAllocatorData(I);
9006void OMPClauseWriter::VisitOMPAffinityClause(OMPAffinityClause *
C) {
9007 Record.push_back(
C->varlist_size());
9008 Record.AddSourceLocation(
C->getLParenLoc());
9009 Record.AddStmt(
C->getModifier());
9010 Record.AddSourceLocation(
C->getColonLoc());
9011 for (
Expr *E :
C->varlist())
9015void OMPClauseWriter::VisitOMPBindClause(OMPBindClause *
C) {
9016 Record.writeEnum(
C->getBindKind());
9017 Record.AddSourceLocation(
C->getLParenLoc());
9018 Record.AddSourceLocation(
C->getBindKindLoc());
9021void OMPClauseWriter::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
9022 VisitOMPClauseWithPreInit(
C);
9024 Record.AddSourceLocation(
C->getLParenLoc());
9027void OMPClauseWriter::VisitOMPDynGroupprivateClause(
9028 OMPDynGroupprivateClause *
C) {
9029 VisitOMPClauseWithPreInit(
C);
9030 Record.push_back(
C->getDynGroupprivateModifier());
9031 Record.push_back(
C->getDynGroupprivateFallbackModifier());
9033 Record.AddSourceLocation(
C->getLParenLoc());
9034 Record.AddSourceLocation(
C->getDynGroupprivateModifierLoc());
9035 Record.AddSourceLocation(
C->getDynGroupprivateFallbackModifierLoc());
9038void OMPClauseWriter::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
9039 Record.push_back(
C->varlist_size());
9040 Record.push_back(
C->getNumLoops());
9041 Record.AddSourceLocation(
C->getLParenLoc());
9042 Record.push_back(
C->getDependenceType());
9043 Record.AddSourceLocation(
C->getDependenceLoc());
9044 Record.AddSourceLocation(
C->getColonLoc());
9045 for (
auto *
VE :
C->varlist())
9047 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
9048 Record.AddStmt(
C->getLoopData(I));
9051void OMPClauseWriter::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
9052 Record.AddAttributes(
C->getAttrs());
9053 Record.AddSourceLocation(
C->getBeginLoc());
9054 Record.AddSourceLocation(
C->getLParenLoc());
9055 Record.AddSourceLocation(
C->getEndLoc());
9058void OMPClauseWriter::VisitOMPXBareClause(OMPXBareClause *
C) {}
9062 for (
const auto &
Set : TI->
Sets) {
9069 writeExprRef(
Selector.ScoreOrCondition);
9083 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
9085 if (
Data->hasAssociatedStmt())
9087 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
9093 for (
Expr *E :
C->getVarList())
9099 for (
Expr *E : Exprs)
9108 switch (
C->getClauseKind()) {
9118 AddStmt(
const_cast<Expr*
>(IC->getConditionExpr()));
9125 if (SC->isConditionExprClause()) {
9127 if (SC->hasConditionExpr())
9128 AddStmt(
const_cast<Expr *
>(SC->getConditionExpr()));
9131 for (
Expr *E : SC->getVarList())
9140 for (
Expr *E : NGC->getIntExprs())
9174 static_assert(
sizeof(R) == 1 *
sizeof(
int *));
9197 static_assert(
sizeof(R) == 2 *
sizeof(
int *));
9285 if (AC->hasIntExpr())
9293 if (
Expr *DNE = WC->getDevNumExpr())
9307 if (Arg.getIdentifierInfo())
9326 for (
auto &CombinerRecipe : R.CombinerRecipes) {
9354 for (
Expr *E : TC->getSizeExprs())
9362 for (
unsigned I = 0; I < GC->getNumExprs(); ++I) {
9364 AddStmt(
const_cast<Expr *
>(GC->getExpr(I).second));
9372 if (WC->hasIntExpr())
9380 if (VC->hasIntExpr())
9401 if (BC->isStringArgument())
9410 llvm_unreachable(
"Clause serialization not yet implemented");
9412 llvm_unreachable(
"Invalid Clause Kind");
9421 const OpenACCRoutineDeclAttr *A) {
#define RECORD(CLASS, BASE)
Defines the clang::ASTContext interface.
static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)
Whether the given identifier is "interesting".
static NamedDecl * getDeclForLocalLookup(const LangOptions &LangOpts, NamedDecl *D)
Determine the declaration that should be put into the name lookup table to represent the given declar...
static unsigned CreateSLocBufferAbbrev(llvm::BitstreamWriter &Stream)
Create an abbreviation for the SLocEntry that refers to a buffer.
static bool isLookupResultNotInteresting(ASTWriter &Writer, StoredDeclsList &Result)
Returns true if all of the lookup result are either external, not emitted or predefined.
static void AddLazyVectorDecls(ASTWriter &Writer, Vector &Vec)
static bool IsInternalDeclFromFileContext(const Decl *D)
static TypeID MakeTypeID(ASTContext &Context, QualType T, IdxForTypeTy IdxForType)
static void AddLazyVectorEmiitedDecls(ASTWriter &Writer, Vector &Vec, ASTWriter::RecordData &Record)
static unsigned CreateSLocExpansionAbbrev(llvm::BitstreamWriter &Stream)
Create an abbreviation for the SLocEntry that refers to a macro expansion.
static StringRef bytes(const std::vector< T, Allocator > &v)
static unsigned CreateSLocBufferBlobAbbrev(llvm::BitstreamWriter &Stream, bool Compressed)
Create an abbreviation for the SLocEntry that refers to a buffer's blob.
static void BackpatchSignatureAt(llvm::BitstreamWriter &Stream, const ASTFileSignature &S, uint64_t BitNo)
static bool isLocalIdentifierID(IdentifierID ID)
If the.
static bool isImportedDeclContext(ASTReader *Chain, const Decl *D)
static TypeCode getTypeCodeForTypeClass(Type::TypeClass id)
static void AddStmtsExprs(llvm::BitstreamWriter &Stream, ASTWriter::RecordDataImpl &Record)
static bool adjustFilenameForRelocatableAST(SmallVectorImpl< char > &Filename, StringRef BaseDir)
Adjusts the given filename to only write out the portion of the filename that is not part of the syst...
static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob, unsigned SLocBufferBlobCompressedAbbrv, unsigned SLocBufferBlobAbbrv)
static uint64_t EmitCXXBaseSpecifiers(ASTContext &Context, ASTWriter &W, ArrayRef< CXXBaseSpecifier > Bases)
static std::pair< unsigned, unsigned > emitULEBKeyDataLength(unsigned KeyLen, unsigned DataLen, raw_ostream &Out)
Emit key length and data length as ULEB-encoded data, and return them as a pair.
static bool shouldIgnoreMacro(MacroDirective *MD, bool IsModule, const Preprocessor &PP)
static uint64_t EmitCXXCtorInitializers(ASTContext &Context, ASTWriter &W, ArrayRef< CXXCtorInitializer * > CtorInits)
static unsigned CreateSLocFileAbbrev(llvm::BitstreamWriter &Stream)
Create an abbreviation for the SLocEntry that refers to a file.
Defines the Diagnostic-related interfaces.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines interfaces for clang::FileEntry and clang::FileEntryRef.
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 LambdaCapture class.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
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::Target Target
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.
Defines the clang::OpenCLOptions class.
This file defines OpenMP AST classes for clauses.
Defines the clang::Preprocessor interface.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to RISC-V.
static void EmitBlockID(unsigned ID, const char *Name, llvm::BitstreamWriter &Stream, RecordDataImpl &Record)
Emits a block ID in the BLOCKINFO block.
static void EmitRecordID(unsigned ID, const char *Name, llvm::BitstreamWriter &Stream, RecordDataImpl &Record)
Emits a record ID in the BLOCKINFO block.
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)
#define BLOCK(DERIVED, BASE)
Defines the clang::TypeLoc interface and its subclasses.
TypePropertyCache< Private > Cache
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)
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getRawCFConstantStringType() const
Get the structure type used to representation CFStrings, or NULL if it hasn't yet been built.
QualType getucontext_tType() const
Retrieve the C ucontext_t type.
FunctionDecl * getcudaGetParameterBufferDecl()
QualType getFILEType() const
Retrieve the C FILE type.
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
const LangOptions & getLangOpts() const
RawCommentList Comments
All comments in this translation unit.
TagDecl * MSTypeInfoTagDecl
QualType getjmp_bufType() const
Retrieve the C jmp_buf type.
QualType getsigjmp_bufType() const
Retrieve the C sigjmp_buf type.
Decl * getVaListTagDecl() const
Retrieve the C type declaration corresponding to the predefined __va_list_tag type used to help defin...
FunctionDecl * getcudaConfigureCallDecl()
import_range local_imports() const
FunctionDecl * getcudaLaunchDeviceDecl()
Reads an AST files chain containing the contents of a translation unit.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
unsigned getTotalNumSubmodules() const
Returns the number of submodules known.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
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.
serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)
Get the loaded specializations lookup tables for D, if any.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
An object for streaming information to a record.
void AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo)
void AddCXXBaseSpecifiers(ArrayRef< CXXBaseSpecifier > Bases)
Emit a set of C++ base specifiers.
void AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs)
Emit a template argument list.
uint64_t Emit(unsigned Code, unsigned Abbrev=0)
Emit the record to the stream, followed by its substatements, and return its offset.
void AddCXXTemporary(const CXXTemporary *Temp)
Emit a CXXTemporary.
void writeOMPTraitInfo(const OMPTraitInfo *TI)
Write an OMPTraitInfo object.
void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base)
Emit a C++ base specifier.
void writeOMPClause(OMPClause *C)
void writeBool(bool Value)
void AddAPValue(const APValue &Value)
Emit an APvalue.
void AddUnresolvedSet(const ASTUnresolvedSet &Set)
Emit a UnresolvedSet structure.
void AddIdentifierRef(const IdentifierInfo *II)
Emit a reference to an identifier.
void AddStmt(Stmt *S)
Add the given statement or expression to the queue of statements to emit.
void AddDeclarationName(DeclarationName Name)
Emit a declaration name.
void AddTemplateArgumentLocInfo(const TemplateArgumentLoc &Arg)
Emits a template argument location info.
void AddTypeLoc(TypeLoc TL)
Emits source location information for a type. Does not emit the type.
void AddSelectorRef(Selector S)
Emit a Selector (which is a smart pointer reference).
void writeSourceLocation(SourceLocation Loc)
void AddOffset(uint64_t BitOffset)
Add a bit offset into the record.
void AddTypeRef(QualType T)
Emit a reference to a type.
void writeOpenACCClauseList(ArrayRef< const OpenACCClause * > Clauses)
Writes out a list of OpenACC clauses.
void push_back(uint64_t N)
Minimal vector-like interface.
void AddCXXCtorInitializers(ArrayRef< CXXCtorInitializer * > CtorInits)
Emit a CXXCtorInitializer array.
void AddTemplateParameterList(const TemplateParameterList *TemplateParams)
Emit a template parameter list.
void AddTemplateArgument(const TemplateArgument &Arg)
Emit a template argument.
void AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc, DeclarationName Name)
void writeOpenACCIntExprList(ArrayRef< Expr * > Exprs)
void AddTemplateName(TemplateName Name)
Emit a template name.
void AddAPFloat(const llvm::APFloat &Value)
Emit a floating-point value.
void AddTypeSourceInfo(TypeSourceInfo *TInfo)
Emits a reference to a declarator info.
void AddQualifierInfo(const QualifierInfo &Info)
void writeUInt32(uint32_t Value)
void AddDeclRef(const Decl *D)
Emit a reference to a declaration.
void writeOMPChildren(OMPChildren *Data)
Writes data related to the OpenMP directives.
void AddConceptReference(const ConceptReference *CR)
void AddSourceRange(SourceRange Range)
Emit a source range.
void AddAPInt(const llvm::APInt &Value)
Emit an integral value.
void AddSourceLocation(SourceLocation Loc)
Emit a source location.
void writeOpenACCVarList(const OpenACCClauseWithVarList *C)
void AddAttributes(ArrayRef< const Attr * > Attrs)
Emit a list of attributes.
void AddASTTemplateArgumentListInfo(const ASTTemplateArgumentListInfo *ASTTemplArgList)
Emits an AST template argument list info.
void AddCXXDefinitionData(const CXXRecordDecl *D)
void AddVarDeclInit(const VarDecl *VD)
Emit information about the initializer of a VarDecl.
void writeStmtRef(const Stmt *S)
void AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg)
Emits a template argument location.
void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS)
Emit a nested name specifier with source-location information.
void AddOpenACCRoutineDeclAttr(const OpenACCRoutineDeclAttr *A)
void writeOpenACCClause(const OpenACCClause *C)
Writes out a single OpenACC Clause.
void AddAttr(const Attr *A)
An UnresolvedSet-like class which uses the ASTContext's allocator.
UnresolvedSetIterator const_iterator
Writes an AST file containing the contents of a translation unit.
static SourceLocationEncoding::Chain EmitSourceLocationOffset(SourceLocation::UIntTy Offset, SourceLocation::UIntTy InitialDelta, RecordDataImpl &Record)
Emit Offset as the next record field and return a chain anchored at Offset + InitialDelta,...
SourceLocation::UIntTy getEntryOffset(const SrcMgr::SLocEntry &SLoc) const
The starting offset of SLoc's entry within this module, with the dummy entry skipped.
void AddEmittedDeclRef(const Decl *D, RecordDataImpl &Record)
friend class ASTRecordWriter
bool isWritingStdCXXNamedModules() const
ArrayRef< uint64_t > RecordDataRef
void EmitRecordWithPath(unsigned Abbrev, RecordDataRef Record, StringRef Path)
Emit the current record with the given path as a blob.
void AddFileID(FileID FID, RecordDataImpl &Record)
Emit a FileID.
bool isDeclPredefined(const Decl *D) const
bool IsLocalDecl(const Decl *D) const
Is this a local declaration (that is, one that will be written to our AST file)?
void AddPath(StringRef Path, RecordDataImpl &Record)
Add a path to the given record.
SmallVectorImpl< uint64_t > RecordDataImpl
void AddVersionTuple(const VersionTuple &Version, RecordDataImpl &Record)
Add a version tuple to the given record.
bool isGeneratingReducedBMI() const
uint32_t getMacroDirectivesOffset(const IdentifierInfo *Name)
void AddAlignPackInfo(const Sema::AlignPackInfo &Info, RecordDataImpl &Record)
Emit a AlignPackInfo.
void AddPathBlob(StringRef Str, RecordDataImpl &Record, SmallVectorImpl< char > &Blob)
llvm::MapVector< serialization::ModuleFile *, const Decl * > CollectFirstDeclFromEachModule(const Decl *D, bool IncludeLocal)
Collect the first declaration from each module file that provides a declaration of D.
void AddTypeRef(ASTContext &Context, QualType T, RecordDataImpl &Record)
Emit a reference to a type.
bool wasDeclEmitted(const Decl *D) const
Whether or not the declaration got emitted.
void AddString(StringRef Str, RecordDataImpl &Record)
Add a string to the given record.
bool isWritingModule() const
LocalDeclID GetDeclRef(const Decl *D)
Force a declaration to be emitted and get its local ID to the module file been writing.
void AddSourceRange(SourceRange Range, RecordDataImpl &Record)
Emit a source range.
LocalDeclID getDeclID(const Decl *D)
Determine the local declaration ID of an already-emitted declaration.
void AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record)
Emit a source location.
ASTFileSignature WriteAST(llvm::PointerUnion< Sema *, Preprocessor * > Subject, StringRef OutputFile, Module *WritingModule, StringRef isysroot)
Write a precompiled header or a module with the AST produced by the Sema object, or a dependency scan...
void addTouchedModuleFile(serialization::ModuleFile *)
void AddIdentifierRef(const IdentifierInfo *II, RecordDataImpl &Record)
Emit a reference to an identifier.
serialization::MacroID getMacroRef(MacroInfo *MI, const IdentifierInfo *Name)
Get the unique number used to refer to the given macro.
SourceLocationEncoding::RawLocEncoding getRawSourceLocationEncoding(SourceLocation Loc)
Return the raw encodings for source locations.
ASTReader * getChain() const
SourceLocationEncoding::Chain EmitEntryOffset(const SrcMgr::SLocEntry &SLoc, RecordDataImpl &Record)
Emit SLoc's entry offset as the record's first field and return a chain anchored at that entry,...
bool getDoneWritingDeclsAndTypes() const
serialization::IdentifierID getIdentifierRef(const IdentifierInfo *II)
Get the unique number used to refer to the given identifier.
ASTWriter(llvm::BitstreamWriter &Stream, SmallVectorImpl< char > &Buffer, ModuleCache &ModCache, const CodeGenOptions &CodeGenOpts, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, bool IncludeTimestamps=true, bool BuildingImplicitModule=false, bool GeneratingReducedBMI=false)
Create a new precompiled header writer that outputs to the given bitstream.
time_t getTimestampForOutput(time_t ModTime) const
Get a timestamp for output into the AST file.
void handleVTable(CXXRecordDecl *RD)
unsigned getLocalOrImportedSubmoduleID(const Module *Mod)
Retrieve or create a submodule ID for this module, or return 0 if the submodule is neither local (a s...
void AddToken(const Token &Tok, RecordDataImpl &Record)
Emit a token.
void AddLookupOffsets(const LookupBlockOffsets &Offsets, RecordDataImpl &Record)
serialization::SelectorID getSelectorRef(Selector Sel)
Get the unique number used to refer to the given selector.
SmallVector< uint64_t, 64 > RecordData
serialization::TypeID GetOrCreateTypeID(ASTContext &Context, QualType T)
Force a type to be emitted and get its ID.
unsigned getAnonymousDeclarationNumber(const NamedDecl *D)
void AddMacroRef(MacroInfo *MI, const IdentifierInfo *Name, RecordDataImpl &Record)
Emit a reference to a macro.
const LangOptions & getLangOpts() const
void SetSelectorOffset(Selector Sel, uint32_t Offset)
Note that the selector Sel occurs at the given offset within the method pool/selector table.
bool PreparePathForOutput(SmallVectorImpl< char > &Path)
Convert a path from this build process into one that is appropriate for emission in the module file.
void SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset)
Note that the identifier II occurs at the given offset within the identifier table.
void AddDeclRef(const Decl *D, RecordDataImpl &Record)
Emit a reference to a declaration.
void AddStringBlob(StringRef Str, RecordDataImpl &Record, SmallVectorImpl< char > &Blob)
Wrapper for source info for arrays.
SourceLocation getLBracketLoc() const
Expr * getSizeExpr() const
SourceLocation getRBracketLoc() const
SourceLocation getRParenLoc() const
SourceLocation getKWLoc() const
SourceLocation getLParenLoc() const
Attr - This represents one attribute.
attr::Kind getKind() const
SourceLocation getScopeLoc() const
SourceRange getRange() const
const IdentifierInfo * getScopeName() const
bool isRegularKeywordAttribute() const
const IdentifierInfo * getAttrName() const
Kind getParsedKind() const
const Attr * getAttr() const
The type attribute.
SourceLocation getRParenLoc() const
bool isDecltypeAuto() const
bool isConstrained() const
ConceptReference * getConceptReference() const
A simple helper class to pack several bits in order into (a) 32 bit integer(s).
void addBits(uint32_t Value, uint32_t BitsWidth)
SourceLocation getCaretLoc() const
SourceLocation getBuiltinLoc() const
TypeSpecifierType getWrittenTypeSpec() const
TypeSpecifierWidth getWrittenWidthSpec() const
bool needsExtraLocalData() const
TypeSpecifierSign getWrittenSignSpec() const
This class is used for builtin types like 'int'.
Represents a base class of a C++ class.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
unsigned getDeviceLambdaManglingNumber() const
Retrieve the device side mangling number.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
unsigned getODRHash() const
Represents a C++ temporary.
const CXXDestructorDecl * getDestructor() const
Declaration of a class template.
Represents a class template specialization, which refers to a class template with a given set of temp...
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.
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
const DeclarationNameInfo & getConceptNameInfo() const
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
TemplateName getNamedConcept() const
SourceLocation getTemplateKWLoc() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
bool isFileContext() const
DeclContextLookupResult lookup_result
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isLookupContext() const
Test whether the context supports looking up names.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
StoredDeclsMap * buildLookup()
Ensure the lookup structure is fully-built and return it.
lookup_result noload_lookup(DeclarationName Name)
Find the declarations with the given name that are visible within this context; don't attempt to retr...
decl_range noload_decls() const
noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...
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.
bool isFunctionOrMethod() const
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
StoredDeclsMap * getLookupPtr() const
Retrieve the internal representation of the lookup structure.
DeclID getRawValue() const
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
Module * getTopLevelOwningNamedModule() const
Get the top level owning named module that owns this declaration if any.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isInNamedModule() const
Whether this declaration comes from a named module.
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
@ FOK_None
Not a friend object.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isFromExplicitGlobalModule() const
Whether this declaration comes from explicit global module.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
SourceLocation getLocation() const
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 ...
DeclarationNameLoc - Additional source/type location info for a declaration name.
SourceLocation getCXXLiteralOperatorNameLoc() const
Return the location of the literal operator name (without the operator keyword).
TypeSourceInfo * getNamedTypeInfo() const
Returns the source type info.
SourceRange getCXXOperatorNameRange() const
Return the range of the operator name (without the operator keyword).
The name of a declaration.
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
SourceLocation getDecltypeLoc() const
SourceLocation getRParenLoc() const
SourceLocation getElaboratedKeywordLoc() const
SourceLocation getTemplateNameLoc() const
NestedNameSpecifierLoc getQualifierLoc() const
Expr * getAttrExprOperand() const
The attribute's expression operand, if it has one.
SourceRange getAttrOperandParensRange() const
The location of the parentheses around the operand, if there is an operand.
SourceLocation getAttrNameLoc() const
The location of the attribute name, i.e.
NestedNameSpecifierLoc getQualifierLoc() const
SourceLocation getNameLoc() const
SourceLocation getElaboratedKeywordLoc() const
SourceLocation getNameLoc() const
SourceLocation getNameLoc() const
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.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
bool hasUncompilableErrorOccurred() const
Errors that actually prevent compilation, not those that are upgraded from a warning by -Werror.
StringRef getName() const
SourceLocation getElaboratedKeywordLoc() const
SourceLocation getNameLoc() const
NestedNameSpecifierLoc getQualifierLoc() const
This represents one expression.
storage_type getAsOpaqueInt() const
storage_type getAsOpaqueInt() const
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...
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
int getOpaqueValue() const
Returns the raw integer representation of this FileID.
void trackVFSUsage(bool Active)
Enable or disable tracking of VFS usage.
llvm::vfs::FileSystem & getVirtualFileSystem() const
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
FileSystemOptions & getFileSystemOpts()
Returns the current file system options.
bool makeAbsolutePath(SmallVectorImpl< char > &Path, bool Canonicalize=false) const
Makes Path absolute taking into account FileSystemOptions and the working directory option,...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true, bool IsText=true)
Get a FileEntryRef if it exists, without doing anything on error.
OptionalDirectoryEntryRef getOptionalDirectoryRef(StringRef DirName, bool CacheFailure=true)
Get a DirectoryEntryRef if it exists, without doing anything on error.
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.
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
Declaration of a template function.
Wrapper for source info for functions.
unsigned getNumParams() const
ParmVarDecl * getParam(unsigned i) const
SourceLocation getLocalRangeEnd() const
SourceRange getExceptionSpecRange() const
SourceLocation getLocalRangeBegin() const
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool hasChangedSinceDeserialization() const
Determine whether this identifier has changed since it was loaded from an AST file.
bool isCPlusPlusOperatorKeyword() const
bool hasFETokenInfoChangedSinceDeserialization() const
Determine whether the frontend token information for this identifier has changed since it was loaded ...
bool hasMacroDefinition() const
Return true if this identifier is #defined to some other value.
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.
const char * getNameStart() const
Return the beginning of the actual null-terminated string for this identifier.
tok::NotableIdentifierKind getNotableIdentifierID() const
unsigned getObjCOrBuiltinID() const
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
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.
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
iterator end()
Returns the end iterator.
llvm::iterator_range< iterator > decls(DeclarationName Name)
Returns a range of decls with the name 'Name'.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
SourceLocation getAmpLoc() const
Describes the capture of a variable or of this, or of a C++1y init-capture.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
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 ...
Record the location of a macro definition.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
const MacroDirective * getPrevious() const
Get previous definition of the macro with the same name.
const MacroInfo * getMacroInfo() const
SourceLocation getLocation() const
Encapsulates the data about a macro definition (e.g.
bool isUsed() const
Return false if this macro is defined in the main file and has not yet been used.
bool isC99Varargs() const
SourceLocation getDefinitionEndLoc() const
Return the location of the last token in the macro.
ArrayRef< const IdentifierInfo * > params() const
unsigned getNumTokens() const
Return the number of tokens that this macro expands to.
unsigned getNumParams() const
const Token & getReplacementToken(unsigned Tok) const
bool isBuiltinMacro() const
Return true if this macro requires processing before expansion.
SourceLocation getDefinitionLoc() const
Return the location that the macro was defined at.
bool hasCommaPasting() const
bool isObjectLike() const
bool isUsedForHeaderGuard() const
Determine whether this macro was used for a header guard.
bool isGNUVarargs() const
SourceLocation getExpansionLoc() const
Expr * getAttrColumnOperand() const
The attribute's column operand, if it has one.
SourceRange getAttrOperandParensRange() const
The location of the parentheses around the operand, if there is an operand.
SourceLocation getAttrNameLoc() const
The location of the attribute name, i.e.
Expr * getAttrRowOperand() const
The attribute's row operand, if it has one.
NestedNameSpecifierLoc getQualifierLoc() const
SourceLocation getStarLoc() const
The module cache used for compiling modules implicitly.
virtual void writeExtensionContents(Sema &SemaRef, llvm::BitstreamWriter &Stream)=0
Write the contents of the extension block into the given bitstream.
ModuleFileExtension * getExtension() const
Retrieve the module file extension with which this writer is associated.
virtual ModuleFileExtensionMetadata getExtensionMetadata() const =0
Retrieves the metadata for this module file extension.
StringRef str() const
Returns the plain module file name.
Module * findModule(StringRef Name) const
Retrieve an already loaded module with the given name.
void resolveHeaderDirectives(const FileEntry *File) const
Resolve all lazy header directives for the specified file.
ArrayRef< KnownHeader > findResolvedModulesForHeader(FileEntryRef File) const
Like findAllModulesForHeader, but do not attempt to infer module ownership from umbrella headers if w...
FileID getModuleMapFileIDForUniquing(const Module *M) const
Get the module map file that (along with the module name) uniquely identifies this module.
FileID getContainingModuleMapFileID(const Module *Module) const
Retrieve the module map file containing the definition of the given module.
ModuleHeaderRole
Flags describing the role of a module header.
static ModuleHeaderRole headerKindToRole(Module::HeaderKind Kind)
Convert a header kind to a role. Requires Kind to not be HK_Excluded.
Describes a module or submodule.
unsigned IsExplicit
Whether this is an explicit submodule.
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...
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.
Module * Parent
The parent of this module.
ModuleKind Kind
The kind of this module.
bool isUnimportable() const
Determine whether this module has been declared unimportable.
unsigned IsInferred
Whether this is an inferred submodule (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.
llvm::iterator_range< submodule_iterator > submodules()
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.
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.
llvm::SmallSetVector< const Module *, 2 > UndeclaredUses
When NoUndeclaredIncludes is true, the set of modules this module tried to import but didn't because ...
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.
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
ASTFileSignature Signature
The module signature.
ArrayRef< Header > getHeaders(HeaderKind HK) const
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
ArrayRef< FileEntryRef > getTopHeaders(FileManager &FileMgr)
The top-level headers associated with this module.
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
bool isHeaderUnit() const
Is this module a header unit.
unsigned IsFramework
Whether this is a framework module.
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
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.
Linkage getLinkageInternal() const
Determine what kind of linkage this entity has.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
NamespaceAndPrefixLoc getAsNamespaceAndPrefix() const
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
TypeLoc castAsTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
SourceRange getLocalSourceRange() const
Retrieve the source range covering just the last part of this nested-name-specifier,...
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Kind
The kind of specifier that completes this nested name specifier.
@ 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*.
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'allocate' in the 'pragma omp ...' directives.
This represents 'allocator' clause in the 'pragma omp ...' directive.
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.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents the 'depth' clause on the 'pragma omp flatten' (and 'pragma omp fuse') loop-transform...
This represents 'final' clause in the 'pragma omp ...' directive.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
This represents 'if' clause in the 'pragma omp ...' directive.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
Representation of the 'partial' clause of the 'pragma omp unroll' directive.
This class represents the 'permutation' clause in the 'pragma omp interchange' directive.
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.
This represents 'threadset' clause in the 'pragma omp task ...' directive.
ObjCCategoryDecl - Represents a category declaration.
Represents an ObjC class declaration.
filtered_category_iterator< isKnownCategory > known_categories_iterator
Iterator that walks over all of the known categories and extensions, including those that are hidden.
ObjCInterfaceDecl * getDefinition()
Retrieve the definition of this class, or NULL if this class has been forward-declared (with @class) ...
SourceLocation getNameEndLoc() const
SourceLocation getNameLoc() const
SourceLocation getStarLoc() const
bool hasBaseTypeAsWritten() const
SourceLocation getTypeArgsLAngleLoc() const
unsigned getNumTypeArgs() const
unsigned getNumProtocols() const
TypeSourceInfo * getTypeArgTInfo(unsigned i) const
SourceLocation getProtocolRAngleLoc() const
SourceLocation getProtocolLoc(unsigned i) const
SourceLocation getProtocolLAngleLoc() const
SourceLocation getTypeArgsRAngleLoc() const
const VersionTuple & getVersion() const
unsigned getNumProtocols() const
SourceLocation getProtocolLoc(unsigned i) const
SourceLocation getProtocolLAngleLoc() const
SourceLocation getProtocolRAngleLoc() const
Represents a clause with one or more 'var' objects, represented as an expr, as its arguments.
This is the base type for all OpenACC Clauses.
SourceLocation getAttrLoc() const
SourceLocation getEllipsisLoc() const
SourceLocation getEllipsisLoc() const
SourceLocation getRParenLoc() const
SourceLocation getLParenLoc() const
Represents a parameter to a function.
SourceLocation getKWLoc() const
SourceLocation getStarLoc() const
MacroDefinitionRecord * findMacroDefinition(const MacroInfo *MI)
Retrieve the macro definition that corresponds to the given MacroInfo.
const std::vector< SourceRange > & getSkippedRanges()
Retrieve all ranges that got skipped while preprocessing.
iterator local_begin()
Begin iterator for local, non-loaded, preprocessed entities.
iterator local_end()
End iterator for local, non-loaded, preprocessed entities.
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
bool WriteCommentListToPCH
Whether to write comment locations into the PCH when building it.
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
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 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.
ArrayRef< ModuleMacro * > getLeafModuleMacros(const IdentifierInfo *II) const
Get the list of leaf (non-overridden) module macros for a name.
ArrayRef< PPConditionalInfo > getPreambleConditionalStack() const
bool isRecordingPreamble() const
MacroDirective * getLocalMacroDirectiveHistory(const IdentifierInfo *II) const
Given an identifier, return the latest non-imported macro directive for that identifier.
bool SawDateOrTime() const
Returns true if the preprocessor has seen a use of DATE or TIME in the file so far.
SourceManager & getSourceManager() const
std::optional< PreambleSkipInfo > getPreambleSkipInfo() const
bool hasRecordedPreamble() const
const TargetInfo & getTargetInfo() const
FileManager & getFileManager() const
bool alreadyIncluded(FileEntryRef File) const
Return true if this header has already been included.
FileID getPredefinesFileID() const
Returns the FileID for the preprocessor predefines.
HeaderSearch & getHeaderSearchInfo() const
SmallVector< SourceLocation, 64 > serializeSafeBufferOptOutMap() const
IdentifierTable & getIdentifierTable()
const PreprocessorOptions & getPreprocessorOpts() const
Retrieve the preprocessor options used to initialize this preprocessor.
const LangOptions & getLangOpts() const
PreprocessingRecord * getPreprocessingRecord() const
Retrieve the preprocessing record, or NULL if there is no preprocessing record.
DiagnosticsEngine & getDiagnostics() const
uint32_t getCounterValue() const
SourceLocation getPreambleRecordedPragmaAssumeNonNullLoc() const
Get the location of the recorded unterminated #pragma clang assume_nonnull begin in the preamble,...
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const
Forwarding function for diagnostics.
A (possibly-)qualified type.
Wrapper of type source information for a type with non-trivial direct qualifiers.
SourceLocation getAmpAmpLoc() const
Represents a struct/union/class.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Smart pointer class that efficiently represents Objective-C method names.
const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
void * getAsOpaquePtr() const
unsigned getNumArgs() const
void updateOutOfDateSelector(Selector Sel)
llvm::MapVector< Selector, SourceLocation > ReferencedSelectors
Method selectors used in a @selector expression.
GlobalMethodPool MethodPool
Method Pool - allows efficient lookup when typechecking messages to "id".
ArrayRef< const OMPRequiresDecl * > getRequiresDecls() const
The 'requires' directives seen so far in this translation unit.
bool DeclareAndesVectorBuiltins
Indicate RISC-V Andes vector builtin functions enabled or not.
bool DeclareSiFiveVectorBuiltins
Indicate RISC-V SiFive vector builtin functions enabled or not.
bool DeclareRVVBuiltins
Indicate RISC-V vector builtin functions enabled or not.
static uint32_t getRawEncoding(const AlignPackInfo &Info)
Sema - This implements semantic analysis and AST building for C.
DelegatingCtorDeclsType DelegatingCtorDecls
All the delegating constructors seen so far in the file, used for cycle detection at the end of the T...
Preprocessor & getPreprocessor() const
PragmaStack< FPOptionsOverride > FpPragmaStack
ExtVectorDeclsType ExtVectorDecls
ExtVectorDecls - This is a list all the extended vector types.
SourceLocation getOptimizeOffPragmaLocation() const
Get the location for the currently active "\#pragma clang optimizeoff". If this location is invalid,...
FPOptionsOverride CurFPFeatureOverrides()
LateParsedTemplateMapT LateParsedTemplateMap
UnusedFileScopedDeclsType UnusedFileScopedDecls
The set of file scoped decls seen so far that have not been used and must warn if not used.
SmallVector< const Decl * > DeclsWithEffectsToVerify
All functions/lambdas/blocks which have bodies and which have a non-empty FunctionEffectsRef to be ve...
EnumDecl * getStdAlignValT() const
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
SmallVector< VTableUse, 16 > VTableUses
The list of vtables that are required but have not yet been materialized.
llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > LateParsedTemplateMapT
CXXRecordDecl * getStdBadAlloc() const
SourceLocation ImplicitMSInheritanceAttrLoc
Source location for newly created implicit MSInheritanceAttrs.
llvm::DenseMap< CXXRecordDecl *, bool > VTablesUsed
The set of classes whose vtables have been used within this translation unit, and a bit that will be ...
PragmaStack< AlignPackInfo > AlignPackStack
llvm::SmallSetVector< Decl *, 4 > DeclsToCheckForDeferredDiags
Function or variable declarations to be checked for whether the deferred diagnostics should be emitte...
llvm::MapVector< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations
The queue of implicit template instantiations that are required and must be performed within the curr...
void getUndefinedButUsed(SmallVectorImpl< std::pair< NamedDecl *, SourceLocation > > &Undefined)
Obtain a sorted list of functions that are undefined but ODR-used.
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
const llvm::MapVector< FieldDecl *, DeleteLocs > & getMismatchingDeleteExpressions() const
Retrieves list of suspicious delete-expressions that will be checked at the end of translation unit.
OpenCLOptions & getOpenCLOptions()
NamespaceDecl * getStdNamespace() const
LangOptions::PragmaMSPointersToMembersKind MSPointerToMemberRepresentationMethod
Controls member pointer representation format under the MS ABI.
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
void getSortedUnusedLocalTypedefNameCandidates(SmallVectorImpl< const TypedefNameDecl * > &Sorted) const
Store UnusedLocalTypedefNameCandidates in Sorted in a deterministic order.
IdentifierResolver IdResolver
A delta encoder for a run of source locations.
static RawLocEncoding encode(SourceLocation Loc, UIntTy BaseOffset, unsigned BaseModuleFileIndex)
Encodes a location in the source.
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.
FileIDAndOffset getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
DiagnosticsEngine & getDiagnostics() const
SourceLocation::UIntTy getNextLocalOffset() const
bool isLocalSourceLocation(SourceLocation Loc) const
Returns true if Loc did not come from a PCH/Module.
OptionalFileEntryRef getFileEntryRefForID(FileID FID) const
Returns the FileEntryRef for the provided FileID.
const SrcMgr::SLocEntry & getLocalSLocEntry(unsigned Index) const
Get a local SLocEntry. This is exposed for indexing.
FileManager & getFileManager() const
unsigned local_sloc_entry_size() const
Get the number of local SLocEntries we have.
SourceLocation getLocForEndOfFile(FileID FID) const
Return the source location corresponding to the last byte of the specified file.
FileID getMainFileID() const
Returns the FileID of the main source file.
unsigned getFileIDSize(FileID FID) const
The size of the SLocEntry that FID represents.
bool hasLineTable() const
Determine if the source manager has a line table.
bool isLoadedFileID(FileID FID) const
Returns true if FID came from a PCH/Module.
const FileEntry * getFileEntryForID(FileID FID) const
Returns the FileEntry record for the provided FileID.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
SourceLocation getFileLoc(SourceLocation Loc, unsigned MaxDepth=std::numeric_limits< unsigned >::max()) const
Given Loc, if it is a macro location return the expansion location or the spelling location,...
LineTableInfo & getLineTable()
Retrieve the stored line table.
const SrcMgr::SLocEntry & getSLocEntry(FileID FID, bool *Invalid=nullptr) const
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
OptionalFileEntryRef ContentsEntry
References the file which the contents were actually loaded from.
unsigned IsTransient
True if this file may be transient, that is, if it might not exist at some later point in time when t...
std::optional< llvm::MemoryBufferRef > getBufferOrNone(DiagnosticsEngine &Diag, FileManager &FM, SourceLocation Loc=SourceLocation()) const
Returns the memory buffer for the associated content.
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.
SourceLocation getExpansionLocStart() const
bool isExpansionTokenRange() const
SourceLocation getSpellingLoc() const
bool isMacroArgExpansion() const
SourceLocation getExpansionLocEnd() const
const ContentCache & getContentCache() const
This is a discriminated union of FileInfo and ExpansionInfo.
SourceLocation::UIntTy getOffset() const
const FileInfo & getFile() const
const ExpansionInfo & getExpansion() const
An array of decls optimized for the common case of only containing one entry.
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
SourceLocation getNameLoc() const
SourceLocation getElaboratedKeywordLoc() const
NestedNameSpecifierLoc getQualifierLoc() const
TargetOptions & getTargetOpts() const
Retrieve the target options.
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 template argument list.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
Location wrapper for a TemplateArgument.
SourceLocation getTemplateEllipsisLoc() const
TemplateArgumentLocInfo getLocInfo() const
const TemplateArgument & getArgument() const
SourceLocation getTemplateNameLoc() const
SourceLocation getTemplateKWLoc() const
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
@ 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.
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
SourceLocation getTemplateLoc() const
unsigned getNumArgs() const
SourceLocation getLAngleLoc() const
TemplateArgumentLoc getArgLoc(unsigned i) const
SourceLocation getRAngleLoc() const
SourceLocation getTemplateNameLoc() const
SourceLocation getTemplateKeywordLoc() const
NestedNameSpecifierLoc getQualifierLoc() const
SourceLocation getElaboratedKeywordLoc() const
Token - This structure provides full information about a lexed token.
The top declaration context.
NamespaceDecl * getAnonymousNamespace() const
Base wrapper for a particular "section" of type source info.
QualType getType() const
Get the type for which this source info wrapper provides information.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
TypeSourceInfo * getUnmodifiedTInfo() const
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
SourceLocation getNameLoc() const
TypeClass getTypeClass() const
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
SourceLocation getTypeofLoc() const
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.
const APValue * getEvaluatedValue() const
Return the already-evaluated value of this variable's initializer, or nullptr if the value is not yet...
bool hasInitWithSideEffects() const
Checks whether this declaration has an initializer with side effects.
EvaluatedStmt * getEvaluatedStmt() const
const Expr * getInit() const
Declaration of a variable template.
Represents a variable template specialization, which refers to a variable template with a given set o...
SourceLocation getNameLoc() const
SourceLocation getLocation() const
Retrieve the location at which this variable was captured.
SourceLocation getEllipsisLoc() const
Retrieve the source location of the ellipsis, whose presence indicates that the capture is a pack exp...
OverloadedOperatorKind getOperatorKind() const
IdentifierInfo * getIdentifier() const
Selector getSelector() const
Information about a module that has been loaded by the ASTReader.
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
unsigned LocalNumSubmodules
The number of submodules in this module.
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
unsigned Index
The index of this module in the list of modules.
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
ModuleFileName FileName
The file name of the module file.
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.
A type index; the type ID with the qualifier bits removed.
uint32_t getModuleFileIndex() const
TypeID asTypeID(unsigned FastQuals) const
uint64_t getValue() const
SmallVector< LazySpecializationInfo, 4 > data_type
The lookup result is a list of global declaration IDs.
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
TypeCode
Record codes for each kind of type.
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_NULL_ID
The NULL type.
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
@ CTOR_INITIALIZER_MEMBER
@ CTOR_INITIALIZER_DELEGATING
@ CTOR_INITIALIZER_INDIRECT_MEMBER
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_NAMESPACE
A NamespaceDecl record.
@ DECL_NON_TYPE_TEMPLATE_PARM
A NonTypeTemplateParmDecl record.
@ DECL_FUNCTION
A FunctionDecl record.
@ DECL_USING_DIRECTIVE
A UsingDirecitveDecl record.
@ DECL_RECORD
A RecordDecl record.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_BLOCK
A BlockDecl record.
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
@ DECL_VAR
A VarDecl record.
@ DECL_USING
A UsingDecl record.
@ DECL_OBJC_PROTOCOL
A ObjCProtocolDecl record.
@ DECL_TEMPLATE_TYPE_PARM
A TemplateTypeParmDecl record.
@ DECL_VAR_TEMPLATE_SPECIALIZATION
A VarTemplateSpecializationDecl record.
@ DECL_OBJC_IMPLEMENTATION
A ObjCImplementationDecl record.
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
@ DECL_FRIEND_TEMPLATE
A FriendTemplateDecl record.
@ DECL_PRAGMA_DETECT_MISMATCH
A PragmaDetectMismatchDecl record.
@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.
@ DECL_OBJC_AT_DEFS_FIELD
A ObjCAtDefsFieldDecl record.
@ DECL_IMPLICIT_PARAM
An ImplicitParamDecl record.
@ DECL_FRIEND
A FriendDecl record.
@ DECL_CXX_METHOD
A CXXMethodDecl record.
@ DECL_EXPORT
An ExportDecl record.
@ DECL_PRAGMA_COMMENT
A PragmaCommentDecl record.
@ DECL_ENUM
An EnumDecl record.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_OMP_DECLARE_REDUCTION
An OMPDeclareReductionDecl record.
@ DECL_OMP_THREADPRIVATE
An OMPThreadPrivateDecl record.
@ DECL_OBJC_METHOD
A ObjCMethodDecl record.
@ DECL_CXX_DESTRUCTOR
A CXXDestructorDecl record.
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
@ DECL_USING_SHADOW
A UsingShadowDecl record.
@ DECL_CONCEPT
A ConceptDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
@ TYPE_EXT_QUAL
An ExtQualType record.
@ EXPR_DESIGNATED_INIT
A DesignatedInitExpr record.
@ EXPR_COMPOUND_LITERAL
A CompoundLiteralExpr record.
@ EXPR_OBJC_IVAR_REF_EXPR
An ObjCIvarRefExpr record.
@ EXPR_MEMBER
A MemberExpr record.
@ EXPR_CXX_TEMPORARY_OBJECT
A CXXTemporaryObjectExpr record.
@ EXPR_CXX_UNRESOLVED_LOOKUP
@ EXPR_COMPOUND_ASSIGN_OPERATOR
A CompoundAssignOperator record.
@ EXPR_EXPR_WITH_CLEANUPS
@ EXPR_CXX_STATIC_CAST
A CXXStaticCastExpr record.
@ EXPR_OBJC_STRING_LITERAL
An ObjCStringLiteral record.
@ EXPR_VA_ARG
A VAArgExpr record.
@ EXPR_CXX_OPERATOR_CALL
A CXXOperatorCallExpr record.
@ STMT_OBJC_AT_TRY
An ObjCAtTryStmt record.
@ EXPR_CXX_UNRESOLVED_CONSTRUCT
@ EXPR_FIXEDPOINT_LITERAL
@ STMT_DO
A DoStmt record.
@ STMT_OBJC_CATCH
An ObjCAtCatchStmt record.
@ STMT_IF
An IfStmt record.
@ EXPR_CXX_EXPRESSION_TRAIT
@ EXPR_STRING_LITERAL
A StringLiteral record.
@ EXPR_IMPLICIT_CAST
An ImplicitCastExpr record.
@ STMT_GCCASM
A GCC-style AsmStmt record.
@ EXPR_IMAGINARY_LITERAL
An ImaginaryLiteral record.
@ STMT_WHILE
A WhileStmt record.
@ EXPR_STMT
A StmtExpr record.
@ EXPR_CXX_REINTERPRET_CAST
A CXXReinterpretCastExpr record.
@ EXPR_DESIGNATED_INIT_UPDATE
A DesignatedInitUpdateExpr record.
@ STMT_OBJC_AT_SYNCHRONIZED
An ObjCAtSynchronizedStmt record.
@ EXPR_CXX_PSEUDO_DESTRUCTOR
@ EXPR_CHARACTER_LITERAL
A CharacterLiteral record.
@ EXPR_OBJC_ENCODE
An ObjCEncodeExpr record.
@ EXPR_CSTYLE_CAST
A CStyleCastExpr record.
@ EXPR_OBJC_BOXED_EXPRESSION
@ EXPR_OBJC_BOOL_LITERAL
An ObjCBoolLiteralExpr record.
@ EXPR_CXX_BIND_TEMPORARY
@ EXPR_EXT_VECTOR_ELEMENT
An ExtVectorElementExpr record.
@ STMT_RETURN
A ReturnStmt record.
@ STMT_OBJC_FOR_COLLECTION
An ObjCForCollectionStmt record.
@ STMT_CONTINUE
A ContinueStmt record.
@ EXPR_PREDEFINED
A PredefinedExpr record.
@ EXPR_CXX_BOOL_LITERAL
A CXXBoolLiteralExpr record.
@ EXPR_PAREN_LIST
A ParenListExpr record.
@ EXPR_CXX_PAREN_LIST_INIT
A CXXParenListInitExpr record.
@ STMT_COMPOUND
A CompoundStmt record.
@ STMT_FOR
A ForStmt record.
@ STMT_ATTRIBUTED
An AttributedStmt record.
@ EXPR_CXX_REWRITTEN_BINARY_OPERATOR
A CXXRewrittenBinaryOperator record.
@ STMT_GOTO
A GotoStmt record.
@ EXPR_NO_INIT
An NoInitExpr record.
@ EXPR_OBJC_ARRAY_LITERAL
@ EXPR_OBJC_PROTOCOL_EXPR
An ObjCProtocolExpr record.
@ EXPR_CXX_CONSTRUCT
A CXXConstructExpr record.
@ EXPR_OBJC_DICTIONARY_LITERAL
@ EXPR_CXX_DYNAMIC_CAST
A CXXDynamicCastExpr record.
@ STMT_CXX_TRY
A CXXTryStmt record.
@ EXPR_GENERIC_SELECTION
A GenericSelectionExpr record.
@ EXPR_CALL
A CallExpr record.
@ EXPR_GNU_NULL
A GNUNullExpr record.
@ EXPR_BINARY_CONDITIONAL_OPERATOR
@ EXPR_OBJC_PROPERTY_REF_EXPR
An ObjCPropertyRefExpr record.
@ EXPR_CXX_CONST_CAST
A CXXConstCastExpr record.
@ STMT_REF_PTR
A reference to a previously [de]serialized Stmt record.
@ EXPR_OBJC_MESSAGE_EXPR
An ObjCMessageExpr record.
@ EXPR_CXX_DEPENDENT_SCOPE_DECL_REF
@ STMT_CASE
A CaseStmt record.
@ EXPR_FUNCTION_PARM_PACK
@ STMT_STOP
A marker record that indicates that we are at the end of an expression.
@ EXPR_CXX_NULL_PTR_LITERAL
@ STMT_MSASM
A MS-style AsmStmt record.
@ EXPR_CONDITIONAL_OPERATOR
A ConditionOperator record.
@ EXPR_BINARY_OPERATOR
A BinaryOperator record.
@ EXPR_CXX_STD_INITIALIZER_LIST
A CXXStdInitializerListExpr record.
@ EXPR_SHUFFLE_VECTOR
A ShuffleVectorExpr record.
@ STMT_OBJC_FINALLY
An ObjCAtFinallyStmt record.
@ EXPR_OBJC_SELECTOR_EXPR
An ObjCSelectorExpr record.
@ EXPR_FLOATING_LITERAL
A FloatingLiteral record.
@ EXPR_CXX_DEPENDENT_SCOPE_MEMBER
@ STMT_NULL_PTR
A NULL expression.
@ STMT_DEFAULT
A DefaultStmt record.
@ EXPR_CHOOSE
A ChooseExpr record.
@ STMT_NULL
A NullStmt record.
@ EXPR_DECL_REF
A DeclRefExpr record.
@ EXPR_SUBST_NON_TYPE_TEMPLATE_PARM
@ EXPR_INIT_LIST
An InitListExpr record.
@ EXPR_IMPLICIT_VALUE_INIT
An ImplicitValueInitExpr record.
@ EXPR_PAREN
A ParenExpr record.
@ EXPR_DEPENDENT_TEMPLATE_ID
@ STMT_LABEL
A LabelStmt record.
@ EXPR_CXX_FUNCTIONAL_CAST
A CXXFunctionalCastExpr record.
@ EXPR_USER_DEFINED_LITERAL
A UserDefinedLiteral record.
@ EXPR_INTEGER_LITERAL
An IntegerLiteral record.
@ EXPR_MATERIALIZE_TEMPORARY
@ EXPR_CXX_MEMBER_CALL
A CXXMemberCallExpr record.
@ STMT_SWITCH
A SwitchStmt record.
@ STMT_DECL
A DeclStmt record.
@ EXPR_CXX_UNRESOLVED_MEMBER
@ EXPR_OBJC_KVC_REF_EXPR
UNUSED.
@ EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK
@ EXPR_CXX_SCALAR_VALUE_INIT
@ EXPR_SIZEOF_ALIGN_OF
A SizefAlignOfExpr record.
@ STMT_BREAK
A BreakStmt record.
@ STMT_OBJC_AT_THROW
An ObjCAtThrowStmt record.
@ EXPR_ADDR_LABEL
An AddrLabelExpr record.
@ STMT_CXX_FOR_RANGE
A CXXForRangeStmt record.
@ EXPR_CXX_ADDRSPACE_CAST
A CXXAddrspaceCastExpr record.
@ EXPR_ARRAY_SUBSCRIPT
An ArraySubscriptExpr record.
@ EXPR_UNARY_OPERATOR
A UnaryOperator record.
@ STMT_CXX_CATCH
A CXXCatchStmt record.
@ STMT_INDIRECT_GOTO
An IndirectGotoStmt record.
Defines the clang::TargetInfo interface.
bool isSystem(CharacteristicKind CK)
Determine whether a file / directory characteristic is for system code.
bool isModuleMap(CharacteristicKind CK)
Determine whether a file characteristic is for a module map.
bool LE(InterpState &S, CodePtr OpPC)
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.
GlobalDeclID LazySpecializationInfo
@ EXTENSION_METADATA
Metadata describing this particular extension.
@ SUBMODULE_EXCLUDED_HEADER
Specifies a header that has been explicitly excluded from this submodule.
@ SUBMODULE_TOPHEADER
Specifies a top-level header that falls into this (sub)module.
@ SUBMODULE_PRIVATE_TEXTUAL_HEADER
Specifies a header that is private to this submodule but must be textually included.
@ SUBMODULE_HEADER
Specifies a header that falls into this (sub)module.
@ SUBMODULE_EXPORT_AS
Specifies the name of the module that will eventually re-export the entities in this module.
@ SUBMODULE_UMBRELLA_DIR
Specifies an umbrella directory.
@ SUBMODULE_UMBRELLA_HEADER
Specifies the umbrella header used to create this module, if any.
@ SUBMODULE_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.
TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT)
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
@ 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.
@ 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.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
const unsigned VERSION_MINOR
AST file minor version number supported by this version of Clang.
@ 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.
@ 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.
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
@ MODULE_DIRECTORY_DEPENDENCIES
Record code for the directories this AST file depends on the listing of.
@ 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 ...
@ 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...
@ 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.
@ INPUT_FILE_HASH
The input file content hash.
@ INPUT_FILE
An input file.
const DeclContext * getDefinitiveDeclContext(const DeclContext *DC)
Retrieve the "definitive" declaration that provides all of the visible entries for the given declarat...
uint64_t TypeID
An ID number that refers to a type in an AST file.
@ 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.
@ MK_PrebuiltModule
File is from a prebuilt module path.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
@ 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.
@ OMP_REQUIRES_DECLS
Record code for the OpenMP 'requires' directives seen in the TU.
@ 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.
@ OPENCL_EXTENSION_DECLS
Record code for declarations associated with OpenCL extensions.
@ 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.
@ OPENCL_EXTENSION_TYPES
Record code for types associated with OpenCL extensions.
@ 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...
@ METADATA_OLD_FORMAT
This is so that older clang versions, before the introduction of the control block,...
@ 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)
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
Top level wrappers for InstallAPI frontend operations.
@ NUM_OVERLOADED_OPERATORS
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
@ 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.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
IdentifierLoc DeviceTypeArgument
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ 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.
@ 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_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.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
bool CanElideDeclDef(const Decl *D)
If we can elide the definition of.
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
U cast(CodeGen::Address addr)
@ Class
The "class" keyword introduces the elaborated-type-specifier.
UnsignedOrNone getPrimaryModuleHash(const Module *M)
Calculate a hash value for the primary module name of the given module.
Diagnostic wrappers for TextAPI types for error reporting.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __builtin_riscv_mqwacc_i64 __packed_splat4 uint16_t
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __builtin_riscv_mqwacc_i64 uint8_t
The signature of a module, which is a hash of the AST content.
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>".
SourceLocation RAngleLoc
The source location of the right angle bracket ('>').
const TemplateArgumentLoc * getTemplateArgs() const
Retrieve the template arguments.
SourceLocation LAngleLoc
The source location of the left angle bracket ('<').
unsigned NumTemplateArgs
The number of template arguments in TemplateArgs.
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
const DeclarationNameLoc & getInfo() const
Structure used to store a statement, the constant value to which it was evaluated (if any),...
FPOptions FPO
Floating-point options in the point of definition.
Decl * D
The template function declaration to be late parsed.
NestedNameSpecifierLoc Prefix
ObjCMethodDecl * getMethod() 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.
Location information for a TemplateArgument.
TypeSourceInfo * getAsTypeSourceInfo() const
uint64_t ModuleLocalOffset
MultiOnDiskHashTable< ASTDeclContextNameLookupTrait > Table
MultiOnDiskHashTable< LazySpecializationInfoLookupTrait > Table
MultiOnDiskHashTable< ModuleLocalNameLookupTrait > Table