82#include "llvm/ADT/APFloat.h"
83#include "llvm/ADT/APInt.h"
84#include "llvm/ADT/ArrayRef.h"
85#include "llvm/ADT/DenseMap.h"
86#include "llvm/ADT/DenseSet.h"
87#include "llvm/ADT/PointerIntPair.h"
88#include "llvm/ADT/STLExtras.h"
89#include "llvm/ADT/ScopeExit.h"
90#include "llvm/ADT/SmallPtrSet.h"
91#include "llvm/ADT/SmallString.h"
92#include "llvm/ADT/SmallVector.h"
93#include "llvm/ADT/StringRef.h"
94#include "llvm/Bitstream/BitCodes.h"
95#include "llvm/Bitstream/BitstreamWriter.h"
96#include "llvm/Support/Compression.h"
97#include "llvm/Support/DJB.h"
98#include "llvm/Support/EndianStream.h"
99#include "llvm/Support/ErrorHandling.h"
100#include "llvm/Support/LEB128.h"
101#include "llvm/Support/MemoryBuffer.h"
102#include "llvm/Support/OnDiskHashTable.h"
103#include "llvm/Support/Path.h"
104#include "llvm/Support/SHA1.h"
105#include "llvm/Support/TimeProfiler.h"
106#include "llvm/Support/VersionTuple.h"
107#include "llvm/Support/raw_ostream.h"
122using namespace clang;
125template <
typename T,
typename Allocator>
126static StringRef
bytes(
const std::vector<T, Allocator> &v) {
127 if (v.empty())
return StringRef();
128 return StringRef(
reinterpret_cast<const char*
>(&v[0]),
129 sizeof(T) * v.size());
134 return StringRef(
reinterpret_cast<const char*
>(v.data()),
135 sizeof(T) * v.size());
138static std::string
bytes(
const std::vector<bool> &
V) {
140 Str.reserve(
V.size() / 8);
141 for (
unsigned I = 0, E =
V.size(); I < E;) {
143 for (
unsigned Bit = 0; Bit < 8 && I < E; ++Bit, ++I)
156#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \
157 case Type::CLASS_ID: return TYPE_##CODE_ID;
158#include "clang/Serialization/TypeBitCodes.def"
160 llvm_unreachable(
"shouldn't be serializing a builtin type this way");
162 llvm_unreachable(
"bad type kind");
167struct AffectingModuleMaps {
168 llvm::DenseSet<FileID> DefinitionFileIDs;
169 llvm::DenseSet<const FileEntry *> DefinitionFiles;
172std::optional<AffectingModuleMaps>
185 enum AffectedReason :
bool {
186 AR_TextualHeader = 0,
187 AR_ImportOrTextualHeader = 1,
189 auto AssignMostImportant = [](AffectedReason &LHS, AffectedReason RHS) {
190 LHS = std::max(LHS, RHS);
192 llvm::DenseMap<FileID, AffectedReason> ModuleMaps;
193 llvm::DenseMap<const Module *, AffectedReason> ProcessedModules;
194 auto CollectModuleMapsForHierarchy = [&](
const Module *M,
195 AffectedReason Reason) {
201 if (
auto [It, Inserted] = ProcessedModules.insert({M, Reason});
202 !Inserted && Reason <= It->second) {
208 std::queue<const Module *> Q;
211 const Module *Mod = Q.front();
217 AssignMostImportant(ModuleMaps[F], Reason);
222 AssignMostImportant(ModuleMaps[UniqF], Reason);
231 CollectModuleMapsForHierarchy(RootModule, AR_ImportOrTextualHeader);
233 std::queue<const Module *> Q;
236 const Module *CurrentModule = Q.front();
240 CollectModuleMapsForHierarchy(ImportedModule, AR_ImportOrTextualHeader);
242 CollectModuleMapsForHierarchy(UndeclaredModule, AR_ImportOrTextualHeader);
256 for (
unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
270 if (
const Module *M = KH.getModule())
271 CollectModuleMapsForHierarchy(M, AR_TextualHeader);
292 llvm::DenseSet<const FileEntry *> ModuleFileEntries;
293 llvm::DenseSet<FileID> ModuleFileIDs;
294 for (
auto [FID, Reason] : ModuleMaps) {
295 if (Reason == AR_ImportOrTextualHeader)
296 ModuleFileIDs.insert(FID);
297 if (
auto *FE =
SM.getFileEntryForID(FID))
298 ModuleFileEntries.insert(FE);
301 AffectingModuleMaps
R;
302 R.DefinitionFileIDs = std::move(ModuleFileIDs);
303 R.DefinitionFiles = std::move(ModuleFileEntries);
310 ASTRecordWriter BasicWriter;
313 ASTTypeWriter(ASTContext &Context, ASTWriter &Writer)
314 : Writer(Writer), BasicWriter(Context, Writer, Record) {}
320 BasicWriter.writeQualifiers(Qs);
321 return BasicWriter.Emit(
TYPE_EXT_QUAL, Writer.getTypeExtQualAbbrev());
325 serialization::AbstractTypeWriter<ASTRecordWriter> atw(BasicWriter);
333 ASTRecordWriter &Record;
335 void addSourceLocation(SourceLocation Loc) { Record.AddSourceLocation(Loc); }
336 void addSourceRange(SourceRange Range) { Record.AddSourceRange(Range); }
339 TypeLocWriter(ASTRecordWriter &Record) : Record(Record) {}
341#define ABSTRACT_TYPELOC(CLASS, PARENT)
342#define TYPELOC(CLASS, PARENT) \
343 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc);
344#include "clang/AST/TypeLocNodes.def"
357void TypeLocWriter::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
367void TypeLocWriter::VisitComplexTypeLoc(ComplexTypeLoc TL) {
371void TypeLocWriter::VisitPointerTypeLoc(PointerTypeLoc TL) {
375void TypeLocWriter::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
379void TypeLocWriter::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
383void TypeLocWriter::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
387void TypeLocWriter::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
391void TypeLocWriter::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
395void TypeLocWriter::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
399void TypeLocWriter::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
404void TypeLocWriter::VisitArrayTypeLoc(ArrayTypeLoc TL) {
412void TypeLocWriter::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) {
413 VisitArrayTypeLoc(TL);
416void TypeLocWriter::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) {
417 VisitArrayTypeLoc(TL);
420void TypeLocWriter::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
421 VisitArrayTypeLoc(TL);
424void TypeLocWriter::VisitDependentSizedArrayTypeLoc(
425 DependentSizedArrayTypeLoc TL) {
426 VisitArrayTypeLoc(TL);
429void TypeLocWriter::VisitDependentAddressSpaceTypeLoc(
430 DependentAddressSpaceTypeLoc TL) {
433 addSourceLocation(
range.getBegin());
434 addSourceLocation(
range.getEnd());
438void TypeLocWriter::VisitDependentSizedExtVectorTypeLoc(
439 DependentSizedExtVectorTypeLoc TL) {
443void TypeLocWriter::VisitVectorTypeLoc(VectorTypeLoc TL) {
447void TypeLocWriter::VisitDependentVectorTypeLoc(
448 DependentVectorTypeLoc TL) {
452void TypeLocWriter::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
456void TypeLocWriter::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
459 addSourceLocation(
range.getBegin());
460 addSourceLocation(
range.getEnd());
465void TypeLocWriter::VisitDependentSizedMatrixTypeLoc(
466 DependentSizedMatrixTypeLoc TL) {
469 addSourceLocation(
range.getBegin());
470 addSourceLocation(
range.getEnd());
475void TypeLocWriter::VisitFunctionTypeLoc(FunctionTypeLoc TL) {
481 for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i)
485void TypeLocWriter::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) {
486 VisitFunctionTypeLoc(TL);
489void TypeLocWriter::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) {
490 VisitFunctionTypeLoc(TL);
493void TypeLocWriter::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
499void TypeLocWriter::VisitUsingTypeLoc(UsingTypeLoc TL) {
505void TypeLocWriter::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
511void TypeLocWriter::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
520void TypeLocWriter::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
526void TypeLocWriter::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
533void TypeLocWriter::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
538void TypeLocWriter::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
561void TypeLocWriter::VisitAutoTypeLoc(
AutoTypeLoc TL) {
566 Record.AddConceptReference(CR);
572void TypeLocWriter::VisitDeducedTemplateSpecializationTypeLoc(
573 DeducedTemplateSpecializationTypeLoc TL) {
579void TypeLocWriter::VisitTagTypeLoc(TagTypeLoc TL) {
585void TypeLocWriter::VisitRecordTypeLoc(RecordTypeLoc TL) {
589void TypeLocWriter::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
593void TypeLocWriter::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
595void TypeLocWriter::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
599void TypeLocWriter::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
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)
890void ASTWriter::WriteBlockInfoBlock() {
892 Stream.EnterBlockInfoBlock();
894#define BLOCK(X) EmitBlockID(X ## _ID, #X, Stream, Record)
895#define RECORD(X) EmitRecordID(X, #X, Stream, Record)
898 BLOCK(CONTROL_BLOCK);
908 BLOCK(OPTIONS_BLOCK);
916 BLOCK(INPUT_FILES_BLOCK);
984 BLOCK(SOURCE_MANAGER_BLOCK);
992 BLOCK(PREPROCESSOR_BLOCK);
1000 BLOCK(SUBMODULE_BLOCK);
1023 BLOCK(COMMENTS_BLOCK);
1027 BLOCK(DECLTYPES_BLOCK);
1031 RECORD(TYPE_BLOCK_POINTER);
1032 RECORD(TYPE_LVALUE_REFERENCE);
1033 RECORD(TYPE_RVALUE_REFERENCE);
1034 RECORD(TYPE_MEMBER_POINTER);
1035 RECORD(TYPE_CONSTANT_ARRAY);
1036 RECORD(TYPE_INCOMPLETE_ARRAY);
1037 RECORD(TYPE_VARIABLE_ARRAY);
1040 RECORD(TYPE_FUNCTION_NO_PROTO);
1041 RECORD(TYPE_FUNCTION_PROTO);
1043 RECORD(TYPE_TYPEOF_EXPR);
1047 RECORD(TYPE_OBJC_INTERFACE);
1048 RECORD(TYPE_OBJC_OBJECT_POINTER);
1050 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM);
1051 RECORD(TYPE_UNRESOLVED_USING);
1052 RECORD(TYPE_INJECTED_CLASS_NAME);
1053 RECORD(TYPE_OBJC_OBJECT);
1054 RECORD(TYPE_TEMPLATE_TYPE_PARM);
1055 RECORD(TYPE_TEMPLATE_SPECIALIZATION);
1056 RECORD(TYPE_DEPENDENT_NAME);
1057 RECORD(TYPE_DEPENDENT_SIZED_ARRAY);
1059 RECORD(TYPE_MACRO_QUALIFIED);
1060 RECORD(TYPE_PACK_EXPANSION);
1062 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK);
1063 RECORD(TYPE_SUBST_BUILTIN_TEMPLATE_PACK);
1065 RECORD(TYPE_UNARY_TRANSFORM);
1069 RECORD(TYPE_OBJC_TYPE_PARAM);
1150 BLOCK(PREPROCESSOR_DETAIL_BLOCK);
1156 BLOCK(EXTENSION_BLOCK);
1159 BLOCK(UNHASHED_CONTROL_BLOCK);
1185 assert(Filename &&
"No file name to adjust?");
1187 if (BaseDir.empty())
1192 for (; Filename[Pos] && Pos < BaseDir.size(); ++Pos)
1193 if (Filename[Pos] != BaseDir[Pos])
1202 if (!llvm::sys::path::is_separator(Filename[Pos])) {
1203 if (!llvm::sys::path::is_separator(BaseDir.back()))
1217 return Filename + Pos;
1220std::pair<ASTFileSignature, ASTFileSignature>
1221ASTWriter::createSignature()
const {
1222 StringRef AllBytes(Buffer.data(), Buffer.size());
1225 Hasher.update(AllBytes.slice(ASTBlockRange.first, ASTBlockRange.second));
1230 Hasher.update(AllBytes.slice(0, UnhashedControlBlockRange.first));
1233 AllBytes.slice(UnhashedControlBlockRange.second, ASTBlockRange.first));
1235 Hasher.update(AllBytes.substr(ASTBlockRange.second));
1238 return std::make_pair(ASTBlockHash, Signature);
1241ASTFileSignature ASTWriter::createSignatureForNamedModule()
const {
1243 Hasher.update(StringRef(Buffer.data(), Buffer.size()));
1245 assert(WritingModule);
1246 assert(WritingModule->isNamedModule());
1250 for (
auto [ExportImported, _] : WritingModule->Exports)
1251 Hasher.update(ExportImported->Signature);
1275 for (
Module *M : TouchedTopLevelModules)
1283 for (uint8_t Byte : S) {
1284 Stream.BackpatchByte(BitNo, Byte);
1289ASTFileSignature ASTWriter::backpatchSignature() {
1290 if (isWritingStdCXXNamedModules()) {
1291 ASTFileSignature Signature = createSignatureForNamedModule();
1296 if (!WritingModule ||
1301 ASTFileSignature ASTBlockHash;
1302 ASTFileSignature Signature;
1303 std::tie(ASTBlockHash, Signature) = createSignature();
1311void ASTWriter::writeUnhashedControlBlock(Preprocessor &PP) {
1312 using namespace llvm;
1315 Stream.FlushToWord();
1316 UnhashedControlBlockRange.first = Stream.GetCurrentBitNo() >> 3;
1324 if (isWritingStdCXXNamedModules() ||
1335 SmallString<128> Blob{Dummy.begin(), Dummy.end()};
1338 if (!isWritingStdCXXNamedModules()) {
1339 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1341 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1342 unsigned ASTBlockHashAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1345 Stream.EmitRecordWithBlob(ASTBlockHashAbbrev,
Record, Blob);
1346 ASTBlockHashOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1350 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1351 Abbrev->Add(BitCodeAbbrevOp(
SIGNATURE));
1352 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1353 unsigned SignatureAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1356 Stream.EmitRecordWithBlob(SignatureAbbrev,
Record, Blob);
1357 SignatureOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1366 if (!HSOpts.ModulesSkipDiagnosticOptions) {
1367#define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name);
1368#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
1369 Record.push_back(static_cast<unsigned>(DiagOpts.get##Name()));
1370#include "clang/Basic/DiagnosticOptions.def"
1372 for (
unsigned I = 0, N = DiagOpts.
Warnings.size(); I != N; ++I)
1375 for (
unsigned I = 0, N = DiagOpts.
Remarks.size(); I != N; ++I)
1384 if (!HSOpts.ModulesSkipHeaderSearchPaths) {
1386 Record.push_back(HSOpts.UserEntries.size());
1387 for (
unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) {
1388 const HeaderSearchOptions::Entry &Entry = HSOpts.UserEntries[I];
1390 Record.push_back(
static_cast<unsigned>(Entry.
Group));
1396 Record.push_back(HSOpts.SystemHeaderPrefixes.size());
1397 for (
unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) {
1398 AddString(HSOpts.SystemHeaderPrefixes[I].Prefix,
Record);
1399 Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader);
1403 Record.push_back(HSOpts.VFSOverlayFiles.size());
1404 for (StringRef VFSOverlayFile : HSOpts.VFSOverlayFiles)
1405 AddString(VFSOverlayFile,
Record);
1410 if (!HSOpts.ModulesSkipPragmaDiagnosticMappings)
1411 WritePragmaDiagnosticMappings(Diags, WritingModule);
1416 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1418 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1419 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1420 unsigned HSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1422 HSEntryUsage.size()};
1423 Stream.EmitRecordWithBlob(HSUsageAbbrevCode,
Record,
bytes(HSEntryUsage));
1429 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1430 Abbrev->Add(BitCodeAbbrevOp(
VFS_USAGE));
1431 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1432 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1433 unsigned VFSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1435 Stream.EmitRecordWithBlob(VFSUsageAbbrevCode,
Record,
bytes(VFSUsage));
1440 UnhashedControlBlockRange.second = Stream.GetCurrentBitNo() >> 3;
1444void ASTWriter::WriteControlBlock(Preprocessor &PP, StringRef isysroot) {
1445 using namespace llvm;
1454 auto MetadataAbbrev = std::make_shared<BitCodeAbbrev>();
1455 MetadataAbbrev->Add(BitCodeAbbrevOp(
METADATA));
1456 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1457 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1458 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1459 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1460 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1462 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1463 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1464 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1465 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1466 unsigned MetadataAbbrevCode = Stream.EmitAbbrev(std::move(MetadataAbbrev));
1467 assert((!WritingModule || isysroot.empty()) &&
1468 "writing module as a relocatable PCH?");
1473 CLANG_VERSION_MAJOR,
1474 CLANG_VERSION_MINOR,
1476 isWritingStdCXXNamedModules(),
1478 ASTHasCompilerErrors};
1479 Stream.EmitRecordWithBlob(MetadataAbbrevCode,
Record,
1483 if (WritingModule) {
1485 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1487 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1488 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1490 Stream.EmitRecordWithBlob(AbbrevCode,
Record, WritingModule->Name);
1492 auto BaseDir = [&]() -> std::optional<SmallString<128>> {
1498 if (WritingModule->Directory) {
1499 return WritingModule->Directory->getName();
1501 return std::nullopt;
1513 WritingModule->Directory->getName() !=
".")) {
1515 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1517 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1518 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1521 Stream.EmitRecordWithBlob(AbbrevCode,
Record, *BaseDir);
1525 BaseDirectory.assign(BaseDir->begin(), BaseDir->end());
1527 }
else if (!isysroot.empty()) {
1529 SmallString<128> CleanedSysroot(isysroot);
1531 BaseDirectory.assign(CleanedSysroot.begin(), CleanedSysroot.end());
1535 if (WritingModule && WritingModule->Kind == Module::ModuleMapModule) {
1539 AddPath(WritingModule->PresumedModuleMapFile.empty()
1540 ? Map.getModuleMapFileForUniquing(WritingModule)
1541 ->getNameAsRequested()
1542 : StringRef(WritingModule->PresumedModuleMapFile),
1546 if (
auto *AdditionalModMaps =
1547 Map.getAdditionalModuleMapFiles(WritingModule)) {
1548 Record.push_back(AdditionalModMaps->size());
1549 SmallVector<FileEntryRef, 1> ModMaps(AdditionalModMaps->begin(),
1550 AdditionalModMaps->end());
1551 llvm::sort(ModMaps, [](FileEntryRef A, FileEntryRef B) {
1554 for (FileEntryRef F : ModMaps)
1555 AddPath(F.getName(),
Record);
1565 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1566 Abbrev->Add(BitCodeAbbrevOp(
IMPORT));
1567 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
1568 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1569 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1570 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1571 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1572 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1573 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1574 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1575 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1576 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1578 SmallString<128> Blob;
1580 for (ModuleFile &M : Chain->getModuleManager()) {
1582 if (!M.isDirectlyImported())
1590 AddSourceLocation(M.ImportLoc,
Record);
1591 AddStringBlob(M.ModuleName,
Record, Blob);
1592 Record.push_back(M.StandardCXXModule);
1596 if (M.StandardCXXModule) {
1609 Record.push_back(M.FileName.getImplicitModuleSuffixLength());
1610 AddPathBlob(M.FileName,
Record, Blob);
1613 Stream.EmitRecordWithBlob(AbbrevCode,
Record, Blob);
1623#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
1624 Record.push_back(LangOpts.Name);
1625#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
1626 Record.push_back(static_cast<unsigned>(LangOpts.get##Name()));
1627#include "clang/Basic/LangOptions.def"
1628#define SANITIZER(NAME, ID) \
1629 Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID));
1630#include "clang/Basic/Sanitizers.def"
1651 AddString(T.getTriple(),
Record);
1659 using CK = CodeGenOptions::CompatibilityKind;
1661 const CodeGenOptions &CGOpts = getCodeGenOpts();
1662#define CODEGENOPT(Name, Bits, Default, Compatibility) \
1663 if constexpr (CK::Compatibility != CK::Benign) \
1664 Record.push_back(static_cast<unsigned>(CGOpts.Name));
1665#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
1666 if constexpr (CK::Compatibility != CK::Benign) \
1667 Record.push_back(static_cast<unsigned>(CGOpts.get##Name()));
1668#define DEBUGOPT(Name, Bits, Default, Compatibility)
1669#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
1670#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
1671#include "clang/Basic/CodeGenOptions.def"
1687 for (
unsigned I = 0, N = TargetOpts.
Features.size(); I != N; ++I) {
1700 const HeaderSearchOptions &HSOpts =
1703 StringRef HSOpts_ModuleCachePath =
1708 AddString(HSOpts_ModuleCachePath,
Record);
1729 bool WriteMacros = !SkipMacros;
1730 Record.push_back(WriteMacros);
1734 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
1742 for (
unsigned I = 0, N = PPOpts.
Includes.size(); I != N; ++I)
1747 for (
unsigned I = 0, N = PPOpts.
MacroIncludes.size(); I != N; ++I)
1768 auto FileAbbrev = std::make_shared<BitCodeAbbrev>();
1770 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1771 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1772 unsigned FileAbbrevCode = Stream.EmitAbbrev(std::move(FileAbbrev));
1777 EmitRecordWithPath(FileAbbrevCode,
Record, MainFile->getName());
1784 WriteInputFiles(SourceMgr);
1791struct InputFileEntry {
1795 bool BufferOverridden;
1802 void trySetContentHash(
1804 llvm::function_ref<std::optional<llvm::MemoryBufferRef>()> GetMemBuff) {
1813 auto MemBuff = GetMemBuff();
1815 PP.
Diag(SourceLocation(), diag::err_module_unable_to_hash_content)
1820 uint64_t Hash = xxh3_64bits(MemBuff->getBuffer());
1822 ContentHash[1] =
uint32_t(Hash >> 32);
1828SourceLocation ASTWriter::getAffectingIncludeLoc(
const SourceManager &SourceMgr,
1829 const SrcMgr::FileInfo &
File) {
1830 SourceLocation IncludeLoc =
File.getIncludeLoc();
1832 FileID IncludeFID = SourceMgr.
getFileID(IncludeLoc);
1833 assert(IncludeFID.
isValid() &&
"IncludeLoc in invalid file");
1834 if (!IsSLocAffecting[IncludeFID.ID])
1835 IncludeLoc = SourceLocation();
1840void ASTWriter::WriteInputFiles(SourceManager &SourceMgr) {
1841 using namespace llvm;
1846 auto IFAbbrev = std::make_shared<BitCodeAbbrev>();
1848 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1849 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12));
1850 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
1851 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1852 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1853 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1854 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1855 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
1856 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1857 unsigned IFAbbrevCode = Stream.EmitAbbrev(std::move(IFAbbrev));
1860 auto IFHAbbrev = std::make_shared<BitCodeAbbrev>();
1862 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1863 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1864 unsigned IFHAbbrevCode = Stream.EmitAbbrev(std::move(IFHAbbrev));
1866 uint64_t InputFilesOffsetBase = Stream.GetCurrentBitNo();
1870 std::vector<InputFileEntry> SystemFiles;
1874 assert(&SourceMgr.
getSLocEntry(FileID::get(I)) == SLoc);
1881 if (!
Cache->OrigEntry)
1885 if (!IsSLocFileEntryAffecting[I])
1888 InputFileEntry Entry(*
Cache->OrigEntry);
1889 Entry.IsSystemFile =
isSystem(
File.getFileCharacteristic());
1890 Entry.IsTransient =
Cache->IsTransient;
1891 Entry.BufferOverridden =
Cache->BufferOverridden;
1893 FileID IncludeFileID = SourceMgr.
getFileID(
File.getIncludeLoc());
1894 Entry.IsTopLevel = IncludeFileID.
isInvalid() || IncludeFileID.ID < 0 ||
1895 !IsSLocFileEntryAffecting[IncludeFileID.ID];
1898 Entry.trySetContentHash(*PP, [&] {
return Cache->getBufferIfLoaded(); });
1900 if (Entry.IsSystemFile)
1901 SystemFiles.push_back(Entry);
1910 if (!Sysroot.empty()) {
1911 SmallString<128> SDKSettingsJSON = Sysroot;
1912 llvm::sys::path::append(SDKSettingsJSON,
"SDKSettings.json");
1915 InputFileEntry Entry(*FE);
1916 Entry.IsSystemFile =
true;
1917 Entry.IsTransient =
false;
1918 Entry.BufferOverridden =
false;
1919 Entry.IsTopLevel =
true;
1920 Entry.IsModuleMap =
false;
1921 std::unique_ptr<MemoryBuffer> MB;
1922 Entry.trySetContentHash(*PP, [&]() -> std::optional<MemoryBufferRef> {
1924 MB = std::move(*MBOrErr);
1925 return MB->getMemBufferRef();
1927 return std::nullopt;
1929 SystemFiles.push_back(Entry);
1934 auto SortedFiles = llvm::concat<InputFileEntry>(std::move(
UserFiles),
1935 std::move(SystemFiles));
1937 unsigned UserFilesNum = 0;
1939 std::vector<uint64_t> InputFileOffsets;
1940 for (
const auto &Entry : SortedFiles) {
1941 uint32_t &InputFileID = InputFileIDs[Entry.File];
1942 if (InputFileID != 0)
1946 InputFileOffsets.push_back(Stream.GetCurrentBitNo() - InputFilesOffsetBase);
1948 InputFileID = InputFileOffsets.size();
1950 if (!Entry.IsSystemFile)
1956 SmallString<128> NameAsRequested = Entry.File.getNameAsRequested();
1957 SmallString<128> Name = Entry.File.getName();
1959 PreparePathForOutput(NameAsRequested);
1960 PreparePathForOutput(Name);
1962 if (Name == NameAsRequested)
1965 RecordData::value_type
Record[] = {
1967 InputFileOffsets.size(),
1969 (
uint64_t)getTimestampForOutput(Entry.File.getModificationTime()),
1970 Entry.BufferOverridden,
1974 NameAsRequested.size()};
1976 Stream.EmitRecordWithBlob(IFAbbrevCode,
Record,
1977 (NameAsRequested + Name).str());
1983 Entry.ContentHash[1]};
1984 Stream.EmitRecordWithAbbrev(IFHAbbrevCode,
Record);
1991 auto OffsetsAbbrev = std::make_shared<BitCodeAbbrev>();
1993 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1994 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1996 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1997 unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(std::move(OffsetsAbbrev));
2001 InputFileOffsets.size(), UserFilesNum};
2002 Stream.EmitRecordWithBlob(OffsetsAbbrevCode,
Record,
bytes(InputFileOffsets));
2012 using namespace llvm;
2014 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2016 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2017 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2018 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2019 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2021 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2022 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2023 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24));
2024 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2025 return Stream.EmitAbbrev(std::move(Abbrev));
2031 using namespace llvm;
2033 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2035 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2036 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2037 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2038 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2039 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2040 return Stream.EmitAbbrev(std::move(Abbrev));
2047 using namespace llvm;
2049 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2053 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2054 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2055 return Stream.EmitAbbrev(std::move(Abbrev));
2061 using namespace llvm;
2063 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2065 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2066 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2067 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2068 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2069 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2070 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2071 return Stream.EmitAbbrev(std::move(Abbrev));
2076static std::pair<unsigned, unsigned>
2078 llvm::encodeULEB128(KeyLen, Out);
2079 llvm::encodeULEB128(DataLen, Out);
2080 return std::make_pair(KeyLen, DataLen);
2086 class HeaderFileInfoTrait {
2090 HeaderFileInfoTrait(ASTWriter &Writer) : Writer(Writer) {}
2097 using key_type_ref =
const key_type &;
2099 using UnresolvedModule =
2100 llvm::PointerIntPair<Module *, 2, ModuleMap::ModuleHeaderRole>;
2103 data_type(
const HeaderFileInfo &HFI,
bool AlreadyIncluded,
2104 ArrayRef<ModuleMap::KnownHeader> KnownHeaders,
2106 : HFI(HFI), AlreadyIncluded(AlreadyIncluded),
2110 bool AlreadyIncluded;
2111 SmallVector<ModuleMap::KnownHeader, 1> KnownHeaders;
2114 using data_type_ref =
const data_type &;
2116 using hash_value_type = unsigned;
2117 using offset_type = unsigned;
2123 uint8_t buf[
sizeof(key.Size) +
sizeof(key.ModTime)];
2124 memcpy(buf, &key.Size,
sizeof(key.Size));
2125 memcpy(buf +
sizeof(key.Size), &key.ModTime,
sizeof(key.ModTime));
2126 return llvm::xxh3_64bits(buf);
2129 std::pair<unsigned, unsigned>
2130 EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref
Data) {
2131 unsigned KeyLen = key.Filename.size() + 1 + 8 + 8;
2133 for (
auto ModInfo :
Data.KnownHeaders)
2136 if (
Data.Unresolved.getPointer())
2141 void EmitKey(raw_ostream& Out, key_type_ref key,
unsigned KeyLen) {
2142 using namespace llvm::support;
2144 endian::Writer
LE(Out, llvm::endianness::little);
2149 Out.write(key.Filename.data(), KeyLen);
2152 void EmitData(raw_ostream &Out, key_type_ref key,
2153 data_type_ref
Data,
unsigned DataLen) {
2154 using namespace llvm::support;
2156 endian::Writer
LE(Out, llvm::endianness::little);
2159 unsigned char Flags = (
Data.AlreadyIncluded << 6)
2160 | (
Data.HFI.isImport << 5)
2162 Data.HFI.isPragmaOnce << 4)
2163 | (
Data.HFI.DirInfo << 1);
2164 LE.write<uint8_t>(Flags);
2166 if (
Data.HFI.LazyControllingMacro.isID())
2175 assert((
Value >> 3) == ModID &&
"overflow in header module info");
2180 for (
auto ModInfo :
Data.KnownHeaders)
2181 EmitModule(ModInfo.getModule(), ModInfo.getRole());
2182 if (
Data.Unresolved.getPointer())
2183 EmitModule(
Data.Unresolved.getPointer(),
Data.Unresolved.getInt());
2185 assert(
Out.tell() - Start == DataLen &&
"Wrong data length");
2194void ASTWriter::WriteHeaderSearch(
const HeaderSearch &HS) {
2195 HeaderFileInfoTrait GeneratorTrait(*
this);
2196 llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait>
Generator;
2197 SmallVector<const char *, 4> SavedStrings;
2198 unsigned NumHeaderSearchEntries = 0;
2204 const HeaderFileInfo
Empty;
2205 if (WritingModule) {
2206 llvm::SmallVector<Module *, 16> Worklist(1, WritingModule);
2207 while (!Worklist.empty()) {
2208 Module *M = Worklist.pop_back_val();
2225 if (!U.Size || (!U.ModTime && IncludeTimestamps)) {
2226 PP->
Diag(U.FileNameLoc, diag::err_module_no_size_mtime_for_header)
2227 << WritingModule->getFullModuleName() << U.Size.has_value()
2234 llvm::sys::path::append(Filename, U.FileName);
2235 PreparePathForOutput(Filename);
2237 StringRef FilenameDup = strdup(Filename.c_str());
2238 SavedStrings.push_back(FilenameDup.data());
2240 HeaderFileInfoTrait::key_type Key = {
2241 FilenameDup, *U.Size, IncludeTimestamps ? *U.ModTime : 0};
2242 HeaderFileInfoTrait::data_type
Data = {
2247 ++NumHeaderSearchEntries;
2250 Worklist.append(SubmodulesRange.begin(), SubmodulesRange.end());
2254 SmallVector<OptionalFileEntryRef, 16> FilesByUID;
2260 for (
unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
2274 StringRef Filename =
File->getName();
2275 SmallString<128> FilenameTmp(Filename);
2276 if (PreparePathForOutput(FilenameTmp)) {
2279 Filename = StringRef(strdup(FilenameTmp.c_str()));
2280 SavedStrings.push_back(Filename.data());
2285 HeaderFileInfoTrait::key_type Key = {
2286 Filename,
File->getSize(),
2287 getTimestampForOutput(
File->getModificationTime())};
2288 HeaderFileInfoTrait::data_type
Data = {
2292 ++NumHeaderSearchEntries;
2296 SmallString<4096> TableData;
2299 using namespace llvm::support;
2301 llvm::raw_svector_ostream
Out(TableData);
2303 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
2304 BucketOffset =
Generator.Emit(Out, GeneratorTrait);
2308 using namespace llvm;
2310 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2312 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2313 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2314 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2315 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2316 unsigned TableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2320 NumHeaderSearchEntries, TableData.size()};
2321 Stream.EmitRecordWithBlob(TableAbbrev,
Record, TableData);
2324 for (
unsigned I = 0, N = SavedStrings.size(); I != N; ++I)
2325 free(
const_cast<char *
>(SavedStrings[I]));
2328static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob,
2329 unsigned SLocBufferBlobCompressedAbbrv,
2330 unsigned SLocBufferBlobAbbrv) {
2331 using RecordDataType = ASTWriter::RecordData::value_type;
2336 if (llvm::compression::zstd::isAvailable()) {
2337 llvm::compression::zstd::compress(
2338 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer, 9);
2340 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2341 llvm::toStringRef(CompressedBuffer));
2344 if (llvm::compression::zlib::isAvailable()) {
2345 llvm::compression::zlib::compress(
2346 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer);
2348 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2349 llvm::toStringRef(CompressedBuffer));
2354 Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv,
Record, Blob);
2365void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr) {
2370 const uint64_t SourceManagerBlockOffset = Stream.GetCurrentBitNo();
2376 unsigned SLocBufferBlobCompressedAbbrv =
2382 std::vector<uint32_t> SLocEntryOffsets;
2383 uint64_t SLocEntryOffsetsBase = Stream.GetCurrentBitNo();
2389 FileID FID = FileID::get(I);
2393 uint64_t Offset = Stream.GetCurrentBitNo() - SLocEntryOffsetsBase;
2394 assert((Offset >> 32) == 0 &&
"SLocEntry offset too large");
2400 if (
Cache->OrigEntry) {
2413 if (!IsSLocAffecting[I])
2415 SLocEntryOffsets.push_back(Offset);
2418 AddSourceLocation(getAffectingIncludeLoc(SourceMgr,
File),
Record);
2419 Record.push_back(
File.getFileCharacteristic());
2422 bool EmitBlob =
false;
2425 "Writing to AST an overridden file is not supported");
2428 assert(InputFileIDs[*Content->
OrigEntry] != 0 &&
"Missed file entry");
2431 Record.push_back(getAdjustedNumCreatedFIDs(FID));
2433 FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);
2434 if (FDI != FileDeclIDs.end()) {
2435 Record.push_back(FDI->second->FirstDeclIndex);
2436 Record.push_back(FDI->second->DeclIDs.size());
2442 Stream.EmitRecordWithAbbrev(SLocFileAbbrv,
Record);
2453 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2455 StringRef Name = Buffer ? Buffer->getBufferIdentifier() :
"";
2456 Stream.EmitRecordWithBlob(SLocBufferAbbrv,
Record,
2457 StringRef(Name.data(), Name.size() + 1));
2464 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2467 Buffer = llvm::MemoryBufferRef(
"<<<INVALID BUFFER>>>",
"");
2468 StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1);
2469 emitBlob(Stream, Blob, SLocBufferBlobCompressedAbbrv,
2470 SLocBufferBlobAbbrv);
2474 const SrcMgr::ExpansionInfo &Expansion = SLoc->
getExpansion();
2475 SLocEntryOffsets.push_back(Offset);
2490 Record.push_back(getAdjustedOffset(NextOffset - SLoc->
getOffset()) - 1);
2491 Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv,
Record);
2497 if (SLocEntryOffsets.empty())
2502 using namespace llvm;
2504 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2506 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2507 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2508 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2509 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2510 unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2512 RecordData::value_type
Record[] = {
2515 SLocEntryOffsetsBase - SourceManagerBlockOffset};
2516 Stream.EmitRecordWithBlob(SLocOffsetsAbbrev,
Record,
2517 bytes(SLocEntryOffsets));
2528 llvm::DenseMap<int, int> FilenameMap;
2529 FilenameMap[-1] = -1;
2530 for (
const auto &L : LineTable) {
2533 for (
auto &LE : L.second) {
2534 if (FilenameMap.insert(std::make_pair(
LE.FilenameID,
2535 FilenameMap.size() - 1)).second)
2536 AddPath(LineTable.getFilename(
LE.FilenameID),
Record);
2542 for (
const auto &L : LineTable) {
2547 AddFileID(L.first,
Record);
2550 Record.push_back(L.second.size());
2551 for (
const auto &LE : L.second) {
2554 Record.push_back(FilenameMap[
LE.FilenameID]);
2555 Record.push_back((
unsigned)
LE.FileKind);
2556 Record.push_back(
LE.IncludeOffset);
2571 if (MI->isBuiltinMacro())
2587void ASTWriter::WritePreprocessor(
const Preprocessor &PP,
bool IsModule) {
2588 uint64_t MacroOffsetsBase = Stream.GetCurrentBitNo();
2592 WritePreprocessorDetail(*PPRec, MacroOffsetsBase);
2595 RecordData ModuleMacroRecord;
2605 SourceLocation AssumeNonNullLoc =
2607 if (AssumeNonNullLoc.
isValid()) {
2609 AddSourceLocation(AssumeNonNullLoc,
Record);
2619 AddSourceLocation(SkipInfo->HashTokenLoc,
Record);
2620 AddSourceLocation(SkipInfo->IfTokenLoc,
Record);
2621 Record.push_back(SkipInfo->FoundNonSkipPortion);
2622 Record.push_back(SkipInfo->FoundElse);
2623 AddSourceLocation(SkipInfo->ElseLoc,
Record);
2639 AddSourceLocation(S,
Record);
2649 PP.
Diag(SourceLocation(), diag::warn_module_uses_date_time) << IsModule;
2656 SmallVector<const IdentifierInfo *, 128> MacroIdentifiers;
2659 if (!isWritingStdCXXNamedModules())
2661 if (Id.second->hadMacroDefinition() &&
2662 (!Id.second->isFromAST() ||
2663 Id.second->hasChangedSinceDeserialization()))
2664 MacroIdentifiers.push_back(Id.second);
2667 llvm::sort(MacroIdentifiers, llvm::deref<std::less<>>());
2671 for (
const IdentifierInfo *Name : MacroIdentifiers) {
2673 uint64_t StartOffset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2674 assert((StartOffset >> 32) == 0 &&
"Macro identifiers offset too large");
2677 bool EmittedModuleMacros =
false;
2685 if (IsModule && WritingModule->isHeaderUnit()) {
2694 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2695 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2696 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2697 Record.push_back(VisMD->isPublic());
2699 ModuleMacroRecord.push_back(getSubmoduleID(WritingModule));
2700 AddMacroRef(MD->
getMacroInfo(), Name, ModuleMacroRecord);
2702 ModuleMacroRecord.clear();
2703 EmittedModuleMacros =
true;
2713 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2714 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2715 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2716 Record.push_back(VisMD->isPublic());
2722 SmallVector<ModuleMacro *, 8> Worklist(Leafs);
2723 llvm::DenseMap<ModuleMacro *, unsigned> Visits;
2724 while (!Worklist.empty()) {
2725 auto *
Macro = Worklist.pop_back_val();
2728 ModuleMacroRecord.push_back(getSubmoduleID(
Macro->getOwningModule()));
2729 AddMacroRef(
Macro->getMacroInfo(), Name, ModuleMacroRecord);
2730 for (
auto *M :
Macro->overrides())
2731 ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));
2734 ModuleMacroRecord.clear();
2737 for (
auto *M :
Macro->overrides())
2738 if (++Visits[M] == M->getNumOverridingMacros())
2739 Worklist.push_back(M);
2741 EmittedModuleMacros =
true;
2744 if (
Record.empty() && !EmittedModuleMacros)
2747 IdentMacroDirectivesOffsetMap[Name] = StartOffset;
2758 std::vector<uint32_t> MacroOffsets;
2760 for (
unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {
2761 const IdentifierInfo *Name = MacroInfosToEmit[I].Name;
2762 MacroInfo *MI = MacroInfosToEmit[I].MI;
2765 if (ID < FirstMacroID) {
2766 assert(0 &&
"Loaded MacroInfo entered MacroInfosToEmit ?");
2771 unsigned Index =
ID - FirstMacroID;
2772 if (Index >= MacroOffsets.size())
2773 MacroOffsets.resize(Index + 1);
2775 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2776 assert((Offset >> 32) == 0 &&
"Macro offset too large");
2777 MacroOffsets[Index] = Offset;
2779 AddIdentifierRef(Name,
Record);
2795 for (
const IdentifierInfo *Param : MI->
params())
2796 AddIdentifierRef(Param,
Record);
2804 Stream.EmitRecord(Code,
Record);
2808 for (
unsigned TokNo = 0, e = MI->
getNumTokens(); TokNo != e; ++TokNo) {
2823 using namespace llvm;
2825 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2827 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2828 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2829 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2831 unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2834 MacroOffsetsBase - ASTBlockStartOffset};
2835 Stream.EmitRecordWithBlob(MacroOffsetAbbrev,
Record,
bytes(MacroOffsets));
2839void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec,
2840 uint64_t MacroOffsetsBase) {
2844 SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets;
2850 unsigned NumPreprocessingRecords = 0;
2851 using namespace llvm;
2854 unsigned InclusionAbbrev = 0;
2856 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2858 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2859 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2860 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));
2861 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2862 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2863 InclusionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2867 unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
2869 for (PreprocessingRecord::iterator E = PPRec.
local_begin(),
2872 (
void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {
2875 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2876 assert((Offset >> 32) == 0 &&
"Preprocessed entity offset too large");
2877 SourceRange
R = getAdjustedRange((*E)->getSourceRange());
2878 PreprocessedEntityOffsets.emplace_back(
2879 getRawSourceLocationEncoding(
R.getBegin()),
2880 getRawSourceLocationEncoding(
R.getEnd()), Offset);
2882 if (
auto *MD = dyn_cast<MacroDefinitionRecord>(*E)) {
2884 MacroDefinitions[MD] = NextPreprocessorEntityID;
2886 AddIdentifierRef(MD->getName(),
Record);
2891 if (
auto *ME = dyn_cast<MacroExpansion>(*E)) {
2892 Record.push_back(ME->isBuiltinMacro());
2893 if (ME->isBuiltinMacro())
2894 AddIdentifierRef(ME->getName(),
Record);
2896 Record.push_back(MacroDefinitions[ME->getDefinition()]);
2901 if (
auto *ID = dyn_cast<InclusionDirective>(*E)) {
2903 Record.push_back(
ID->getFileName().size());
2904 Record.push_back(
ID->wasInQuotes());
2905 Record.push_back(
static_cast<unsigned>(
ID->getKind()));
2906 Record.push_back(
ID->importedModule());
2907 SmallString<64> Buffer;
2908 Buffer +=
ID->getFileName();
2912 Buffer +=
ID->getFile()->getName();
2913 Stream.EmitRecordWithBlob(InclusionAbbrev,
Record, Buffer);
2917 llvm_unreachable(
"Unhandled PreprocessedEntity in ASTWriter");
2922 if (NumPreprocessingRecords > 0) {
2923 assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);
2926 using namespace llvm;
2928 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2930 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2931 unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2934 Stream.EmitRecordWithBlob(PPEOffsetAbbrev,
Record,
2935 bytes(PreprocessedEntityOffsets));
2940 if (SkippedRanges.size() > 0) {
2941 std::vector<PPSkippedRange> SerializedSkippedRanges;
2942 SerializedSkippedRanges.reserve(SkippedRanges.size());
2943 for (
auto const& Range : SkippedRanges)
2944 SerializedSkippedRanges.emplace_back(
2945 getRawSourceLocationEncoding(
Range.getBegin()),
2946 getRawSourceLocationEncoding(
Range.getEnd()));
2948 using namespace llvm;
2949 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2951 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2952 unsigned PPESkippedRangeAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2956 Stream.EmitRecordWithBlob(PPESkippedRangeAbbrev,
Record,
2957 bytes(SerializedSkippedRanges));
2965 auto Known = SubmoduleIDs.find(Mod);
2966 if (Known != SubmoduleIDs.end())
2967 return Known->second;
2970 if (Top != WritingModule &&
2972 !Top->fullModuleNameIs(StringRef(
getLangOpts().CurrentModule))))
2975 return SubmoduleIDs[Mod] = NextSubmoduleID++;
2978unsigned ASTWriter::getSubmoduleID(
Module *Mod) {
2979 unsigned ID = getLocalOrImportedSubmoduleID(Mod);
2988void ASTWriter::WriteSubmodules(
Module *WritingModule,
ASTContext *Context) {
2993 using namespace llvm;
2995 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2997 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2998 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2999 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4));
3000 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3001 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));
3002 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3003 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3004 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3005 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3006 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3007 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3008 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3009 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3010 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3011 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3012 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3013 unsigned DefinitionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3015 Abbrev = std::make_shared<BitCodeAbbrev>();
3017 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3018 unsigned UmbrellaAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3020 Abbrev = std::make_shared<BitCodeAbbrev>();
3022 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3023 unsigned HeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3025 Abbrev = std::make_shared<BitCodeAbbrev>();
3027 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3028 unsigned TopHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3030 Abbrev = std::make_shared<BitCodeAbbrev>();
3032 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3033 unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3035 Abbrev = std::make_shared<BitCodeAbbrev>();
3037 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3038 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3039 unsigned RequiresAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3041 Abbrev = std::make_shared<BitCodeAbbrev>();
3043 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3044 unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3046 Abbrev = std::make_shared<BitCodeAbbrev>();
3048 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3049 unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3051 Abbrev = std::make_shared<BitCodeAbbrev>();
3053 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3054 unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3056 Abbrev = std::make_shared<BitCodeAbbrev>();
3058 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3059 unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3061 Abbrev = std::make_shared<BitCodeAbbrev>();
3063 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3064 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3065 unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3067 Abbrev = std::make_shared<BitCodeAbbrev>();
3069 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3070 unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3072 Abbrev = std::make_shared<BitCodeAbbrev>();
3074 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3075 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3076 unsigned ConflictAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3078 Abbrev = std::make_shared<BitCodeAbbrev>();
3080 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3081 unsigned ExportAsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3083 Abbrev = std::make_shared<BitCodeAbbrev>();
3085 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3086 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3087 unsigned ChildAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3090 uint64_t SubmoduleOffsetBase = Stream.GetCurrentBitNo();
3092 unsigned TopLevelID = getSubmoduleID(WritingModule);
3095 std::queue<Module *> Q;
3096 Q.push(WritingModule);
3097 while (!Q.empty()) {
3100 unsigned ID = getSubmoduleID(Mod);
3101 if (ID < FirstSubmoduleID) {
3102 assert(0 &&
"Loaded submodule entered WritingModule ?");
3107 unsigned Index =
ID - FirstSubmoduleID;
3108 if (Index >= SubmoduleOffsets.size())
3109 SubmoduleOffsets.resize(Index + 1);
3111 uint64_t Offset = Stream.GetCurrentBitNo() - SubmoduleOffsetBase;
3112 assert((Offset >> 32) == 0 &&
"Submodule offset too large");
3113 SubmoduleOffsets[Index] = Offset;
3117 assert(SubmoduleIDs[Mod->
Parent] &&
"Submodule parent not written?");
3118 ParentID = SubmoduleIDs[Mod->
Parent];
3122 getRawSourceLocationEncoding(getAdjustedLocation(Mod->
DefinitionLoc));
3125 FileID UnadjustedInferredFID;
3128 int InferredFID = getAdjustedFileID(UnadjustedInferredFID).getOpaqueValue();
3135 (RecordData::value_type)Mod->
Kind,
3137 (RecordData::value_type)InferredFID,
3148 Stream.EmitRecordWithBlob(DefinitionAbbrev,
Record, Mod->
Name);
3154 Stream.EmitRecordWithBlob(RequiresAbbrev,
Record,
R.FeatureName);
3158 if (std::optional<Module::Header> UmbrellaHeader =
3161 Stream.EmitRecordWithBlob(UmbrellaAbbrev,
Record,
3162 UmbrellaHeader->NameAsWritten);
3163 }
else if (std::optional<Module::DirectoryName> UmbrellaDir =
3166 Stream.EmitRecordWithBlob(UmbrellaDirAbbrev,
Record,
3167 UmbrellaDir->NameAsWritten);
3172 unsigned RecordKind;
3174 Module::HeaderKind HeaderKind;
3180 Module::HK_PrivateTextual},
3183 for (
const auto &HL : HeaderLists) {
3184 RecordData::value_type
Record[] = {HL.RecordKind};
3185 for (
const auto &H : Mod->
getHeaders(HL.HeaderKind))
3186 Stream.EmitRecordWithBlob(HL.Abbrev,
Record, H.NameAsWritten);
3193 SmallString<128> HeaderName(H.getName());
3194 PreparePathForOutput(HeaderName);
3195 Stream.EmitRecordWithBlob(TopHeaderAbbrev,
Record, HeaderName);
3203 Record.push_back(getSubmoduleID(I));
3211 Record.push_back(getSubmoduleID(I));
3218 for (
const auto &E : Mod->
Exports) {
3221 Record.push_back(getSubmoduleID(E.first));
3222 Record.push_back(E.second);
3237 Stream.EmitRecordWithBlob(LinkLibraryAbbrev,
Record, LL.Library);
3245 getSubmoduleID(
C.Other)};
3246 Stream.EmitRecordWithBlob(ConflictAbbrev,
Record,
C.Message);
3252 Stream.EmitRecordWithBlob(ConfigMacroAbbrev,
Record, CM);
3257 if (Context && !GeneratingReducedBMI) {
3260 if (wasDeclEmitted(D))
3261 AddDeclRef(D,
Inits);
3276 getSubmoduleID(Child)};
3277 Stream.EmitRecordWithBlob(ChildAbbrev,
Record, Child->Name);
3293 assert((NextSubmoduleID - FirstSubmoduleID == SubmoduleOffsets.size()) &&
3294 "Wrong # of submodules; found a reference to a non-local, "
3295 "non-imported submodule?");
3297 Abbrev = std::make_shared<BitCodeAbbrev>();
3299 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3300 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3301 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3302 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3303 unsigned SubmoduleMetadataAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3305 RecordData::value_type
Record[] = {
3308 Stream.EmitRecordWithBlob(SubmoduleMetadataAbbrev,
Record,
3309 bytes(SubmoduleOffsets));
3312void ASTWriter::WritePragmaDiagnosticMappings(
const DiagnosticsEngine &
Diag,
3314 llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>
3316 unsigned CurrID = 0;
3319 auto EncodeDiagStateFlags =
3320 [](
const DiagnosticsEngine::DiagState *DS) ->
unsigned {
3321 unsigned Result = (unsigned)DS->ExtBehavior;
3323 {(unsigned)DS->IgnoreAllWarnings, (
unsigned)DS->EnableAllWarnings,
3324 (unsigned)DS->WarningsAsErrors, (
unsigned)DS->ErrorsAsFatal,
3325 (unsigned)DS->SuppressSystemWarnings})
3330 unsigned Flags = EncodeDiagStateFlags(
Diag.DiagStatesByLoc.FirstDiagState);
3333 auto AddDiagState = [&](
const DiagnosticsEngine::DiagState *State,
3334 bool IncludeNonPragmaStates) {
3337 assert(Flags == EncodeDiagStateFlags(State) &&
3338 "diag state flags vary in single AST file");
3342 assert(!IncludeNonPragmaStates ||
3343 State ==
Diag.DiagStatesByLoc.FirstDiagState);
3345 unsigned &DiagStateID = DiagStateIDMap[State];
3346 Record.push_back(DiagStateID);
3348 if (DiagStateID == 0) {
3349 DiagStateID = ++CurrID;
3350 SmallVector<std::pair<unsigned, DiagnosticMapping>> Mappings;
3353 auto SizeIdx =
Record.size();
3355 for (
const auto &I : *State) {
3357 if (!I.second.isPragma() && !IncludeNonPragmaStates)
3361 if (!I.second.isPragma() &&
3362 I.second ==
Diag.getDiagnosticIDs()->getDefaultMapping(I.first))
3364 Mappings.push_back(I);
3368 llvm::sort(Mappings, llvm::less_first());
3370 for (
const auto &I : Mappings) {
3371 Record.push_back(I.first);
3372 Record.push_back(I.second.serialize());
3379 AddDiagState(
Diag.DiagStatesByLoc.FirstDiagState, isModule);
3382 auto NumLocationsIdx =
Record.size();
3386 unsigned NumLocations = 0;
3387 for (
auto &FileIDAndFile :
Diag.DiagStatesByLoc.Files) {
3388 if (!FileIDAndFile.first.isValid() ||
3389 !FileIDAndFile.second.HasLocalTransitions)
3393 AddFileID(FileIDAndFile.first,
Record);
3395 Record.push_back(FileIDAndFile.second.StateTransitions.size());
3396 for (
auto &StatePoint : FileIDAndFile.second.StateTransitions) {
3397 Record.push_back(StatePoint.Offset);
3398 AddDiagState(StatePoint.State,
false);
3403 Record[NumLocationsIdx] = NumLocations;
3411 AddSourceLocation(
Diag.DiagStatesByLoc.CurDiagStateLoc,
Record);
3412 AddDiagState(
Diag.DiagStatesByLoc.CurDiagState,
false);
3417 Record.push_back(
Diag.DiagStateOnPushStack.size());
3418 for (
const auto *State :
Diag.DiagStateOnPushStack)
3419 AddDiagState(State,
false);
3429void ASTWriter::WriteType(ASTContext &Context, QualType T) {
3430 TypeIdx &IdxRef = TypeIdxs[T];
3432 IdxRef = TypeIdx(0, NextTypeID++);
3433 TypeIdx Idx = IdxRef;
3436 assert(Idx.
getValue() >= FirstTypeID &&
"Writing predefined type");
3440 ASTTypeWriter(Context, *
this).write(T) - DeclTypesBlockStartOffset;
3444 if (TypeOffsets.size() == Index)
3445 TypeOffsets.emplace_back(Offset);
3446 else if (TypeOffsets.size() < Index) {
3447 TypeOffsets.resize(Index + 1);
3448 TypeOffsets[Index].set(Offset);
3450 llvm_unreachable(
"Types emitted in wrong order");
3459 auto *ND = dyn_cast<NamedDecl>(D);
3474uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context,
3475 const DeclContext *DC) {
3483 uint64_t Offset = Stream.GetCurrentBitNo();
3484 SmallVector<DeclID, 128> KindDeclPairs;
3485 for (
const auto *D : DC->
decls()) {
3486 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(D))
3494 if (GeneratingReducedBMI && !D->isFromExplicitGlobalModule() &&
3498 KindDeclPairs.push_back(D->getKind());
3499 KindDeclPairs.push_back(GetDeclRef(D).getRawValue());
3502 ++NumLexicalDeclContexts;
3504 Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev,
Record,
3505 bytes(KindDeclPairs));
3509void ASTWriter::WriteTypeDeclOffsets() {
3510 using namespace llvm;
3513 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3515 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3516 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3517 unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3520 Stream.EmitRecordWithBlob(TypeOffsetAbbrev,
Record,
bytes(TypeOffsets));
3524 Abbrev = std::make_shared<BitCodeAbbrev>();
3526 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3527 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3528 unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3531 Stream.EmitRecordWithBlob(DeclOffsetAbbrev,
Record,
bytes(DeclOffsets));
3535void ASTWriter::WriteFileDeclIDsMap() {
3536 using namespace llvm;
3538 SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs;
3539 SortedFileDeclIDs.reserve(FileDeclIDs.size());
3540 for (
const auto &P : FileDeclIDs)
3541 SortedFileDeclIDs.push_back(std::make_pair(P.first, P.second.get()));
3542 llvm::sort(SortedFileDeclIDs, llvm::less_first());
3545 SmallVector<DeclID, 256> FileGroupedDeclIDs;
3546 for (
auto &FileDeclEntry : SortedFileDeclIDs) {
3547 DeclIDInFileInfo &Info = *FileDeclEntry.second;
3548 Info.FirstDeclIndex = FileGroupedDeclIDs.size();
3549 llvm::stable_sort(Info.DeclIDs);
3550 for (
auto &LocDeclEntry : Info.DeclIDs)
3551 FileGroupedDeclIDs.push_back(LocDeclEntry.second.getRawValue());
3554 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3556 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3557 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3558 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
3560 FileGroupedDeclIDs.size()};
3561 Stream.EmitRecordWithBlob(AbbrevCode,
Record,
bytes(FileGroupedDeclIDs));
3564void ASTWriter::WriteComments(ASTContext &Context) {
3566 llvm::scope_exit _([
this] { Stream.ExitBlock(); });
3571 for (
const auto &FO : Context.
Comments.OrderedComments) {
3572 for (
const auto &OC : FO.second) {
3573 const RawComment *I = OC.second;
3591class ASTMethodPoolTrait {
3595 using key_type = Selector;
3596 using key_type_ref = key_type;
3600 ObjCMethodList Instance, Factory;
3602 using data_type_ref =
const data_type &;
3604 using hash_value_type = unsigned;
3605 using offset_type = unsigned;
3607 explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) {}
3609 static hash_value_type
ComputeHash(Selector Sel) {
3613 std::pair<unsigned, unsigned>
3614 EmitKeyDataLength(raw_ostream& Out, Selector Sel,
3615 data_type_ref Methods) {
3619 unsigned DataLen = 4 + 2 + 2;
3620 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3622 if (ShouldWriteMethodListNode(
Method))
3623 DataLen +=
sizeof(
DeclID);
3624 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3626 if (ShouldWriteMethodListNode(
Method))
3627 DataLen +=
sizeof(
DeclID);
3631 void EmitKey(raw_ostream& Out, Selector Sel,
unsigned) {
3632 using namespace llvm::support;
3634 endian::Writer
LE(Out, llvm::endianness::little);
3636 assert((Start >> 32) == 0 &&
"Selector key offset too large");
3639 LE.write<uint16_t>(N);
3642 for (
unsigned I = 0; I != N; ++I)
3647 void EmitData(raw_ostream& Out, key_type_ref,
3648 data_type_ref Methods,
unsigned DataLen) {
3649 using namespace llvm::support;
3651 endian::Writer
LE(Out, llvm::endianness::little);
3654 unsigned NumInstanceMethods = 0;
3655 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3657 if (ShouldWriteMethodListNode(
Method))
3658 ++NumInstanceMethods;
3660 unsigned NumFactoryMethods = 0;
3661 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3663 if (ShouldWriteMethodListNode(
Method))
3664 ++NumFactoryMethods;
3666 unsigned InstanceBits = Methods.Instance.getBits();
3667 assert(InstanceBits < 4);
3668 unsigned InstanceHasMoreThanOneDeclBit =
3669 Methods.Instance.hasMoreThanOneDecl();
3670 unsigned FullInstanceBits = (NumInstanceMethods << 3) |
3671 (InstanceHasMoreThanOneDeclBit << 2) |
3673 unsigned FactoryBits = Methods.Factory.getBits();
3674 assert(FactoryBits < 4);
3675 unsigned FactoryHasMoreThanOneDeclBit =
3676 Methods.Factory.hasMoreThanOneDecl();
3677 unsigned FullFactoryBits = (NumFactoryMethods << 3) |
3678 (FactoryHasMoreThanOneDeclBit << 2) |
3680 LE.write<uint16_t>(FullInstanceBits);
3681 LE.write<uint16_t>(FullFactoryBits);
3682 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3684 if (ShouldWriteMethodListNode(
Method))
3686 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3688 if (ShouldWriteMethodListNode(
Method))
3691 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
3695 static bool ShouldWriteMethodListNode(
const ObjCMethodList *Node) {
3707void ASTWriter::WriteSelectors(Sema &SemaRef) {
3708 using namespace llvm;
3713 unsigned NumTableEntries = 0;
3716 llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait>
Generator;
3717 ASTMethodPoolTrait Trait(*
this);
3721 SelectorOffsets.resize(NextSelectorID - FirstSelectorID);
3722 for (
auto &SelectorAndID : SelectorIDs) {
3723 Selector S = SelectorAndID.first;
3725 SemaObjC::GlobalMethodPool::iterator F =
3727 ASTMethodPoolTrait::data_type
Data = {
3733 Data.Instance = F->second.first;
3734 Data.Factory = F->second.second;
3738 if (Chain && ID < FirstSelectorID) {
3740 bool changed =
false;
3741 for (ObjCMethodList *M = &
Data.Instance; M && M->getMethod();
3743 if (!M->getMethod()->isFromASTFile()) {
3749 for (ObjCMethodList *M = &
Data.Factory; M && M->getMethod();
3751 if (!M->getMethod()->isFromASTFile()) {
3759 }
else if (
Data.Instance.getMethod() ||
Data.Factory.getMethod()) {
3767 SmallString<4096> MethodPool;
3770 using namespace llvm::support;
3772 ASTMethodPoolTrait Trait(*
this);
3773 llvm::raw_svector_ostream
Out(MethodPool);
3775 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
3776 BucketOffset =
Generator.Emit(Out, Trait);
3780 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3782 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3783 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3784 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3785 unsigned MethodPoolAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3791 Stream.EmitRecordWithBlob(MethodPoolAbbrev,
Record, MethodPool);
3795 Abbrev = std::make_shared<BitCodeAbbrev>();
3797 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3798 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3799 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3800 unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3804 RecordData::value_type
Record[] = {
3807 Stream.EmitRecordWithBlob(SelectorOffsetAbbrev,
Record,
3808 bytes(SelectorOffsets));
3814void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) {
3815 using namespace llvm;
3827 Selector Sel = SelectorAndLocation.first;
3828 SourceLocation Loc = SelectorAndLocation.second;
3829 Writer.AddSelectorRef(Sel);
3851 for (; Redecl; Redecl = Redecl->getPreviousDecl()) {
3853 if (!Redecl->isFromASTFile()) {
3857 if (!Redecl->getDeclContext()->getRedeclContext()->Equals(
3865 if (Redecl->getOwningModuleID() == 0)
3870 if (!
First->isFromASTFile())
3881bool IsInterestingIdentifier(
const IdentifierInfo *II, uint64_t MacroOffset,
3882 bool IsModule,
bool IsCPlusPlus) {
3883 bool NeedDecls = !IsModule || !IsCPlusPlus;
3885 bool IsInteresting =
3892 II->
isPoisoned() || (!IsModule && IsInteresting) ||
3900bool IsInterestingNonMacroIdentifier(
const IdentifierInfo *II,
3901 ASTWriter &Writer) {
3903 bool IsCPlusPlus = Writer.
getLangOpts().CPlusPlus;
3904 return IsInterestingIdentifier(II, 0, IsModule, IsCPlusPlus);
3907class ASTIdentifierTableTrait {
3910 IdentifierResolver *IdResolver;
3920 return IsInterestingIdentifier(II, MacroOffset, IsModule,
3925 using key_type =
const IdentifierInfo *;
3926 using key_type_ref = key_type;
3929 using data_type_ref = data_type;
3931 using hash_value_type = unsigned;
3932 using offset_type = unsigned;
3934 ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP,
3935 IdentifierResolver *IdResolver,
bool IsModule,
3937 : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),
3938 NeedDecls(!IsModule || !Writer.getLangOpts().
CPlusPlus),
3939 InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}
3941 bool needDecls()
const {
return NeedDecls; }
3943 static hash_value_type
ComputeHash(
const IdentifierInfo* II) {
3944 return llvm::djbHash(II->
getName());
3952 std::pair<unsigned, unsigned>
3953 EmitKeyDataLength(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID) {
3962 if (InterestingIdentifierOffsets &&
3964 InterestingIdentifierOffsets->push_back(
Out.tell());
3975 if (NeedDecls && IdResolver)
3976 DataLen += std::distance(IdResolver->
begin(II), IdResolver->
end()) *
3982 void EmitKey(raw_ostream &Out,
const IdentifierInfo *II,
unsigned KeyLen) {
3986 void EmitData(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID,
3988 using namespace llvm::support;
3990 endian::Writer
LE(Out, llvm::endianness::little);
4000 assert((Bits & 0xffff) == Bits &&
"ObjCOrBuiltinID too big for ASTReader.");
4001 LE.write<uint16_t>(Bits);
4003 bool HasMacroDefinition =
4006 Bits = (Bits << 1) |
unsigned(HasMacroDefinition);
4008 Bits = (Bits << 1) |
unsigned(II->
isPoisoned());
4011 LE.write<uint16_t>(Bits);
4013 if (HasMacroDefinition)
4016 if (NeedDecls && IdResolver) {
4023 SmallVector<NamedDecl *, 16> Decls(IdResolver->
decls(II));
4024 for (NamedDecl *D : llvm::reverse(Decls))
4042void ASTWriter::WriteIdentifierTable(Preprocessor &PP,
4043 IdentifierResolver *IdResolver,
4045 using namespace llvm;
4047 RecordData InterestingIdents;
4052 llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait>
Generator;
4053 ASTIdentifierTableTrait Trait(*
this, PP, IdResolver, IsModule,
4054 IsModule ? &InterestingIdents :
nullptr);
4058 IdentifierOffsets.resize(NextIdentID - FirstIdentID);
4059 for (
auto IdentIDPair : IdentifierIDs) {
4060 const IdentifierInfo *II = IdentIDPair.first;
4062 assert(II &&
"NULL identifier in identifier table");
4067 (Trait.needDecls() &&
4073 SmallString<4096> IdentifierTable;
4076 using namespace llvm::support;
4078 llvm::raw_svector_ostream
Out(IdentifierTable);
4080 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
4081 BucketOffset =
Generator.Emit(Out, Trait);
4085 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4087 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4088 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4089 unsigned IDTableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4093 Stream.EmitRecordWithBlob(IDTableAbbrev,
Record, IdentifierTable);
4097 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4099 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4100 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4101 unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4104 for (
unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)
4105 assert(IdentifierOffsets[I] &&
"Missing identifier offset?");
4109 IdentifierOffsets.size()};
4110 Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev,
Record,
4111 bytes(IdentifierOffsets));
4115 if (!InterestingIdents.empty())
4123 PendingEmittingVTables.push_back(RD);
4127 TouchedModuleFiles.insert(MF);
4136class ASTDeclContextNameLookupTraitBase {
4144 using data_type = std::pair<unsigned, unsigned>;
4145 using data_type_ref =
const data_type &;
4150 explicit ASTDeclContextNameLookupTraitBase(
ASTWriter &Writer)
4153 data_type getData(
const DeclIDsTy &LocalIDs) {
4154 unsigned Start = DeclIDs.size();
4155 for (
auto ID : LocalIDs)
4156 DeclIDs.push_back(ID);
4157 return std::make_pair(Start, DeclIDs.size());
4160 data_type ImportData(
const reader::ASTDeclContextNameLookupTrait::data_type &FromReader) {
4161 unsigned Start = DeclIDs.size();
4164 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.begin()),
4165 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.end()));
4166 return std::make_pair(Start, DeclIDs.size());
4169 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4171 "have reference to loaded module file but no chain?");
4173 using namespace llvm::support;
4176 llvm::endianness::little);
4179 std::pair<unsigned, unsigned> EmitKeyDataLengthBase(raw_ostream &Out,
4180 DeclarationNameKey Name,
4181 data_type_ref Lookup) {
4182 unsigned KeyLen = 1;
4205 unsigned DataLen =
sizeof(
DeclID) * (Lookup.second - Lookup.first);
4207 return {KeyLen, DataLen};
4210 void EmitKeyBase(raw_ostream &Out, DeclarationNameKey Name) {
4211 using namespace llvm::support;
4213 endian::Writer
LE(Out, llvm::endianness::little);
4228 "Invalid operator?");
4238 llvm_unreachable(
"Invalid name kind?");
4241 void EmitDataBase(raw_ostream &Out, data_type Lookup,
unsigned DataLen) {
4242 using namespace llvm::support;
4244 endian::Writer
LE(Out, llvm::endianness::little);
4246 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I)
4248 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4252class ModuleLevelNameLookupTrait :
public ASTDeclContextNameLookupTraitBase {
4254 using primary_module_hash_type = unsigned;
4256 using key_type = std::pair<DeclarationNameKey, primary_module_hash_type>;
4257 using key_type_ref = key_type;
4259 explicit ModuleLevelNameLookupTrait(ASTWriter &Writer)
4260 : ASTDeclContextNameLookupTraitBase(Writer) {}
4262 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4265 llvm::FoldingSetNodeID
ID;
4266 ID.AddInteger(Key.first.getHash());
4267 ID.AddInteger(Key.second);
4268 return ID.computeStableHash();
4271 std::pair<unsigned, unsigned>
4272 EmitKeyDataLength(raw_ostream &Out, key_type Key, data_type_ref Lookup) {
4273 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Key.first, Lookup);
4274 KeyLen +=
sizeof(Key.second);
4278 void EmitKey(raw_ostream &Out, key_type Key,
unsigned) {
4279 EmitKeyBase(Out, Key.first);
4280 llvm::support::endian::Writer
LE(Out, llvm::endianness::little);
4281 LE.write<primary_module_hash_type>(Key.second);
4284 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4286 EmitDataBase(Out, Lookup, DataLen);
4290class ASTDeclContextNameTrivialLookupTrait
4291 :
public ASTDeclContextNameLookupTraitBase {
4293 using key_type = DeclarationNameKey;
4294 using key_type_ref = key_type;
4297 using ASTDeclContextNameLookupTraitBase::ASTDeclContextNameLookupTraitBase;
4299 using ASTDeclContextNameLookupTraitBase::getData;
4301 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4303 hash_value_type
ComputeHash(key_type Name) {
return Name.getHash(); }
4305 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4306 DeclarationNameKey Name,
4307 data_type_ref Lookup) {
4308 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Name, Lookup);
4312 void EmitKey(raw_ostream &Out, DeclarationNameKey Name,
unsigned) {
4313 return EmitKeyBase(Out, Name);
4316 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4318 EmitDataBase(Out, Lookup, DataLen);
4322static bool isModuleLocalDecl(NamedDecl *D) {
4327 return isModuleLocalDecl(Parent);
4331 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
4332 if (
auto *CDGD = dyn_cast<CXXDeductionGuideDecl>(FTD->getTemplatedDecl()))
4333 return isModuleLocalDecl(CDGD->getDeducedTemplate());
4349static bool isTULocalInNamedModules(NamedDecl *D) {
4372class ASTDeclContextNameLookupTrait
4373 :
public ASTDeclContextNameTrivialLookupTrait {
4375 using TULocalDeclsMapTy = llvm::DenseMap<key_type, DeclIDsTy>;
4377 using ModuleLevelDeclsMapTy =
4378 llvm::DenseMap<ModuleLevelNameLookupTrait::key_type, DeclIDsTy>;
4381 enum class LookupVisibility {
4391 LookupVisibility getLookupVisibility(NamedDecl *D)
const {
4394 return LookupVisibility::GenerallyVisibile;
4396 if (isModuleLocalDecl(D))
4397 return LookupVisibility::ModuleLocalVisible;
4398 if (isTULocalInNamedModules(D))
4399 return LookupVisibility::TULocal;
4411 if (
auto *ECD = dyn_cast<EnumConstantDecl>(D);
4412 ECD && DC.
isFileContext() && ECD->getTopLevelOwningNamedModule()) {
4417 return Found->isInvisibleOutsideTheOwningModule();
4419 return ECD->isFromExplicitGlobalModule() ||
4420 ECD->isInAnonymousNamespace()
4421 ? LookupVisibility::TULocal
4422 : LookupVisibility::ModuleLocalVisible;
4425 return LookupVisibility::GenerallyVisibile;
4429 ModuleLevelDeclsMapTy ModuleLocalDeclsMap;
4430 TULocalDeclsMapTy TULocalDeclsMap;
4433 using ASTDeclContextNameTrivialLookupTrait::
4434 ASTDeclContextNameTrivialLookupTrait;
4436 ASTDeclContextNameLookupTrait(ASTWriter &Writer, DeclContext &DC)
4437 : ASTDeclContextNameTrivialLookupTrait(Writer), DC(DC) {}
4439 template <
typename Coll> data_type getData(
const Coll &Decls) {
4440 unsigned Start = DeclIDs.size();
4441 auto AddDecl = [
this](NamedDecl *D) {
4442 NamedDecl *DeclForLocalLookup =
4458 switch (getLookupVisibility(DeclForLocalLookup)) {
4459 case LookupVisibility::ModuleLocalVisible:
4462 auto Key = std::make_pair(D->
getDeclName(), *PrimaryModuleHash);
4463 auto Iter = ModuleLocalDeclsMap.find(Key);
4464 if (Iter == ModuleLocalDeclsMap.end())
4465 ModuleLocalDeclsMap.insert({Key, DeclIDsTy{
ID}});
4467 Iter->second.push_back(ID);
4471 case LookupVisibility::TULocal: {
4472 auto Iter = TULocalDeclsMap.find(D->
getDeclName());
4473 if (Iter == TULocalDeclsMap.end())
4476 Iter->second.push_back(ID);
4479 case LookupVisibility::GenerallyVisibile:
4484 DeclIDs.push_back(ID);
4486 ASTReader *Chain = Writer.
getChain();
4487 for (NamedDecl *D : Decls) {
4498 for (
const auto &[_,
First] : Firsts)
4504 return std::make_pair(Start, DeclIDs.size());
4507 const ModuleLevelDeclsMapTy &getModuleLocalDecls() {
4508 return ModuleLocalDeclsMap;
4511 const TULocalDeclsMapTy &getTULocalDecls() {
return TULocalDeclsMap; }
4517class LazySpecializationInfoLookupTrait {
4519 llvm::SmallVector<serialization::reader::LazySpecializationInfo, 64> Specs;
4522 using key_type = unsigned;
4523 using key_type_ref = key_type;
4526 using data_type = std::pair<unsigned, unsigned>;
4527 using data_type_ref =
const data_type &;
4529 using hash_value_type = unsigned;
4530 using offset_type = unsigned;
4532 explicit LazySpecializationInfoLookupTrait(ASTWriter &Writer)
4535 template <
typename Col,
typename Col2>
4536 data_type getData(Col &&
C, Col2 &ExistingInfo) {
4537 unsigned Start = Specs.size();
4540 const_cast<NamedDecl *
>(D));
4545 Specs.push_back(Info);
4546 return std::make_pair(Start, Specs.size());
4549 data_type ImportData(
4551 unsigned Start = Specs.size();
4552 for (
auto ID : FromReader)
4553 Specs.push_back(ID);
4554 return std::make_pair(Start, Specs.size());
4557 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4559 hash_value_type
ComputeHash(key_type Name) {
return Name; }
4561 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4563 "have reference to loaded module file but no chain?");
4565 using namespace llvm::support;
4568 llvm::endianness::little);
4571 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4573 data_type_ref Lookup) {
4575 unsigned KeyLen = 4;
4577 (Lookup.second - Lookup.first);
4582 void EmitKey(raw_ostream &Out, key_type HashValue,
unsigned) {
4583 using namespace llvm::support;
4585 endian::Writer
LE(Out, llvm::endianness::little);
4589 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4591 using namespace llvm::support;
4593 endian::Writer
LE(Out, llvm::endianness::little);
4596 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I) {
4597 LE.write<
DeclID>(Specs[I].getRawValue());
4599 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4603unsigned CalculateODRHashForSpecs(
const Decl *Spec) {
4604 ArrayRef<TemplateArgument> Args;
4605 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Spec))
4606 Args = CTSD->getTemplateArgs().asArray();
4607 else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Spec))
4608 Args = VTSD->getTemplateArgs().asArray();
4609 else if (
auto *FD = dyn_cast<FunctionDecl>(Spec))
4610 Args = FD->getTemplateSpecializationArgs()->asArray();
4612 llvm_unreachable(
"New Specialization Kind?");
4618void ASTWriter::GenerateSpecializationInfoLookupTable(
4619 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4620 llvm::SmallVectorImpl<char> &LookupTable,
bool IsPartial) {
4624 MultiOnDiskHashTableGenerator<reader::LazySpecializationInfoLookupTrait,
4625 LazySpecializationInfoLookupTrait>
4627 LazySpecializationInfoLookupTrait Trait(*
this);
4629 llvm::MapVector<unsigned, llvm::SmallVector<const NamedDecl *, 4>>
4635 auto Iter = SpecializationMaps.find(HashedValue);
4636 if (Iter == SpecializationMaps.end())
4637 Iter = SpecializationMaps
4638 .try_emplace(HashedValue,
4639 llvm::SmallVector<const NamedDecl *, 4>())
4649 for (
auto &[HashValue, Specs] : SpecializationMaps) {
4650 SmallVector<serialization::reader::LazySpecializationInfo, 16>
4660 ExisitingSpecs = Lookups->Table.find(HashValue);
4662 Generator.insert(HashValue, Trait.getData(Specs, ExisitingSpecs), Trait);
4672 auto *ToEmitMaybeMergedLookupTable =
4673 (!isGeneratingReducedBMI() && Lookups) ? &Lookups->
Table :
nullptr;
4674 Generator.emit(LookupTable, Trait, ToEmitMaybeMergedLookupTable);
4677uint64_t ASTWriter::WriteSpecializationInfoLookupTable(
4678 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4681 llvm::SmallString<4096> LookupTable;
4682 GenerateSpecializationInfoLookupTable(D, Specializations, LookupTable,
4685 uint64_t Offset = Stream.GetCurrentBitNo();
4686 RecordData::value_type
Record[] = {
static_cast<RecordData::value_type
>(
4688 Stream.EmitRecordWithBlob(IsPartial ? DeclPartialSpecializationsAbbrev
4689 : DeclSpecializationsAbbrev,
4701 for (
auto *D :
Result.getLookupResult()) {
4703 if (LocalD->isFromASTFile())
4721void ASTWriter::GenerateNameLookupTable(
4722 ASTContext &Context,
const DeclContext *ConstDC,
4723 llvm::SmallVectorImpl<char> &LookupTable,
4724 llvm::SmallVectorImpl<char> &ModuleLocalLookupTable,
4725 llvm::SmallVectorImpl<char> &TULookupTable) {
4726 assert(!ConstDC->hasLazyLocalLexicalLookups() &&
4727 !ConstDC->hasLazyExternalLexicalLookups() &&
4728 "must call buildLookups first");
4731 auto *DC =
const_cast<DeclContext*
>(ConstDC);
4735 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4736 ASTDeclContextNameLookupTrait>
4738 ASTDeclContextNameLookupTrait Trait(*
this, *DC);
4743 SmallVector<DeclarationName, 16> Names;
4747 bool IncludeConstructorNames =
false;
4748 bool IncludeConversionNames =
false;
4775 if (
Result.getLookupResult().empty())
4778 switch (Name.getNameKind()) {
4780 Names.push_back(Name);
4784 IncludeConstructorNames =
true;
4788 IncludeConversionNames =
true;
4796 if (IncludeConstructorNames || IncludeConversionNames) {
4801 llvm::SmallPtrSet<DeclarationName, 8> AddedNames;
4803 if (
auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
4804 auto Name = ChildND->getDeclName();
4805 switch (Name.getNameKind()) {
4810 if (!IncludeConstructorNames)
4815 if (!IncludeConversionNames)
4819 if (AddedNames.insert(Name).second)
4820 Names.push_back(Name);
4828 for (
auto &Name : Names)
4835 SmallVector<NamedDecl *, 8> ConstructorDecls;
4836 SmallVector<NamedDecl *, 8> ConversionDecls;
4840 for (
auto &Name : Names) {
4843 switch (Name.getNameKind()) {
4861 if (!ConstructorDecls.empty())
4862 Generator.insert(ConstructorDecls.front()->getDeclName(),
4863 Trait.getData(ConstructorDecls), Trait);
4864 if (!ConversionDecls.empty())
4865 Generator.insert(ConversionDecls.front()->getDeclName(),
4866 Trait.getData(ConversionDecls), Trait);
4878 auto *ToEmitMaybeMergedLookupTable =
4879 (!isGeneratingReducedBMI() && Lookups) ? &Lookups->
Table :
nullptr;
4880 Generator.emit(LookupTable, Trait, ToEmitMaybeMergedLookupTable);
4882 const auto &ModuleLocalDecls = Trait.getModuleLocalDecls();
4883 if (!ModuleLocalDecls.empty()) {
4884 MultiOnDiskHashTableGenerator<reader::ModuleLocalNameLookupTrait,
4885 ModuleLevelNameLookupTrait>
4886 ModuleLocalLookupGenerator;
4887 ModuleLevelNameLookupTrait ModuleLocalTrait(*
this);
4889 for (
const auto &ModuleLocalIter : ModuleLocalDecls) {
4890 const auto &Key = ModuleLocalIter.first;
4891 const auto &IDs = ModuleLocalIter.second;
4892 ModuleLocalLookupGenerator.insert(Key, ModuleLocalTrait.getData(IDs),
4898 auto *ModuleLocalLookups =
4899 (isGeneratingReducedBMI() && Chain &&
4903 ModuleLocalLookupGenerator.emit(ModuleLocalLookupTable, ModuleLocalTrait,
4904 ModuleLocalLookups);
4907 const auto &TULocalDecls = Trait.getTULocalDecls();
4908 if (!TULocalDecls.empty() && !isGeneratingReducedBMI()) {
4909 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4910 ASTDeclContextNameTrivialLookupTrait>
4912 ASTDeclContextNameTrivialLookupTrait TULocalTrait(*
this);
4914 for (
const auto &TULocalIter : TULocalDecls) {
4915 const auto &Key = TULocalIter.first;
4916 const auto &IDs = TULocalIter.second;
4917 TULookupGenerator.insert(Key, TULocalTrait.getData(IDs), TULocalTrait);
4922 auto *TULocalLookups =
4926 TULookupGenerator.emit(TULookupTable, TULocalTrait, TULocalLookups);
4935void ASTWriter::WriteDeclContextVisibleBlock(
4936 ASTContext &Context, DeclContext *DC, VisibleLookupBlockOffsets &Offsets) {
4946 Prev = Prev->getPreviousDecl())
4947 if (!Prev->isFromASTFile())
4957 SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16>
4960 LookupResults.reserve(Map->size());
4961 for (
auto &Entry : *Map)
4962 LookupResults.push_back(
4963 std::make_pair(Entry.first, Entry.second.getLookupResult()));
4966 llvm::sort(LookupResults, llvm::less_first());
4967 for (
auto &NameAndResult : LookupResults) {
4968 DeclarationName Name = NameAndResult.first;
4975 assert(
Result.empty() &&
"Cannot have a constructor or conversion "
4976 "function name in a namespace!");
4980 for (NamedDecl *ND :
Result) {
4984 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(ND))
5018 if (!Map || Map->empty())
5023 SmallString<4096> LookupTable;
5024 SmallString<4096> ModuleLocalLookupTable;
5025 SmallString<4096> TULookupTable;
5026 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
5031 Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev,
Record,
5033 ++NumVisibleDeclContexts;
5035 if (!ModuleLocalLookupTable.empty()) {
5039 RecordData::value_type ModuleLocalRecord[] = {
5041 Stream.EmitRecordWithBlob(DeclModuleLocalVisibleLookupAbbrev,
5042 ModuleLocalRecord, ModuleLocalLookupTable);
5043 ++NumModuleLocalDeclContexts;
5046 if (!TULookupTable.empty()) {
5049 RecordData::value_type TULocalDeclsRecord[] = {
5051 Stream.EmitRecordWithBlob(DeclTULocalLookupAbbrev, TULocalDeclsRecord,
5053 ++NumTULocalDeclContexts;
5063void ASTWriter::WriteDeclContextVisibleUpdate(ASTContext &Context,
5064 const DeclContext *DC) {
5066 if (!Map || Map->empty())
5070 SmallString<4096> LookupTable;
5071 SmallString<4096> ModuleLocalLookupTable;
5072 SmallString<4096> TULookupTable;
5073 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
5084 Stream.EmitRecordWithBlob(UpdateVisibleAbbrev,
Record, LookupTable);
5086 if (!ModuleLocalLookupTable.empty()) {
5088 RecordData::value_type ModuleLocalRecord[] = {
5090 Stream.EmitRecordWithBlob(ModuleLocalUpdateVisibleAbbrev, ModuleLocalRecord,
5091 ModuleLocalLookupTable);
5094 if (!TULookupTable.empty()) {
5095 RecordData::value_type GMFRecord[] = {
5097 Stream.EmitRecordWithBlob(TULocalUpdateVisibleAbbrev, GMFRecord,
5103void ASTWriter::WriteFPPragmaOptions(
const FPOptionsOverride &Opts) {
5109void ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) {
5115 for (
const auto &I:Opts.OptMap) {
5116 AddString(I.getKey(),
Record);
5117 auto V = I.getValue();
5118 Record.push_back(
V.Supported ? 1 : 0);
5119 Record.push_back(
V.Enabled ? 1 : 0);
5120 Record.push_back(
V.WithPragma ? 1 : 0);
5127void ASTWriter::WriteCUDAPragmas(Sema &SemaRef) {
5128 if (SemaRef.
CUDA().ForceHostDeviceDepth > 0) {
5129 RecordData::value_type
Record[] = {SemaRef.
CUDA().ForceHostDeviceDepth};
5134void ASTWriter::WriteObjCCategories() {
5135 if (ObjCClassesWithCategories.empty())
5138 SmallVector<ObjCCategoriesInfo, 2> CategoriesMap;
5139 RecordData Categories;
5141 for (
unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {
5143 unsigned StartIndex = Categories.size();
5145 ObjCInterfaceDecl *
Class = ObjCClassesWithCategories[I];
5148 Categories.push_back(0);
5152 Cat =
Class->known_categories_begin(),
5153 CatEnd =
Class->known_categories_end();
5154 Cat != CatEnd; ++Cat, ++Size) {
5155 assert(getDeclID(*Cat).isValid() &&
"Bogus category");
5156 AddDeclRef(*Cat, Categories);
5160 Categories[StartIndex] =
Size;
5163 ObjCCategoriesInfo CatInfo = { getDeclID(
Class), StartIndex };
5164 CategoriesMap.push_back(CatInfo);
5169 llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());
5172 using namespace llvm;
5174 auto Abbrev = std::make_shared<BitCodeAbbrev>();
5176 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
5177 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
5178 unsigned AbbrevID = Stream.EmitAbbrev(std::move(Abbrev));
5181 Stream.EmitRecordWithBlob(AbbrevID,
Record,
5182 reinterpret_cast<char *
>(CategoriesMap.data()),
5183 CategoriesMap.size() *
sizeof(ObjCCategoriesInfo));
5189void ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) {
5196 for (
auto &LPTMapEntry : LPTMap) {
5197 const FunctionDecl *FD = LPTMapEntry.first;
5198 LateParsedTemplate &LPT = *LPTMapEntry.second;
5204 for (
const auto &
Tok : LPT.
Toks) {
5212void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) {
5215 AddSourceLocation(PragmaLoc,
Record);
5220void ASTWriter::WriteMSStructPragmaOptions(Sema &SemaRef) {
5228void ASTWriter::WriteMSPointersToMembersPragmaOptions(Sema &SemaRef) {
5236void ASTWriter::WritePackPragmaOptions(Sema &SemaRef) {
5247 AddAlignPackInfo(StackEntry.Value,
Record);
5248 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5249 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5250 AddString(StackEntry.StackSlotLabel,
Record);
5256void ASTWriter::WriteFloatControlPragmaOptions(Sema &SemaRef) {
5266 for (
const auto &StackEntry : SemaRef.
FpPragmaStack.Stack) {
5267 Record.push_back(StackEntry.Value.getAsOpaqueInt());
5268 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5269 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5270 AddString(StackEntry.StackSlotLabel,
Record);
5276void ASTWriter::WriteDeclsWithEffectsToVerify(Sema &SemaRef) {
5286void ASTWriter::WriteModuleFileExtension(Sema &SemaRef,
5287 ModuleFileExtensionWriter &Writer) {
5292 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
5294 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5295 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5296 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5297 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5298 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
5299 unsigned Abbrev = Stream.EmitAbbrev(std::move(Abv));
5305 Record.push_back(Metadata.MajorVersion);
5306 Record.push_back(Metadata.MinorVersion);
5307 Record.push_back(Metadata.BlockName.size());
5308 Record.push_back(Metadata.UserInfo.size());
5309 SmallString<64> Buffer;
5310 Buffer += Metadata.BlockName;
5311 Buffer += Metadata.UserInfo;
5312 Stream.EmitRecordWithBlob(Abbrev,
Record, Buffer);
5321void ASTWriter::WriteRISCVIntrinsicPragmas(Sema &SemaRef) {
5336 auto &Record = *
this;
5342 Writer->isWritingStdCXXHeaderUnit())))
5343 return Record.push_back(0);
5345 Record.push_back(A->
getKind() + 1);
5349 Record.AddSourceRange(A->
getRange());
5353 Record.push_back(A->getAttributeSpellingListIndexRaw());
5356#include "clang/Serialization/AttrPCHWrite.inc"
5362 for (
const auto *A : Attrs)
5373 if (
Tok.isAnnotation()) {
5375 switch (
Tok.getKind()) {
5376 case tok::annot_pragma_loop_hint: {
5380 Record.push_back(Info->Toks.size());
5381 for (
const auto &T : Info->Toks)
5385 case tok::annot_pragma_pack: {
5388 Record.push_back(
static_cast<unsigned>(Info->Action));
5394 case tok::annot_pragma_openmp:
5395 case tok::annot_pragma_openmp_end:
5396 case tok::annot_pragma_unused:
5397 case tok::annot_pragma_openacc:
5398 case tok::annot_pragma_openacc_end:
5399 case tok::annot_repl_input_end:
5402 llvm_unreachable(
"missing serialization code for annotation token");
5413 Record.push_back(Str.size());
5414 llvm::append_range(
Record, Str);
5419 Record.push_back(Str.size());
5420 llvm::append_range(Blob, Str);
5424 assert(WritingAST &&
"can't prepare path for output when not writing AST");
5427 StringRef PathStr(Path.data(), Path.size());
5428 if (PathStr ==
"<built-in>" || PathStr ==
"<command line>")
5432 PP->getFileManager().makeAbsolutePath(Path,
true);
5434 const char *PathBegin = Path.data();
5435 const char *PathPtr =
5437 if (PathPtr != PathBegin) {
5438 Path.erase(Path.begin(), Path.begin() + (PathPtr - PathBegin));
5462 Stream.EmitRecordWithBlob(Abbrev,
Record, FilePath);
5467 Record.push_back(Version.getMajor());
5468 if (std::optional<unsigned> Minor = Version.getMinor())
5469 Record.push_back(*Minor + 1);
5472 if (std::optional<unsigned> Subminor = Version.getSubminor())
5473 Record.push_back(*Subminor + 1);
5491 assert(ID < IdentifierOffsets.size());
5492 IdentifierOffsets[ID] = Offset;
5498 unsigned ID = SelectorIDs[Sel];
5499 assert(ID &&
"Unknown selector");
5502 if (ID < FirstSelectorID)
5504 SelectorOffsets[ID - FirstSelectorID] = Offset;
5510 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
5511 bool IncludeTimestamps,
bool BuildingImplicitModule,
5512 bool GeneratingReducedBMI)
5513 : Stream(Stream), Buffer(Buffer), ModCache(ModCache),
5514 CodeGenOpts(CodeGenOpts), IncludeTimestamps(IncludeTimestamps),
5515 BuildingImplicitModule(BuildingImplicitModule),
5516 GeneratingReducedBMI(GeneratingReducedBMI) {
5517 for (
const auto &Ext : Extensions) {
5518 if (
auto Writer = Ext->createExtensionWriter(*
this))
5519 ModuleFileExtensionWriters.push_back(std::move(Writer));
5526 assert(WritingAST &&
"can't determine lang opts when not writing AST");
5527 return PP->getLangOpts();
5531 return IncludeTimestamps ? ModTime : 0;
5536 StringRef OutputFile,
Module *WritingModule,
5537 StringRef isysroot) {
5538 llvm::TimeTraceScope scope(
"WriteAST", OutputFile);
5541 Sema *SemaPtr = dyn_cast<Sema *>(Subject);
5548 Stream.Emit((
unsigned)
'C', 8);
5549 Stream.Emit((
unsigned)
'P', 8);
5550 Stream.Emit((
unsigned)
'C', 8);
5551 Stream.Emit((
unsigned)
'H', 8);
5553 WriteBlockInfoBlock();
5556 this->WritingModule = WritingModule;
5557 ASTFileSignature Signature = WriteASTCore(SemaPtr, isysroot, WritingModule);
5559 this->WritingModule =
nullptr;
5560 this->BaseDirectory.clear();
5567template<
typename Vector>
5569 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5575template <
typename Vector>
5578 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5584void ASTWriter::computeNonAffectingInputFiles() {
5585 SourceManager &SrcMgr = PP->getSourceManager();
5588 IsSLocAffecting.resize(N,
true);
5589 IsSLocFileEntryAffecting.resize(N,
true);
5594 auto AffectingModuleMaps = GetAffectingModuleMaps(*PP, WritingModule);
5596 unsigned FileIDAdjustment = 0;
5597 unsigned OffsetAdjustment = 0;
5599 NonAffectingFileIDAdjustments.reserve(N);
5600 NonAffectingOffsetAdjustments.reserve(N);
5602 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5603 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5605 for (
unsigned I = 1; I != N; ++I) {
5607 FileID FID = FileID::get(I);
5614 if (!
Cache->OrigEntry)
5622 if (!AffectingModuleMaps)
5626 if (AffectingModuleMaps->DefinitionFileIDs.contains(FID))
5629 IsSLocAffecting[I] =
false;
5630 IsSLocFileEntryAffecting[I] =
5631 AffectingModuleMaps->DefinitionFiles.contains(*
Cache->OrigEntry);
5633 FileIDAdjustment += 1;
5639 if (!NonAffectingFileIDs.empty() &&
5640 NonAffectingFileIDs.back().ID == FID.ID - 1) {
5641 NonAffectingFileIDs.back() = FID;
5643 NonAffectingFileIDAdjustments.back() = FileIDAdjustment;
5644 NonAffectingOffsetAdjustments.back() = OffsetAdjustment;
5648 NonAffectingFileIDs.push_back(FID);
5651 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5652 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5655 if (!PP->getHeaderSearchInfo().getHeaderSearchOpts().ModulesIncludeVFSUsage)
5658 FileManager &FileMgr = PP->getFileManager();
5661 for (StringRef Path :
5662 PP->getHeaderSearchInfo().getHeaderSearchOpts().VFSOverlayFiles)
5664 for (
unsigned I = 1; I != N; ++I) {
5665 if (IsSLocAffecting[I]) {
5671 if (!
Cache->OrigEntry)
5674 Cache->OrigEntry->getNameAsRequested());
5680void ASTWriter::prepareLazyUpdates() {
5683 if (!GeneratingReducedBMI)
5686 DeclUpdateMap DeclUpdatesTmp;
5694 for (
auto &DeclUpdate : DeclUpdates) {
5695 const Decl *D = DeclUpdate.first;
5697 for (
auto &
Update : DeclUpdate.second) {
5700 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
5701 DeclUpdatesTmp[D].push_back(
5702 ASTWriter::DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
5704 DeclUpdatesLazy[D].push_back(
Update);
5707 DeclUpdates.swap(DeclUpdatesTmp);
5709 UpdatedDeclContextsLazy.swap(UpdatedDeclContexts);
5711 DeclsToEmitEvenIfUnreferenced.clear();
5714void ASTWriter::PrepareWritingSpecialDecls(
Sema &SemaRef) {
5715 ASTContext &Context = SemaRef.
Context;
5717 bool isModule = WritingModule !=
nullptr;
5719 prepareLazyUpdates();
5726 PredefinedDecls.insert(D);
5734 RegisterPredefDecl(Context.ObjCProtocolClassDecl,
5738 RegisterPredefDecl(Context.ObjCInstanceTypeDecl,
5742 RegisterPredefDecl(Context.BuiltinMSVaListDecl,
5749 RegisterPredefDecl(Context.CFConstantStringTypeDecl,
5751 RegisterPredefDecl(Context.CFConstantStringTagDecl,
5753#define BuiltinTemplate(BTName) \
5754 RegisterPredefDecl(Context.Decl##BTName, PREDEF_DECL##BTName##_ID);
5755#include "clang/Basic/BuiltinTemplates.inc"
5767 if (GeneratingReducedBMI) {
5793 if (GeneratingReducedBMI)
5815 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I)
5826 "There are local ones at end of translation unit!");
5844 for (
const auto &I : SemaRef.KnownNamespaces)
5849 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
5857 for (
const auto &DeleteExprsInfo :
5864 for (
const auto *I : DeclsToEmitEvenIfUnreferenced)
5866 DeclsToEmitEvenIfUnreferenced.clear();
5871 llvm::SmallVector<const IdentifierInfo*, 256> IIs;
5873 const IdentifierInfo *II =
ID.second;
5879 llvm::sort(IIs, llvm::deref<std::less<>>());
5881 for (
const IdentifierInfo *II : IIs)
5892 for (CXXRecordDecl *RD : PendingEmittingVTables)
5895 PendingEmittingVTables.clear();
5898void ASTWriter::WriteSpecialDeclRecords(
Sema &SemaRef) {
5899 ASTContext &Context = SemaRef.
Context;
5901 bool isModule = WritingModule !=
nullptr;
5904 if (!EagerlyDeserializedDecls.empty())
5907 if (!ModularCodegenDecls.empty())
5913 TentativeDefinitions);
5914 if (!TentativeDefinitions.empty())
5921 UnusedFileScopedDecls);
5922 if (!UnusedFileScopedDecls.empty())
5928 if (!ExtVectorDecls.empty())
5934 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I) {
5935 CXXRecordDecl *D = SemaRef.
VTableUses[I].first;
5950 if (!UnusedLocalTypedefNameCandidates.empty())
5952 UnusedLocalTypedefNameCandidates);
5954 if (!GeneratingReducedBMI) {
5964 if (!PendingInstantiations.empty())
5968 auto AddEmittedDeclRefOrZero = [
this](
RecordData &Refs,
Decl *D) {
5982 if (!SemaDeclRefs.empty())
5990 if (!DeclsToCheckForDeferredDiags.empty())
5992 DeclsToCheckForDeferredDiags);
5999 CudaCallDecl || CudaGetParamDecl || CudaLaunchDecl) {
6000 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaCallDecl);
6001 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaGetParamDecl);
6002 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaLaunchDecl);
6010 DelegatingCtorDecls);
6011 if (!DelegatingCtorDecls.empty())
6016 for (
const auto &I : SemaRef.KnownNamespaces) {
6020 if (!KnownNamespaces.empty())
6025 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
6034 if (!UndefinedButUsed.empty())
6041 for (
const auto &DeleteExprsInfo :
6046 AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze);
6047 DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());
6048 for (
const auto &DeleteLoc : DeleteExprsInfo.second) {
6050 DeleteExprsToAnalyze.push_back(DeleteLoc.second);
6054 if (!DeleteExprsToAnalyze.empty())
6058 for (CXXRecordDecl *RD : PendingEmittingVTables) {
6065 if (!VTablesToEmit.empty())
6071 using namespace llvm;
6073 bool isModule = WritingModule !=
nullptr;
6077 Chain->finalizeForWriting();
6081 computeNonAffectingInputFiles();
6083 writeUnhashedControlBlock(*PP);
6096 IdentifierIDs.clear();
6107 SmallVector<const IdentifierInfo *, 128> IIs;
6108 for (
const auto &ID : PP->getIdentifierTable())
6109 if (IsInterestingNonMacroIdentifier(
ID.second, *
this))
6110 IIs.push_back(
ID.second);
6113 llvm::sort(IIs, llvm::deref<std::less<>>());
6114 for (
const IdentifierInfo *II : IIs)
6122 for (
const auto &WeakUndeclaredIdentifierList :
6124 const IdentifierInfo *
const II = WeakUndeclaredIdentifierList.first;
6125 for (
const auto &WI : WeakUndeclaredIdentifierList.second) {
6138 ASTContext &Context = SemaPtr->
Context;
6140 Context, *
this, ExtnameUndeclaredIdentifiers);
6142 ExtnameUndeclaredIdentifiersWriter.AddIdentifierRef(II);
6143 ExtnameUndeclaredIdentifiersWriter.AddIdentifierRef(
6145 ExtnameUndeclaredIdentifiersWriter.AddSourceLocation(AL->getLocation());
6152 ASTContext &Context = SemaPtr->
Context;
6157 AddTypeRef(Context, Context.ObjCIdRedefinitionType, SpecialTypes);
6158 AddTypeRef(Context, Context.ObjCClassRedefinitionType, SpecialTypes);
6159 AddTypeRef(Context, Context.ObjCSelRedefinitionType, SpecialTypes);
6164 PrepareWritingSpecialDecls(*SemaPtr);
6167 WriteControlBlock(*PP, isysroot);
6170 Stream.FlushToWord();
6171 ASTBlockRange.first = Stream.GetCurrentBitNo() >> 3;
6173 ASTBlockStartOffset = Stream.GetCurrentBitNo();
6190 llvm::SmallVector<Selector, 256> AllSelectors;
6191 for (
auto &SelectorAndID : SelectorIDs)
6192 AllSelectors.push_back(SelectorAndID.first);
6193 for (
auto &Selector : AllSelectors)
6217 auto Abbrev = std::make_shared<BitCodeAbbrev>();
6219 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
6220 unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
6221 SmallString<2048> Buffer;
6223 llvm::raw_svector_ostream
Out(Buffer);
6224 for (ModuleFile &M : Chain->ModuleMgr) {
6225 using namespace llvm::support;
6227 endian::Writer
LE(Out, llvm::endianness::little);
6228 LE.write<uint8_t>(
static_cast<uint8_t
>(M.
Kind));
6234 LE.write<uint16_t>(Name.size());
6235 Out.write(Name.data(), Name.size());
6241 auto writeBaseIDOrNone = [&](
auto BaseID,
bool ShouldWrite) {
6242 assert(BaseID < std::numeric_limits<uint32_t>::max() &&
"base id too high");
6256 Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev,
Record,
6257 Buffer.data(), Buffer.size());
6261 WriteDeclAndTypes(SemaPtr->
Context);
6263 WriteFileDeclIDsMap();
6264 WriteSourceManagerBlock(PP->getSourceManager());
6266 WriteComments(SemaPtr->
Context);
6267 WritePreprocessor(*PP, isModule);
6268 WriteHeaderSearch(PP->getHeaderSearchInfo());
6270 WriteSelectors(*SemaPtr);
6271 WriteReferencedSelectorsPool(*SemaPtr);
6272 WriteLateParsedTemplates(*SemaPtr);
6274 WriteIdentifierTable(*PP, SemaPtr ? &SemaPtr->
IdResolver :
nullptr, isModule);
6277 WriteOpenCLExtensions(*SemaPtr);
6278 WriteCUDAPragmas(*SemaPtr);
6279 WriteRISCVIntrinsicPragmas(*SemaPtr);
6284 WriteSubmodules(WritingModule, SemaPtr ? &SemaPtr->
Context :
nullptr);
6289 WriteSpecialDeclRecords(*SemaPtr);
6292 if (!WeakUndeclaredIdentifiers.empty())
6294 WeakUndeclaredIdentifiers);
6298 if (!ExtnameUndeclaredIdentifiers.empty())
6300 ExtnameUndeclaredIdentifiers);
6302 if (!WritingModule) {
6307 ModuleInfo(uint64_t ID,
Module *M) :
ID(
ID), M(M) {}
6309 llvm::SmallVector<ModuleInfo, 64> Imports;
6312 assert(SubmoduleIDs.contains(I->getImportedModule()));
6313 Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()],
6314 I->getImportedModule()));
6318 if (!Imports.empty()) {
6319 auto Cmp = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6322 auto Eq = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6323 return A.ID == B.ID;
6327 llvm::sort(Imports,
Cmp);
6328 Imports.erase(llvm::unique(Imports, Eq), Imports.end());
6331 for (
const auto &Import : Imports) {
6332 ImportedModules.push_back(
Import.ID);
6343 WriteObjCCategories();
6345 if (!WritingModule) {
6346 WriteOptimizePragmaOptions(*SemaPtr);
6347 WriteMSStructPragmaOptions(*SemaPtr);
6348 WriteMSPointersToMembersPragmaOptions(*SemaPtr);
6350 WritePackPragmaOptions(*SemaPtr);
6351 WriteFloatControlPragmaOptions(*SemaPtr);
6352 WriteDeclsWithEffectsToVerify(*SemaPtr);
6356 RecordData::value_type
Record[] = {NumStatements,
6358 NumLexicalDeclContexts,
6359 NumVisibleDeclContexts,
6360 NumModuleLocalDeclContexts,
6361 NumTULocalDeclContexts};
6364 Stream.FlushToWord();
6365 ASTBlockRange.second = Stream.GetCurrentBitNo() >> 3;
6369 for (
const auto &ExtWriter : ModuleFileExtensionWriters)
6370 WriteModuleFileExtension(*SemaPtr, *ExtWriter);
6372 return backpatchSignature();
6378void ASTWriter::AddedManglingNumber(
const Decl *D,
unsigned Number) {
6382 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::ManglingNumber, Number));
6384void ASTWriter::AddedStaticLocalNumbers(
const Decl *D,
unsigned Number) {
6388 DeclUpdates[D].push_back(
6389 DeclUpdate(DeclUpdateKind::StaticLocalNumber, Number));
6398 ASTWriter::UpdateRecord &
Record = DeclUpdates[TU];
6401 DeclUpdate(DeclUpdateKind::CXXAddedAnonymousNamespace, NS));
6405void ASTWriter::WriteDeclAndTypes(
ASTContext &Context) {
6410 DeclTypesBlockStartOffset = Stream.GetCurrentBitNo();
6414 WriteDeclUpdatesBlocks(Context, DeclUpdatesOffsetsRecord);
6415 while (!DeclTypesToEmit.empty()) {
6416 DeclOrType DOT = DeclTypesToEmit.front();
6417 DeclTypesToEmit.pop();
6419 WriteType(Context, DOT.getType());
6421 WriteDecl(Context, DOT.getDecl());
6423 }
while (!DeclUpdates.empty());
6425 DoneWritingDeclsAndTypes =
true;
6429 assert(DelayedNamespace.empty() || GeneratingReducedBMI);
6431 for (NamespaceDecl *NS : DelayedNamespace) {
6432 LookupBlockOffsets Offsets;
6434 Offsets.
LexicalOffset = WriteDeclContextLexicalBlock(Context, NS);
6435 WriteDeclContextVisibleBlock(Context, NS, Offsets);
6456 assert(DeclTypesToEmit.empty());
6457 assert(DeclUpdates.empty());
6462 WriteTypeDeclOffsets();
6463 if (!DeclUpdatesOffsetsRecord.empty())
6466 if (!DelayedNamespaceRecord.empty())
6468 DelayedNamespaceRecord);
6470 if (!RelatedDeclsMap.empty()) {
6474 for (
const auto &Pair : RelatedDeclsMap) {
6475 RelatedDeclsMapRecord.push_back(Pair.first.getRawValue());
6476 RelatedDeclsMapRecord.push_back(Pair.second.size());
6477 for (
const auto &Lambda : Pair.second)
6478 RelatedDeclsMapRecord.push_back(Lambda.getRawValue());
6481 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6483 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array));
6484 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6485 unsigned FunctionToLambdaMapAbbrev = Stream.EmitAbbrev(std::move(Abv));
6487 FunctionToLambdaMapAbbrev);
6490 if (!SpecializationsUpdates.empty()) {
6491 WriteSpecializationsUpdates(
false);
6492 SpecializationsUpdates.clear();
6495 if (!PartialSpecializationsUpdates.empty()) {
6496 WriteSpecializationsUpdates(
true);
6497 PartialSpecializationsUpdates.clear();
6503 SmallVector<DeclID, 128> NewGlobalKindDeclPairs;
6512 NewGlobalKindDeclPairs.push_back(D->
getKind());
6513 NewGlobalKindDeclPairs.push_back(
GetDeclRef(D).getRawValue());
6516 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6518 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6519 unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));
6522 Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev,
Record,
6523 bytes(NewGlobalKindDeclPairs));
6525 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6527 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6528 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6529 UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6531 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6533 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6534 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6535 ModuleLocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6537 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6539 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6540 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6541 TULocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6544 WriteDeclContextVisibleUpdate(Context, TU);
6547 if (Context.ExternCContext)
6548 WriteDeclContextVisibleUpdate(Context, Context.ExternCContext);
6551 for (
auto *DC : UpdatedDeclContexts)
6552 WriteDeclContextVisibleUpdate(Context, DC);
6555void ASTWriter::WriteSpecializationsUpdates(
bool IsPartial) {
6559 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6560 Abv->Add(llvm::BitCodeAbbrevOp(RecordType));
6561 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6562 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6563 auto UpdateSpecializationAbbrev = Stream.EmitAbbrev(std::move(Abv));
6566 IsPartial ? PartialSpecializationsUpdates : SpecializationsUpdates;
6567 for (
auto &SpecializationUpdate : SpecUpdates) {
6568 const NamedDecl *D = SpecializationUpdate.first;
6570 llvm::SmallString<4096> LookupTable;
6571 GenerateSpecializationInfoLookupTable(D, SpecializationUpdate.second,
6572 LookupTable, IsPartial);
6575 RecordData::value_type
Record[] = {
6576 static_cast<RecordData::value_type
>(RecordType),
6578 Stream.EmitRecordWithBlob(UpdateSpecializationAbbrev,
Record, LookupTable);
6582void ASTWriter::WriteDeclUpdatesBlocks(
ASTContext &Context,
6583 RecordDataImpl &OffsetsRecord) {
6584 if (DeclUpdates.empty())
6587 DeclUpdateMap LocalUpdates;
6588 LocalUpdates.swap(DeclUpdates);
6590 for (
auto &DeclUpdate : LocalUpdates) {
6591 const Decl *D = DeclUpdate.first;
6593 bool HasUpdatedBody =
false;
6594 bool HasAddedVarDefinition =
false;
6597 for (
auto &
Update : DeclUpdate.second) {
6602 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
6603 HasUpdatedBody =
true;
6604 else if (Kind == DeclUpdateKind::CXXAddedVarDefinition)
6605 HasAddedVarDefinition =
true;
6607 Record.push_back(llvm::to_underlying(Kind));
6610 case DeclUpdateKind::CXXAddedImplicitMember:
6611 case DeclUpdateKind::CXXAddedAnonymousNamespace:
6612 assert(
Update.getDecl() &&
"no decl to add?");
6615 case DeclUpdateKind::CXXAddedFunctionDefinition:
6616 case DeclUpdateKind::CXXAddedVarDefinition:
6619 case DeclUpdateKind::CXXPointOfInstantiation:
6624 case DeclUpdateKind::CXXInstantiatedDefaultArgument:
6629 case DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer:
6634 case DeclUpdateKind::CXXInstantiatedClassDefinition: {
6636 UpdatedDeclContexts.insert(RD->getPrimaryContext());
6637 Record.push_back(RD->isParamDestroyedInCallee());
6638 Record.push_back(llvm::to_underlying(RD->getArgPassingRestrictions()));
6639 Record.AddCXXDefinitionData(RD);
6640 Record.AddOffset(WriteDeclContextLexicalBlock(Context, RD));
6645 if (
auto *MSInfo = RD->getMemberSpecializationInfo()) {
6646 Record.push_back(MSInfo->getTemplateSpecializationKind());
6647 Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
6650 Record.push_back(Spec->getTemplateSpecializationKind());
6651 Record.AddSourceLocation(Spec->getPointOfInstantiation());
6655 auto From = Spec->getInstantiatedFrom();
6656 if (
auto PartialSpec =
6657 From.dyn_cast<ClassTemplatePartialSpecializationDecl*>()) {
6659 Record.AddDeclRef(PartialSpec);
6660 Record.AddTemplateArgumentList(
6661 &Spec->getTemplateInstantiationArgs());
6666 Record.push_back(llvm::to_underlying(RD->getTagKind()));
6667 Record.AddSourceLocation(RD->getLocation());
6668 Record.AddSourceLocation(RD->getBeginLoc());
6669 Record.AddSourceRange(RD->getBraceRange());
6680 case DeclUpdateKind::CXXResolvedDtorDelete:
6685 case DeclUpdateKind::CXXResolvedDtorGlobDelete:
6689 case DeclUpdateKind::CXXResolvedDtorArrayDelete:
6693 case DeclUpdateKind::CXXResolvedDtorGlobArrayDelete:
6697 case DeclUpdateKind::CXXResolvedExceptionSpec: {
6700 Record.writeExceptionSpecInfo(prototype->getExceptionSpecInfo());
6704 case DeclUpdateKind::CXXDeducedReturnType:
6708 case DeclUpdateKind::DeclMarkedUsed:
6711 case DeclUpdateKind::ManglingNumber:
6712 case DeclUpdateKind::StaticLocalNumber:
6716 case DeclUpdateKind::DeclMarkedOpenMPThreadPrivate:
6718 D->
getAttr<OMPThreadPrivateDeclAttr>()->getRange());
6721 case DeclUpdateKind::DeclMarkedOpenMPAllocate: {
6722 auto *A = D->
getAttr<OMPAllocateDeclAttr>();
6723 Record.push_back(A->getAllocatorType());
6724 Record.AddStmt(A->getAllocator());
6725 Record.AddStmt(A->getAlignment());
6726 Record.AddSourceRange(A->getRange());
6730 case DeclUpdateKind::DeclMarkedOpenMPIndirectCall:
6732 D->
getAttr<OMPTargetIndirectCallAttr>()->getRange());
6735 case DeclUpdateKind::DeclMarkedOpenMPDeclareTarget:
6736 Record.push_back(D->
getAttr<OMPDeclareTargetDeclAttr>()->getMapType());
6738 D->
getAttr<OMPDeclareTargetDeclAttr>()->getRange());
6741 case DeclUpdateKind::DeclExported:
6745 case DeclUpdateKind::AddedAttrToRecord:
6746 Record.AddAttributes(llvm::ArrayRef(
Update.getAttr()));
6754 if (HasUpdatedBody) {
6757 llvm::to_underlying(DeclUpdateKind::CXXAddedFunctionDefinition));
6758 Record.push_back(Def->isInlined());
6759 Record.AddSourceLocation(Def->getInnerLocStart());
6760 Record.AddFunctionDefinition(Def);
6761 }
else if (HasAddedVarDefinition) {
6764 llvm::to_underlying(DeclUpdateKind::CXXAddedVarDefinition));
6765 Record.push_back(VD->isInline());
6766 Record.push_back(VD->isInlineSpecified());
6767 Record.AddVarDeclInit(VD);
6784 NonAffectingFileIDs.empty())
6786 auto It = llvm::lower_bound(NonAffectingFileIDs, FID);
6787 unsigned Idx = std::distance(NonAffectingFileIDs.begin(), It);
6788 unsigned Offset = NonAffectingFileIDAdjustments[Idx];
6789 return FileID::get(FID.getOpaqueValue() - Offset);
6792unsigned ASTWriter::getAdjustedNumCreatedFIDs(
FileID FID)
const {
6798 unsigned AdjustedNumCreatedFIDs = 0;
6799 for (
unsigned I = FID.ID, N = I + NumCreatedFIDs; I != N; ++I)
6800 if (IsSLocAffecting[I])
6801 ++AdjustedNumCreatedFIDs;
6802 return AdjustedNumCreatedFIDs;
6812 return SourceRange(getAdjustedLocation(
Range.getBegin()),
6813 getAdjustedLocation(
Range.getEnd()));
6818 return Offset - getAdjustment(Offset);
6823 if (NonAffectingRanges.empty())
6826 if (PP->getSourceManager().isLoadedOffset(Offset))
6829 if (Offset > NonAffectingRanges.back().getEnd().getOffset())
6830 return NonAffectingOffsetAdjustments.back();
6832 if (Offset < NonAffectingRanges.front().getBegin().getOffset())
6836 return Range.getEnd().getOffset() < Offset;
6839 auto It = llvm::lower_bound(NonAffectingRanges, Offset, Contains);
6840 unsigned Idx = std::distance(NonAffectingRanges.begin(), It);
6841 return NonAffectingOffsetAdjustments[Idx];
6845 Record.push_back(getAdjustedFileID(FID).getOpaqueValue());
6851 unsigned ModuleFileIndex = 0;
6854 if (PP->getSourceManager().isLoadedSourceLocation(Loc) && Loc.
isValid()) {
6857 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6858 assert(SLocMapI !=
getChain()->GlobalSLocOffsetMap.end() &&
6859 "Corrupted global sloc offset map");
6864 ModuleFileIndex = F->
Index + 1;
6872 Loc = getAdjustedLocation(Loc);
6909 MacroInfoToEmitData Info = { Name, MI, ID };
6910 MacroInfosToEmit.push_back(Info);
6916 return IdentMacroDirectivesOffsetMap.lookup(Name);
6920 Record->push_back(Writer->getSelectorRef(SelRef));
6929 if (SID == 0 && Chain) {
6932 Chain->LoadSelector(Sel);
6933 SID = SelectorIDs[Sel];
6936 SID = NextSelectorID++;
6937 SelectorIDs[Sel] = SID;
6979 bool InfoHasSameExpr
6981 Record->push_back(InfoHasSameExpr);
6982 if (InfoHasSameExpr)
6999 TypeLocWriter TLW(*
this);
7009template <
typename IdxForTypeTy>
7011 IdxForTypeTy IdxForType) {
7015 unsigned FastQuals = T.getLocalFastQualifiers();
7016 T.removeLocalFastQualifiers();
7018 if (T.hasLocalNonFastQualifiers())
7019 return IdxForType(T).asTypeID(FastQuals);
7021 assert(!T.hasLocalQualifiers());
7023 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr()))
7026 if (T == Context.AutoDeductTy)
7028 if (T == Context.AutoRRefDeductTy)
7031 return IdxForType(T).asTypeID(FastQuals);
7038 assert(!T.getLocalFastQualifiers());
7042 if (DoneWritingDeclsAndTypes) {
7043 assert(0 &&
"New type seen after serializing all the types to emit!");
7049 Idx =
TypeIdx(0, NextTypeID++);
7050 DeclTypesToEmit.push(T);
7056llvm::MapVector<ModuleFile *, const Decl *>
7058 llvm::MapVector<ModuleFile *, const Decl *> Firsts;
7061 if (R->isFromASTFile())
7062 Firsts[Chain->getOwningModuleFile(R)] = R;
7063 else if (IncludeLocal)
7064 Firsts[
nullptr] = R;
7080 Record.push_back(MacroRef >> 32);
7081 Record.push_back(MacroRef & llvm::maskTrailingOnes<MacroID>(32));
7096 assert(WritingAST &&
"Cannot request a declaration ID before AST writing");
7113 assert(!(
reinterpret_cast<uintptr_t>(D) & 0x01) &&
"Invalid decl pointer");
7115 if (ID.isInvalid()) {
7116 if (DoneWritingDeclsAndTypes) {
7117 assert(0 &&
"New decl seen after serializing all the decls to emit!");
7124 DeclTypesToEmit.push(
const_cast<Decl *
>(D));
7139 assert(DeclIDs.contains(D) &&
"Declaration not emitted!");
7146 assert(DoneWritingDeclsAndTypes &&
7147 "wasDeclEmitted should only be called after writing declarations");
7152 bool Emitted = DeclIDs.contains(D);
7154 GeneratingReducedBMI) &&
7155 "The declaration within modules can only be omitted in reduced BMI.");
7159void ASTWriter::getLazyUpdates(
const Decl *D) {
7160 if (!GeneratingReducedBMI)
7163 if (
auto *Iter = DeclUpdatesLazy.find(D); Iter != DeclUpdatesLazy.end()) {
7164 for (DeclUpdate &
Update : Iter->second)
7165 DeclUpdates[D].push_back(
Update);
7166 DeclUpdatesLazy.erase(Iter);
7170 if (
auto *DC = dyn_cast<DeclContext>(D);
7171 DC && UpdatedDeclContextsLazy.count(DC)) {
7172 UpdatedDeclContexts.insert(DC);
7173 UpdatedDeclContextsLazy.remove(DC);
7178 assert(
ID.isValid());
7195 SourceManager &
SM = PP->getSourceManager();
7196 SourceLocation FileLoc =
SM.getFileLoc(Loc);
7197 assert(
SM.isLocalSourceLocation(FileLoc));
7198 auto [FID, Offset] =
SM.getDecomposedLoc(FileLoc);
7201 assert(
SM.getSLocEntry(FID).isFile());
7202 assert(IsSLocAffecting[FID.ID]);
7204 std::unique_ptr<DeclIDInFileInfo> &Info = FileDeclIDs[FID];
7206 Info = std::make_unique<DeclIDInFileInfo>();
7208 std::pair<unsigned, LocalDeclID> LocDecl(Offset, ID);
7209 LocDeclIDsTy &Decls = Info->DeclIDs;
7210 Decls.push_back(LocDecl);
7215 "expected an anonymous declaration");
7219 auto It = AnonymousDeclarationNumbers.find(D);
7220 if (It == AnonymousDeclarationNumbers.end()) {
7223 AnonymousDeclarationNumbers[ND] = Number;
7226 It = AnonymousDeclarationNumbers.find(D);
7227 assert(It != AnonymousDeclarationNumbers.end() &&
7228 "declaration not found within its lexical context");
7283 while (QualifierLoc) {
7284 NestedNames.push_back(QualifierLoc);
7288 Record->push_back(NestedNames.size());
7289 while(!NestedNames.empty()) {
7290 QualifierLoc = NestedNames.pop_back_val();
7293 Record->push_back(llvm::to_underlying(Kind));
7296 AddDeclRef(Qualifier.getAsNamespaceAndPrefix().Namespace);
7318 llvm_unreachable(
"unexpected null nested name specifier");
7325 assert(TemplateParams &&
"No TemplateParams!");
7330 Record->push_back(TemplateParams->
size());
7331 for (
const auto &P : *TemplateParams)
7334 Record->push_back(
true);
7337 Record->push_back(
false);
7344 assert(TemplateArgs &&
"No TemplateArgs!");
7345 Record->push_back(TemplateArgs->
size());
7346 for (
int i = 0, e = TemplateArgs->
size(); i != e; ++i)
7352 assert(ASTTemplArgList &&
"No ASTTemplArgList!");
7362 Record->push_back(
Set.size());
7364 I =
Set.begin(), E =
Set.end(); I != E; ++I) {
7366 Record->push_back(I.getAccess());
7372 Record->push_back(
Base.isVirtual());
7373 Record->push_back(
Base.isBaseOfClass());
7374 Record->push_back(
Base.getAccessSpecifierAsWritten());
7375 Record->push_back(
Base.getInheritConstructors());
7388 for (
auto &
Base : Bases)
7406 for (
auto *
Init : CtorInits) {
7407 if (
Init->isBaseInitializer()) {
7411 }
else if (
Init->isDelegatingInitializer()) {
7414 }
else if (
Init->isMemberInitializer()){
7427 if (
Init->isWritten())
7441 auto &
Data = D->data();
7443 Record->push_back(
Data.IsLambda);
7447#define FIELD(Name, Width, Merge) \
7448 if (!DefinitionBits.canWriteNextNBits(Width)) { \
7449 Record->push_back(DefinitionBits); \
7450 DefinitionBits.reset(0); \
7452 DefinitionBits.addBits(Data.Name, Width);
7454#include "clang/AST/CXXRecordDeclDefinitionBits.def"
7457 Record->push_back(DefinitionBits);
7463 bool ModulesCodegen =
7468 Record->push_back(ModulesCodegen);
7470 Writer->AddDeclRef(D, Writer->ModularCodegenDecls);
7475 Record->push_back(
Data.ComputedVisibleConversions);
7476 if (
Data.ComputedVisibleConversions)
7480 if (!
Data.IsLambda) {
7481 Record->push_back(
Data.NumBases);
7482 if (
Data.NumBases > 0)
7486 Record->push_back(
Data.NumVBases);
7487 if (
Data.NumVBases > 0)
7492 auto &Lambda = D->getLambdaData();
7495 LambdaBits.
addBits(Lambda.DependencyKind, 2);
7496 LambdaBits.
addBit(Lambda.IsGenericLambda);
7497 LambdaBits.
addBits(Lambda.CaptureDefault, 2);
7498 LambdaBits.
addBits(Lambda.NumCaptures, 15);
7499 LambdaBits.
addBit(Lambda.HasKnownInternalLinkage);
7500 Record->push_back(LambdaBits);
7502 Record->push_back(Lambda.NumExplicitCaptures);
7503 Record->push_back(Lambda.ManglingNumber);
7508 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
7515 Record->push_back(CaptureBits);
7517 switch (
Capture.getCaptureKind()) {
7547 assert(ES->CheckedForSideEffects);
7548 Val |= (ES->HasConstantInitialization ? 2 : 0);
7549 Val |= (ES->HasConstantDestruction ? 4 : 0);
7563void ASTWriter::ReaderInitialized(
ASTReader *Reader) {
7564 assert(Reader &&
"Cannot remove chain");
7565 assert((!Chain || Chain == Reader) &&
"Cannot replace chain");
7566 assert(FirstDeclID == NextDeclID &&
7567 FirstTypeID == NextTypeID &&
7568 FirstIdentID == NextIdentID &&
7569 FirstMacroID == NextMacroID &&
7570 FirstSubmoduleID == NextSubmoduleID &&
7571 FirstSelectorID == NextSelectorID &&
7572 "Setting chain after writing has started.");
7578 NextSelectorID = FirstSelectorID;
7579 NextSubmoduleID = FirstSubmoduleID;
7589 unsigned OriginalModuleFileIndex = StoredID >> 32;
7593 if (OriginalModuleFileIndex == 0 && StoredID)
7604 MacroID &StoredID = MacroIDs[MI];
7605 unsigned OriginalModuleFileIndex = StoredID >> 32;
7608 if (OriginalModuleFileIndex == 0 && StoredID)
7617void ASTWriter::TypeRead(TypeIdx Idx,
QualType T) {
7629 TypeIdx &StoredIdx = TypeIdxs[T];
7635 if (ModuleFileIndex == 0 && StoredIdx.
getValue())
7646 DeclIDs[D] = LocalDeclID(ID);
7647 PredefinedDecls.insert(D);
7659 assert(!MacroDefinitions.contains(MD));
7660 MacroDefinitions[MD] =
ID;
7664 assert(!SubmoduleIDs.contains(Mod));
7665 SubmoduleIDs[Mod] =
ID;
7668void ASTWriter::CompletedTagDefinition(
const TagDecl *D) {
7669 if (Chain && Chain->isProcessingUpdateRecords())
return;
7671 assert(!WritingAST &&
"Already writing the AST!");
7672 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
7674 if (RD->isFromASTFile()) {
7679 "completed a tag from another module but not by instantiation?");
7680 DeclUpdates[RD].push_back(
7681 DeclUpdate(DeclUpdateKind::CXXInstantiatedClassDefinition));
7695void ASTWriter::AddedVisibleDecl(
const DeclContext *DC,
const Decl *D) {
7696 if (Chain && Chain->isProcessingUpdateRecords())
return;
7698 "Should not add lookup results to non-lookup contexts!");
7719 assert(!WritingAST &&
"Already writing the AST!");
7720 if (UpdatedDeclContexts.insert(DC) && !
cast<Decl>(DC)->isFromASTFile()) {
7724 llvm::append_range(DeclsToEmitEvenIfUnreferenced, DC->
decls());
7726 DeclsToEmitEvenIfUnreferenced.push_back(D);
7730 if (Chain && Chain->isProcessingUpdateRecords())
return;
7743 assert(!WritingAST &&
"Already writing the AST!");
7744 DeclUpdates[RD].push_back(
7745 DeclUpdate(DeclUpdateKind::CXXAddedImplicitMember, D));
7748void ASTWriter::ResolvedExceptionSpec(
const FunctionDecl *FD) {
7749 if (Chain && Chain->isProcessingUpdateRecords())
return;
7750 assert(!DoneWritingDeclsAndTypes &&
"Already done writing updates!");
7752 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7757 ->castAs<FunctionProtoType>()
7758 ->getExceptionSpecType()))
7759 DeclUpdates[D].push_back(DeclUpdateKind::CXXResolvedExceptionSpec);
7764 if (Chain && Chain->isProcessingUpdateRecords())
return;
7765 assert(!WritingAST &&
"Already writing the AST!");
7767 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7768 DeclUpdates[D].push_back(
7769 DeclUpdate(DeclUpdateKind::CXXDeducedReturnType, ReturnType));
7776 if (Chain && Chain->isProcessingUpdateRecords())
return;
7777 assert(!WritingAST &&
"Already writing the AST!");
7778 assert(
Delete &&
"Not given an operator delete");
7780 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7781 DeclUpdates[D].push_back(
7782 DeclUpdate(DeclUpdateKind::CXXResolvedDtorDelete,
Delete));
7788 if (Chain && Chain->isProcessingUpdateRecords())
7790 assert(!WritingAST &&
"Already writing the AST!");
7791 assert(GlobDelete &&
"Not given an operator delete");
7794 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7795 DeclUpdates[D].push_back(
7796 DeclUpdate(DeclUpdateKind::CXXResolvedDtorGlobDelete, GlobDelete));
7802 if (Chain && Chain->isProcessingUpdateRecords())
7804 assert(!WritingAST &&
"Already writing the AST!");
7805 assert(ArrayDelete &&
"Not given an operator delete");
7808 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7809 DeclUpdates[D].push_back(
7810 DeclUpdate(DeclUpdateKind::CXXResolvedDtorArrayDelete, ArrayDelete));
7814void ASTWriter::ResolvedOperatorGlobArrayDelete(
7816 if (Chain && Chain->isProcessingUpdateRecords())
7818 assert(!WritingAST &&
"Already writing the AST!");
7819 assert(GlobArrayDelete &&
"Not given an operator delete");
7822 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7823 DeclUpdates[D].push_back(DeclUpdate(
7824 DeclUpdateKind::CXXResolvedDtorGlobArrayDelete, GlobArrayDelete));
7828void ASTWriter::CompletedImplicitDefinition(
const FunctionDecl *D) {
7829 if (Chain && Chain->isProcessingUpdateRecords())
return;
7830 assert(!WritingAST &&
"Already writing the AST!");
7839 DeclUpdates[D].push_back(
7840 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7843void ASTWriter::VariableDefinitionInstantiated(
const VarDecl *D) {
7844 if (Chain && Chain->isProcessingUpdateRecords())
return;
7845 assert(!WritingAST &&
"Already writing the AST!");
7849 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::CXXAddedVarDefinition));
7852void ASTWriter::FunctionDefinitionInstantiated(
const FunctionDecl *D) {
7853 if (Chain && Chain->isProcessingUpdateRecords())
return;
7854 assert(!WritingAST &&
"Already writing the AST!");
7862 DeclUpdates[D].push_back(
7863 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7866void ASTWriter::InstantiationRequested(
const ValueDecl *D) {
7867 if (Chain && Chain->isProcessingUpdateRecords())
return;
7868 assert(!WritingAST &&
"Already writing the AST!");
7875 if (
auto *VD = dyn_cast<VarDecl>(D))
7876 POI = VD->getPointOfInstantiation();
7879 DeclUpdates[D].push_back(
7880 DeclUpdate(DeclUpdateKind::CXXPointOfInstantiation, POI));
7883void ASTWriter::DefaultArgumentInstantiated(
const ParmVarDecl *D) {
7884 if (Chain && Chain->isProcessingUpdateRecords())
return;
7885 assert(!WritingAST &&
"Already writing the AST!");
7889 DeclUpdates[D].push_back(
7890 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultArgument, D));
7893void ASTWriter::DefaultMemberInitializerInstantiated(
const FieldDecl *D) {
7894 assert(!WritingAST &&
"Already writing the AST!");
7898 DeclUpdates[D].push_back(
7899 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer, D));
7904 if (Chain && Chain->isProcessingUpdateRecords())
return;
7905 assert(!WritingAST &&
"Already writing the AST!");
7909 assert(IFD->
getDefinition() &&
"Category on a class without a definition?");
7910 ObjCClassesWithCategories.insert(
7914void ASTWriter::DeclarationMarkedUsed(
const Decl *D) {
7915 if (Chain && Chain->isProcessingUpdateRecords())
return;
7916 assert(!WritingAST &&
"Already writing the AST!");
7925 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclMarkedUsed));
7928void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(
const Decl *D) {
7929 if (Chain && Chain->isProcessingUpdateRecords())
return;
7930 assert(!WritingAST &&
"Already writing the AST!");
7934 DeclUpdates[D].push_back(
7935 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPThreadPrivate));
7938void ASTWriter::DeclarationMarkedOpenMPAllocate(
const Decl *D,
const Attr *A) {
7939 if (Chain && Chain->isProcessingUpdateRecords())
return;
7940 assert(!WritingAST &&
"Already writing the AST!");
7944 DeclUpdates[D].push_back(
7945 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPAllocate, A));
7948void ASTWriter::DeclarationMarkedOpenMPIndirectCall(
const Decl *D) {
7949 if (Chain && Chain->isProcessingUpdateRecords())
7951 assert(!WritingAST &&
"Already writing the AST!");
7955 DeclUpdates[D].push_back(
7956 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPIndirectCall));
7959void ASTWriter::DeclarationMarkedOpenMPDeclareTarget(
const Decl *D,
7961 if (Chain && Chain->isProcessingUpdateRecords())
return;
7962 assert(!WritingAST &&
"Already writing the AST!");
7966 DeclUpdates[D].push_back(
7967 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPDeclareTarget, Attr));
7970void ASTWriter::RedefinedHiddenDefinition(
const NamedDecl *D,
Module *M) {
7971 if (Chain && Chain->isProcessingUpdateRecords())
return;
7972 assert(!WritingAST &&
"Already writing the AST!");
7974 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclExported, M));
7977void ASTWriter::AddedAttributeToRecord(
const Attr *
Attr,
7979 if (Chain && Chain->isProcessingUpdateRecords())
return;
7980 assert(!WritingAST &&
"Already writing the AST!");
7981 if (!
Record->isFromASTFile())
7983 DeclUpdates[
Record].push_back(
7984 DeclUpdate(DeclUpdateKind::AddedAttrToRecord, Attr));
7987void ASTWriter::AddedCXXTemplateSpecialization(
7989 assert(!WritingAST &&
"Already writing the AST!");
7993 if (Chain && Chain->isProcessingUpdateRecords())
7996 DeclsToEmitEvenIfUnreferenced.push_back(D);
7999void ASTWriter::AddedCXXTemplateSpecialization(
8001 assert(!WritingAST &&
"Already writing the AST!");
8005 if (Chain && Chain->isProcessingUpdateRecords())
8008 DeclsToEmitEvenIfUnreferenced.push_back(D);
8013 assert(!WritingAST &&
"Already writing the AST!");
8017 if (Chain && Chain->isProcessingUpdateRecords())
8020 DeclsToEmitEvenIfUnreferenced.push_back(D);
8029class OMPClauseWriter :
public OMPClauseVisitor<OMPClauseWriter> {
8034#define GEN_CLANG_CLAUSE_CLASS
8035#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
8036#include "llvm/Frontend/OpenMP/OMP.inc"
8045 OMPClauseWriter(*this).writeClause(
C);
8048void OMPClauseWriter::writeClause(
OMPClause *
C) {
8049 Record.push_back(
unsigned(
C->getClauseKind()));
8051 Record.AddSourceLocation(
C->getBeginLoc());
8052 Record.AddSourceLocation(
C->getEndLoc());
8056 Record.push_back(uint64_t(
C->getCaptureRegion()));
8057 Record.AddStmt(
C->getPreInitStmt());
8061 VisitOMPClauseWithPreInit(
C);
8062 Record.AddStmt(
C->getPostUpdateExpr());
8065void OMPClauseWriter::VisitOMPIfClause(
OMPIfClause *
C) {
8066 VisitOMPClauseWithPreInit(
C);
8068 Record.AddSourceLocation(
C->getNameModifierLoc());
8069 Record.AddSourceLocation(
C->getColonLoc());
8070 Record.AddStmt(
C->getCondition());
8071 Record.AddSourceLocation(
C->getLParenLoc());
8075 VisitOMPClauseWithPreInit(
C);
8076 Record.AddStmt(
C->getCondition());
8077 Record.AddSourceLocation(
C->getLParenLoc());
8081 VisitOMPClauseWithPreInit(
C);
8082 Record.writeEnum(
C->getModifier());
8083 Record.AddStmt(
C->getNumThreads());
8084 Record.AddSourceLocation(
C->getModifierLoc());
8085 Record.AddSourceLocation(
C->getLParenLoc());
8089 Record.AddStmt(
C->getSafelen());
8090 Record.AddSourceLocation(
C->getLParenLoc());
8094 Record.AddStmt(
C->getSimdlen());
8095 Record.AddSourceLocation(
C->getLParenLoc());
8099 Record.push_back(
C->getNumSizes());
8100 for (
Expr *Size :
C->getSizesRefs())
8102 Record.AddSourceLocation(
C->getLParenLoc());
8106 Record.push_back(
C->getNumCounts());
8107 Record.push_back(
C->hasOmpFill());
8108 if (
C->hasOmpFill())
8109 Record.push_back(*
C->getOmpFillIndex());
8110 Record.AddSourceLocation(
C->getOmpFillLoc());
8111 for (
Expr *Count :
C->getCountsRefs())
8113 Record.AddSourceLocation(
C->getLParenLoc());
8117 Record.push_back(
C->getNumLoops());
8118 for (
Expr *Size :
C->getArgsRefs())
8120 Record.AddSourceLocation(
C->getLParenLoc());
8126 Record.AddStmt(
C->getFactor());
8127 Record.AddSourceLocation(
C->getLParenLoc());
8131 Record.AddStmt(
C->getFirst());
8132 Record.AddStmt(
C->getCount());
8133 Record.AddSourceLocation(
C->getLParenLoc());
8134 Record.AddSourceLocation(
C->getFirstLoc());
8135 Record.AddSourceLocation(
C->getCountLoc());
8139 Record.AddStmt(
C->getAllocator());
8140 Record.AddSourceLocation(
C->getLParenLoc());
8144 Record.AddStmt(
C->getNumForLoops());
8145 Record.AddSourceLocation(
C->getLParenLoc());
8148void OMPClauseWriter::VisitOMPDetachClause(OMPDetachClause *
C) {
8149 Record.AddStmt(
C->getEventHandler());
8150 Record.AddSourceLocation(
C->getLParenLoc());
8154 Record.push_back(
unsigned(
C->getDefaultKind()));
8155 Record.AddSourceLocation(
C->getLParenLoc());
8156 Record.AddSourceLocation(
C->getDefaultKindKwLoc());
8157 Record.push_back(
unsigned(
C->getDefaultVC()));
8158 Record.AddSourceLocation(
C->getDefaultVCLoc());
8162 Record.AddSourceLocation(
C->getLParenLoc());
8163 Record.AddSourceLocation(
C->getThreadsetKindLoc());
8164 Record.writeEnum(
C->getThreadsetKind());
8167void OMPClauseWriter::VisitOMPTransparentClause(OMPTransparentClause *
C) {
8168 Record.AddSourceLocation(
C->getLParenLoc());
8169 Record.AddStmt(
C->getImpexType());
8172void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *
C) {
8173 Record.push_back(
unsigned(
C->getProcBindKind()));
8174 Record.AddSourceLocation(
C->getLParenLoc());
8175 Record.AddSourceLocation(
C->getProcBindKindKwLoc());
8178void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *
C) {
8179 VisitOMPClauseWithPreInit(
C);
8180 Record.push_back(
C->getScheduleKind());
8181 Record.push_back(
C->getFirstScheduleModifier());
8182 Record.push_back(
C->getSecondScheduleModifier());
8183 Record.AddStmt(
C->getChunkSize());
8184 Record.AddSourceLocation(
C->getLParenLoc());
8185 Record.AddSourceLocation(
C->getFirstScheduleModifierLoc());
8186 Record.AddSourceLocation(
C->getSecondScheduleModifierLoc());
8187 Record.AddSourceLocation(
C->getScheduleKindLoc());
8188 Record.AddSourceLocation(
C->getCommaLoc());
8191void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *
C) {
8192 Record.push_back(
C->getLoopNumIterations().size());
8193 Record.AddStmt(
C->getNumForLoops());
8194 for (
Expr *NumIter :
C->getLoopNumIterations())
8196 for (
unsigned I = 0, E =
C->getLoopNumIterations().size(); I <E; ++I)
8197 Record.AddStmt(
C->getLoopCounter(I));
8198 Record.AddSourceLocation(
C->getLParenLoc());
8201void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *
C) {
8202 Record.AddStmt(
C->getCondition());
8203 Record.AddSourceLocation(
C->getLParenLoc());
8206void OMPClauseWriter::VisitOMPUntiedClause(OMPUntiedClause *) {}
8208void OMPClauseWriter::VisitOMPMergeableClause(OMPMergeableClause *) {}
8210void OMPClauseWriter::VisitOMPReadClause(OMPReadClause *) {}
8212void OMPClauseWriter::VisitOMPWriteClause(OMPWriteClause *) {}
8214void OMPClauseWriter::VisitOMPUpdateClause(OMPUpdateClause *
C) {
8215 Record.push_back(
C->isExtended() ? 1 : 0);
8216 if (
C->isExtended()) {
8217 Record.AddSourceLocation(
C->getLParenLoc());
8218 Record.AddSourceLocation(
C->getArgumentLoc());
8219 Record.writeEnum(
C->getDependencyKind());
8223void OMPClauseWriter::VisitOMPCaptureClause(OMPCaptureClause *) {}
8225void OMPClauseWriter::VisitOMPCompareClause(OMPCompareClause *) {}
8228void OMPClauseWriter::VisitOMPFailClause(OMPFailClause *
C) {
8229 Record.AddSourceLocation(
C->getLParenLoc());
8230 Record.AddSourceLocation(
C->getFailParameterLoc());
8231 Record.writeEnum(
C->getFailParameter());
8234void OMPClauseWriter::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
8236void OMPClauseWriter::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
8238void OMPClauseWriter::VisitOMPAbsentClause(OMPAbsentClause *
C) {
8239 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8240 Record.AddSourceLocation(
C->getLParenLoc());
8241 for (
auto K :
C->getDirectiveKinds()) {
8246void OMPClauseWriter::VisitOMPHoldsClause(OMPHoldsClause *
C) {
8248 Record.AddSourceLocation(
C->getLParenLoc());
8251void OMPClauseWriter::VisitOMPContainsClause(OMPContainsClause *
C) {
8252 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8253 Record.AddSourceLocation(
C->getLParenLoc());
8254 for (
auto K :
C->getDirectiveKinds()) {
8259void OMPClauseWriter::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
8261void OMPClauseWriter::VisitOMPNoOpenMPRoutinesClause(
8262 OMPNoOpenMPRoutinesClause *) {}
8264void OMPClauseWriter::VisitOMPNoOpenMPConstructsClause(
8265 OMPNoOpenMPConstructsClause *) {}
8267void OMPClauseWriter::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
8269void OMPClauseWriter::VisitOMPAcquireClause(OMPAcquireClause *) {}
8271void OMPClauseWriter::VisitOMPReleaseClause(OMPReleaseClause *) {}
8273void OMPClauseWriter::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
8275void OMPClauseWriter::VisitOMPWeakClause(OMPWeakClause *) {}
8277void OMPClauseWriter::VisitOMPThreadsClause(OMPThreadsClause *) {}
8279void OMPClauseWriter::VisitOMPSIMDClause(OMPSIMDClause *) {}
8281void OMPClauseWriter::VisitOMPNogroupClause(OMPNogroupClause *) {}
8283void OMPClauseWriter::VisitOMPInitClause(OMPInitClause *
C) {
8284 Record.push_back(
C->varlist_size());
8287 Record.writeBool(
C->getIsTarget());
8288 Record.writeBool(
C->getIsTargetSync());
8289 Record.AddSourceLocation(
C->getLParenLoc());
8290 Record.AddSourceLocation(
C->getVarLoc());
8293void OMPClauseWriter::VisitOMPUseClause(OMPUseClause *
C) {
8294 Record.AddStmt(
C->getInteropVar());
8295 Record.AddSourceLocation(
C->getLParenLoc());
8296 Record.AddSourceLocation(
C->getVarLoc());
8299void OMPClauseWriter::VisitOMPDestroyClause(OMPDestroyClause *
C) {
8300 Record.AddStmt(
C->getInteropVar());
8301 Record.AddSourceLocation(
C->getLParenLoc());
8302 Record.AddSourceLocation(
C->getVarLoc());
8305void OMPClauseWriter::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
8306 VisitOMPClauseWithPreInit(
C);
8307 Record.AddStmt(
C->getCondition());
8308 Record.AddSourceLocation(
C->getLParenLoc());
8311void OMPClauseWriter::VisitOMPNocontextClause(OMPNocontextClause *
C) {
8312 VisitOMPClauseWithPreInit(
C);
8313 Record.AddStmt(
C->getCondition());
8314 Record.AddSourceLocation(
C->getLParenLoc());
8317void OMPClauseWriter::VisitOMPFilterClause(OMPFilterClause *
C) {
8318 VisitOMPClauseWithPreInit(
C);
8319 Record.AddStmt(
C->getThreadID());
8320 Record.AddSourceLocation(
C->getLParenLoc());
8324 Record.AddStmt(
C->getAlignment());
8325 Record.AddSourceLocation(
C->getLParenLoc());
8328void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *
C) {
8329 Record.push_back(
C->varlist_size());
8330 Record.AddSourceLocation(
C->getLParenLoc());
8331 for (
auto *
VE :
C->varlist()) {
8334 for (
auto *
VE :
C->private_copies()) {
8339void OMPClauseWriter::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
8340 Record.push_back(
C->varlist_size());
8341 VisitOMPClauseWithPreInit(
C);
8342 Record.AddSourceLocation(
C->getLParenLoc());
8343 for (
auto *
VE :
C->varlist()) {
8346 for (
auto *
VE :
C->private_copies()) {
8349 for (
auto *
VE :
C->inits()) {
8354void OMPClauseWriter::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
8355 Record.push_back(
C->varlist_size());
8356 VisitOMPClauseWithPostUpdate(
C);
8357 Record.AddSourceLocation(
C->getLParenLoc());
8358 Record.writeEnum(
C->getKind());
8359 Record.AddSourceLocation(
C->getKindLoc());
8360 Record.AddSourceLocation(
C->getColonLoc());
8361 for (
auto *
VE :
C->varlist())
8363 for (
auto *E :
C->private_copies())
8365 for (
auto *E :
C->source_exprs())
8367 for (
auto *E :
C->destination_exprs())
8369 for (
auto *E :
C->assignment_ops())
8373void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *
C) {
8374 Record.push_back(
C->varlist_size());
8375 Record.AddSourceLocation(
C->getLParenLoc());
8376 for (
auto *
VE :
C->varlist())
8380void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *
C) {
8381 Record.push_back(
C->varlist_size());
8382 Record.writeEnum(
C->getModifier());
8383 VisitOMPClauseWithPostUpdate(
C);
8384 Record.AddSourceLocation(
C->getLParenLoc());
8385 Record.AddSourceLocation(
C->getModifierLoc());
8386 Record.AddSourceLocation(
C->getColonLoc());
8387 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8388 Record.AddDeclarationNameInfo(
C->getNameInfo());
8389 for (
auto *
VE :
C->varlist())
8391 for (
auto *
VE :
C->privates())
8393 for (
auto *E :
C->lhs_exprs())
8395 for (
auto *E :
C->rhs_exprs())
8397 for (
auto *E :
C->reduction_ops())
8399 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
8400 for (
auto *E :
C->copy_ops())
8402 for (
auto *E :
C->copy_array_temps())
8404 for (
auto *E :
C->copy_array_elems())
8407 auto PrivateFlags =
C->private_var_reduction_flags();
8408 Record.push_back(std::distance(PrivateFlags.begin(), PrivateFlags.end()));
8409 for (
bool Flag : PrivateFlags)
8413void OMPClauseWriter::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
8414 Record.push_back(
C->varlist_size());
8415 VisitOMPClauseWithPostUpdate(
C);
8416 Record.AddSourceLocation(
C->getLParenLoc());
8417 Record.AddSourceLocation(
C->getColonLoc());
8418 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8419 Record.AddDeclarationNameInfo(
C->getNameInfo());
8420 for (
auto *
VE :
C->varlist())
8422 for (
auto *
VE :
C->privates())
8424 for (
auto *E :
C->lhs_exprs())
8426 for (
auto *E :
C->rhs_exprs())
8428 for (
auto *E :
C->reduction_ops())
8432void OMPClauseWriter::VisitOMPInReductionClause(OMPInReductionClause *
C) {
8433 Record.push_back(
C->varlist_size());
8434 VisitOMPClauseWithPostUpdate(
C);
8435 Record.AddSourceLocation(
C->getLParenLoc());
8436 Record.AddSourceLocation(
C->getColonLoc());
8437 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8438 Record.AddDeclarationNameInfo(
C->getNameInfo());
8439 for (
auto *
VE :
C->varlist())
8441 for (
auto *
VE :
C->privates())
8443 for (
auto *E :
C->lhs_exprs())
8445 for (
auto *E :
C->rhs_exprs())
8447 for (
auto *E :
C->reduction_ops())
8449 for (
auto *E :
C->taskgroup_descriptors())
8453void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *
C) {
8454 Record.push_back(
C->varlist_size());
8455 VisitOMPClauseWithPostUpdate(
C);
8456 Record.AddSourceLocation(
C->getLParenLoc());
8457 Record.AddSourceLocation(
C->getColonLoc());
8458 Record.push_back(
C->getModifier());
8459 Record.AddSourceLocation(
C->getModifierLoc());
8460 for (
auto *
VE :
C->varlist()) {
8463 for (
auto *
VE :
C->privates()) {
8466 for (
auto *
VE :
C->inits()) {
8469 for (
auto *
VE :
C->updates()) {
8472 for (
auto *
VE :
C->finals()) {
8476 Record.AddStmt(
C->getCalcStep());
8477 for (
auto *
VE :
C->used_expressions())
8481void OMPClauseWriter::VisitOMPAlignedClause(OMPAlignedClause *
C) {
8482 Record.push_back(
C->varlist_size());
8483 Record.AddSourceLocation(
C->getLParenLoc());
8484 Record.AddSourceLocation(
C->getColonLoc());
8485 for (
auto *
VE :
C->varlist())
8487 Record.AddStmt(
C->getAlignment());
8490void OMPClauseWriter::VisitOMPCopyinClause(OMPCopyinClause *
C) {
8491 Record.push_back(
C->varlist_size());
8492 Record.AddSourceLocation(
C->getLParenLoc());
8493 for (
auto *
VE :
C->varlist())
8495 for (
auto *E :
C->source_exprs())
8497 for (
auto *E :
C->destination_exprs())
8499 for (
auto *E :
C->assignment_ops())
8503void OMPClauseWriter::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
8504 Record.push_back(
C->varlist_size());
8505 Record.AddSourceLocation(
C->getLParenLoc());
8506 for (
auto *
VE :
C->varlist())
8508 for (
auto *E :
C->source_exprs())
8510 for (
auto *E :
C->destination_exprs())
8512 for (
auto *E :
C->assignment_ops())
8516void OMPClauseWriter::VisitOMPFlushClause(OMPFlushClause *
C) {
8517 Record.push_back(
C->varlist_size());
8518 Record.AddSourceLocation(
C->getLParenLoc());
8519 for (
auto *
VE :
C->varlist())
8523void OMPClauseWriter::VisitOMPDepobjClause(OMPDepobjClause *
C) {
8524 Record.AddStmt(
C->getDepobj());
8525 Record.AddSourceLocation(
C->getLParenLoc());
8528void OMPClauseWriter::VisitOMPDependClause(OMPDependClause *
C) {
8529 Record.push_back(
C->varlist_size());
8530 Record.push_back(
C->getNumLoops());
8531 Record.AddSourceLocation(
C->getLParenLoc());
8532 Record.AddStmt(
C->getModifier());
8533 Record.push_back(
C->getDependencyKind());
8534 Record.AddSourceLocation(
C->getDependencyLoc());
8535 Record.AddSourceLocation(
C->getColonLoc());
8536 Record.AddSourceLocation(
C->getOmpAllMemoryLoc());
8537 for (
auto *
VE :
C->varlist())
8539 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8540 Record.AddStmt(
C->getLoopData(I));
8543void OMPClauseWriter::VisitOMPDeviceClause(OMPDeviceClause *
C) {
8544 VisitOMPClauseWithPreInit(
C);
8545 Record.writeEnum(
C->getModifier());
8546 Record.AddStmt(
C->getDevice());
8547 Record.AddSourceLocation(
C->getModifierLoc());
8548 Record.AddSourceLocation(
C->getLParenLoc());
8551void OMPClauseWriter::VisitOMPMapClause(OMPMapClause *
C) {
8552 Record.push_back(
C->varlist_size());
8553 Record.push_back(
C->getUniqueDeclarationsNum());
8554 Record.push_back(
C->getTotalComponentListNum());
8555 Record.push_back(
C->getTotalComponentsNum());
8556 Record.AddSourceLocation(
C->getLParenLoc());
8557 bool HasIteratorModifier =
false;
8559 Record.push_back(
C->getMapTypeModifier(I));
8560 Record.AddSourceLocation(
C->getMapTypeModifierLoc(I));
8561 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
8562 HasIteratorModifier =
true;
8564 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8565 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8566 Record.push_back(
C->getMapType());
8567 Record.AddSourceLocation(
C->getMapLoc());
8568 Record.AddSourceLocation(
C->getColonLoc());
8569 for (
auto *E :
C->varlist())
8571 for (
auto *E :
C->mapperlists())
8573 if (HasIteratorModifier)
8574 Record.AddStmt(
C->getIteratorModifier());
8575 for (
auto *D :
C->all_decls())
8577 for (
auto N :
C->all_num_lists())
8579 for (
auto N :
C->all_lists_sizes())
8581 for (
auto &M :
C->all_components()) {
8582 Record.AddStmt(M.getAssociatedExpression());
8583 Record.AddDeclRef(M.getAssociatedDeclaration());
8588 Record.push_back(
C->varlist_size());
8589 Record.writeEnum(
C->getFirstAllocateModifier());
8590 Record.writeEnum(
C->getSecondAllocateModifier());
8591 Record.AddSourceLocation(
C->getLParenLoc());
8592 Record.AddSourceLocation(
C->getColonLoc());
8593 Record.AddStmt(
C->getAllocator());
8594 Record.AddStmt(
C->getAlignment());
8595 for (
auto *
VE :
C->varlist())
8599void OMPClauseWriter::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
8600 Record.push_back(
C->varlist_size());
8601 VisitOMPClauseWithPreInit(
C);
8602 Record.AddSourceLocation(
C->getLParenLoc());
8603 for (
auto *
VE :
C->varlist())
8607void OMPClauseWriter::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
8608 Record.push_back(
C->varlist_size());
8609 VisitOMPClauseWithPreInit(
C);
8610 Record.AddSourceLocation(
C->getLParenLoc());
8611 for (
auto *
VE :
C->varlist())
8615void OMPClauseWriter::VisitOMPPriorityClause(OMPPriorityClause *
C) {
8616 VisitOMPClauseWithPreInit(
C);
8617 Record.AddStmt(
C->getPriority());
8618 Record.AddSourceLocation(
C->getLParenLoc());
8621void OMPClauseWriter::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
8622 VisitOMPClauseWithPreInit(
C);
8623 Record.writeEnum(
C->getModifier());
8624 Record.AddStmt(
C->getGrainsize());
8625 Record.AddSourceLocation(
C->getModifierLoc());
8626 Record.AddSourceLocation(
C->getLParenLoc());
8629void OMPClauseWriter::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
8630 VisitOMPClauseWithPreInit(
C);
8631 Record.writeEnum(
C->getModifier());
8632 Record.AddStmt(
C->getNumTasks());
8633 Record.AddSourceLocation(
C->getModifierLoc());
8634 Record.AddSourceLocation(
C->getLParenLoc());
8637void OMPClauseWriter::VisitOMPHintClause(OMPHintClause *
C) {
8639 Record.AddSourceLocation(
C->getLParenLoc());
8642void OMPClauseWriter::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
8643 VisitOMPClauseWithPreInit(
C);
8644 Record.push_back(
C->getDistScheduleKind());
8645 Record.AddStmt(
C->getChunkSize());
8646 Record.AddSourceLocation(
C->getLParenLoc());
8647 Record.AddSourceLocation(
C->getDistScheduleKindLoc());
8648 Record.AddSourceLocation(
C->getCommaLoc());
8651void OMPClauseWriter::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
8652 Record.push_back(
C->getDefaultmapKind());
8653 Record.push_back(
C->getDefaultmapModifier());
8654 Record.AddSourceLocation(
C->getLParenLoc());
8655 Record.AddSourceLocation(
C->getDefaultmapModifierLoc());
8656 Record.AddSourceLocation(
C->getDefaultmapKindLoc());
8659void OMPClauseWriter::VisitOMPToClause(OMPToClause *
C) {
8660 Record.push_back(
C->varlist_size());
8661 Record.push_back(
C->getUniqueDeclarationsNum());
8662 Record.push_back(
C->getTotalComponentListNum());
8663 Record.push_back(
C->getTotalComponentsNum());
8664 Record.AddSourceLocation(
C->getLParenLoc());
8666 Record.push_back(
C->getMotionModifier(I));
8667 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8668 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8669 Record.AddStmt(
C->getIteratorModifier());
8671 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8672 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8673 Record.AddSourceLocation(
C->getColonLoc());
8674 for (
auto *E :
C->varlist())
8676 for (
auto *E :
C->mapperlists())
8678 for (
auto *D :
C->all_decls())
8680 for (
auto N :
C->all_num_lists())
8682 for (
auto N :
C->all_lists_sizes())
8684 for (
auto &M :
C->all_components()) {
8685 Record.AddStmt(M.getAssociatedExpression());
8686 Record.writeBool(M.isNonContiguous());
8687 Record.AddDeclRef(M.getAssociatedDeclaration());
8691void OMPClauseWriter::VisitOMPFromClause(OMPFromClause *
C) {
8692 Record.push_back(
C->varlist_size());
8693 Record.push_back(
C->getUniqueDeclarationsNum());
8694 Record.push_back(
C->getTotalComponentListNum());
8695 Record.push_back(
C->getTotalComponentsNum());
8696 Record.AddSourceLocation(
C->getLParenLoc());
8698 Record.push_back(
C->getMotionModifier(I));
8699 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8700 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8701 Record.AddStmt(
C->getIteratorModifier());
8703 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8704 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8705 Record.AddSourceLocation(
C->getColonLoc());
8706 for (
auto *E :
C->varlist())
8708 for (
auto *E :
C->mapperlists())
8710 for (
auto *D :
C->all_decls())
8712 for (
auto N :
C->all_num_lists())
8714 for (
auto N :
C->all_lists_sizes())
8716 for (
auto &M :
C->all_components()) {
8717 Record.AddStmt(M.getAssociatedExpression());
8718 Record.writeBool(M.isNonContiguous());
8719 Record.AddDeclRef(M.getAssociatedDeclaration());
8723void OMPClauseWriter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
8724 Record.push_back(
C->varlist_size());
8725 Record.push_back(
C->getUniqueDeclarationsNum());
8726 Record.push_back(
C->getTotalComponentListNum());
8727 Record.push_back(
C->getTotalComponentsNum());
8728 Record.AddSourceLocation(
C->getLParenLoc());
8729 Record.writeEnum(
C->getFallbackModifier());
8730 Record.AddSourceLocation(
C->getFallbackModifierLoc());
8731 for (
auto *E :
C->varlist())
8733 for (
auto *
VE :
C->private_copies())
8735 for (
auto *
VE :
C->inits())
8737 for (
auto *D :
C->all_decls())
8739 for (
auto N :
C->all_num_lists())
8741 for (
auto N :
C->all_lists_sizes())
8743 for (
auto &M :
C->all_components()) {
8744 Record.AddStmt(M.getAssociatedExpression());
8745 Record.AddDeclRef(M.getAssociatedDeclaration());
8749void OMPClauseWriter::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
8750 Record.push_back(
C->varlist_size());
8751 Record.push_back(
C->getUniqueDeclarationsNum());
8752 Record.push_back(
C->getTotalComponentListNum());
8753 Record.push_back(
C->getTotalComponentsNum());
8754 Record.AddSourceLocation(
C->getLParenLoc());
8755 for (
auto *E :
C->varlist())
8757 for (
auto *D :
C->all_decls())
8759 for (
auto N :
C->all_num_lists())
8761 for (
auto N :
C->all_lists_sizes())
8763 for (
auto &M :
C->all_components()) {
8764 Record.AddStmt(M.getAssociatedExpression());
8765 Record.AddDeclRef(M.getAssociatedDeclaration());
8769void OMPClauseWriter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
8770 Record.push_back(
C->varlist_size());
8771 Record.push_back(
C->getUniqueDeclarationsNum());
8772 Record.push_back(
C->getTotalComponentListNum());
8773 Record.push_back(
C->getTotalComponentsNum());
8774 Record.AddSourceLocation(
C->getLParenLoc());
8775 for (
auto *E :
C->varlist())
8777 for (
auto *D :
C->all_decls())
8779 for (
auto N :
C->all_num_lists())
8781 for (
auto N :
C->all_lists_sizes())
8783 for (
auto &M :
C->all_components()) {
8784 Record.AddStmt(M.getAssociatedExpression());
8785 Record.AddDeclRef(M.getAssociatedDeclaration());
8789void OMPClauseWriter::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
8790 Record.push_back(
C->varlist_size());
8791 Record.push_back(
C->getUniqueDeclarationsNum());
8792 Record.push_back(
C->getTotalComponentListNum());
8793 Record.push_back(
C->getTotalComponentsNum());
8794 Record.AddSourceLocation(
C->getLParenLoc());
8795 for (
auto *E :
C->varlist())
8797 for (
auto *D :
C->all_decls())
8799 for (
auto N :
C->all_num_lists())
8801 for (
auto N :
C->all_lists_sizes())
8803 for (
auto &M :
C->all_components()) {
8804 Record.AddStmt(M.getAssociatedExpression());
8805 Record.AddDeclRef(M.getAssociatedDeclaration());
8809void OMPClauseWriter::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
8811void OMPClauseWriter::VisitOMPUnifiedSharedMemoryClause(
8812 OMPUnifiedSharedMemoryClause *) {}
8814void OMPClauseWriter::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
8817OMPClauseWriter::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
8820void OMPClauseWriter::VisitOMPAtomicDefaultMemOrderClause(
8821 OMPAtomicDefaultMemOrderClause *
C) {
8822 Record.push_back(
C->getAtomicDefaultMemOrderKind());
8823 Record.AddSourceLocation(
C->getLParenLoc());
8824 Record.AddSourceLocation(
C->getAtomicDefaultMemOrderKindKwLoc());
8827void OMPClauseWriter::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
8829void OMPClauseWriter::VisitOMPAtClause(OMPAtClause *
C) {
8830 Record.push_back(
C->getAtKind());
8831 Record.AddSourceLocation(
C->getLParenLoc());
8832 Record.AddSourceLocation(
C->getAtKindKwLoc());
8835void OMPClauseWriter::VisitOMPSeverityClause(OMPSeverityClause *
C) {
8836 Record.push_back(
C->getSeverityKind());
8837 Record.AddSourceLocation(
C->getLParenLoc());
8838 Record.AddSourceLocation(
C->getSeverityKindKwLoc());
8841void OMPClauseWriter::VisitOMPMessageClause(OMPMessageClause *
C) {
8842 VisitOMPClauseWithPreInit(
C);
8843 Record.AddStmt(
C->getMessageString());
8844 Record.AddSourceLocation(
C->getLParenLoc());
8847void OMPClauseWriter::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
8848 Record.push_back(
C->varlist_size());
8849 Record.AddSourceLocation(
C->getLParenLoc());
8850 for (
auto *
VE :
C->varlist())
8852 for (
auto *E :
C->private_refs())
8856void OMPClauseWriter::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
8857 Record.push_back(
C->varlist_size());
8858 Record.AddSourceLocation(
C->getLParenLoc());
8859 for (
auto *
VE :
C->varlist())
8863void OMPClauseWriter::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
8864 Record.push_back(
C->varlist_size());
8865 Record.AddSourceLocation(
C->getLParenLoc());
8866 for (
auto *
VE :
C->varlist())
8870void OMPClauseWriter::VisitOMPOrderClause(OMPOrderClause *
C) {
8871 Record.writeEnum(
C->getKind());
8872 Record.writeEnum(
C->getModifier());
8873 Record.AddSourceLocation(
C->getLParenLoc());
8874 Record.AddSourceLocation(
C->getKindKwLoc());
8875 Record.AddSourceLocation(
C->getModifierKwLoc());
8878void OMPClauseWriter::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
8879 Record.push_back(
C->getNumberOfAllocators());
8880 Record.AddSourceLocation(
C->getLParenLoc());
8881 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
8882 OMPUsesAllocatorsClause::Data
Data =
C->getAllocatorData(I);
8890void OMPClauseWriter::VisitOMPAffinityClause(OMPAffinityClause *
C) {
8891 Record.push_back(
C->varlist_size());
8892 Record.AddSourceLocation(
C->getLParenLoc());
8893 Record.AddStmt(
C->getModifier());
8894 Record.AddSourceLocation(
C->getColonLoc());
8895 for (
Expr *E :
C->varlist())
8899void OMPClauseWriter::VisitOMPBindClause(OMPBindClause *
C) {
8900 Record.writeEnum(
C->getBindKind());
8901 Record.AddSourceLocation(
C->getLParenLoc());
8902 Record.AddSourceLocation(
C->getBindKindLoc());
8905void OMPClauseWriter::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
8906 VisitOMPClauseWithPreInit(
C);
8908 Record.AddSourceLocation(
C->getLParenLoc());
8911void OMPClauseWriter::VisitOMPDynGroupprivateClause(
8912 OMPDynGroupprivateClause *
C) {
8913 VisitOMPClauseWithPreInit(
C);
8914 Record.push_back(
C->getDynGroupprivateModifier());
8915 Record.push_back(
C->getDynGroupprivateFallbackModifier());
8917 Record.AddSourceLocation(
C->getLParenLoc());
8918 Record.AddSourceLocation(
C->getDynGroupprivateModifierLoc());
8919 Record.AddSourceLocation(
C->getDynGroupprivateFallbackModifierLoc());
8922void OMPClauseWriter::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
8923 Record.push_back(
C->varlist_size());
8924 Record.push_back(
C->getNumLoops());
8925 Record.AddSourceLocation(
C->getLParenLoc());
8926 Record.push_back(
C->getDependenceType());
8927 Record.AddSourceLocation(
C->getDependenceLoc());
8928 Record.AddSourceLocation(
C->getColonLoc());
8929 for (
auto *
VE :
C->varlist())
8931 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8932 Record.AddStmt(
C->getLoopData(I));
8935void OMPClauseWriter::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
8936 Record.AddAttributes(
C->getAttrs());
8937 Record.AddSourceLocation(
C->getBeginLoc());
8938 Record.AddSourceLocation(
C->getLParenLoc());
8939 Record.AddSourceLocation(
C->getEndLoc());
8942void OMPClauseWriter::VisitOMPXBareClause(OMPXBareClause *
C) {}
8946 for (
const auto &
Set : TI->
Sets) {
8953 writeExprRef(
Selector.ScoreOrCondition);
8967 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
8969 if (
Data->hasAssociatedStmt())
8971 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
8977 for (
Expr *E :
C->getVarList())
8983 for (
Expr *E : Exprs)
8992 switch (
C->getClauseKind()) {
9002 AddStmt(
const_cast<Expr*
>(IC->getConditionExpr()));
9009 if (SC->isConditionExprClause()) {
9011 if (SC->hasConditionExpr())
9012 AddStmt(
const_cast<Expr *
>(SC->getConditionExpr()));
9015 for (
Expr *E : SC->getVarList())
9024 for (
Expr *E : NGC->getIntExprs())
9058 static_assert(
sizeof(R) == 1 *
sizeof(
int *));
9081 static_assert(
sizeof(R) == 2 *
sizeof(
int *));
9169 if (AC->hasIntExpr())
9177 if (
Expr *DNE = WC->getDevNumExpr())
9191 if (Arg.getIdentifierInfo())
9210 for (
auto &CombinerRecipe : R.CombinerRecipes) {
9238 for (
Expr *E : TC->getSizeExprs())
9246 for (
unsigned I = 0; I < GC->getNumExprs(); ++I) {
9248 AddStmt(
const_cast<Expr *
>(GC->getExpr(I).second));
9256 if (WC->hasIntExpr())
9264 if (VC->hasIntExpr())
9285 if (BC->isStringArgument())
9294 llvm_unreachable(
"Clause serialization not yet implemented");
9296 llvm_unreachable(
"Invalid Clause Kind");
9305 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 const char * adjustFilenameForRelocatableAST(const 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 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 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....
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.
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 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.
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
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
TemplateDecl * 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
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.
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
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,...
void GetUniqueIDMapping(SmallVectorImpl< OptionalFileEntryRef > &UIDToFiles) const
Produce an array mapping from the unique IDs assigned to each file to the corresponding FileEntryRef.
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.
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.
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.
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 '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.
bool hasLocalNonFastQualifiers() const
Determine whether this particular QualType instance has any "non-fast" qualifiers,...
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
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".
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.
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
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.
IdentifierResolver IdResolver
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.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
DiagnosticsEngine & getDiagnostics() const
SourceLocation::UIntTy getNextLocalOffset() const
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.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
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
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.
bool hasInitWithSideEffects() const
Checks whether this declaration has an initializer with side effects.
EvaluatedStmt * getEvaluatedStmt() const
const Expr * getInit() const
APValue * getEvaluatedValue() const
Return the already-evaluated value of this variable's initializer, or NULL if the value is not yet kn...
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.
@ 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_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.
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.
@ 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.
The JSON file list parser is used to communicate input to InstallAPI.
@ 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...
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
@ 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...
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.
@ Property
The type of a property.
OptionalUnsigned< unsigned > UnsignedOrNone
@ Type
The name was classified as a type.
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)
@ None
The alignment was not explicit in code.
@ 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...
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