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) {
1607 Record.push_back(M.FileName.getRawKind());
1611 AddPathBlob(M.FileName,
Record, Blob);
1614 Stream.EmitRecordWithBlob(AbbrevCode,
Record, Blob);
1624#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
1625 Record.push_back(LangOpts.Name);
1626#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
1627 Record.push_back(static_cast<unsigned>(LangOpts.get##Name()));
1628#include "clang/Basic/LangOptions.def"
1629#define SANITIZER(NAME, ID) \
1630 Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID));
1631#include "clang/Basic/Sanitizers.def"
1652 AddString(T.getTriple(),
Record);
1660 using CK = CodeGenOptions::CompatibilityKind;
1662 const CodeGenOptions &CGOpts = getCodeGenOpts();
1663#define CODEGENOPT(Name, Bits, Default, Compatibility) \
1664 if constexpr (CK::Compatibility != CK::Benign) \
1665 Record.push_back(static_cast<unsigned>(CGOpts.Name));
1666#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
1667 if constexpr (CK::Compatibility != CK::Benign) \
1668 Record.push_back(static_cast<unsigned>(CGOpts.get##Name()));
1669#define DEBUGOPT(Name, Bits, Default, Compatibility)
1670#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
1671#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
1672#include "clang/Basic/CodeGenOptions.def"
1688 for (
unsigned I = 0, N = TargetOpts.
Features.size(); I != N; ++I) {
1701 const HeaderSearchOptions &HSOpts =
1704 StringRef HSOpts_ModuleCachePath =
1709 AddString(HSOpts_ModuleCachePath,
Record);
1730 bool WriteMacros = !SkipMacros;
1731 Record.push_back(WriteMacros);
1735 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
1743 for (
unsigned I = 0, N = PPOpts.
Includes.size(); I != N; ++I)
1748 for (
unsigned I = 0, N = PPOpts.
MacroIncludes.size(); I != N; ++I)
1769 auto FileAbbrev = std::make_shared<BitCodeAbbrev>();
1771 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1772 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1773 unsigned FileAbbrevCode = Stream.EmitAbbrev(std::move(FileAbbrev));
1778 EmitRecordWithPath(FileAbbrevCode,
Record, MainFile->getName());
1785 WriteInputFiles(SourceMgr);
1792struct InputFileEntry {
1796 bool BufferOverridden;
1803 void trySetContentHash(
1805 llvm::function_ref<std::optional<llvm::MemoryBufferRef>()> GetMemBuff) {
1814 auto MemBuff = GetMemBuff();
1816 PP.
Diag(SourceLocation(), diag::err_module_unable_to_hash_content)
1821 uint64_t Hash = xxh3_64bits(MemBuff->getBuffer());
1823 ContentHash[1] =
uint32_t(Hash >> 32);
1829SourceLocation ASTWriter::getAffectingIncludeLoc(
const SourceManager &SourceMgr,
1830 const SrcMgr::FileInfo &
File) {
1831 SourceLocation IncludeLoc =
File.getIncludeLoc();
1833 FileID IncludeFID = SourceMgr.
getFileID(IncludeLoc);
1834 assert(IncludeFID.
isValid() &&
"IncludeLoc in invalid file");
1835 if (!IsSLocAffecting[IncludeFID.ID])
1836 IncludeLoc = SourceLocation();
1841void ASTWriter::WriteInputFiles(SourceManager &SourceMgr) {
1842 using namespace llvm;
1847 auto IFAbbrev = std::make_shared<BitCodeAbbrev>();
1849 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1850 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12));
1851 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
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::Fixed, 1));
1856 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
1857 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1858 unsigned IFAbbrevCode = Stream.EmitAbbrev(std::move(IFAbbrev));
1861 auto IFHAbbrev = std::make_shared<BitCodeAbbrev>();
1863 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1864 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1865 unsigned IFHAbbrevCode = Stream.EmitAbbrev(std::move(IFHAbbrev));
1867 uint64_t InputFilesOffsetBase = Stream.GetCurrentBitNo();
1871 std::vector<InputFileEntry> SystemFiles;
1875 assert(&SourceMgr.
getSLocEntry(FileID::get(I)) == SLoc);
1882 if (!
Cache->OrigEntry)
1886 if (!IsSLocFileEntryAffecting[I])
1889 InputFileEntry Entry(*
Cache->OrigEntry);
1890 Entry.IsSystemFile =
isSystem(
File.getFileCharacteristic());
1891 Entry.IsTransient =
Cache->IsTransient;
1892 Entry.BufferOverridden =
Cache->BufferOverridden;
1894 FileID IncludeFileID = SourceMgr.
getFileID(
File.getIncludeLoc());
1895 Entry.IsTopLevel = IncludeFileID.
isInvalid() || IncludeFileID.ID < 0 ||
1896 !IsSLocFileEntryAffecting[IncludeFileID.ID];
1899 Entry.trySetContentHash(*PP, [&] {
return Cache->getBufferIfLoaded(); });
1901 if (Entry.IsSystemFile)
1902 SystemFiles.push_back(Entry);
1911 if (!Sysroot.empty()) {
1912 SmallString<128> SDKSettingsJSON = Sysroot;
1913 llvm::sys::path::append(SDKSettingsJSON,
"SDKSettings.json");
1916 InputFileEntry Entry(*FE);
1917 Entry.IsSystemFile =
true;
1918 Entry.IsTransient =
false;
1919 Entry.BufferOverridden =
false;
1920 Entry.IsTopLevel =
true;
1921 Entry.IsModuleMap =
false;
1922 std::unique_ptr<MemoryBuffer> MB;
1923 Entry.trySetContentHash(*PP, [&]() -> std::optional<MemoryBufferRef> {
1925 MB = std::move(*MBOrErr);
1926 return MB->getMemBufferRef();
1928 return std::nullopt;
1930 SystemFiles.push_back(Entry);
1935 auto SortedFiles = llvm::concat<InputFileEntry>(std::move(
UserFiles),
1936 std::move(SystemFiles));
1938 unsigned UserFilesNum = 0;
1940 std::vector<uint64_t> InputFileOffsets;
1941 for (
const auto &Entry : SortedFiles) {
1942 uint32_t &InputFileID = InputFileIDs[Entry.File];
1943 if (InputFileID != 0)
1947 InputFileOffsets.push_back(Stream.GetCurrentBitNo() - InputFilesOffsetBase);
1949 InputFileID = InputFileOffsets.size();
1951 if (!Entry.IsSystemFile)
1957 SmallString<128> NameAsRequested = Entry.File.getNameAsRequested();
1958 SmallString<128> Name = Entry.File.getName();
1960 PreparePathForOutput(NameAsRequested);
1961 PreparePathForOutput(Name);
1963 if (Name == NameAsRequested)
1966 RecordData::value_type
Record[] = {
1968 InputFileOffsets.size(),
1970 (
uint64_t)getTimestampForOutput(Entry.File.getModificationTime()),
1971 Entry.BufferOverridden,
1975 NameAsRequested.size()};
1977 Stream.EmitRecordWithBlob(IFAbbrevCode,
Record,
1978 (NameAsRequested + Name).str());
1984 Entry.ContentHash[1]};
1985 Stream.EmitRecordWithAbbrev(IFHAbbrevCode,
Record);
1992 auto OffsetsAbbrev = std::make_shared<BitCodeAbbrev>();
1994 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1995 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1997 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1998 unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(std::move(OffsetsAbbrev));
2002 InputFileOffsets.size(), UserFilesNum};
2003 Stream.EmitRecordWithBlob(OffsetsAbbrevCode,
Record,
bytes(InputFileOffsets));
2013 using namespace llvm;
2015 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2017 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2018 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2019 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2020 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2022 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2023 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2024 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24));
2025 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2026 return Stream.EmitAbbrev(std::move(Abbrev));
2032 using namespace llvm;
2034 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2036 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2037 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2038 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2039 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2040 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2041 return Stream.EmitAbbrev(std::move(Abbrev));
2048 using namespace llvm;
2050 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2054 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2055 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2056 return Stream.EmitAbbrev(std::move(Abbrev));
2062 using namespace llvm;
2064 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2066 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2067 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2068 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2069 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2070 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2071 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2072 return Stream.EmitAbbrev(std::move(Abbrev));
2077static std::pair<unsigned, unsigned>
2079 llvm::encodeULEB128(KeyLen, Out);
2080 llvm::encodeULEB128(DataLen, Out);
2081 return std::make_pair(KeyLen, DataLen);
2087 class HeaderFileInfoTrait {
2091 HeaderFileInfoTrait(ASTWriter &Writer) : Writer(Writer) {}
2098 using key_type_ref =
const key_type &;
2100 using UnresolvedModule =
2101 llvm::PointerIntPair<Module *, 2, ModuleMap::ModuleHeaderRole>;
2104 data_type(
const HeaderFileInfo &HFI,
bool AlreadyIncluded,
2105 ArrayRef<ModuleMap::KnownHeader> KnownHeaders,
2107 : HFI(HFI), AlreadyIncluded(AlreadyIncluded),
2111 bool AlreadyIncluded;
2112 SmallVector<ModuleMap::KnownHeader, 1> KnownHeaders;
2115 using data_type_ref =
const data_type &;
2117 using hash_value_type = unsigned;
2118 using offset_type = unsigned;
2124 uint8_t buf[
sizeof(key.Size) +
sizeof(key.ModTime)];
2125 memcpy(buf, &key.Size,
sizeof(key.Size));
2126 memcpy(buf +
sizeof(key.Size), &key.ModTime,
sizeof(key.ModTime));
2127 return llvm::xxh3_64bits(buf);
2130 std::pair<unsigned, unsigned>
2131 EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref
Data) {
2132 unsigned KeyLen = key.Filename.size() + 1 + 8 + 8;
2134 for (
auto ModInfo :
Data.KnownHeaders)
2137 if (
Data.Unresolved.getPointer())
2142 void EmitKey(raw_ostream& Out, key_type_ref key,
unsigned KeyLen) {
2143 using namespace llvm::support;
2145 endian::Writer
LE(Out, llvm::endianness::little);
2150 Out.write(key.Filename.data(), KeyLen);
2153 void EmitData(raw_ostream &Out, key_type_ref key,
2154 data_type_ref
Data,
unsigned DataLen) {
2155 using namespace llvm::support;
2157 endian::Writer
LE(Out, llvm::endianness::little);
2160 unsigned char Flags = (
Data.AlreadyIncluded << 6)
2161 | (
Data.HFI.isImport << 5)
2163 Data.HFI.isPragmaOnce << 4)
2164 | (
Data.HFI.DirInfo << 1);
2165 LE.write<uint8_t>(Flags);
2167 if (
Data.HFI.LazyControllingMacro.isID())
2176 assert((
Value >> 3) == ModID &&
"overflow in header module info");
2181 for (
auto ModInfo :
Data.KnownHeaders)
2182 EmitModule(ModInfo.getModule(), ModInfo.getRole());
2183 if (
Data.Unresolved.getPointer())
2184 EmitModule(
Data.Unresolved.getPointer(),
Data.Unresolved.getInt());
2186 assert(
Out.tell() - Start == DataLen &&
"Wrong data length");
2195void ASTWriter::WriteHeaderSearch(
const HeaderSearch &HS) {
2196 HeaderFileInfoTrait GeneratorTrait(*
this);
2197 llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait>
Generator;
2198 SmallVector<const char *, 4> SavedStrings;
2199 unsigned NumHeaderSearchEntries = 0;
2205 const HeaderFileInfo
Empty;
2206 if (WritingModule) {
2207 llvm::SmallVector<Module *, 16> Worklist(1, WritingModule);
2208 while (!Worklist.empty()) {
2209 Module *M = Worklist.pop_back_val();
2226 if (!U.Size || (!U.ModTime && IncludeTimestamps)) {
2227 PP->
Diag(U.FileNameLoc, diag::err_module_no_size_mtime_for_header)
2228 << WritingModule->getFullModuleName() << U.Size.has_value()
2235 llvm::sys::path::append(Filename, U.FileName);
2236 PreparePathForOutput(Filename);
2238 StringRef FilenameDup = strdup(Filename.c_str());
2239 SavedStrings.push_back(FilenameDup.data());
2241 HeaderFileInfoTrait::key_type Key = {
2242 FilenameDup, *U.Size, IncludeTimestamps ? *U.ModTime : 0};
2243 HeaderFileInfoTrait::data_type
Data = {
2248 ++NumHeaderSearchEntries;
2251 Worklist.append(SubmodulesRange.begin(), SubmodulesRange.end());
2255 SmallVector<OptionalFileEntryRef, 16> FilesByUID;
2261 for (
unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
2275 StringRef Filename =
File->getName();
2276 SmallString<128> FilenameTmp(Filename);
2277 if (PreparePathForOutput(FilenameTmp)) {
2280 Filename = StringRef(strdup(FilenameTmp.c_str()));
2281 SavedStrings.push_back(Filename.data());
2286 HeaderFileInfoTrait::key_type Key = {
2287 Filename,
File->getSize(),
2288 getTimestampForOutput(
File->getModificationTime())};
2289 HeaderFileInfoTrait::data_type
Data = {
2293 ++NumHeaderSearchEntries;
2297 SmallString<4096> TableData;
2300 using namespace llvm::support;
2302 llvm::raw_svector_ostream
Out(TableData);
2304 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
2305 BucketOffset =
Generator.Emit(Out, GeneratorTrait);
2309 using namespace llvm;
2311 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2313 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2314 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2315 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2316 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2317 unsigned TableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2321 NumHeaderSearchEntries, TableData.size()};
2322 Stream.EmitRecordWithBlob(TableAbbrev,
Record, TableData);
2325 for (
unsigned I = 0, N = SavedStrings.size(); I != N; ++I)
2326 free(
const_cast<char *
>(SavedStrings[I]));
2329static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob,
2330 unsigned SLocBufferBlobCompressedAbbrv,
2331 unsigned SLocBufferBlobAbbrv) {
2332 using RecordDataType = ASTWriter::RecordData::value_type;
2337 if (llvm::compression::zstd::isAvailable()) {
2338 llvm::compression::zstd::compress(
2339 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer, 9);
2341 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2342 llvm::toStringRef(CompressedBuffer));
2345 if (llvm::compression::zlib::isAvailable()) {
2346 llvm::compression::zlib::compress(
2347 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer);
2349 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2350 llvm::toStringRef(CompressedBuffer));
2355 Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv,
Record, Blob);
2366void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr) {
2371 const uint64_t SourceManagerBlockOffset = Stream.GetCurrentBitNo();
2377 unsigned SLocBufferBlobCompressedAbbrv =
2383 std::vector<uint32_t> SLocEntryOffsets;
2384 uint64_t SLocEntryOffsetsBase = Stream.GetCurrentBitNo();
2390 FileID FID = FileID::get(I);
2394 uint64_t Offset = Stream.GetCurrentBitNo() - SLocEntryOffsetsBase;
2395 assert((Offset >> 32) == 0 &&
"SLocEntry offset too large");
2401 if (
Cache->OrigEntry) {
2414 if (!IsSLocAffecting[I])
2416 SLocEntryOffsets.push_back(Offset);
2419 AddSourceLocation(getAffectingIncludeLoc(SourceMgr,
File),
Record);
2420 Record.push_back(
File.getFileCharacteristic());
2423 bool EmitBlob =
false;
2426 "Writing to AST an overridden file is not supported");
2429 assert(InputFileIDs[*Content->
OrigEntry] != 0 &&
"Missed file entry");
2432 Record.push_back(getAdjustedNumCreatedFIDs(FID));
2434 FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);
2435 if (FDI != FileDeclIDs.end()) {
2436 Record.push_back(FDI->second->FirstDeclIndex);
2437 Record.push_back(FDI->second->DeclIDs.size());
2443 Stream.EmitRecordWithAbbrev(SLocFileAbbrv,
Record);
2454 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2456 StringRef Name = Buffer ? Buffer->getBufferIdentifier() :
"";
2457 Stream.EmitRecordWithBlob(SLocBufferAbbrv,
Record,
2458 StringRef(Name.data(), Name.size() + 1));
2465 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2468 Buffer = llvm::MemoryBufferRef(
"<<<INVALID BUFFER>>>",
"");
2469 StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1);
2470 emitBlob(Stream, Blob, SLocBufferBlobCompressedAbbrv,
2471 SLocBufferBlobAbbrv);
2475 const SrcMgr::ExpansionInfo &Expansion = SLoc->
getExpansion();
2476 SLocEntryOffsets.push_back(Offset);
2491 Record.push_back(getAdjustedOffset(NextOffset - SLoc->
getOffset()) - 1);
2492 Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv,
Record);
2498 if (SLocEntryOffsets.empty())
2503 using namespace llvm;
2505 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2507 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2508 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2509 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2510 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2511 unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2513 RecordData::value_type
Record[] = {
2516 SLocEntryOffsetsBase - SourceManagerBlockOffset};
2517 Stream.EmitRecordWithBlob(SLocOffsetsAbbrev,
Record,
2518 bytes(SLocEntryOffsets));
2529 llvm::DenseMap<int, int> FilenameMap;
2530 FilenameMap[-1] = -1;
2531 for (
const auto &L : LineTable) {
2534 for (
auto &LE : L.second) {
2535 if (FilenameMap.insert(std::make_pair(
LE.FilenameID,
2536 FilenameMap.size() - 1)).second)
2537 AddPath(LineTable.getFilename(
LE.FilenameID),
Record);
2543 for (
const auto &L : LineTable) {
2548 AddFileID(L.first,
Record);
2551 Record.push_back(L.second.size());
2552 for (
const auto &LE : L.second) {
2555 Record.push_back(FilenameMap[
LE.FilenameID]);
2556 Record.push_back((
unsigned)
LE.FileKind);
2557 Record.push_back(
LE.IncludeOffset);
2572 if (MI->isBuiltinMacro())
2588void ASTWriter::WritePreprocessor(
const Preprocessor &PP,
bool IsModule) {
2589 uint64_t MacroOffsetsBase = Stream.GetCurrentBitNo();
2593 WritePreprocessorDetail(*PPRec, MacroOffsetsBase);
2596 RecordData ModuleMacroRecord;
2606 SourceLocation AssumeNonNullLoc =
2608 if (AssumeNonNullLoc.
isValid()) {
2610 AddSourceLocation(AssumeNonNullLoc,
Record);
2620 AddSourceLocation(SkipInfo->HashTokenLoc,
Record);
2621 AddSourceLocation(SkipInfo->IfTokenLoc,
Record);
2622 Record.push_back(SkipInfo->FoundNonSkipPortion);
2623 Record.push_back(SkipInfo->FoundElse);
2624 AddSourceLocation(SkipInfo->ElseLoc,
Record);
2640 AddSourceLocation(S,
Record);
2650 PP.
Diag(SourceLocation(), diag::warn_module_uses_date_time) << IsModule;
2657 SmallVector<const IdentifierInfo *, 128> MacroIdentifiers;
2660 if (!isWritingStdCXXNamedModules())
2662 if (Id.second->hadMacroDefinition() &&
2663 (!Id.second->isFromAST() ||
2664 Id.second->hasChangedSinceDeserialization()))
2665 MacroIdentifiers.push_back(Id.second);
2668 llvm::sort(MacroIdentifiers, llvm::deref<std::less<>>());
2672 for (
const IdentifierInfo *Name : MacroIdentifiers) {
2674 uint64_t StartOffset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2675 assert((StartOffset >> 32) == 0 &&
"Macro identifiers offset too large");
2678 bool EmittedModuleMacros =
false;
2686 if (IsModule && WritingModule->isHeaderUnit()) {
2695 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2696 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2697 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2698 Record.push_back(VisMD->isPublic());
2700 ModuleMacroRecord.push_back(getSubmoduleID(WritingModule));
2701 AddMacroRef(MD->
getMacroInfo(), Name, ModuleMacroRecord);
2703 ModuleMacroRecord.clear();
2704 EmittedModuleMacros =
true;
2714 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2715 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2716 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2717 Record.push_back(VisMD->isPublic());
2723 SmallVector<ModuleMacro *, 8> Worklist(Leafs);
2724 llvm::DenseMap<ModuleMacro *, unsigned> Visits;
2725 while (!Worklist.empty()) {
2726 auto *
Macro = Worklist.pop_back_val();
2729 ModuleMacroRecord.push_back(getSubmoduleID(
Macro->getOwningModule()));
2730 AddMacroRef(
Macro->getMacroInfo(), Name, ModuleMacroRecord);
2731 for (
auto *M :
Macro->overrides())
2732 ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));
2735 ModuleMacroRecord.clear();
2738 for (
auto *M :
Macro->overrides())
2739 if (++Visits[M] == M->getNumOverridingMacros())
2740 Worklist.push_back(M);
2742 EmittedModuleMacros =
true;
2745 if (
Record.empty() && !EmittedModuleMacros)
2748 IdentMacroDirectivesOffsetMap[Name] = StartOffset;
2759 std::vector<uint32_t> MacroOffsets;
2761 for (
unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {
2762 const IdentifierInfo *Name = MacroInfosToEmit[I].Name;
2763 MacroInfo *MI = MacroInfosToEmit[I].MI;
2766 if (ID < FirstMacroID) {
2767 assert(0 &&
"Loaded MacroInfo entered MacroInfosToEmit ?");
2772 unsigned Index =
ID - FirstMacroID;
2773 if (Index >= MacroOffsets.size())
2774 MacroOffsets.resize(Index + 1);
2776 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2777 assert((Offset >> 32) == 0 &&
"Macro offset too large");
2778 MacroOffsets[Index] = Offset;
2780 AddIdentifierRef(Name,
Record);
2796 for (
const IdentifierInfo *Param : MI->
params())
2797 AddIdentifierRef(Param,
Record);
2805 Stream.EmitRecord(Code,
Record);
2809 for (
unsigned TokNo = 0, e = MI->
getNumTokens(); TokNo != e; ++TokNo) {
2824 using namespace llvm;
2826 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2828 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2829 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2830 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2832 unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2835 MacroOffsetsBase - ASTBlockStartOffset};
2836 Stream.EmitRecordWithBlob(MacroOffsetAbbrev,
Record,
bytes(MacroOffsets));
2840void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec,
2841 uint64_t MacroOffsetsBase) {
2845 SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets;
2851 unsigned NumPreprocessingRecords = 0;
2852 using namespace llvm;
2855 unsigned InclusionAbbrev = 0;
2857 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2859 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2860 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2861 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));
2862 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2863 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2864 InclusionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2868 unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
2870 for (PreprocessingRecord::iterator E = PPRec.
local_begin(),
2873 (
void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {
2876 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2877 assert((Offset >> 32) == 0 &&
"Preprocessed entity offset too large");
2878 SourceRange
R = getAdjustedRange((*E)->getSourceRange());
2879 PreprocessedEntityOffsets.emplace_back(
2880 getRawSourceLocationEncoding(
R.getBegin()),
2881 getRawSourceLocationEncoding(
R.getEnd()), Offset);
2883 if (
auto *MD = dyn_cast<MacroDefinitionRecord>(*E)) {
2885 MacroDefinitions[MD] = NextPreprocessorEntityID;
2887 AddIdentifierRef(MD->getName(),
Record);
2892 if (
auto *ME = dyn_cast<MacroExpansion>(*E)) {
2893 Record.push_back(ME->isBuiltinMacro());
2894 if (ME->isBuiltinMacro())
2895 AddIdentifierRef(ME->getName(),
Record);
2897 Record.push_back(MacroDefinitions[ME->getDefinition()]);
2902 if (
auto *ID = dyn_cast<InclusionDirective>(*E)) {
2904 Record.push_back(
ID->getFileName().size());
2905 Record.push_back(
ID->wasInQuotes());
2906 Record.push_back(
static_cast<unsigned>(
ID->getKind()));
2907 Record.push_back(
ID->importedModule());
2908 SmallString<64> Buffer;
2909 Buffer +=
ID->getFileName();
2913 Buffer +=
ID->getFile()->getName();
2914 Stream.EmitRecordWithBlob(InclusionAbbrev,
Record, Buffer);
2918 llvm_unreachable(
"Unhandled PreprocessedEntity in ASTWriter");
2923 if (NumPreprocessingRecords > 0) {
2924 assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);
2927 using namespace llvm;
2929 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2931 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2932 unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2935 Stream.EmitRecordWithBlob(PPEOffsetAbbrev,
Record,
2936 bytes(PreprocessedEntityOffsets));
2941 if (SkippedRanges.size() > 0) {
2942 std::vector<PPSkippedRange> SerializedSkippedRanges;
2943 SerializedSkippedRanges.reserve(SkippedRanges.size());
2944 for (
auto const& Range : SkippedRanges)
2945 SerializedSkippedRanges.emplace_back(
2946 getRawSourceLocationEncoding(
Range.getBegin()),
2947 getRawSourceLocationEncoding(
Range.getEnd()));
2949 using namespace llvm;
2950 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2952 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2953 unsigned PPESkippedRangeAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2957 Stream.EmitRecordWithBlob(PPESkippedRangeAbbrev,
Record,
2958 bytes(SerializedSkippedRanges));
2966 auto Known = SubmoduleIDs.find(Mod);
2967 if (Known != SubmoduleIDs.end())
2968 return Known->second;
2971 if (Top != WritingModule &&
2973 !Top->fullModuleNameIs(StringRef(
getLangOpts().CurrentModule))))
2976 return SubmoduleIDs[Mod] = NextSubmoduleID++;
2979unsigned ASTWriter::getSubmoduleID(
Module *Mod) {
2980 unsigned ID = getLocalOrImportedSubmoduleID(Mod);
2989void ASTWriter::WriteSubmodules(
Module *WritingModule,
ASTContext *Context) {
2994 using namespace llvm;
2996 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2998 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2999 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3000 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4));
3001 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3002 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));
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::Fixed, 1));
3013 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3014 unsigned DefinitionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3016 Abbrev = std::make_shared<BitCodeAbbrev>();
3018 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3019 unsigned UmbrellaAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3021 Abbrev = std::make_shared<BitCodeAbbrev>();
3023 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3024 unsigned HeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3026 Abbrev = std::make_shared<BitCodeAbbrev>();
3028 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3029 unsigned TopHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3031 Abbrev = std::make_shared<BitCodeAbbrev>();
3033 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3034 unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3036 Abbrev = std::make_shared<BitCodeAbbrev>();
3038 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3039 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3040 unsigned RequiresAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3042 Abbrev = std::make_shared<BitCodeAbbrev>();
3044 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3045 unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3047 Abbrev = std::make_shared<BitCodeAbbrev>();
3049 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3050 unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3052 Abbrev = std::make_shared<BitCodeAbbrev>();
3054 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3055 unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3057 Abbrev = std::make_shared<BitCodeAbbrev>();
3059 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3060 unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3062 Abbrev = std::make_shared<BitCodeAbbrev>();
3064 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3065 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3066 unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3068 Abbrev = std::make_shared<BitCodeAbbrev>();
3070 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3071 unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3073 Abbrev = std::make_shared<BitCodeAbbrev>();
3075 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3076 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3077 unsigned ConflictAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3079 Abbrev = std::make_shared<BitCodeAbbrev>();
3081 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3082 unsigned ExportAsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3084 Abbrev = std::make_shared<BitCodeAbbrev>();
3086 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3087 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3088 unsigned ChildAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3091 uint64_t SubmoduleOffsetBase = Stream.GetCurrentBitNo();
3093 unsigned TopLevelID = getSubmoduleID(WritingModule);
3096 std::queue<Module *> Q;
3097 Q.push(WritingModule);
3098 while (!Q.empty()) {
3101 unsigned ID = getSubmoduleID(Mod);
3102 if (ID < FirstSubmoduleID) {
3103 assert(0 &&
"Loaded submodule entered WritingModule ?");
3108 unsigned Index =
ID - FirstSubmoduleID;
3109 if (Index >= SubmoduleOffsets.size())
3110 SubmoduleOffsets.resize(Index + 1);
3112 uint64_t Offset = Stream.GetCurrentBitNo() - SubmoduleOffsetBase;
3113 assert((Offset >> 32) == 0 &&
"Submodule offset too large");
3114 SubmoduleOffsets[Index] = Offset;
3118 assert(SubmoduleIDs[Mod->
Parent] &&
"Submodule parent not written?");
3119 ParentID = SubmoduleIDs[Mod->
Parent];
3123 getRawSourceLocationEncoding(getAdjustedLocation(Mod->
DefinitionLoc));
3126 FileID UnadjustedInferredFID;
3129 int InferredFID = getAdjustedFileID(UnadjustedInferredFID).getOpaqueValue();
3136 (RecordData::value_type)Mod->
Kind,
3138 (RecordData::value_type)InferredFID,
3149 Stream.EmitRecordWithBlob(DefinitionAbbrev,
Record, Mod->
Name);
3155 Stream.EmitRecordWithBlob(RequiresAbbrev,
Record,
R.FeatureName);
3159 if (std::optional<Module::Header> UmbrellaHeader =
3162 Stream.EmitRecordWithBlob(UmbrellaAbbrev,
Record,
3163 UmbrellaHeader->NameAsWritten);
3164 }
else if (std::optional<Module::DirectoryName> UmbrellaDir =
3167 Stream.EmitRecordWithBlob(UmbrellaDirAbbrev,
Record,
3168 UmbrellaDir->NameAsWritten);
3173 unsigned RecordKind;
3175 Module::HeaderKind HeaderKind;
3181 Module::HK_PrivateTextual},
3184 for (
const auto &HL : HeaderLists) {
3185 RecordData::value_type
Record[] = {HL.RecordKind};
3186 for (
const auto &H : Mod->
getHeaders(HL.HeaderKind))
3187 Stream.EmitRecordWithBlob(HL.Abbrev,
Record, H.NameAsWritten);
3194 SmallString<128> HeaderName(H.getName());
3195 PreparePathForOutput(HeaderName);
3196 Stream.EmitRecordWithBlob(TopHeaderAbbrev,
Record, HeaderName);
3204 Record.push_back(getSubmoduleID(I));
3212 Record.push_back(getSubmoduleID(I));
3219 for (
const auto &E : Mod->
Exports) {
3222 Record.push_back(getSubmoduleID(E.first));
3223 Record.push_back(E.second);
3238 Stream.EmitRecordWithBlob(LinkLibraryAbbrev,
Record, LL.Library);
3246 getSubmoduleID(
C.Other)};
3247 Stream.EmitRecordWithBlob(ConflictAbbrev,
Record,
C.Message);
3253 Stream.EmitRecordWithBlob(ConfigMacroAbbrev,
Record, CM);
3258 if (Context && !GeneratingReducedBMI) {
3261 if (wasDeclEmitted(D))
3262 AddDeclRef(D,
Inits);
3277 getSubmoduleID(Child)};
3278 Stream.EmitRecordWithBlob(ChildAbbrev,
Record, Child->Name);
3294 assert((NextSubmoduleID - FirstSubmoduleID == SubmoduleOffsets.size()) &&
3295 "Wrong # of submodules; found a reference to a non-local, "
3296 "non-imported submodule?");
3298 Abbrev = std::make_shared<BitCodeAbbrev>();
3300 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3301 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3302 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3303 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3304 unsigned SubmoduleMetadataAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3306 RecordData::value_type
Record[] = {
3309 Stream.EmitRecordWithBlob(SubmoduleMetadataAbbrev,
Record,
3310 bytes(SubmoduleOffsets));
3313void ASTWriter::WritePragmaDiagnosticMappings(
const DiagnosticsEngine &
Diag,
3315 llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>
3317 unsigned CurrID = 0;
3320 auto EncodeDiagStateFlags =
3321 [](
const DiagnosticsEngine::DiagState *DS) ->
unsigned {
3322 unsigned Result = (unsigned)DS->ExtBehavior;
3324 {(unsigned)DS->IgnoreAllWarnings, (
unsigned)DS->EnableAllWarnings,
3325 (unsigned)DS->WarningsAsErrors, (
unsigned)DS->ErrorsAsFatal,
3326 (unsigned)DS->SuppressSystemWarnings})
3331 unsigned Flags = EncodeDiagStateFlags(
Diag.DiagStatesByLoc.FirstDiagState);
3334 auto AddDiagState = [&](
const DiagnosticsEngine::DiagState *State,
3335 bool IncludeNonPragmaStates) {
3338 assert(Flags == EncodeDiagStateFlags(State) &&
3339 "diag state flags vary in single AST file");
3343 assert(!IncludeNonPragmaStates ||
3344 State ==
Diag.DiagStatesByLoc.FirstDiagState);
3346 unsigned &DiagStateID = DiagStateIDMap[State];
3347 Record.push_back(DiagStateID);
3349 if (DiagStateID == 0) {
3350 DiagStateID = ++CurrID;
3351 SmallVector<std::pair<unsigned, DiagnosticMapping>> Mappings;
3354 auto SizeIdx =
Record.size();
3356 for (
const auto &I : *State) {
3358 if (!I.second.isPragma() && !IncludeNonPragmaStates)
3362 if (!I.second.isPragma() &&
3363 I.second ==
Diag.getDiagnosticIDs()->getDefaultMapping(I.first))
3365 Mappings.push_back(I);
3369 llvm::sort(Mappings, llvm::less_first());
3371 for (
const auto &I : Mappings) {
3372 Record.push_back(I.first);
3373 Record.push_back(I.second.serialize());
3380 AddDiagState(
Diag.DiagStatesByLoc.FirstDiagState, isModule);
3383 auto NumLocationsIdx =
Record.size();
3387 unsigned NumLocations = 0;
3388 for (
auto &FileIDAndFile :
Diag.DiagStatesByLoc.Files) {
3389 if (!FileIDAndFile.first.isValid() ||
3390 !FileIDAndFile.second.HasLocalTransitions)
3394 AddFileID(FileIDAndFile.first,
Record);
3396 Record.push_back(FileIDAndFile.second.StateTransitions.size());
3397 for (
auto &StatePoint : FileIDAndFile.second.StateTransitions) {
3398 Record.push_back(StatePoint.Offset);
3399 AddDiagState(StatePoint.State,
false);
3404 Record[NumLocationsIdx] = NumLocations;
3412 AddSourceLocation(
Diag.DiagStatesByLoc.CurDiagStateLoc,
Record);
3413 AddDiagState(
Diag.DiagStatesByLoc.CurDiagState,
false);
3418 Record.push_back(
Diag.DiagStateOnPushStack.size());
3419 for (
const auto *State :
Diag.DiagStateOnPushStack)
3420 AddDiagState(State,
false);
3430void ASTWriter::WriteType(ASTContext &Context, QualType T) {
3431 TypeIdx &IdxRef = TypeIdxs[T];
3433 IdxRef = TypeIdx(0, NextTypeID++);
3434 TypeIdx Idx = IdxRef;
3437 assert(Idx.
getValue() >= FirstTypeID &&
"Writing predefined type");
3441 ASTTypeWriter(Context, *
this).write(T) - DeclTypesBlockStartOffset;
3445 if (TypeOffsets.size() == Index)
3446 TypeOffsets.emplace_back(Offset);
3447 else if (TypeOffsets.size() < Index) {
3448 TypeOffsets.resize(Index + 1);
3449 TypeOffsets[Index].set(Offset);
3451 llvm_unreachable(
"Types emitted in wrong order");
3460 auto *ND = dyn_cast<NamedDecl>(D);
3475uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context,
3476 const DeclContext *DC) {
3484 uint64_t Offset = Stream.GetCurrentBitNo();
3485 SmallVector<DeclID, 128> KindDeclPairs;
3486 for (
const auto *D : DC->
decls()) {
3487 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(D))
3495 if (GeneratingReducedBMI && !D->isFromExplicitGlobalModule() &&
3499 KindDeclPairs.push_back(D->getKind());
3500 KindDeclPairs.push_back(GetDeclRef(D).getRawValue());
3503 ++NumLexicalDeclContexts;
3505 Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev,
Record,
3506 bytes(KindDeclPairs));
3510void ASTWriter::WriteTypeDeclOffsets() {
3511 using namespace llvm;
3514 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3516 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3517 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3518 unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3521 Stream.EmitRecordWithBlob(TypeOffsetAbbrev,
Record,
bytes(TypeOffsets));
3525 Abbrev = std::make_shared<BitCodeAbbrev>();
3527 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3528 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3529 unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3532 Stream.EmitRecordWithBlob(DeclOffsetAbbrev,
Record,
bytes(DeclOffsets));
3536void ASTWriter::WriteFileDeclIDsMap() {
3537 using namespace llvm;
3539 SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs;
3540 SortedFileDeclIDs.reserve(FileDeclIDs.size());
3541 for (
const auto &P : FileDeclIDs)
3542 SortedFileDeclIDs.push_back(std::make_pair(P.first, P.second.get()));
3543 llvm::sort(SortedFileDeclIDs, llvm::less_first());
3546 SmallVector<DeclID, 256> FileGroupedDeclIDs;
3547 for (
auto &FileDeclEntry : SortedFileDeclIDs) {
3548 DeclIDInFileInfo &Info = *FileDeclEntry.second;
3549 Info.FirstDeclIndex = FileGroupedDeclIDs.size();
3550 llvm::stable_sort(Info.DeclIDs);
3551 for (
auto &LocDeclEntry : Info.DeclIDs)
3552 FileGroupedDeclIDs.push_back(LocDeclEntry.second.getRawValue());
3555 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3557 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3558 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3559 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
3561 FileGroupedDeclIDs.size()};
3562 Stream.EmitRecordWithBlob(AbbrevCode,
Record,
bytes(FileGroupedDeclIDs));
3565void ASTWriter::WriteComments(ASTContext &Context) {
3567 llvm::scope_exit _([
this] { Stream.ExitBlock(); });
3572 for (
const auto &FO : Context.
Comments.OrderedComments) {
3573 for (
const auto &OC : FO.second) {
3574 const RawComment *I = OC.second;
3592class ASTMethodPoolTrait {
3596 using key_type = Selector;
3597 using key_type_ref = key_type;
3601 ObjCMethodList Instance, Factory;
3603 using data_type_ref =
const data_type &;
3605 using hash_value_type = unsigned;
3606 using offset_type = unsigned;
3608 explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) {}
3610 static hash_value_type
ComputeHash(Selector Sel) {
3614 std::pair<unsigned, unsigned>
3615 EmitKeyDataLength(raw_ostream& Out, Selector Sel,
3616 data_type_ref Methods) {
3620 unsigned DataLen = 4 + 2 + 2;
3621 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3623 if (ShouldWriteMethodListNode(
Method))
3624 DataLen +=
sizeof(
DeclID);
3625 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3627 if (ShouldWriteMethodListNode(
Method))
3628 DataLen +=
sizeof(
DeclID);
3632 void EmitKey(raw_ostream& Out, Selector Sel,
unsigned) {
3633 using namespace llvm::support;
3635 endian::Writer
LE(Out, llvm::endianness::little);
3637 assert((Start >> 32) == 0 &&
"Selector key offset too large");
3640 LE.write<uint16_t>(N);
3643 for (
unsigned I = 0; I != N; ++I)
3648 void EmitData(raw_ostream& Out, key_type_ref,
3649 data_type_ref Methods,
unsigned DataLen) {
3650 using namespace llvm::support;
3652 endian::Writer
LE(Out, llvm::endianness::little);
3655 unsigned NumInstanceMethods = 0;
3656 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3658 if (ShouldWriteMethodListNode(
Method))
3659 ++NumInstanceMethods;
3661 unsigned NumFactoryMethods = 0;
3662 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3664 if (ShouldWriteMethodListNode(
Method))
3665 ++NumFactoryMethods;
3667 unsigned InstanceBits = Methods.Instance.getBits();
3668 assert(InstanceBits < 4);
3669 unsigned InstanceHasMoreThanOneDeclBit =
3670 Methods.Instance.hasMoreThanOneDecl();
3671 unsigned FullInstanceBits = (NumInstanceMethods << 3) |
3672 (InstanceHasMoreThanOneDeclBit << 2) |
3674 unsigned FactoryBits = Methods.Factory.getBits();
3675 assert(FactoryBits < 4);
3676 unsigned FactoryHasMoreThanOneDeclBit =
3677 Methods.Factory.hasMoreThanOneDecl();
3678 unsigned FullFactoryBits = (NumFactoryMethods << 3) |
3679 (FactoryHasMoreThanOneDeclBit << 2) |
3681 LE.write<uint16_t>(FullInstanceBits);
3682 LE.write<uint16_t>(FullFactoryBits);
3683 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3685 if (ShouldWriteMethodListNode(
Method))
3687 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3689 if (ShouldWriteMethodListNode(
Method))
3692 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
3696 static bool ShouldWriteMethodListNode(
const ObjCMethodList *Node) {
3708void ASTWriter::WriteSelectors(Sema &SemaRef) {
3709 using namespace llvm;
3714 unsigned NumTableEntries = 0;
3717 llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait>
Generator;
3718 ASTMethodPoolTrait Trait(*
this);
3722 SelectorOffsets.resize(NextSelectorID - FirstSelectorID);
3723 for (
auto &SelectorAndID : SelectorIDs) {
3724 Selector S = SelectorAndID.first;
3726 SemaObjC::GlobalMethodPool::iterator F =
3728 ASTMethodPoolTrait::data_type
Data = {
3734 Data.Instance = F->second.first;
3735 Data.Factory = F->second.second;
3739 if (Chain && ID < FirstSelectorID) {
3741 bool changed =
false;
3742 for (ObjCMethodList *M = &
Data.Instance; M && M->getMethod();
3744 if (!M->getMethod()->isFromASTFile()) {
3750 for (ObjCMethodList *M = &
Data.Factory; M && M->getMethod();
3752 if (!M->getMethod()->isFromASTFile()) {
3760 }
else if (
Data.Instance.getMethod() ||
Data.Factory.getMethod()) {
3768 SmallString<4096> MethodPool;
3771 using namespace llvm::support;
3773 ASTMethodPoolTrait Trait(*
this);
3774 llvm::raw_svector_ostream
Out(MethodPool);
3776 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
3777 BucketOffset =
Generator.Emit(Out, Trait);
3781 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3783 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3784 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3785 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3786 unsigned MethodPoolAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3792 Stream.EmitRecordWithBlob(MethodPoolAbbrev,
Record, MethodPool);
3796 Abbrev = std::make_shared<BitCodeAbbrev>();
3798 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3799 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3800 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3801 unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3805 RecordData::value_type
Record[] = {
3808 Stream.EmitRecordWithBlob(SelectorOffsetAbbrev,
Record,
3809 bytes(SelectorOffsets));
3815void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) {
3816 using namespace llvm;
3828 Selector Sel = SelectorAndLocation.first;
3829 SourceLocation Loc = SelectorAndLocation.second;
3830 Writer.AddSelectorRef(Sel);
3852 for (; Redecl; Redecl = Redecl->getPreviousDecl()) {
3854 if (!Redecl->isFromASTFile()) {
3858 if (!Redecl->getDeclContext()->getRedeclContext()->Equals(
3866 if (Redecl->getOwningModuleID() == 0)
3871 if (!
First->isFromASTFile())
3882bool IsInterestingIdentifier(
const IdentifierInfo *II, uint64_t MacroOffset,
3883 bool IsModule,
bool IsCPlusPlus) {
3884 bool NeedDecls = !IsModule || !IsCPlusPlus;
3886 bool IsInteresting =
3893 II->
isPoisoned() || (!IsModule && IsInteresting) ||
3901bool IsInterestingNonMacroIdentifier(
const IdentifierInfo *II,
3902 ASTWriter &Writer) {
3904 bool IsCPlusPlus = Writer.
getLangOpts().CPlusPlus;
3905 return IsInterestingIdentifier(II, 0, IsModule, IsCPlusPlus);
3908class ASTIdentifierTableTrait {
3911 IdentifierResolver *IdResolver;
3921 return IsInterestingIdentifier(II, MacroOffset, IsModule,
3926 using key_type =
const IdentifierInfo *;
3927 using key_type_ref = key_type;
3930 using data_type_ref = data_type;
3932 using hash_value_type = unsigned;
3933 using offset_type = unsigned;
3935 ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP,
3936 IdentifierResolver *IdResolver,
bool IsModule,
3938 : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),
3939 NeedDecls(!IsModule || !Writer.getLangOpts().
CPlusPlus),
3940 InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}
3942 bool needDecls()
const {
return NeedDecls; }
3944 static hash_value_type
ComputeHash(
const IdentifierInfo* II) {
3945 return llvm::djbHash(II->
getName());
3953 std::pair<unsigned, unsigned>
3954 EmitKeyDataLength(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID) {
3963 if (InterestingIdentifierOffsets &&
3965 InterestingIdentifierOffsets->push_back(
Out.tell());
3976 if (NeedDecls && IdResolver)
3977 DataLen += std::distance(IdResolver->
begin(II), IdResolver->
end()) *
3983 void EmitKey(raw_ostream &Out,
const IdentifierInfo *II,
unsigned KeyLen) {
3987 void EmitData(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID,
3989 using namespace llvm::support;
3991 endian::Writer
LE(Out, llvm::endianness::little);
4001 assert((Bits & 0xffff) == Bits &&
"ObjCOrBuiltinID too big for ASTReader.");
4002 LE.write<uint16_t>(Bits);
4004 bool HasMacroDefinition =
4007 Bits = (Bits << 1) |
unsigned(HasMacroDefinition);
4009 Bits = (Bits << 1) |
unsigned(II->
isPoisoned());
4012 LE.write<uint16_t>(Bits);
4014 if (HasMacroDefinition)
4017 if (NeedDecls && IdResolver) {
4024 SmallVector<NamedDecl *, 16> Decls(IdResolver->
decls(II));
4025 for (NamedDecl *D : llvm::reverse(Decls))
4043void ASTWriter::WriteIdentifierTable(Preprocessor &PP,
4044 IdentifierResolver *IdResolver,
4046 using namespace llvm;
4048 RecordData InterestingIdents;
4053 llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait>
Generator;
4054 ASTIdentifierTableTrait Trait(*
this, PP, IdResolver, IsModule,
4055 IsModule ? &InterestingIdents :
nullptr);
4059 IdentifierOffsets.resize(NextIdentID - FirstIdentID);
4060 for (
auto IdentIDPair : IdentifierIDs) {
4061 const IdentifierInfo *II = IdentIDPair.first;
4063 assert(II &&
"NULL identifier in identifier table");
4068 (Trait.needDecls() &&
4074 SmallString<4096> IdentifierTable;
4077 using namespace llvm::support;
4079 llvm::raw_svector_ostream
Out(IdentifierTable);
4081 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
4082 BucketOffset =
Generator.Emit(Out, Trait);
4086 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4088 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4089 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4090 unsigned IDTableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4094 Stream.EmitRecordWithBlob(IDTableAbbrev,
Record, IdentifierTable);
4098 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4100 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4101 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4102 unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4105 for (
unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)
4106 assert(IdentifierOffsets[I] &&
"Missing identifier offset?");
4110 IdentifierOffsets.size()};
4111 Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev,
Record,
4112 bytes(IdentifierOffsets));
4116 if (!InterestingIdents.empty())
4124 PendingEmittingVTables.push_back(RD);
4128 TouchedModuleFiles.insert(MF);
4137class ASTDeclContextNameLookupTraitBase {
4145 using data_type = std::pair<unsigned, unsigned>;
4146 using data_type_ref =
const data_type &;
4151 explicit ASTDeclContextNameLookupTraitBase(
ASTWriter &Writer)
4154 data_type getData(
const DeclIDsTy &LocalIDs) {
4155 unsigned Start = DeclIDs.size();
4156 for (
auto ID : LocalIDs)
4157 DeclIDs.push_back(ID);
4158 return std::make_pair(Start, DeclIDs.size());
4161 data_type ImportData(
const reader::ASTDeclContextNameLookupTrait::data_type &FromReader) {
4162 unsigned Start = DeclIDs.size();
4165 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.begin()),
4166 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.end()));
4167 return std::make_pair(Start, DeclIDs.size());
4170 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4172 "have reference to loaded module file but no chain?");
4174 using namespace llvm::support;
4177 llvm::endianness::little);
4180 std::pair<unsigned, unsigned> EmitKeyDataLengthBase(raw_ostream &Out,
4181 DeclarationNameKey Name,
4182 data_type_ref Lookup) {
4183 unsigned KeyLen = 1;
4206 unsigned DataLen =
sizeof(
DeclID) * (Lookup.second - Lookup.first);
4208 return {KeyLen, DataLen};
4211 void EmitKeyBase(raw_ostream &Out, DeclarationNameKey Name) {
4212 using namespace llvm::support;
4214 endian::Writer
LE(Out, llvm::endianness::little);
4229 "Invalid operator?");
4239 llvm_unreachable(
"Invalid name kind?");
4242 void EmitDataBase(raw_ostream &Out, data_type Lookup,
unsigned DataLen) {
4243 using namespace llvm::support;
4245 endian::Writer
LE(Out, llvm::endianness::little);
4247 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I)
4249 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4253class ModuleLevelNameLookupTrait :
public ASTDeclContextNameLookupTraitBase {
4255 using primary_module_hash_type = unsigned;
4257 using key_type = std::pair<DeclarationNameKey, primary_module_hash_type>;
4258 using key_type_ref = key_type;
4260 explicit ModuleLevelNameLookupTrait(ASTWriter &Writer)
4261 : ASTDeclContextNameLookupTraitBase(Writer) {}
4263 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4266 llvm::FoldingSetNodeID
ID;
4267 ID.AddInteger(Key.first.getHash());
4268 ID.AddInteger(Key.second);
4269 return ID.computeStableHash();
4272 std::pair<unsigned, unsigned>
4273 EmitKeyDataLength(raw_ostream &Out, key_type Key, data_type_ref Lookup) {
4274 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Key.first, Lookup);
4275 KeyLen +=
sizeof(Key.second);
4279 void EmitKey(raw_ostream &Out, key_type Key,
unsigned) {
4280 EmitKeyBase(Out, Key.first);
4281 llvm::support::endian::Writer
LE(Out, llvm::endianness::little);
4282 LE.write<primary_module_hash_type>(Key.second);
4285 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4287 EmitDataBase(Out, Lookup, DataLen);
4291class ASTDeclContextNameTrivialLookupTrait
4292 :
public ASTDeclContextNameLookupTraitBase {
4294 using key_type = DeclarationNameKey;
4295 using key_type_ref = key_type;
4298 using ASTDeclContextNameLookupTraitBase::ASTDeclContextNameLookupTraitBase;
4300 using ASTDeclContextNameLookupTraitBase::getData;
4302 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4304 hash_value_type
ComputeHash(key_type Name) {
return Name.getHash(); }
4306 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4307 DeclarationNameKey Name,
4308 data_type_ref Lookup) {
4309 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Name, Lookup);
4313 void EmitKey(raw_ostream &Out, DeclarationNameKey Name,
unsigned) {
4314 return EmitKeyBase(Out, Name);
4317 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4319 EmitDataBase(Out, Lookup, DataLen);
4323static bool isModuleLocalDecl(NamedDecl *D) {
4328 return isModuleLocalDecl(Parent);
4332 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
4333 if (
auto *CDGD = dyn_cast<CXXDeductionGuideDecl>(FTD->getTemplatedDecl()))
4334 return isModuleLocalDecl(CDGD->getDeducedTemplate());
4350static bool isTULocalInNamedModules(NamedDecl *D) {
4373class ASTDeclContextNameLookupTrait
4374 :
public ASTDeclContextNameTrivialLookupTrait {
4376 using TULocalDeclsMapTy = llvm::DenseMap<key_type, DeclIDsTy>;
4378 using ModuleLevelDeclsMapTy =
4379 llvm::DenseMap<ModuleLevelNameLookupTrait::key_type, DeclIDsTy>;
4382 enum class LookupVisibility {
4392 LookupVisibility getLookupVisibility(NamedDecl *D)
const {
4395 return LookupVisibility::GenerallyVisibile;
4397 if (isModuleLocalDecl(D))
4398 return LookupVisibility::ModuleLocalVisible;
4399 if (isTULocalInNamedModules(D))
4400 return LookupVisibility::TULocal;
4412 if (
auto *ECD = dyn_cast<EnumConstantDecl>(D);
4413 ECD && DC.
isFileContext() && ECD->getTopLevelOwningNamedModule()) {
4418 return Found->isInvisibleOutsideTheOwningModule();
4420 return ECD->isFromExplicitGlobalModule() ||
4421 ECD->isInAnonymousNamespace()
4422 ? LookupVisibility::TULocal
4423 : LookupVisibility::ModuleLocalVisible;
4426 return LookupVisibility::GenerallyVisibile;
4430 ModuleLevelDeclsMapTy ModuleLocalDeclsMap;
4431 TULocalDeclsMapTy TULocalDeclsMap;
4434 using ASTDeclContextNameTrivialLookupTrait::
4435 ASTDeclContextNameTrivialLookupTrait;
4437 ASTDeclContextNameLookupTrait(ASTWriter &Writer, DeclContext &DC)
4438 : ASTDeclContextNameTrivialLookupTrait(Writer), DC(DC) {}
4440 template <
typename Coll> data_type getData(
const Coll &Decls) {
4441 unsigned Start = DeclIDs.size();
4442 auto AddDecl = [
this](NamedDecl *D) {
4443 NamedDecl *DeclForLocalLookup =
4459 switch (getLookupVisibility(DeclForLocalLookup)) {
4460 case LookupVisibility::ModuleLocalVisible:
4463 auto Key = std::make_pair(D->
getDeclName(), *PrimaryModuleHash);
4464 auto Iter = ModuleLocalDeclsMap.find(Key);
4465 if (Iter == ModuleLocalDeclsMap.end())
4466 ModuleLocalDeclsMap.insert({Key, DeclIDsTy{
ID}});
4468 Iter->second.push_back(ID);
4472 case LookupVisibility::TULocal: {
4473 auto Iter = TULocalDeclsMap.find(D->
getDeclName());
4474 if (Iter == TULocalDeclsMap.end())
4477 Iter->second.push_back(ID);
4480 case LookupVisibility::GenerallyVisibile:
4485 DeclIDs.push_back(ID);
4487 ASTReader *Chain = Writer.
getChain();
4488 for (NamedDecl *D : Decls) {
4499 for (
const auto &[_,
First] : Firsts)
4505 return std::make_pair(Start, DeclIDs.size());
4508 const ModuleLevelDeclsMapTy &getModuleLocalDecls() {
4509 return ModuleLocalDeclsMap;
4512 const TULocalDeclsMapTy &getTULocalDecls() {
return TULocalDeclsMap; }
4518class LazySpecializationInfoLookupTrait {
4520 llvm::SmallVector<serialization::reader::LazySpecializationInfo, 64> Specs;
4523 using key_type = unsigned;
4524 using key_type_ref = key_type;
4527 using data_type = std::pair<unsigned, unsigned>;
4528 using data_type_ref =
const data_type &;
4530 using hash_value_type = unsigned;
4531 using offset_type = unsigned;
4533 explicit LazySpecializationInfoLookupTrait(ASTWriter &Writer)
4536 template <
typename Col,
typename Col2>
4537 data_type getData(Col &&
C, Col2 &ExistingInfo) {
4538 unsigned Start = Specs.size();
4541 const_cast<NamedDecl *
>(D));
4546 Specs.push_back(Info);
4547 return std::make_pair(Start, Specs.size());
4550 data_type ImportData(
4552 unsigned Start = Specs.size();
4553 for (
auto ID : FromReader)
4554 Specs.push_back(ID);
4555 return std::make_pair(Start, Specs.size());
4558 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4560 hash_value_type
ComputeHash(key_type Name) {
return Name; }
4562 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4564 "have reference to loaded module file but no chain?");
4566 using namespace llvm::support;
4569 llvm::endianness::little);
4572 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4574 data_type_ref Lookup) {
4576 unsigned KeyLen = 4;
4578 (Lookup.second - Lookup.first);
4583 void EmitKey(raw_ostream &Out, key_type HashValue,
unsigned) {
4584 using namespace llvm::support;
4586 endian::Writer
LE(Out, llvm::endianness::little);
4590 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4592 using namespace llvm::support;
4594 endian::Writer
LE(Out, llvm::endianness::little);
4597 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I) {
4598 LE.write<
DeclID>(Specs[I].getRawValue());
4600 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4604unsigned CalculateODRHashForSpecs(
const Decl *Spec) {
4605 ArrayRef<TemplateArgument> Args;
4606 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Spec))
4607 Args = CTSD->getTemplateArgs().asArray();
4608 else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Spec))
4609 Args = VTSD->getTemplateArgs().asArray();
4610 else if (
auto *FD = dyn_cast<FunctionDecl>(Spec))
4611 Args = FD->getTemplateSpecializationArgs()->asArray();
4613 llvm_unreachable(
"New Specialization Kind?");
4619void ASTWriter::GenerateSpecializationInfoLookupTable(
4620 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4621 llvm::SmallVectorImpl<char> &LookupTable,
bool IsPartial) {
4625 MultiOnDiskHashTableGenerator<reader::LazySpecializationInfoLookupTrait,
4626 LazySpecializationInfoLookupTrait>
4628 LazySpecializationInfoLookupTrait Trait(*
this);
4630 llvm::MapVector<unsigned, llvm::SmallVector<const NamedDecl *, 4>>
4636 auto Iter = SpecializationMaps.find(HashedValue);
4637 if (Iter == SpecializationMaps.end())
4638 Iter = SpecializationMaps
4639 .try_emplace(HashedValue,
4640 llvm::SmallVector<const NamedDecl *, 4>())
4650 for (
auto &[HashValue, Specs] : SpecializationMaps) {
4651 SmallVector<serialization::reader::LazySpecializationInfo, 16>
4661 ExisitingSpecs = Lookups->Table.find(HashValue);
4663 Generator.insert(HashValue, Trait.getData(Specs, ExisitingSpecs), Trait);
4673 auto *ToEmitMaybeMergedLookupTable =
4674 (!isGeneratingReducedBMI() && Lookups) ? &Lookups->
Table :
nullptr;
4675 Generator.emit(LookupTable, Trait, ToEmitMaybeMergedLookupTable);
4678uint64_t ASTWriter::WriteSpecializationInfoLookupTable(
4679 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4682 llvm::SmallString<4096> LookupTable;
4683 GenerateSpecializationInfoLookupTable(D, Specializations, LookupTable,
4686 uint64_t Offset = Stream.GetCurrentBitNo();
4687 RecordData::value_type
Record[] = {
static_cast<RecordData::value_type
>(
4689 Stream.EmitRecordWithBlob(IsPartial ? DeclPartialSpecializationsAbbrev
4690 : DeclSpecializationsAbbrev,
4702 for (
auto *D :
Result.getLookupResult()) {
4704 if (LocalD->isFromASTFile())
4722void ASTWriter::GenerateNameLookupTable(
4723 ASTContext &Context,
const DeclContext *ConstDC,
4724 llvm::SmallVectorImpl<char> &LookupTable,
4725 llvm::SmallVectorImpl<char> &ModuleLocalLookupTable,
4726 llvm::SmallVectorImpl<char> &TULookupTable) {
4727 assert(!ConstDC->hasLazyLocalLexicalLookups() &&
4728 !ConstDC->hasLazyExternalLexicalLookups() &&
4729 "must call buildLookups first");
4732 auto *DC =
const_cast<DeclContext*
>(ConstDC);
4736 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4737 ASTDeclContextNameLookupTrait>
4739 ASTDeclContextNameLookupTrait Trait(*
this, *DC);
4744 SmallVector<DeclarationName, 16> Names;
4748 bool IncludeConstructorNames =
false;
4749 bool IncludeConversionNames =
false;
4776 if (
Result.getLookupResult().empty())
4779 switch (Name.getNameKind()) {
4781 Names.push_back(Name);
4785 IncludeConstructorNames =
true;
4789 IncludeConversionNames =
true;
4797 if (IncludeConstructorNames || IncludeConversionNames) {
4802 llvm::SmallPtrSet<DeclarationName, 8> AddedNames;
4804 if (
auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
4805 auto Name = ChildND->getDeclName();
4806 switch (Name.getNameKind()) {
4811 if (!IncludeConstructorNames)
4816 if (!IncludeConversionNames)
4820 if (AddedNames.insert(Name).second)
4821 Names.push_back(Name);
4829 for (
auto &Name : Names)
4836 SmallVector<NamedDecl *, 8> ConstructorDecls;
4837 SmallVector<NamedDecl *, 8> ConversionDecls;
4841 for (
auto &Name : Names) {
4844 switch (Name.getNameKind()) {
4862 if (!ConstructorDecls.empty())
4863 Generator.insert(ConstructorDecls.front()->getDeclName(),
4864 Trait.getData(ConstructorDecls), Trait);
4865 if (!ConversionDecls.empty())
4866 Generator.insert(ConversionDecls.front()->getDeclName(),
4867 Trait.getData(ConversionDecls), Trait);
4879 auto *ToEmitMaybeMergedLookupTable =
4880 (!isGeneratingReducedBMI() && Lookups) ? &Lookups->
Table :
nullptr;
4881 Generator.emit(LookupTable, Trait, ToEmitMaybeMergedLookupTable);
4883 const auto &ModuleLocalDecls = Trait.getModuleLocalDecls();
4884 if (!ModuleLocalDecls.empty()) {
4885 MultiOnDiskHashTableGenerator<reader::ModuleLocalNameLookupTrait,
4886 ModuleLevelNameLookupTrait>
4887 ModuleLocalLookupGenerator;
4888 ModuleLevelNameLookupTrait ModuleLocalTrait(*
this);
4890 for (
const auto &ModuleLocalIter : ModuleLocalDecls) {
4891 const auto &Key = ModuleLocalIter.first;
4892 const auto &IDs = ModuleLocalIter.second;
4893 ModuleLocalLookupGenerator.insert(Key, ModuleLocalTrait.getData(IDs),
4899 auto *ModuleLocalLookups =
4900 (isGeneratingReducedBMI() && Chain &&
4904 ModuleLocalLookupGenerator.emit(ModuleLocalLookupTable, ModuleLocalTrait,
4905 ModuleLocalLookups);
4908 const auto &TULocalDecls = Trait.getTULocalDecls();
4909 if (!TULocalDecls.empty() && !isGeneratingReducedBMI()) {
4910 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4911 ASTDeclContextNameTrivialLookupTrait>
4913 ASTDeclContextNameTrivialLookupTrait TULocalTrait(*
this);
4915 for (
const auto &TULocalIter : TULocalDecls) {
4916 const auto &Key = TULocalIter.first;
4917 const auto &IDs = TULocalIter.second;
4918 TULookupGenerator.insert(Key, TULocalTrait.getData(IDs), TULocalTrait);
4923 auto *TULocalLookups =
4927 TULookupGenerator.emit(TULookupTable, TULocalTrait, TULocalLookups);
4936void ASTWriter::WriteDeclContextVisibleBlock(
4937 ASTContext &Context, DeclContext *DC, VisibleLookupBlockOffsets &Offsets) {
4947 Prev = Prev->getPreviousDecl())
4948 if (!Prev->isFromASTFile())
4958 SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16>
4961 LookupResults.reserve(Map->size());
4962 for (
auto &Entry : *Map)
4963 LookupResults.push_back(
4964 std::make_pair(Entry.first, Entry.second.getLookupResult()));
4967 llvm::sort(LookupResults, llvm::less_first());
4968 for (
auto &NameAndResult : LookupResults) {
4969 DeclarationName Name = NameAndResult.first;
4976 assert(
Result.empty() &&
"Cannot have a constructor or conversion "
4977 "function name in a namespace!");
4981 for (NamedDecl *ND :
Result) {
4985 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(ND))
5019 if (!Map || Map->empty())
5024 SmallString<4096> LookupTable;
5025 SmallString<4096> ModuleLocalLookupTable;
5026 SmallString<4096> TULookupTable;
5027 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
5032 Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev,
Record,
5034 ++NumVisibleDeclContexts;
5036 if (!ModuleLocalLookupTable.empty()) {
5040 RecordData::value_type ModuleLocalRecord[] = {
5042 Stream.EmitRecordWithBlob(DeclModuleLocalVisibleLookupAbbrev,
5043 ModuleLocalRecord, ModuleLocalLookupTable);
5044 ++NumModuleLocalDeclContexts;
5047 if (!TULookupTable.empty()) {
5050 RecordData::value_type TULocalDeclsRecord[] = {
5052 Stream.EmitRecordWithBlob(DeclTULocalLookupAbbrev, TULocalDeclsRecord,
5054 ++NumTULocalDeclContexts;
5064void ASTWriter::WriteDeclContextVisibleUpdate(ASTContext &Context,
5065 const DeclContext *DC) {
5067 if (!Map || Map->empty())
5071 SmallString<4096> LookupTable;
5072 SmallString<4096> ModuleLocalLookupTable;
5073 SmallString<4096> TULookupTable;
5074 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
5085 Stream.EmitRecordWithBlob(UpdateVisibleAbbrev,
Record, LookupTable);
5087 if (!ModuleLocalLookupTable.empty()) {
5089 RecordData::value_type ModuleLocalRecord[] = {
5091 Stream.EmitRecordWithBlob(ModuleLocalUpdateVisibleAbbrev, ModuleLocalRecord,
5092 ModuleLocalLookupTable);
5095 if (!TULookupTable.empty()) {
5096 RecordData::value_type GMFRecord[] = {
5098 Stream.EmitRecordWithBlob(TULocalUpdateVisibleAbbrev, GMFRecord,
5104void ASTWriter::WriteFPPragmaOptions(
const FPOptionsOverride &Opts) {
5110void ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) {
5116 for (
const auto &I:Opts.OptMap) {
5117 AddString(I.getKey(),
Record);
5118 auto V = I.getValue();
5119 Record.push_back(
V.Supported ? 1 : 0);
5120 Record.push_back(
V.Enabled ? 1 : 0);
5121 Record.push_back(
V.WithPragma ? 1 : 0);
5128void ASTWriter::WriteCUDAPragmas(Sema &SemaRef) {
5129 if (SemaRef.
CUDA().ForceHostDeviceDepth > 0) {
5130 RecordData::value_type
Record[] = {SemaRef.
CUDA().ForceHostDeviceDepth};
5135void ASTWriter::WriteObjCCategories() {
5136 if (ObjCClassesWithCategories.empty())
5139 SmallVector<ObjCCategoriesInfo, 2> CategoriesMap;
5140 RecordData Categories;
5142 for (
unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {
5144 unsigned StartIndex = Categories.size();
5146 ObjCInterfaceDecl *
Class = ObjCClassesWithCategories[I];
5149 Categories.push_back(0);
5153 Cat =
Class->known_categories_begin(),
5154 CatEnd =
Class->known_categories_end();
5155 Cat != CatEnd; ++Cat, ++Size) {
5156 assert(getDeclID(*Cat).isValid() &&
"Bogus category");
5157 AddDeclRef(*Cat, Categories);
5161 Categories[StartIndex] =
Size;
5164 ObjCCategoriesInfo CatInfo = { getDeclID(
Class), StartIndex };
5165 CategoriesMap.push_back(CatInfo);
5170 llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());
5173 using namespace llvm;
5175 auto Abbrev = std::make_shared<BitCodeAbbrev>();
5177 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
5178 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
5179 unsigned AbbrevID = Stream.EmitAbbrev(std::move(Abbrev));
5182 Stream.EmitRecordWithBlob(AbbrevID,
Record,
5183 reinterpret_cast<char *
>(CategoriesMap.data()),
5184 CategoriesMap.size() *
sizeof(ObjCCategoriesInfo));
5190void ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) {
5197 for (
auto &LPTMapEntry : LPTMap) {
5198 const FunctionDecl *FD = LPTMapEntry.first;
5199 LateParsedTemplate &LPT = *LPTMapEntry.second;
5205 for (
const auto &
Tok : LPT.
Toks) {
5213void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) {
5216 AddSourceLocation(PragmaLoc,
Record);
5221void ASTWriter::WriteMSStructPragmaOptions(Sema &SemaRef) {
5229void ASTWriter::WriteMSPointersToMembersPragmaOptions(Sema &SemaRef) {
5237void ASTWriter::WritePackPragmaOptions(Sema &SemaRef) {
5248 AddAlignPackInfo(StackEntry.Value,
Record);
5249 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5250 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5251 AddString(StackEntry.StackSlotLabel,
Record);
5257void ASTWriter::WriteFloatControlPragmaOptions(Sema &SemaRef) {
5267 for (
const auto &StackEntry : SemaRef.
FpPragmaStack.Stack) {
5268 Record.push_back(StackEntry.Value.getAsOpaqueInt());
5269 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5270 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5271 AddString(StackEntry.StackSlotLabel,
Record);
5277void ASTWriter::WriteDeclsWithEffectsToVerify(Sema &SemaRef) {
5287void ASTWriter::WriteModuleFileExtension(Sema &SemaRef,
5288 ModuleFileExtensionWriter &Writer) {
5293 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
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::VBR, 6));
5299 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
5300 unsigned Abbrev = Stream.EmitAbbrev(std::move(Abv));
5306 Record.push_back(Metadata.MajorVersion);
5307 Record.push_back(Metadata.MinorVersion);
5308 Record.push_back(Metadata.BlockName.size());
5309 Record.push_back(Metadata.UserInfo.size());
5310 SmallString<64> Buffer;
5311 Buffer += Metadata.BlockName;
5312 Buffer += Metadata.UserInfo;
5313 Stream.EmitRecordWithBlob(Abbrev,
Record, Buffer);
5322void ASTWriter::WriteRISCVIntrinsicPragmas(Sema &SemaRef) {
5337 auto &Record = *
this;
5343 Writer->isWritingStdCXXHeaderUnit())))
5344 return Record.push_back(0);
5346 Record.push_back(A->
getKind() + 1);
5350 Record.AddSourceRange(A->
getRange());
5354 Record.push_back(A->getAttributeSpellingListIndexRaw());
5357#include "clang/Serialization/AttrPCHWrite.inc"
5363 for (
const auto *A : Attrs)
5374 if (
Tok.isAnnotation()) {
5376 switch (
Tok.getKind()) {
5377 case tok::annot_pragma_loop_hint: {
5381 Record.push_back(Info->Toks.size());
5382 for (
const auto &T : Info->Toks)
5386 case tok::annot_pragma_pack: {
5389 Record.push_back(
static_cast<unsigned>(Info->Action));
5395 case tok::annot_pragma_openmp:
5396 case tok::annot_pragma_openmp_end:
5397 case tok::annot_pragma_unused:
5398 case tok::annot_pragma_openacc:
5399 case tok::annot_pragma_openacc_end:
5400 case tok::annot_repl_input_end:
5403 llvm_unreachable(
"missing serialization code for annotation token");
5414 Record.push_back(Str.size());
5415 llvm::append_range(
Record, Str);
5420 Record.push_back(Str.size());
5421 llvm::append_range(Blob, Str);
5425 assert(WritingAST &&
"can't prepare path for output when not writing AST");
5428 StringRef PathStr(Path.data(), Path.size());
5429 if (PathStr ==
"<built-in>" || PathStr ==
"<command line>")
5433 PP->getFileManager().makeAbsolutePath(Path,
true);
5435 const char *PathBegin = Path.data();
5436 const char *PathPtr =
5438 if (PathPtr != PathBegin) {
5439 Path.erase(Path.begin(), Path.begin() + (PathPtr - PathBegin));
5463 Stream.EmitRecordWithBlob(Abbrev,
Record, FilePath);
5468 Record.push_back(Version.getMajor());
5469 if (std::optional<unsigned> Minor = Version.getMinor())
5470 Record.push_back(*Minor + 1);
5473 if (std::optional<unsigned> Subminor = Version.getSubminor())
5474 Record.push_back(*Subminor + 1);
5492 assert(ID < IdentifierOffsets.size());
5493 IdentifierOffsets[ID] = Offset;
5499 unsigned ID = SelectorIDs[Sel];
5500 assert(ID &&
"Unknown selector");
5503 if (ID < FirstSelectorID)
5505 SelectorOffsets[ID - FirstSelectorID] = Offset;
5511 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
5512 bool IncludeTimestamps,
bool BuildingImplicitModule,
5513 bool GeneratingReducedBMI)
5514 : Stream(Stream), Buffer(Buffer), ModCache(ModCache),
5515 CodeGenOpts(CodeGenOpts), IncludeTimestamps(IncludeTimestamps),
5516 BuildingImplicitModule(BuildingImplicitModule),
5517 GeneratingReducedBMI(GeneratingReducedBMI) {
5518 for (
const auto &Ext : Extensions) {
5519 if (
auto Writer = Ext->createExtensionWriter(*
this))
5520 ModuleFileExtensionWriters.push_back(std::move(Writer));
5527 assert(WritingAST &&
"can't determine lang opts when not writing AST");
5528 return PP->getLangOpts();
5532 return IncludeTimestamps ? ModTime : 0;
5537 StringRef OutputFile,
Module *WritingModule,
5538 StringRef isysroot) {
5539 llvm::TimeTraceScope scope(
"WriteAST", OutputFile);
5542 Sema *SemaPtr = dyn_cast<Sema *>(Subject);
5549 Stream.Emit((
unsigned)
'C', 8);
5550 Stream.Emit((
unsigned)
'P', 8);
5551 Stream.Emit((
unsigned)
'C', 8);
5552 Stream.Emit((
unsigned)
'H', 8);
5554 WriteBlockInfoBlock();
5557 this->WritingModule = WritingModule;
5558 ASTFileSignature Signature = WriteASTCore(SemaPtr, isysroot, WritingModule);
5560 this->WritingModule =
nullptr;
5561 this->BaseDirectory.clear();
5568template<
typename Vector>
5570 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5576template <
typename Vector>
5579 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5585void ASTWriter::computeNonAffectingInputFiles() {
5586 SourceManager &SrcMgr = PP->getSourceManager();
5589 IsSLocAffecting.resize(N,
true);
5590 IsSLocFileEntryAffecting.resize(N,
true);
5595 auto AffectingModuleMaps = GetAffectingModuleMaps(*PP, WritingModule);
5597 unsigned FileIDAdjustment = 0;
5598 unsigned OffsetAdjustment = 0;
5600 NonAffectingFileIDAdjustments.reserve(N);
5601 NonAffectingOffsetAdjustments.reserve(N);
5603 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5604 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5606 for (
unsigned I = 1; I != N; ++I) {
5608 FileID FID = FileID::get(I);
5615 if (!
Cache->OrigEntry)
5623 if (!AffectingModuleMaps)
5627 if (AffectingModuleMaps->DefinitionFileIDs.contains(FID))
5630 IsSLocAffecting[I] =
false;
5631 IsSLocFileEntryAffecting[I] =
5632 AffectingModuleMaps->DefinitionFiles.contains(*
Cache->OrigEntry);
5634 FileIDAdjustment += 1;
5640 if (!NonAffectingFileIDs.empty() &&
5641 NonAffectingFileIDs.back().ID == FID.ID - 1) {
5642 NonAffectingFileIDs.back() = FID;
5644 NonAffectingFileIDAdjustments.back() = FileIDAdjustment;
5645 NonAffectingOffsetAdjustments.back() = OffsetAdjustment;
5649 NonAffectingFileIDs.push_back(FID);
5652 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5653 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5656 if (!PP->getHeaderSearchInfo().getHeaderSearchOpts().ModulesIncludeVFSUsage)
5659 FileManager &FileMgr = PP->getFileManager();
5662 for (StringRef Path :
5663 PP->getHeaderSearchInfo().getHeaderSearchOpts().VFSOverlayFiles)
5665 for (
unsigned I = 1; I != N; ++I) {
5666 if (IsSLocAffecting[I]) {
5672 if (!
Cache->OrigEntry)
5675 Cache->OrigEntry->getNameAsRequested());
5681void ASTWriter::prepareLazyUpdates() {
5684 if (!GeneratingReducedBMI)
5687 DeclUpdateMap DeclUpdatesTmp;
5695 for (
auto &DeclUpdate : DeclUpdates) {
5696 const Decl *D = DeclUpdate.first;
5698 for (
auto &
Update : DeclUpdate.second) {
5701 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
5702 DeclUpdatesTmp[D].push_back(
5703 ASTWriter::DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
5705 DeclUpdatesLazy[D].push_back(
Update);
5708 DeclUpdates.swap(DeclUpdatesTmp);
5710 UpdatedDeclContextsLazy.swap(UpdatedDeclContexts);
5712 DeclsToEmitEvenIfUnreferenced.clear();
5715void ASTWriter::PrepareWritingSpecialDecls(
Sema &SemaRef) {
5716 ASTContext &Context = SemaRef.
Context;
5718 bool isModule = WritingModule !=
nullptr;
5720 prepareLazyUpdates();
5727 PredefinedDecls.insert(D);
5735 RegisterPredefDecl(Context.ObjCProtocolClassDecl,
5739 RegisterPredefDecl(Context.ObjCInstanceTypeDecl,
5743 RegisterPredefDecl(Context.BuiltinMSVaListDecl,
5750 RegisterPredefDecl(Context.CFConstantStringTypeDecl,
5752 RegisterPredefDecl(Context.CFConstantStringTagDecl,
5754#define BuiltinTemplate(BTName) \
5755 RegisterPredefDecl(Context.Decl##BTName, PREDEF_DECL##BTName##_ID);
5756#include "clang/Basic/BuiltinTemplates.inc"
5768 if (GeneratingReducedBMI) {
5794 if (GeneratingReducedBMI)
5816 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I)
5827 "There are local ones at end of translation unit!");
5845 for (
const auto &I : SemaRef.KnownNamespaces)
5850 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
5858 for (
const auto &DeleteExprsInfo :
5865 for (
const auto *I : DeclsToEmitEvenIfUnreferenced)
5867 DeclsToEmitEvenIfUnreferenced.clear();
5872 llvm::SmallVector<const IdentifierInfo*, 256> IIs;
5874 const IdentifierInfo *II =
ID.second;
5880 llvm::sort(IIs, llvm::deref<std::less<>>());
5882 for (
const IdentifierInfo *II : IIs)
5893 for (CXXRecordDecl *RD : PendingEmittingVTables)
5896 PendingEmittingVTables.clear();
5899void ASTWriter::WriteSpecialDeclRecords(
Sema &SemaRef) {
5900 ASTContext &Context = SemaRef.
Context;
5902 bool isModule = WritingModule !=
nullptr;
5905 if (!EagerlyDeserializedDecls.empty())
5908 if (!ModularCodegenDecls.empty())
5914 TentativeDefinitions);
5915 if (!TentativeDefinitions.empty())
5922 UnusedFileScopedDecls);
5923 if (!UnusedFileScopedDecls.empty())
5929 if (!ExtVectorDecls.empty())
5935 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I) {
5936 CXXRecordDecl *D = SemaRef.
VTableUses[I].first;
5951 if (!UnusedLocalTypedefNameCandidates.empty())
5953 UnusedLocalTypedefNameCandidates);
5955 if (!GeneratingReducedBMI) {
5965 if (!PendingInstantiations.empty())
5969 auto AddEmittedDeclRefOrZero = [
this](
RecordData &Refs,
Decl *D) {
5983 if (!SemaDeclRefs.empty())
5991 if (!DeclsToCheckForDeferredDiags.empty())
5993 DeclsToCheckForDeferredDiags);
6000 CudaCallDecl || CudaGetParamDecl || CudaLaunchDecl) {
6001 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaCallDecl);
6002 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaGetParamDecl);
6003 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaLaunchDecl);
6011 DelegatingCtorDecls);
6012 if (!DelegatingCtorDecls.empty())
6017 for (
const auto &I : SemaRef.KnownNamespaces) {
6021 if (!KnownNamespaces.empty())
6026 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
6035 if (!UndefinedButUsed.empty())
6042 for (
const auto &DeleteExprsInfo :
6047 AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze);
6048 DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());
6049 for (
const auto &DeleteLoc : DeleteExprsInfo.second) {
6051 DeleteExprsToAnalyze.push_back(DeleteLoc.second);
6055 if (!DeleteExprsToAnalyze.empty())
6059 for (CXXRecordDecl *RD : PendingEmittingVTables) {
6066 if (!VTablesToEmit.empty())
6072 using namespace llvm;
6074 bool isModule = WritingModule !=
nullptr;
6078 Chain->finalizeForWriting();
6082 computeNonAffectingInputFiles();
6084 writeUnhashedControlBlock(*PP);
6097 IdentifierIDs.clear();
6108 SmallVector<const IdentifierInfo *, 128> IIs;
6109 for (
const auto &ID : PP->getIdentifierTable())
6110 if (IsInterestingNonMacroIdentifier(
ID.second, *
this))
6111 IIs.push_back(
ID.second);
6114 llvm::sort(IIs, llvm::deref<std::less<>>());
6115 for (
const IdentifierInfo *II : IIs)
6123 for (
const auto &WeakUndeclaredIdentifierList :
6125 const IdentifierInfo *
const II = WeakUndeclaredIdentifierList.first;
6126 for (
const auto &WI : WeakUndeclaredIdentifierList.second) {
6139 ASTContext &Context = SemaPtr->
Context;
6141 Context, *
this, ExtnameUndeclaredIdentifiers);
6143 ExtnameUndeclaredIdentifiersWriter.AddIdentifierRef(II);
6144 ExtnameUndeclaredIdentifiersWriter.AddIdentifierRef(
6146 ExtnameUndeclaredIdentifiersWriter.AddSourceLocation(AL->getLocation());
6153 ASTContext &Context = SemaPtr->
Context;
6158 AddTypeRef(Context, Context.ObjCIdRedefinitionType, SpecialTypes);
6159 AddTypeRef(Context, Context.ObjCClassRedefinitionType, SpecialTypes);
6160 AddTypeRef(Context, Context.ObjCSelRedefinitionType, SpecialTypes);
6165 PrepareWritingSpecialDecls(*SemaPtr);
6168 WriteControlBlock(*PP, isysroot);
6171 Stream.FlushToWord();
6172 ASTBlockRange.first = Stream.GetCurrentBitNo() >> 3;
6174 ASTBlockStartOffset = Stream.GetCurrentBitNo();
6191 llvm::SmallVector<Selector, 256> AllSelectors;
6192 for (
auto &SelectorAndID : SelectorIDs)
6193 AllSelectors.push_back(SelectorAndID.first);
6194 for (
auto &Selector : AllSelectors)
6218 auto Abbrev = std::make_shared<BitCodeAbbrev>();
6220 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
6221 unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
6222 SmallString<2048> Buffer;
6224 llvm::raw_svector_ostream
Out(Buffer);
6225 for (ModuleFile &M : Chain->ModuleMgr) {
6226 using namespace llvm::support;
6228 endian::Writer
LE(Out, llvm::endianness::little);
6229 LE.write<uint8_t>(
static_cast<uint8_t
>(M.
Kind));
6235 LE.write<uint16_t>(Name.size());
6236 Out.write(Name.data(), Name.size());
6242 auto writeBaseIDOrNone = [&](
auto BaseID,
bool ShouldWrite) {
6243 assert(BaseID < std::numeric_limits<uint32_t>::max() &&
"base id too high");
6257 Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev,
Record,
6258 Buffer.data(), Buffer.size());
6262 WriteDeclAndTypes(SemaPtr->
Context);
6264 WriteFileDeclIDsMap();
6265 WriteSourceManagerBlock(PP->getSourceManager());
6267 WriteComments(SemaPtr->
Context);
6268 WritePreprocessor(*PP, isModule);
6269 WriteHeaderSearch(PP->getHeaderSearchInfo());
6271 WriteSelectors(*SemaPtr);
6272 WriteReferencedSelectorsPool(*SemaPtr);
6273 WriteLateParsedTemplates(*SemaPtr);
6275 WriteIdentifierTable(*PP, SemaPtr ? &SemaPtr->
IdResolver :
nullptr, isModule);
6278 WriteOpenCLExtensions(*SemaPtr);
6279 WriteCUDAPragmas(*SemaPtr);
6280 WriteRISCVIntrinsicPragmas(*SemaPtr);
6285 WriteSubmodules(WritingModule, SemaPtr ? &SemaPtr->
Context :
nullptr);
6290 WriteSpecialDeclRecords(*SemaPtr);
6293 if (!WeakUndeclaredIdentifiers.empty())
6295 WeakUndeclaredIdentifiers);
6299 if (!ExtnameUndeclaredIdentifiers.empty())
6301 ExtnameUndeclaredIdentifiers);
6303 if (!WritingModule) {
6308 ModuleInfo(uint64_t ID,
Module *M) :
ID(
ID), M(M) {}
6310 llvm::SmallVector<ModuleInfo, 64> Imports;
6313 assert(SubmoduleIDs.contains(I->getImportedModule()));
6314 Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()],
6315 I->getImportedModule()));
6319 if (!Imports.empty()) {
6320 auto Cmp = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6323 auto Eq = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6324 return A.ID == B.ID;
6328 llvm::sort(Imports,
Cmp);
6329 Imports.erase(llvm::unique(Imports, Eq), Imports.end());
6332 for (
const auto &Import : Imports) {
6333 ImportedModules.push_back(
Import.ID);
6344 WriteObjCCategories();
6346 if (!WritingModule) {
6347 WriteOptimizePragmaOptions(*SemaPtr);
6348 WriteMSStructPragmaOptions(*SemaPtr);
6349 WriteMSPointersToMembersPragmaOptions(*SemaPtr);
6351 WritePackPragmaOptions(*SemaPtr);
6352 WriteFloatControlPragmaOptions(*SemaPtr);
6353 WriteDeclsWithEffectsToVerify(*SemaPtr);
6357 RecordData::value_type
Record[] = {NumStatements,
6359 NumLexicalDeclContexts,
6360 NumVisibleDeclContexts,
6361 NumModuleLocalDeclContexts,
6362 NumTULocalDeclContexts};
6365 Stream.FlushToWord();
6366 ASTBlockRange.second = Stream.GetCurrentBitNo() >> 3;
6370 for (
const auto &ExtWriter : ModuleFileExtensionWriters)
6371 WriteModuleFileExtension(*SemaPtr, *ExtWriter);
6373 return backpatchSignature();
6379void ASTWriter::AddedManglingNumber(
const Decl *D,
unsigned Number) {
6383 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::ManglingNumber, Number));
6385void ASTWriter::AddedStaticLocalNumbers(
const Decl *D,
unsigned Number) {
6389 DeclUpdates[D].push_back(
6390 DeclUpdate(DeclUpdateKind::StaticLocalNumber, Number));
6399 ASTWriter::UpdateRecord &
Record = DeclUpdates[TU];
6402 DeclUpdate(DeclUpdateKind::CXXAddedAnonymousNamespace, NS));
6406void ASTWriter::WriteDeclAndTypes(
ASTContext &Context) {
6411 DeclTypesBlockStartOffset = Stream.GetCurrentBitNo();
6415 WriteDeclUpdatesBlocks(Context, DeclUpdatesOffsetsRecord);
6416 while (!DeclTypesToEmit.empty()) {
6417 DeclOrType DOT = DeclTypesToEmit.front();
6418 DeclTypesToEmit.pop();
6420 WriteType(Context, DOT.getType());
6422 WriteDecl(Context, DOT.getDecl());
6424 }
while (!DeclUpdates.empty());
6426 DoneWritingDeclsAndTypes =
true;
6430 assert(DelayedNamespace.empty() || GeneratingReducedBMI);
6432 for (NamespaceDecl *NS : DelayedNamespace) {
6433 LookupBlockOffsets Offsets;
6435 Offsets.
LexicalOffset = WriteDeclContextLexicalBlock(Context, NS);
6436 WriteDeclContextVisibleBlock(Context, NS, Offsets);
6457 assert(DeclTypesToEmit.empty());
6458 assert(DeclUpdates.empty());
6463 WriteTypeDeclOffsets();
6464 if (!DeclUpdatesOffsetsRecord.empty())
6467 if (!DelayedNamespaceRecord.empty())
6469 DelayedNamespaceRecord);
6471 if (!RelatedDeclsMap.empty()) {
6475 for (
const auto &Pair : RelatedDeclsMap) {
6476 RelatedDeclsMapRecord.push_back(Pair.first.getRawValue());
6477 RelatedDeclsMapRecord.push_back(Pair.second.size());
6478 for (
const auto &Lambda : Pair.second)
6479 RelatedDeclsMapRecord.push_back(Lambda.getRawValue());
6482 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6484 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array));
6485 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6486 unsigned FunctionToLambdaMapAbbrev = Stream.EmitAbbrev(std::move(Abv));
6488 FunctionToLambdaMapAbbrev);
6491 if (!SpecializationsUpdates.empty()) {
6492 WriteSpecializationsUpdates(
false);
6493 SpecializationsUpdates.clear();
6496 if (!PartialSpecializationsUpdates.empty()) {
6497 WriteSpecializationsUpdates(
true);
6498 PartialSpecializationsUpdates.clear();
6504 SmallVector<DeclID, 128> NewGlobalKindDeclPairs;
6513 NewGlobalKindDeclPairs.push_back(D->
getKind());
6514 NewGlobalKindDeclPairs.push_back(
GetDeclRef(D).getRawValue());
6517 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6519 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6520 unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));
6523 Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev,
Record,
6524 bytes(NewGlobalKindDeclPairs));
6526 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6528 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6529 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6530 UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6532 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6534 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6535 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6536 ModuleLocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6538 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6540 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6541 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6542 TULocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6545 WriteDeclContextVisibleUpdate(Context, TU);
6548 if (Context.ExternCContext)
6549 WriteDeclContextVisibleUpdate(Context, Context.ExternCContext);
6552 for (
auto *DC : UpdatedDeclContexts)
6553 WriteDeclContextVisibleUpdate(Context, DC);
6556void ASTWriter::WriteSpecializationsUpdates(
bool IsPartial) {
6560 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6561 Abv->Add(llvm::BitCodeAbbrevOp(RecordType));
6562 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6563 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6564 auto UpdateSpecializationAbbrev = Stream.EmitAbbrev(std::move(Abv));
6567 IsPartial ? PartialSpecializationsUpdates : SpecializationsUpdates;
6568 for (
auto &SpecializationUpdate : SpecUpdates) {
6569 const NamedDecl *D = SpecializationUpdate.first;
6571 llvm::SmallString<4096> LookupTable;
6572 GenerateSpecializationInfoLookupTable(D, SpecializationUpdate.second,
6573 LookupTable, IsPartial);
6576 RecordData::value_type
Record[] = {
6577 static_cast<RecordData::value_type
>(RecordType),
6579 Stream.EmitRecordWithBlob(UpdateSpecializationAbbrev,
Record, LookupTable);
6583void ASTWriter::WriteDeclUpdatesBlocks(
ASTContext &Context,
6584 RecordDataImpl &OffsetsRecord) {
6585 if (DeclUpdates.empty())
6588 DeclUpdateMap LocalUpdates;
6589 LocalUpdates.swap(DeclUpdates);
6591 for (
auto &DeclUpdate : LocalUpdates) {
6592 const Decl *D = DeclUpdate.first;
6594 bool HasUpdatedBody =
false;
6595 bool HasAddedVarDefinition =
false;
6598 for (
auto &
Update : DeclUpdate.second) {
6603 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
6604 HasUpdatedBody =
true;
6605 else if (Kind == DeclUpdateKind::CXXAddedVarDefinition)
6606 HasAddedVarDefinition =
true;
6608 Record.push_back(llvm::to_underlying(Kind));
6611 case DeclUpdateKind::CXXAddedImplicitMember:
6612 case DeclUpdateKind::CXXAddedAnonymousNamespace:
6613 assert(
Update.getDecl() &&
"no decl to add?");
6616 case DeclUpdateKind::CXXAddedFunctionDefinition:
6617 case DeclUpdateKind::CXXAddedVarDefinition:
6620 case DeclUpdateKind::CXXPointOfInstantiation:
6625 case DeclUpdateKind::CXXInstantiatedDefaultArgument:
6630 case DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer:
6635 case DeclUpdateKind::CXXInstantiatedClassDefinition: {
6637 UpdatedDeclContexts.insert(RD->getPrimaryContext());
6638 Record.push_back(RD->isParamDestroyedInCallee());
6639 Record.push_back(llvm::to_underlying(RD->getArgPassingRestrictions()));
6640 Record.AddCXXDefinitionData(RD);
6641 Record.AddOffset(WriteDeclContextLexicalBlock(Context, RD));
6646 if (
auto *MSInfo = RD->getMemberSpecializationInfo()) {
6647 Record.push_back(MSInfo->getTemplateSpecializationKind());
6648 Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
6651 Record.push_back(Spec->getTemplateSpecializationKind());
6652 Record.AddSourceLocation(Spec->getPointOfInstantiation());
6656 auto From = Spec->getInstantiatedFrom();
6657 if (
auto PartialSpec =
6658 From.dyn_cast<ClassTemplatePartialSpecializationDecl*>()) {
6660 Record.AddDeclRef(PartialSpec);
6661 Record.AddTemplateArgumentList(
6662 &Spec->getTemplateInstantiationArgs());
6667 Record.push_back(llvm::to_underlying(RD->getTagKind()));
6668 Record.AddSourceLocation(RD->getLocation());
6669 Record.AddSourceLocation(RD->getBeginLoc());
6670 Record.AddSourceRange(RD->getBraceRange());
6681 case DeclUpdateKind::CXXResolvedDtorDelete:
6686 case DeclUpdateKind::CXXResolvedDtorGlobDelete:
6690 case DeclUpdateKind::CXXResolvedDtorArrayDelete:
6694 case DeclUpdateKind::CXXResolvedDtorGlobArrayDelete:
6698 case DeclUpdateKind::CXXResolvedExceptionSpec: {
6701 Record.writeExceptionSpecInfo(prototype->getExceptionSpecInfo());
6705 case DeclUpdateKind::CXXDeducedReturnType:
6709 case DeclUpdateKind::DeclMarkedUsed:
6712 case DeclUpdateKind::ManglingNumber:
6713 case DeclUpdateKind::StaticLocalNumber:
6717 case DeclUpdateKind::DeclMarkedOpenMPThreadPrivate:
6719 D->
getAttr<OMPThreadPrivateDeclAttr>()->getRange());
6722 case DeclUpdateKind::DeclMarkedOpenMPAllocate: {
6723 auto *A = D->
getAttr<OMPAllocateDeclAttr>();
6724 Record.push_back(A->getAllocatorType());
6725 Record.AddStmt(A->getAllocator());
6726 Record.AddStmt(A->getAlignment());
6727 Record.AddSourceRange(A->getRange());
6731 case DeclUpdateKind::DeclMarkedOpenMPIndirectCall:
6733 D->
getAttr<OMPTargetIndirectCallAttr>()->getRange());
6736 case DeclUpdateKind::DeclMarkedOpenMPDeclareTarget:
6737 Record.push_back(D->
getAttr<OMPDeclareTargetDeclAttr>()->getMapType());
6739 D->
getAttr<OMPDeclareTargetDeclAttr>()->getRange());
6742 case DeclUpdateKind::DeclExported:
6746 case DeclUpdateKind::AddedAttrToRecord:
6747 Record.AddAttributes(llvm::ArrayRef(
Update.getAttr()));
6755 if (HasUpdatedBody) {
6758 llvm::to_underlying(DeclUpdateKind::CXXAddedFunctionDefinition));
6759 Record.push_back(Def->isInlined());
6760 Record.AddSourceLocation(Def->getInnerLocStart());
6761 Record.AddFunctionDefinition(Def);
6762 }
else if (HasAddedVarDefinition) {
6765 llvm::to_underlying(DeclUpdateKind::CXXAddedVarDefinition));
6766 Record.push_back(VD->isInline());
6767 Record.push_back(VD->isInlineSpecified());
6768 Record.AddVarDeclInit(VD);
6785 NonAffectingFileIDs.empty())
6787 auto It = llvm::lower_bound(NonAffectingFileIDs, FID);
6788 unsigned Idx = std::distance(NonAffectingFileIDs.begin(), It);
6789 unsigned Offset = NonAffectingFileIDAdjustments[Idx];
6790 return FileID::get(FID.getOpaqueValue() - Offset);
6793unsigned ASTWriter::getAdjustedNumCreatedFIDs(
FileID FID)
const {
6799 unsigned AdjustedNumCreatedFIDs = 0;
6800 for (
unsigned I = FID.ID, N = I + NumCreatedFIDs; I != N; ++I)
6801 if (IsSLocAffecting[I])
6802 ++AdjustedNumCreatedFIDs;
6803 return AdjustedNumCreatedFIDs;
6813 return SourceRange(getAdjustedLocation(
Range.getBegin()),
6814 getAdjustedLocation(
Range.getEnd()));
6819 return Offset - getAdjustment(Offset);
6824 if (NonAffectingRanges.empty())
6827 if (PP->getSourceManager().isLoadedOffset(Offset))
6830 if (Offset > NonAffectingRanges.back().getEnd().getOffset())
6831 return NonAffectingOffsetAdjustments.back();
6833 if (Offset < NonAffectingRanges.front().getBegin().getOffset())
6837 return Range.getEnd().getOffset() < Offset;
6840 auto It = llvm::lower_bound(NonAffectingRanges, Offset, Contains);
6841 unsigned Idx = std::distance(NonAffectingRanges.begin(), It);
6842 return NonAffectingOffsetAdjustments[Idx];
6846 Record.push_back(getAdjustedFileID(FID).getOpaqueValue());
6852 unsigned ModuleFileIndex = 0;
6855 if (PP->getSourceManager().isLoadedSourceLocation(Loc) && Loc.
isValid()) {
6858 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6859 assert(SLocMapI !=
getChain()->GlobalSLocOffsetMap.end() &&
6860 "Corrupted global sloc offset map");
6865 ModuleFileIndex = F->
Index + 1;
6873 Loc = getAdjustedLocation(Loc);
6910 MacroInfoToEmitData Info = { Name, MI, ID };
6911 MacroInfosToEmit.push_back(Info);
6917 return IdentMacroDirectivesOffsetMap.lookup(Name);
6921 Record->push_back(Writer->getSelectorRef(SelRef));
6930 if (SID == 0 && Chain) {
6933 Chain->LoadSelector(Sel);
6934 SID = SelectorIDs[Sel];
6937 SID = NextSelectorID++;
6938 SelectorIDs[Sel] = SID;
6980 bool InfoHasSameExpr
6982 Record->push_back(InfoHasSameExpr);
6983 if (InfoHasSameExpr)
7000 TypeLocWriter TLW(*
this);
7010template <
typename IdxForTypeTy>
7012 IdxForTypeTy IdxForType) {
7016 unsigned FastQuals = T.getLocalFastQualifiers();
7017 T.removeLocalFastQualifiers();
7019 if (T.hasLocalNonFastQualifiers())
7020 return IdxForType(T).asTypeID(FastQuals);
7022 assert(!T.hasLocalQualifiers());
7024 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr()))
7027 if (T == Context.AutoDeductTy)
7029 if (T == Context.AutoRRefDeductTy)
7032 return IdxForType(T).asTypeID(FastQuals);
7039 assert(!T.getLocalFastQualifiers());
7043 if (DoneWritingDeclsAndTypes) {
7044 assert(0 &&
"New type seen after serializing all the types to emit!");
7050 Idx =
TypeIdx(0, NextTypeID++);
7051 DeclTypesToEmit.push(T);
7057llvm::MapVector<ModuleFile *, const Decl *>
7059 llvm::MapVector<ModuleFile *, const Decl *> Firsts;
7062 if (R->isFromASTFile())
7063 Firsts[Chain->getOwningModuleFile(R)] = R;
7064 else if (IncludeLocal)
7065 Firsts[
nullptr] = R;
7081 Record.push_back(MacroRef >> 32);
7082 Record.push_back(MacroRef & llvm::maskTrailingOnes<MacroID>(32));
7097 assert(WritingAST &&
"Cannot request a declaration ID before AST writing");
7114 assert(!(
reinterpret_cast<uintptr_t>(D) & 0x01) &&
"Invalid decl pointer");
7116 if (ID.isInvalid()) {
7117 if (DoneWritingDeclsAndTypes) {
7118 assert(0 &&
"New decl seen after serializing all the decls to emit!");
7125 DeclTypesToEmit.push(
const_cast<Decl *
>(D));
7140 assert(DeclIDs.contains(D) &&
"Declaration not emitted!");
7147 assert(DoneWritingDeclsAndTypes &&
7148 "wasDeclEmitted should only be called after writing declarations");
7153 bool Emitted = DeclIDs.contains(D);
7155 GeneratingReducedBMI) &&
7156 "The declaration within modules can only be omitted in reduced BMI.");
7160void ASTWriter::getLazyUpdates(
const Decl *D) {
7161 if (!GeneratingReducedBMI)
7164 if (
auto *Iter = DeclUpdatesLazy.find(D); Iter != DeclUpdatesLazy.end()) {
7165 for (DeclUpdate &
Update : Iter->second)
7166 DeclUpdates[D].push_back(
Update);
7167 DeclUpdatesLazy.erase(Iter);
7171 if (
auto *DC = dyn_cast<DeclContext>(D);
7172 DC && UpdatedDeclContextsLazy.count(DC)) {
7173 UpdatedDeclContexts.insert(DC);
7174 UpdatedDeclContextsLazy.remove(DC);
7179 assert(
ID.isValid());
7196 SourceManager &
SM = PP->getSourceManager();
7197 SourceLocation FileLoc =
SM.getFileLoc(Loc);
7198 assert(
SM.isLocalSourceLocation(FileLoc));
7199 auto [FID, Offset] =
SM.getDecomposedLoc(FileLoc);
7202 assert(
SM.getSLocEntry(FID).isFile());
7203 assert(IsSLocAffecting[FID.ID]);
7205 std::unique_ptr<DeclIDInFileInfo> &Info = FileDeclIDs[FID];
7207 Info = std::make_unique<DeclIDInFileInfo>();
7209 std::pair<unsigned, LocalDeclID> LocDecl(Offset, ID);
7210 LocDeclIDsTy &Decls = Info->DeclIDs;
7211 Decls.push_back(LocDecl);
7216 "expected an anonymous declaration");
7220 auto It = AnonymousDeclarationNumbers.find(D);
7221 if (It == AnonymousDeclarationNumbers.end()) {
7224 AnonymousDeclarationNumbers[ND] = Number;
7227 It = AnonymousDeclarationNumbers.find(D);
7228 assert(It != AnonymousDeclarationNumbers.end() &&
7229 "declaration not found within its lexical context");
7284 while (QualifierLoc) {
7285 NestedNames.push_back(QualifierLoc);
7289 Record->push_back(NestedNames.size());
7290 while(!NestedNames.empty()) {
7291 QualifierLoc = NestedNames.pop_back_val();
7294 Record->push_back(llvm::to_underlying(Kind));
7297 AddDeclRef(Qualifier.getAsNamespaceAndPrefix().Namespace);
7319 llvm_unreachable(
"unexpected null nested name specifier");
7326 assert(TemplateParams &&
"No TemplateParams!");
7331 Record->push_back(TemplateParams->
size());
7332 for (
const auto &P : *TemplateParams)
7335 Record->push_back(
true);
7338 Record->push_back(
false);
7345 assert(TemplateArgs &&
"No TemplateArgs!");
7346 Record->push_back(TemplateArgs->
size());
7347 for (
int i = 0, e = TemplateArgs->
size(); i != e; ++i)
7353 assert(ASTTemplArgList &&
"No ASTTemplArgList!");
7363 Record->push_back(
Set.size());
7365 I =
Set.begin(), E =
Set.end(); I != E; ++I) {
7367 Record->push_back(I.getAccess());
7373 Record->push_back(
Base.isVirtual());
7374 Record->push_back(
Base.isBaseOfClass());
7375 Record->push_back(
Base.getAccessSpecifierAsWritten());
7376 Record->push_back(
Base.getInheritConstructors());
7389 for (
auto &
Base : Bases)
7407 for (
auto *
Init : CtorInits) {
7408 if (
Init->isBaseInitializer()) {
7412 }
else if (
Init->isDelegatingInitializer()) {
7415 }
else if (
Init->isMemberInitializer()){
7428 if (
Init->isWritten())
7442 auto &
Data = D->data();
7444 Record->push_back(
Data.IsLambda);
7448#define FIELD(Name, Width, Merge) \
7449 if (!DefinitionBits.canWriteNextNBits(Width)) { \
7450 Record->push_back(DefinitionBits); \
7451 DefinitionBits.reset(0); \
7453 DefinitionBits.addBits(Data.Name, Width);
7455#include "clang/AST/CXXRecordDeclDefinitionBits.def"
7458 Record->push_back(DefinitionBits);
7464 bool ModulesCodegen =
7469 Record->push_back(ModulesCodegen);
7471 Writer->AddDeclRef(D, Writer->ModularCodegenDecls);
7476 Record->push_back(
Data.ComputedVisibleConversions);
7477 if (
Data.ComputedVisibleConversions)
7481 if (!
Data.IsLambda) {
7482 Record->push_back(
Data.NumBases);
7483 if (
Data.NumBases > 0)
7487 Record->push_back(
Data.NumVBases);
7488 if (
Data.NumVBases > 0)
7493 auto &Lambda = D->getLambdaData();
7496 LambdaBits.
addBits(Lambda.DependencyKind, 2);
7497 LambdaBits.
addBit(Lambda.IsGenericLambda);
7498 LambdaBits.
addBits(Lambda.CaptureDefault, 2);
7499 LambdaBits.
addBits(Lambda.NumCaptures, 15);
7500 LambdaBits.
addBit(Lambda.HasKnownInternalLinkage);
7501 Record->push_back(LambdaBits);
7503 Record->push_back(Lambda.NumExplicitCaptures);
7504 Record->push_back(Lambda.ManglingNumber);
7509 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
7516 Record->push_back(CaptureBits);
7518 switch (
Capture.getCaptureKind()) {
7548 assert(ES->CheckedForSideEffects);
7549 Val |= (ES->HasConstantInitialization ? 2 : 0);
7550 Val |= (ES->HasConstantDestruction ? 4 : 0);
7564void ASTWriter::ReaderInitialized(
ASTReader *Reader) {
7565 assert(Reader &&
"Cannot remove chain");
7566 assert((!Chain || Chain == Reader) &&
"Cannot replace chain");
7567 assert(FirstDeclID == NextDeclID &&
7568 FirstTypeID == NextTypeID &&
7569 FirstIdentID == NextIdentID &&
7570 FirstMacroID == NextMacroID &&
7571 FirstSubmoduleID == NextSubmoduleID &&
7572 FirstSelectorID == NextSelectorID &&
7573 "Setting chain after writing has started.");
7579 NextSelectorID = FirstSelectorID;
7580 NextSubmoduleID = FirstSubmoduleID;
7590 unsigned OriginalModuleFileIndex = StoredID >> 32;
7594 if (OriginalModuleFileIndex == 0 && StoredID)
7605 MacroID &StoredID = MacroIDs[MI];
7606 unsigned OriginalModuleFileIndex = StoredID >> 32;
7609 if (OriginalModuleFileIndex == 0 && StoredID)
7618void ASTWriter::TypeRead(TypeIdx Idx,
QualType T) {
7630 TypeIdx &StoredIdx = TypeIdxs[T];
7636 if (ModuleFileIndex == 0 && StoredIdx.
getValue())
7647 DeclIDs[D] = LocalDeclID(ID);
7648 PredefinedDecls.insert(D);
7660 assert(!MacroDefinitions.contains(MD));
7661 MacroDefinitions[MD] =
ID;
7665 assert(!SubmoduleIDs.contains(Mod));
7666 SubmoduleIDs[Mod] =
ID;
7669void ASTWriter::CompletedTagDefinition(
const TagDecl *D) {
7670 if (Chain && Chain->isProcessingUpdateRecords())
return;
7672 assert(!WritingAST &&
"Already writing the AST!");
7673 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
7675 if (RD->isFromASTFile()) {
7680 "completed a tag from another module but not by instantiation?");
7681 DeclUpdates[RD].push_back(
7682 DeclUpdate(DeclUpdateKind::CXXInstantiatedClassDefinition));
7696void ASTWriter::AddedVisibleDecl(
const DeclContext *DC,
const Decl *D) {
7697 if (Chain && Chain->isProcessingUpdateRecords())
return;
7699 "Should not add lookup results to non-lookup contexts!");
7720 assert(!WritingAST &&
"Already writing the AST!");
7721 if (UpdatedDeclContexts.insert(DC) && !
cast<Decl>(DC)->isFromASTFile()) {
7725 llvm::append_range(DeclsToEmitEvenIfUnreferenced, DC->
decls());
7727 DeclsToEmitEvenIfUnreferenced.push_back(D);
7731 if (Chain && Chain->isProcessingUpdateRecords())
return;
7744 assert(!WritingAST &&
"Already writing the AST!");
7745 DeclUpdates[RD].push_back(
7746 DeclUpdate(DeclUpdateKind::CXXAddedImplicitMember, D));
7749void ASTWriter::ResolvedExceptionSpec(
const FunctionDecl *FD) {
7750 if (Chain && Chain->isProcessingUpdateRecords())
return;
7751 assert(!DoneWritingDeclsAndTypes &&
"Already done writing updates!");
7753 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7758 ->castAs<FunctionProtoType>()
7759 ->getExceptionSpecType()))
7760 DeclUpdates[D].push_back(DeclUpdateKind::CXXResolvedExceptionSpec);
7765 if (Chain && Chain->isProcessingUpdateRecords())
return;
7766 assert(!WritingAST &&
"Already writing the AST!");
7768 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7769 DeclUpdates[D].push_back(
7770 DeclUpdate(DeclUpdateKind::CXXDeducedReturnType, ReturnType));
7777 if (Chain && Chain->isProcessingUpdateRecords())
return;
7778 assert(!WritingAST &&
"Already writing the AST!");
7779 assert(
Delete &&
"Not given an operator delete");
7781 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7782 DeclUpdates[D].push_back(
7783 DeclUpdate(DeclUpdateKind::CXXResolvedDtorDelete,
Delete));
7789 if (Chain && Chain->isProcessingUpdateRecords())
7791 assert(!WritingAST &&
"Already writing the AST!");
7792 assert(GlobDelete &&
"Not given an operator delete");
7795 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7796 DeclUpdates[D].push_back(
7797 DeclUpdate(DeclUpdateKind::CXXResolvedDtorGlobDelete, GlobDelete));
7803 if (Chain && Chain->isProcessingUpdateRecords())
7805 assert(!WritingAST &&
"Already writing the AST!");
7806 assert(ArrayDelete &&
"Not given an operator delete");
7809 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7810 DeclUpdates[D].push_back(
7811 DeclUpdate(DeclUpdateKind::CXXResolvedDtorArrayDelete, ArrayDelete));
7815void ASTWriter::ResolvedOperatorGlobArrayDelete(
7817 if (Chain && Chain->isProcessingUpdateRecords())
7819 assert(!WritingAST &&
"Already writing the AST!");
7820 assert(GlobArrayDelete &&
"Not given an operator delete");
7823 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7824 DeclUpdates[D].push_back(DeclUpdate(
7825 DeclUpdateKind::CXXResolvedDtorGlobArrayDelete, GlobArrayDelete));
7829void ASTWriter::CompletedImplicitDefinition(
const FunctionDecl *D) {
7830 if (Chain && Chain->isProcessingUpdateRecords())
return;
7831 assert(!WritingAST &&
"Already writing the AST!");
7840 DeclUpdates[D].push_back(
7841 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7844void ASTWriter::VariableDefinitionInstantiated(
const VarDecl *D) {
7845 if (Chain && Chain->isProcessingUpdateRecords())
return;
7846 assert(!WritingAST &&
"Already writing the AST!");
7850 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::CXXAddedVarDefinition));
7853void ASTWriter::FunctionDefinitionInstantiated(
const FunctionDecl *D) {
7854 if (Chain && Chain->isProcessingUpdateRecords())
return;
7855 assert(!WritingAST &&
"Already writing the AST!");
7863 DeclUpdates[D].push_back(
7864 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7867void ASTWriter::InstantiationRequested(
const ValueDecl *D) {
7868 if (Chain && Chain->isProcessingUpdateRecords())
return;
7869 assert(!WritingAST &&
"Already writing the AST!");
7876 if (
auto *VD = dyn_cast<VarDecl>(D))
7877 POI = VD->getPointOfInstantiation();
7880 DeclUpdates[D].push_back(
7881 DeclUpdate(DeclUpdateKind::CXXPointOfInstantiation, POI));
7884void ASTWriter::DefaultArgumentInstantiated(
const ParmVarDecl *D) {
7885 if (Chain && Chain->isProcessingUpdateRecords())
return;
7886 assert(!WritingAST &&
"Already writing the AST!");
7890 DeclUpdates[D].push_back(
7891 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultArgument, D));
7894void ASTWriter::DefaultMemberInitializerInstantiated(
const FieldDecl *D) {
7895 assert(!WritingAST &&
"Already writing the AST!");
7899 DeclUpdates[D].push_back(
7900 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer, D));
7905 if (Chain && Chain->isProcessingUpdateRecords())
return;
7906 assert(!WritingAST &&
"Already writing the AST!");
7910 assert(IFD->
getDefinition() &&
"Category on a class without a definition?");
7911 ObjCClassesWithCategories.insert(
7915void ASTWriter::DeclarationMarkedUsed(
const Decl *D) {
7916 if (Chain && Chain->isProcessingUpdateRecords())
return;
7917 assert(!WritingAST &&
"Already writing the AST!");
7926 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclMarkedUsed));
7929void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(
const Decl *D) {
7930 if (Chain && Chain->isProcessingUpdateRecords())
return;
7931 assert(!WritingAST &&
"Already writing the AST!");
7935 DeclUpdates[D].push_back(
7936 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPThreadPrivate));
7939void ASTWriter::DeclarationMarkedOpenMPAllocate(
const Decl *D,
const Attr *A) {
7940 if (Chain && Chain->isProcessingUpdateRecords())
return;
7941 assert(!WritingAST &&
"Already writing the AST!");
7945 DeclUpdates[D].push_back(
7946 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPAllocate, A));
7949void ASTWriter::DeclarationMarkedOpenMPIndirectCall(
const Decl *D) {
7950 if (Chain && Chain->isProcessingUpdateRecords())
7952 assert(!WritingAST &&
"Already writing the AST!");
7956 DeclUpdates[D].push_back(
7957 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPIndirectCall));
7960void ASTWriter::DeclarationMarkedOpenMPDeclareTarget(
const Decl *D,
7962 if (Chain && Chain->isProcessingUpdateRecords())
return;
7963 assert(!WritingAST &&
"Already writing the AST!");
7967 DeclUpdates[D].push_back(
7968 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPDeclareTarget, Attr));
7971void ASTWriter::RedefinedHiddenDefinition(
const NamedDecl *D,
Module *M) {
7972 if (Chain && Chain->isProcessingUpdateRecords())
return;
7973 assert(!WritingAST &&
"Already writing the AST!");
7975 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclExported, M));
7978void ASTWriter::AddedAttributeToRecord(
const Attr *
Attr,
7980 if (Chain && Chain->isProcessingUpdateRecords())
return;
7981 assert(!WritingAST &&
"Already writing the AST!");
7982 if (!
Record->isFromASTFile())
7984 DeclUpdates[
Record].push_back(
7985 DeclUpdate(DeclUpdateKind::AddedAttrToRecord, Attr));
7988void ASTWriter::AddedCXXTemplateSpecialization(
7990 assert(!WritingAST &&
"Already writing the AST!");
7994 if (Chain && Chain->isProcessingUpdateRecords())
7997 DeclsToEmitEvenIfUnreferenced.push_back(D);
8000void ASTWriter::AddedCXXTemplateSpecialization(
8002 assert(!WritingAST &&
"Already writing the AST!");
8006 if (Chain && Chain->isProcessingUpdateRecords())
8009 DeclsToEmitEvenIfUnreferenced.push_back(D);
8014 assert(!WritingAST &&
"Already writing the AST!");
8018 if (Chain && Chain->isProcessingUpdateRecords())
8021 DeclsToEmitEvenIfUnreferenced.push_back(D);
8030class OMPClauseWriter :
public OMPClauseVisitor<OMPClauseWriter> {
8035#define GEN_CLANG_CLAUSE_CLASS
8036#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
8037#include "llvm/Frontend/OpenMP/OMP.inc"
8046 OMPClauseWriter(*this).writeClause(
C);
8049void OMPClauseWriter::writeClause(
OMPClause *
C) {
8050 Record.push_back(
unsigned(
C->getClauseKind()));
8052 Record.AddSourceLocation(
C->getBeginLoc());
8053 Record.AddSourceLocation(
C->getEndLoc());
8057 Record.push_back(uint64_t(
C->getCaptureRegion()));
8058 Record.AddStmt(
C->getPreInitStmt());
8062 VisitOMPClauseWithPreInit(
C);
8063 Record.AddStmt(
C->getPostUpdateExpr());
8066void OMPClauseWriter::VisitOMPIfClause(
OMPIfClause *
C) {
8067 VisitOMPClauseWithPreInit(
C);
8069 Record.AddSourceLocation(
C->getNameModifierLoc());
8070 Record.AddSourceLocation(
C->getColonLoc());
8071 Record.AddStmt(
C->getCondition());
8072 Record.AddSourceLocation(
C->getLParenLoc());
8076 VisitOMPClauseWithPreInit(
C);
8077 Record.AddStmt(
C->getCondition());
8078 Record.AddSourceLocation(
C->getLParenLoc());
8082 VisitOMPClauseWithPreInit(
C);
8083 Record.writeEnum(
C->getModifier());
8084 Record.AddStmt(
C->getNumThreads());
8085 Record.AddSourceLocation(
C->getModifierLoc());
8086 Record.AddSourceLocation(
C->getLParenLoc());
8090 Record.AddStmt(
C->getSafelen());
8091 Record.AddSourceLocation(
C->getLParenLoc());
8095 Record.AddStmt(
C->getSimdlen());
8096 Record.AddSourceLocation(
C->getLParenLoc());
8100 Record.push_back(
C->getNumSizes());
8101 for (
Expr *Size :
C->getSizesRefs())
8103 Record.AddSourceLocation(
C->getLParenLoc());
8107 Record.push_back(
C->getNumCounts());
8108 Record.push_back(
C->hasOmpFill());
8109 if (
C->hasOmpFill())
8110 Record.push_back(*
C->getOmpFillIndex());
8111 Record.AddSourceLocation(
C->getOmpFillLoc());
8112 for (
Expr *Count :
C->getCountsRefs())
8114 Record.AddSourceLocation(
C->getLParenLoc());
8118 Record.push_back(
C->getNumLoops());
8119 for (
Expr *Size :
C->getArgsRefs())
8121 Record.AddSourceLocation(
C->getLParenLoc());
8127 Record.AddStmt(
C->getFactor());
8128 Record.AddSourceLocation(
C->getLParenLoc());
8132 Record.AddStmt(
C->getFirst());
8133 Record.AddStmt(
C->getCount());
8134 Record.AddSourceLocation(
C->getLParenLoc());
8135 Record.AddSourceLocation(
C->getFirstLoc());
8136 Record.AddSourceLocation(
C->getCountLoc());
8140 Record.AddStmt(
C->getAllocator());
8141 Record.AddSourceLocation(
C->getLParenLoc());
8145 Record.AddStmt(
C->getNumForLoops());
8146 Record.AddSourceLocation(
C->getLParenLoc());
8149void OMPClauseWriter::VisitOMPDetachClause(OMPDetachClause *
C) {
8150 Record.AddStmt(
C->getEventHandler());
8151 Record.AddSourceLocation(
C->getLParenLoc());
8155 Record.push_back(
unsigned(
C->getDefaultKind()));
8156 Record.AddSourceLocation(
C->getLParenLoc());
8157 Record.AddSourceLocation(
C->getDefaultKindKwLoc());
8158 Record.push_back(
unsigned(
C->getDefaultVC()));
8159 Record.AddSourceLocation(
C->getDefaultVCLoc());
8163 Record.AddSourceLocation(
C->getLParenLoc());
8164 Record.AddSourceLocation(
C->getThreadsetKindLoc());
8165 Record.writeEnum(
C->getThreadsetKind());
8168void OMPClauseWriter::VisitOMPTransparentClause(OMPTransparentClause *
C) {
8169 Record.AddSourceLocation(
C->getLParenLoc());
8170 Record.AddStmt(
C->getImpexType());
8173void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *
C) {
8174 Record.push_back(
unsigned(
C->getProcBindKind()));
8175 Record.AddSourceLocation(
C->getLParenLoc());
8176 Record.AddSourceLocation(
C->getProcBindKindKwLoc());
8179void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *
C) {
8180 VisitOMPClauseWithPreInit(
C);
8181 Record.push_back(
C->getScheduleKind());
8182 Record.push_back(
C->getFirstScheduleModifier());
8183 Record.push_back(
C->getSecondScheduleModifier());
8184 Record.AddStmt(
C->getChunkSize());
8185 Record.AddSourceLocation(
C->getLParenLoc());
8186 Record.AddSourceLocation(
C->getFirstScheduleModifierLoc());
8187 Record.AddSourceLocation(
C->getSecondScheduleModifierLoc());
8188 Record.AddSourceLocation(
C->getScheduleKindLoc());
8189 Record.AddSourceLocation(
C->getCommaLoc());
8192void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *
C) {
8193 Record.push_back(
C->getLoopNumIterations().size());
8194 Record.AddStmt(
C->getNumForLoops());
8195 for (
Expr *NumIter :
C->getLoopNumIterations())
8197 for (
unsigned I = 0, E =
C->getLoopNumIterations().size(); I <E; ++I)
8198 Record.AddStmt(
C->getLoopCounter(I));
8199 Record.AddSourceLocation(
C->getLParenLoc());
8202void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *
C) {
8203 Record.AddStmt(
C->getCondition());
8204 Record.AddSourceLocation(
C->getLParenLoc());
8207void OMPClauseWriter::VisitOMPUntiedClause(OMPUntiedClause *) {}
8209void OMPClauseWriter::VisitOMPMergeableClause(OMPMergeableClause *) {}
8211void OMPClauseWriter::VisitOMPReadClause(OMPReadClause *) {}
8213void OMPClauseWriter::VisitOMPWriteClause(OMPWriteClause *) {}
8215void OMPClauseWriter::VisitOMPUpdateClause(OMPUpdateClause *
C) {
8216 Record.push_back(
C->isExtended() ? 1 : 0);
8217 if (
C->isExtended()) {
8218 Record.AddSourceLocation(
C->getLParenLoc());
8219 Record.AddSourceLocation(
C->getArgumentLoc());
8220 Record.writeEnum(
C->getDependencyKind());
8224void OMPClauseWriter::VisitOMPCaptureClause(OMPCaptureClause *) {}
8226void OMPClauseWriter::VisitOMPCompareClause(OMPCompareClause *) {}
8229void OMPClauseWriter::VisitOMPFailClause(OMPFailClause *
C) {
8230 Record.AddSourceLocation(
C->getLParenLoc());
8231 Record.AddSourceLocation(
C->getFailParameterLoc());
8232 Record.writeEnum(
C->getFailParameter());
8235void OMPClauseWriter::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
8237void OMPClauseWriter::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
8239void OMPClauseWriter::VisitOMPAbsentClause(OMPAbsentClause *
C) {
8240 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8241 Record.AddSourceLocation(
C->getLParenLoc());
8242 for (
auto K :
C->getDirectiveKinds()) {
8247void OMPClauseWriter::VisitOMPHoldsClause(OMPHoldsClause *
C) {
8249 Record.AddSourceLocation(
C->getLParenLoc());
8252void OMPClauseWriter::VisitOMPContainsClause(OMPContainsClause *
C) {
8253 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8254 Record.AddSourceLocation(
C->getLParenLoc());
8255 for (
auto K :
C->getDirectiveKinds()) {
8260void OMPClauseWriter::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
8262void OMPClauseWriter::VisitOMPNoOpenMPRoutinesClause(
8263 OMPNoOpenMPRoutinesClause *) {}
8265void OMPClauseWriter::VisitOMPNoOpenMPConstructsClause(
8266 OMPNoOpenMPConstructsClause *) {}
8268void OMPClauseWriter::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
8270void OMPClauseWriter::VisitOMPAcquireClause(OMPAcquireClause *) {}
8272void OMPClauseWriter::VisitOMPReleaseClause(OMPReleaseClause *) {}
8274void OMPClauseWriter::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
8276void OMPClauseWriter::VisitOMPWeakClause(OMPWeakClause *) {}
8278void OMPClauseWriter::VisitOMPThreadsClause(OMPThreadsClause *) {}
8280void OMPClauseWriter::VisitOMPSIMDClause(OMPSIMDClause *) {}
8282void OMPClauseWriter::VisitOMPNogroupClause(OMPNogroupClause *) {}
8284void OMPClauseWriter::VisitOMPInitClause(OMPInitClause *
C) {
8285 Record.push_back(
C->varlist_size());
8288 Record.writeBool(
C->getIsTarget());
8289 Record.writeBool(
C->getIsTargetSync());
8290 Record.AddSourceLocation(
C->getLParenLoc());
8291 Record.AddSourceLocation(
C->getVarLoc());
8294void OMPClauseWriter::VisitOMPUseClause(OMPUseClause *
C) {
8295 Record.AddStmt(
C->getInteropVar());
8296 Record.AddSourceLocation(
C->getLParenLoc());
8297 Record.AddSourceLocation(
C->getVarLoc());
8300void OMPClauseWriter::VisitOMPDestroyClause(OMPDestroyClause *
C) {
8301 Record.AddStmt(
C->getInteropVar());
8302 Record.AddSourceLocation(
C->getLParenLoc());
8303 Record.AddSourceLocation(
C->getVarLoc());
8306void OMPClauseWriter::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
8307 VisitOMPClauseWithPreInit(
C);
8308 Record.AddStmt(
C->getCondition());
8309 Record.AddSourceLocation(
C->getLParenLoc());
8312void OMPClauseWriter::VisitOMPNocontextClause(OMPNocontextClause *
C) {
8313 VisitOMPClauseWithPreInit(
C);
8314 Record.AddStmt(
C->getCondition());
8315 Record.AddSourceLocation(
C->getLParenLoc());
8318void OMPClauseWriter::VisitOMPFilterClause(OMPFilterClause *
C) {
8319 VisitOMPClauseWithPreInit(
C);
8320 Record.AddStmt(
C->getThreadID());
8321 Record.AddSourceLocation(
C->getLParenLoc());
8325 Record.AddStmt(
C->getAlignment());
8326 Record.AddSourceLocation(
C->getLParenLoc());
8329void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *
C) {
8330 Record.push_back(
C->varlist_size());
8331 Record.AddSourceLocation(
C->getLParenLoc());
8332 for (
auto *
VE :
C->varlist()) {
8335 for (
auto *
VE :
C->private_copies()) {
8340void OMPClauseWriter::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
8341 Record.push_back(
C->varlist_size());
8342 VisitOMPClauseWithPreInit(
C);
8343 Record.AddSourceLocation(
C->getLParenLoc());
8344 for (
auto *
VE :
C->varlist()) {
8347 for (
auto *
VE :
C->private_copies()) {
8350 for (
auto *
VE :
C->inits()) {
8355void OMPClauseWriter::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
8356 Record.push_back(
C->varlist_size());
8357 VisitOMPClauseWithPostUpdate(
C);
8358 Record.AddSourceLocation(
C->getLParenLoc());
8359 Record.writeEnum(
C->getKind());
8360 Record.AddSourceLocation(
C->getKindLoc());
8361 Record.AddSourceLocation(
C->getColonLoc());
8362 for (
auto *
VE :
C->varlist())
8364 for (
auto *E :
C->private_copies())
8366 for (
auto *E :
C->source_exprs())
8368 for (
auto *E :
C->destination_exprs())
8370 for (
auto *E :
C->assignment_ops())
8374void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *
C) {
8375 Record.push_back(
C->varlist_size());
8376 Record.AddSourceLocation(
C->getLParenLoc());
8377 for (
auto *
VE :
C->varlist())
8381void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *
C) {
8382 Record.push_back(
C->varlist_size());
8383 Record.writeEnum(
C->getModifier());
8384 VisitOMPClauseWithPostUpdate(
C);
8385 Record.AddSourceLocation(
C->getLParenLoc());
8386 Record.AddSourceLocation(
C->getModifierLoc());
8387 Record.AddSourceLocation(
C->getColonLoc());
8388 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8389 Record.AddDeclarationNameInfo(
C->getNameInfo());
8390 for (
auto *
VE :
C->varlist())
8392 for (
auto *
VE :
C->privates())
8394 for (
auto *E :
C->lhs_exprs())
8396 for (
auto *E :
C->rhs_exprs())
8398 for (
auto *E :
C->reduction_ops())
8400 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
8401 for (
auto *E :
C->copy_ops())
8403 for (
auto *E :
C->copy_array_temps())
8405 for (
auto *E :
C->copy_array_elems())
8408 auto PrivateFlags =
C->private_var_reduction_flags();
8409 Record.push_back(std::distance(PrivateFlags.begin(), PrivateFlags.end()));
8410 for (
bool Flag : PrivateFlags)
8414void OMPClauseWriter::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
8415 Record.push_back(
C->varlist_size());
8416 VisitOMPClauseWithPostUpdate(
C);
8417 Record.AddSourceLocation(
C->getLParenLoc());
8418 Record.AddSourceLocation(
C->getColonLoc());
8419 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8420 Record.AddDeclarationNameInfo(
C->getNameInfo());
8421 for (
auto *
VE :
C->varlist())
8423 for (
auto *
VE :
C->privates())
8425 for (
auto *E :
C->lhs_exprs())
8427 for (
auto *E :
C->rhs_exprs())
8429 for (
auto *E :
C->reduction_ops())
8433void OMPClauseWriter::VisitOMPInReductionClause(OMPInReductionClause *
C) {
8434 Record.push_back(
C->varlist_size());
8435 VisitOMPClauseWithPostUpdate(
C);
8436 Record.AddSourceLocation(
C->getLParenLoc());
8437 Record.AddSourceLocation(
C->getColonLoc());
8438 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8439 Record.AddDeclarationNameInfo(
C->getNameInfo());
8440 for (
auto *
VE :
C->varlist())
8442 for (
auto *
VE :
C->privates())
8444 for (
auto *E :
C->lhs_exprs())
8446 for (
auto *E :
C->rhs_exprs())
8448 for (
auto *E :
C->reduction_ops())
8450 for (
auto *E :
C->taskgroup_descriptors())
8454void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *
C) {
8455 Record.push_back(
C->varlist_size());
8456 VisitOMPClauseWithPostUpdate(
C);
8457 Record.AddSourceLocation(
C->getLParenLoc());
8458 Record.AddSourceLocation(
C->getColonLoc());
8459 Record.push_back(
C->getModifier());
8460 Record.AddSourceLocation(
C->getModifierLoc());
8461 for (
auto *
VE :
C->varlist()) {
8464 for (
auto *
VE :
C->privates()) {
8467 for (
auto *
VE :
C->inits()) {
8470 for (
auto *
VE :
C->updates()) {
8473 for (
auto *
VE :
C->finals()) {
8477 Record.AddStmt(
C->getCalcStep());
8478 for (
auto *
VE :
C->used_expressions())
8482void OMPClauseWriter::VisitOMPAlignedClause(OMPAlignedClause *
C) {
8483 Record.push_back(
C->varlist_size());
8484 Record.AddSourceLocation(
C->getLParenLoc());
8485 Record.AddSourceLocation(
C->getColonLoc());
8486 for (
auto *
VE :
C->varlist())
8488 Record.AddStmt(
C->getAlignment());
8491void OMPClauseWriter::VisitOMPCopyinClause(OMPCopyinClause *
C) {
8492 Record.push_back(
C->varlist_size());
8493 Record.AddSourceLocation(
C->getLParenLoc());
8494 for (
auto *
VE :
C->varlist())
8496 for (
auto *E :
C->source_exprs())
8498 for (
auto *E :
C->destination_exprs())
8500 for (
auto *E :
C->assignment_ops())
8504void OMPClauseWriter::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
8505 Record.push_back(
C->varlist_size());
8506 Record.AddSourceLocation(
C->getLParenLoc());
8507 for (
auto *
VE :
C->varlist())
8509 for (
auto *E :
C->source_exprs())
8511 for (
auto *E :
C->destination_exprs())
8513 for (
auto *E :
C->assignment_ops())
8517void OMPClauseWriter::VisitOMPFlushClause(OMPFlushClause *
C) {
8518 Record.push_back(
C->varlist_size());
8519 Record.AddSourceLocation(
C->getLParenLoc());
8520 for (
auto *
VE :
C->varlist())
8524void OMPClauseWriter::VisitOMPDepobjClause(OMPDepobjClause *
C) {
8525 Record.AddStmt(
C->getDepobj());
8526 Record.AddSourceLocation(
C->getLParenLoc());
8529void OMPClauseWriter::VisitOMPDependClause(OMPDependClause *
C) {
8530 Record.push_back(
C->varlist_size());
8531 Record.push_back(
C->getNumLoops());
8532 Record.AddSourceLocation(
C->getLParenLoc());
8533 Record.AddStmt(
C->getModifier());
8534 Record.push_back(
C->getDependencyKind());
8535 Record.AddSourceLocation(
C->getDependencyLoc());
8536 Record.AddSourceLocation(
C->getColonLoc());
8537 Record.AddSourceLocation(
C->getOmpAllMemoryLoc());
8538 for (
auto *
VE :
C->varlist())
8540 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8541 Record.AddStmt(
C->getLoopData(I));
8544void OMPClauseWriter::VisitOMPDeviceClause(OMPDeviceClause *
C) {
8545 VisitOMPClauseWithPreInit(
C);
8546 Record.writeEnum(
C->getModifier());
8547 Record.AddStmt(
C->getDevice());
8548 Record.AddSourceLocation(
C->getModifierLoc());
8549 Record.AddSourceLocation(
C->getLParenLoc());
8552void OMPClauseWriter::VisitOMPMapClause(OMPMapClause *
C) {
8553 Record.push_back(
C->varlist_size());
8554 Record.push_back(
C->getUniqueDeclarationsNum());
8555 Record.push_back(
C->getTotalComponentListNum());
8556 Record.push_back(
C->getTotalComponentsNum());
8557 Record.AddSourceLocation(
C->getLParenLoc());
8558 bool HasIteratorModifier =
false;
8560 Record.push_back(
C->getMapTypeModifier(I));
8561 Record.AddSourceLocation(
C->getMapTypeModifierLoc(I));
8562 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
8563 HasIteratorModifier =
true;
8565 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8566 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8567 Record.push_back(
C->getMapType());
8568 Record.AddSourceLocation(
C->getMapLoc());
8569 Record.AddSourceLocation(
C->getColonLoc());
8570 for (
auto *E :
C->varlist())
8572 for (
auto *E :
C->mapperlists())
8574 if (HasIteratorModifier)
8575 Record.AddStmt(
C->getIteratorModifier());
8576 for (
auto *D :
C->all_decls())
8578 for (
auto N :
C->all_num_lists())
8580 for (
auto N :
C->all_lists_sizes())
8582 for (
auto &M :
C->all_components()) {
8583 Record.AddStmt(M.getAssociatedExpression());
8584 Record.AddDeclRef(M.getAssociatedDeclaration());
8589 Record.push_back(
C->varlist_size());
8590 Record.writeEnum(
C->getFirstAllocateModifier());
8591 Record.writeEnum(
C->getSecondAllocateModifier());
8592 Record.AddSourceLocation(
C->getLParenLoc());
8593 Record.AddSourceLocation(
C->getColonLoc());
8594 Record.AddStmt(
C->getAllocator());
8595 Record.AddStmt(
C->getAlignment());
8596 for (
auto *
VE :
C->varlist())
8600void OMPClauseWriter::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
8601 Record.push_back(
C->varlist_size());
8602 VisitOMPClauseWithPreInit(
C);
8603 Record.AddSourceLocation(
C->getLParenLoc());
8604 for (
auto *
VE :
C->varlist())
8608void OMPClauseWriter::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
8609 Record.push_back(
C->varlist_size());
8610 VisitOMPClauseWithPreInit(
C);
8611 Record.AddSourceLocation(
C->getLParenLoc());
8612 for (
auto *
VE :
C->varlist())
8616void OMPClauseWriter::VisitOMPPriorityClause(OMPPriorityClause *
C) {
8617 VisitOMPClauseWithPreInit(
C);
8618 Record.AddStmt(
C->getPriority());
8619 Record.AddSourceLocation(
C->getLParenLoc());
8622void OMPClauseWriter::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
8623 VisitOMPClauseWithPreInit(
C);
8624 Record.writeEnum(
C->getModifier());
8625 Record.AddStmt(
C->getGrainsize());
8626 Record.AddSourceLocation(
C->getModifierLoc());
8627 Record.AddSourceLocation(
C->getLParenLoc());
8630void OMPClauseWriter::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
8631 VisitOMPClauseWithPreInit(
C);
8632 Record.writeEnum(
C->getModifier());
8633 Record.AddStmt(
C->getNumTasks());
8634 Record.AddSourceLocation(
C->getModifierLoc());
8635 Record.AddSourceLocation(
C->getLParenLoc());
8638void OMPClauseWriter::VisitOMPHintClause(OMPHintClause *
C) {
8640 Record.AddSourceLocation(
C->getLParenLoc());
8643void OMPClauseWriter::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
8644 VisitOMPClauseWithPreInit(
C);
8645 Record.push_back(
C->getDistScheduleKind());
8646 Record.AddStmt(
C->getChunkSize());
8647 Record.AddSourceLocation(
C->getLParenLoc());
8648 Record.AddSourceLocation(
C->getDistScheduleKindLoc());
8649 Record.AddSourceLocation(
C->getCommaLoc());
8652void OMPClauseWriter::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
8653 Record.push_back(
C->getDefaultmapKind());
8654 Record.push_back(
C->getDefaultmapModifier());
8655 Record.AddSourceLocation(
C->getLParenLoc());
8656 Record.AddSourceLocation(
C->getDefaultmapModifierLoc());
8657 Record.AddSourceLocation(
C->getDefaultmapKindLoc());
8660void OMPClauseWriter::VisitOMPToClause(OMPToClause *
C) {
8661 Record.push_back(
C->varlist_size());
8662 Record.push_back(
C->getUniqueDeclarationsNum());
8663 Record.push_back(
C->getTotalComponentListNum());
8664 Record.push_back(
C->getTotalComponentsNum());
8665 Record.AddSourceLocation(
C->getLParenLoc());
8667 Record.push_back(
C->getMotionModifier(I));
8668 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8669 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8670 Record.AddStmt(
C->getIteratorModifier());
8672 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8673 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8674 Record.AddSourceLocation(
C->getColonLoc());
8675 for (
auto *E :
C->varlist())
8677 for (
auto *E :
C->mapperlists())
8679 for (
auto *D :
C->all_decls())
8681 for (
auto N :
C->all_num_lists())
8683 for (
auto N :
C->all_lists_sizes())
8685 for (
auto &M :
C->all_components()) {
8686 Record.AddStmt(M.getAssociatedExpression());
8687 Record.writeBool(M.isNonContiguous());
8688 Record.AddDeclRef(M.getAssociatedDeclaration());
8692void OMPClauseWriter::VisitOMPFromClause(OMPFromClause *
C) {
8693 Record.push_back(
C->varlist_size());
8694 Record.push_back(
C->getUniqueDeclarationsNum());
8695 Record.push_back(
C->getTotalComponentListNum());
8696 Record.push_back(
C->getTotalComponentsNum());
8697 Record.AddSourceLocation(
C->getLParenLoc());
8699 Record.push_back(
C->getMotionModifier(I));
8700 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8701 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8702 Record.AddStmt(
C->getIteratorModifier());
8704 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8705 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8706 Record.AddSourceLocation(
C->getColonLoc());
8707 for (
auto *E :
C->varlist())
8709 for (
auto *E :
C->mapperlists())
8711 for (
auto *D :
C->all_decls())
8713 for (
auto N :
C->all_num_lists())
8715 for (
auto N :
C->all_lists_sizes())
8717 for (
auto &M :
C->all_components()) {
8718 Record.AddStmt(M.getAssociatedExpression());
8719 Record.writeBool(M.isNonContiguous());
8720 Record.AddDeclRef(M.getAssociatedDeclaration());
8724void OMPClauseWriter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
8725 Record.push_back(
C->varlist_size());
8726 Record.push_back(
C->getUniqueDeclarationsNum());
8727 Record.push_back(
C->getTotalComponentListNum());
8728 Record.push_back(
C->getTotalComponentsNum());
8729 Record.AddSourceLocation(
C->getLParenLoc());
8730 Record.writeEnum(
C->getFallbackModifier());
8731 Record.AddSourceLocation(
C->getFallbackModifierLoc());
8732 for (
auto *E :
C->varlist())
8734 for (
auto *
VE :
C->private_copies())
8736 for (
auto *
VE :
C->inits())
8738 for (
auto *D :
C->all_decls())
8740 for (
auto N :
C->all_num_lists())
8742 for (
auto N :
C->all_lists_sizes())
8744 for (
auto &M :
C->all_components()) {
8745 Record.AddStmt(M.getAssociatedExpression());
8746 Record.AddDeclRef(M.getAssociatedDeclaration());
8750void OMPClauseWriter::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
8751 Record.push_back(
C->varlist_size());
8752 Record.push_back(
C->getUniqueDeclarationsNum());
8753 Record.push_back(
C->getTotalComponentListNum());
8754 Record.push_back(
C->getTotalComponentsNum());
8755 Record.AddSourceLocation(
C->getLParenLoc());
8756 for (
auto *E :
C->varlist())
8758 for (
auto *D :
C->all_decls())
8760 for (
auto N :
C->all_num_lists())
8762 for (
auto N :
C->all_lists_sizes())
8764 for (
auto &M :
C->all_components()) {
8765 Record.AddStmt(M.getAssociatedExpression());
8766 Record.AddDeclRef(M.getAssociatedDeclaration());
8770void OMPClauseWriter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
8771 Record.push_back(
C->varlist_size());
8772 Record.push_back(
C->getUniqueDeclarationsNum());
8773 Record.push_back(
C->getTotalComponentListNum());
8774 Record.push_back(
C->getTotalComponentsNum());
8775 Record.AddSourceLocation(
C->getLParenLoc());
8776 for (
auto *E :
C->varlist())
8778 for (
auto *D :
C->all_decls())
8780 for (
auto N :
C->all_num_lists())
8782 for (
auto N :
C->all_lists_sizes())
8784 for (
auto &M :
C->all_components()) {
8785 Record.AddStmt(M.getAssociatedExpression());
8786 Record.AddDeclRef(M.getAssociatedDeclaration());
8790void OMPClauseWriter::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
8791 Record.push_back(
C->varlist_size());
8792 Record.push_back(
C->getUniqueDeclarationsNum());
8793 Record.push_back(
C->getTotalComponentListNum());
8794 Record.push_back(
C->getTotalComponentsNum());
8795 Record.AddSourceLocation(
C->getLParenLoc());
8796 for (
auto *E :
C->varlist())
8798 for (
auto *D :
C->all_decls())
8800 for (
auto N :
C->all_num_lists())
8802 for (
auto N :
C->all_lists_sizes())
8804 for (
auto &M :
C->all_components()) {
8805 Record.AddStmt(M.getAssociatedExpression());
8806 Record.AddDeclRef(M.getAssociatedDeclaration());
8810void OMPClauseWriter::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
8812void OMPClauseWriter::VisitOMPUnifiedSharedMemoryClause(
8813 OMPUnifiedSharedMemoryClause *) {}
8815void OMPClauseWriter::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
8818OMPClauseWriter::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
8821void OMPClauseWriter::VisitOMPAtomicDefaultMemOrderClause(
8822 OMPAtomicDefaultMemOrderClause *
C) {
8823 Record.push_back(
C->getAtomicDefaultMemOrderKind());
8824 Record.AddSourceLocation(
C->getLParenLoc());
8825 Record.AddSourceLocation(
C->getAtomicDefaultMemOrderKindKwLoc());
8828void OMPClauseWriter::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
8830void OMPClauseWriter::VisitOMPAtClause(OMPAtClause *
C) {
8831 Record.push_back(
C->getAtKind());
8832 Record.AddSourceLocation(
C->getLParenLoc());
8833 Record.AddSourceLocation(
C->getAtKindKwLoc());
8836void OMPClauseWriter::VisitOMPSeverityClause(OMPSeverityClause *
C) {
8837 Record.push_back(
C->getSeverityKind());
8838 Record.AddSourceLocation(
C->getLParenLoc());
8839 Record.AddSourceLocation(
C->getSeverityKindKwLoc());
8842void OMPClauseWriter::VisitOMPMessageClause(OMPMessageClause *
C) {
8843 VisitOMPClauseWithPreInit(
C);
8844 Record.AddStmt(
C->getMessageString());
8845 Record.AddSourceLocation(
C->getLParenLoc());
8848void OMPClauseWriter::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
8849 Record.push_back(
C->varlist_size());
8850 Record.AddSourceLocation(
C->getLParenLoc());
8851 for (
auto *
VE :
C->varlist())
8853 for (
auto *E :
C->private_refs())
8857void OMPClauseWriter::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
8858 Record.push_back(
C->varlist_size());
8859 Record.AddSourceLocation(
C->getLParenLoc());
8860 for (
auto *
VE :
C->varlist())
8864void OMPClauseWriter::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
8865 Record.push_back(
C->varlist_size());
8866 Record.AddSourceLocation(
C->getLParenLoc());
8867 for (
auto *
VE :
C->varlist())
8871void OMPClauseWriter::VisitOMPOrderClause(OMPOrderClause *
C) {
8872 Record.writeEnum(
C->getKind());
8873 Record.writeEnum(
C->getModifier());
8874 Record.AddSourceLocation(
C->getLParenLoc());
8875 Record.AddSourceLocation(
C->getKindKwLoc());
8876 Record.AddSourceLocation(
C->getModifierKwLoc());
8879void OMPClauseWriter::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
8880 Record.push_back(
C->getNumberOfAllocators());
8881 Record.AddSourceLocation(
C->getLParenLoc());
8882 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
8883 OMPUsesAllocatorsClause::Data
Data =
C->getAllocatorData(I);
8891void OMPClauseWriter::VisitOMPAffinityClause(OMPAffinityClause *
C) {
8892 Record.push_back(
C->varlist_size());
8893 Record.AddSourceLocation(
C->getLParenLoc());
8894 Record.AddStmt(
C->getModifier());
8895 Record.AddSourceLocation(
C->getColonLoc());
8896 for (
Expr *E :
C->varlist())
8900void OMPClauseWriter::VisitOMPBindClause(OMPBindClause *
C) {
8901 Record.writeEnum(
C->getBindKind());
8902 Record.AddSourceLocation(
C->getLParenLoc());
8903 Record.AddSourceLocation(
C->getBindKindLoc());
8906void OMPClauseWriter::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
8907 VisitOMPClauseWithPreInit(
C);
8909 Record.AddSourceLocation(
C->getLParenLoc());
8912void OMPClauseWriter::VisitOMPDynGroupprivateClause(
8913 OMPDynGroupprivateClause *
C) {
8914 VisitOMPClauseWithPreInit(
C);
8915 Record.push_back(
C->getDynGroupprivateModifier());
8916 Record.push_back(
C->getDynGroupprivateFallbackModifier());
8918 Record.AddSourceLocation(
C->getLParenLoc());
8919 Record.AddSourceLocation(
C->getDynGroupprivateModifierLoc());
8920 Record.AddSourceLocation(
C->getDynGroupprivateFallbackModifierLoc());
8923void OMPClauseWriter::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
8924 Record.push_back(
C->varlist_size());
8925 Record.push_back(
C->getNumLoops());
8926 Record.AddSourceLocation(
C->getLParenLoc());
8927 Record.push_back(
C->getDependenceType());
8928 Record.AddSourceLocation(
C->getDependenceLoc());
8929 Record.AddSourceLocation(
C->getColonLoc());
8930 for (
auto *
VE :
C->varlist())
8932 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8933 Record.AddStmt(
C->getLoopData(I));
8936void OMPClauseWriter::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
8937 Record.AddAttributes(
C->getAttrs());
8938 Record.AddSourceLocation(
C->getBeginLoc());
8939 Record.AddSourceLocation(
C->getLParenLoc());
8940 Record.AddSourceLocation(
C->getEndLoc());
8943void OMPClauseWriter::VisitOMPXBareClause(OMPXBareClause *
C) {}
8947 for (
const auto &
Set : TI->
Sets) {
8954 writeExprRef(
Selector.ScoreOrCondition);
8968 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
8970 if (
Data->hasAssociatedStmt())
8972 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
8978 for (
Expr *E :
C->getVarList())
8984 for (
Expr *E : Exprs)
8993 switch (
C->getClauseKind()) {
9003 AddStmt(
const_cast<Expr*
>(IC->getConditionExpr()));
9010 if (SC->isConditionExprClause()) {
9012 if (SC->hasConditionExpr())
9013 AddStmt(
const_cast<Expr *
>(SC->getConditionExpr()));
9016 for (
Expr *E : SC->getVarList())
9025 for (
Expr *E : NGC->getIntExprs())
9059 static_assert(
sizeof(R) == 1 *
sizeof(
int *));
9082 static_assert(
sizeof(R) == 2 *
sizeof(
int *));
9170 if (AC->hasIntExpr())
9178 if (
Expr *DNE = WC->getDevNumExpr())
9192 if (Arg.getIdentifierInfo())
9211 for (
auto &CombinerRecipe : R.CombinerRecipes) {
9239 for (
Expr *E : TC->getSizeExprs())
9247 for (
unsigned I = 0; I < GC->getNumExprs(); ++I) {
9249 AddStmt(
const_cast<Expr *
>(GC->getExpr(I).second));
9257 if (WC->hasIntExpr())
9265 if (VC->hasIntExpr())
9286 if (BC->isStringArgument())
9295 llvm_unreachable(
"Clause serialization not yet implemented");
9297 llvm_unreachable(
"Invalid Clause Kind");
9306 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