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);
983 BLOCK(SOURCE_MANAGER_BLOCK);
991 BLOCK(PREPROCESSOR_BLOCK);
999 BLOCK(SUBMODULE_BLOCK);
1021 BLOCK(COMMENTS_BLOCK);
1025 BLOCK(DECLTYPES_BLOCK);
1029 RECORD(TYPE_BLOCK_POINTER);
1030 RECORD(TYPE_LVALUE_REFERENCE);
1031 RECORD(TYPE_RVALUE_REFERENCE);
1032 RECORD(TYPE_MEMBER_POINTER);
1033 RECORD(TYPE_CONSTANT_ARRAY);
1034 RECORD(TYPE_INCOMPLETE_ARRAY);
1035 RECORD(TYPE_VARIABLE_ARRAY);
1038 RECORD(TYPE_FUNCTION_NO_PROTO);
1039 RECORD(TYPE_FUNCTION_PROTO);
1041 RECORD(TYPE_TYPEOF_EXPR);
1045 RECORD(TYPE_OBJC_INTERFACE);
1046 RECORD(TYPE_OBJC_OBJECT_POINTER);
1048 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM);
1049 RECORD(TYPE_UNRESOLVED_USING);
1050 RECORD(TYPE_INJECTED_CLASS_NAME);
1051 RECORD(TYPE_OBJC_OBJECT);
1052 RECORD(TYPE_TEMPLATE_TYPE_PARM);
1053 RECORD(TYPE_TEMPLATE_SPECIALIZATION);
1054 RECORD(TYPE_DEPENDENT_NAME);
1055 RECORD(TYPE_DEPENDENT_SIZED_ARRAY);
1057 RECORD(TYPE_MACRO_QUALIFIED);
1058 RECORD(TYPE_PACK_EXPANSION);
1060 RECORD(TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK);
1061 RECORD(TYPE_SUBST_BUILTIN_TEMPLATE_PACK);
1063 RECORD(TYPE_UNARY_TRANSFORM);
1067 RECORD(TYPE_OBJC_TYPE_PARAM);
1148 BLOCK(PREPROCESSOR_DETAIL_BLOCK);
1154 BLOCK(EXTENSION_BLOCK);
1157 BLOCK(UNHASHED_CONTROL_BLOCK);
1183 assert(Filename &&
"No file name to adjust?");
1185 if (BaseDir.empty())
1190 for (; Filename[Pos] && Pos < BaseDir.size(); ++Pos)
1191 if (Filename[Pos] != BaseDir[Pos])
1200 if (!llvm::sys::path::is_separator(Filename[Pos])) {
1201 if (!llvm::sys::path::is_separator(BaseDir.back()))
1215 return Filename + Pos;
1218std::pair<ASTFileSignature, ASTFileSignature>
1219ASTWriter::createSignature()
const {
1220 StringRef AllBytes(Buffer.data(), Buffer.size());
1223 Hasher.update(AllBytes.slice(ASTBlockRange.first, ASTBlockRange.second));
1228 Hasher.update(AllBytes.slice(0, UnhashedControlBlockRange.first));
1231 AllBytes.slice(UnhashedControlBlockRange.second, ASTBlockRange.first));
1233 Hasher.update(AllBytes.substr(ASTBlockRange.second));
1236 return std::make_pair(ASTBlockHash, Signature);
1239ASTFileSignature ASTWriter::createSignatureForNamedModule()
const {
1241 Hasher.update(StringRef(Buffer.data(), Buffer.size()));
1243 assert(WritingModule);
1244 assert(WritingModule->isNamedModule());
1248 for (
auto [ExportImported, _] : WritingModule->Exports)
1249 Hasher.update(ExportImported->Signature);
1273 for (
Module *M : TouchedTopLevelModules)
1281 for (uint8_t Byte : S) {
1282 Stream.BackpatchByte(BitNo, Byte);
1287ASTFileSignature ASTWriter::backpatchSignature() {
1288 if (isWritingStdCXXNamedModules()) {
1289 ASTFileSignature Signature = createSignatureForNamedModule();
1294 if (!WritingModule ||
1299 ASTFileSignature ASTBlockHash;
1300 ASTFileSignature Signature;
1301 std::tie(ASTBlockHash, Signature) = createSignature();
1309void ASTWriter::writeUnhashedControlBlock(Preprocessor &PP) {
1310 using namespace llvm;
1313 Stream.FlushToWord();
1314 UnhashedControlBlockRange.first = Stream.GetCurrentBitNo() >> 3;
1322 if (isWritingStdCXXNamedModules() ||
1333 SmallString<128> Blob{Dummy.begin(), Dummy.end()};
1336 if (!isWritingStdCXXNamedModules()) {
1337 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1339 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1340 unsigned ASTBlockHashAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1343 Stream.EmitRecordWithBlob(ASTBlockHashAbbrev,
Record, Blob);
1344 ASTBlockHashOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1348 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1349 Abbrev->Add(BitCodeAbbrevOp(
SIGNATURE));
1350 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1351 unsigned SignatureAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
1354 Stream.EmitRecordWithBlob(SignatureAbbrev,
Record, Blob);
1355 SignatureOffset = Stream.GetCurrentBitNo() - Blob.size() * 8;
1364 if (!HSOpts.ModulesSkipDiagnosticOptions) {
1365#define DIAGOPT(Name, Bits, Default) Record.push_back(DiagOpts.Name);
1366#define ENUM_DIAGOPT(Name, Type, Bits, Default) \
1367 Record.push_back(static_cast<unsigned>(DiagOpts.get##Name()));
1368#include "clang/Basic/DiagnosticOptions.def"
1370 for (
unsigned I = 0, N = DiagOpts.
Warnings.size(); I != N; ++I)
1373 for (
unsigned I = 0, N = DiagOpts.
Remarks.size(); I != N; ++I)
1382 if (!HSOpts.ModulesSkipHeaderSearchPaths) {
1384 Record.push_back(HSOpts.UserEntries.size());
1385 for (
unsigned I = 0, N = HSOpts.UserEntries.size(); I != N; ++I) {
1386 const HeaderSearchOptions::Entry &Entry = HSOpts.UserEntries[I];
1388 Record.push_back(
static_cast<unsigned>(Entry.
Group));
1394 Record.push_back(HSOpts.SystemHeaderPrefixes.size());
1395 for (
unsigned I = 0, N = HSOpts.SystemHeaderPrefixes.size(); I != N; ++I) {
1396 AddString(HSOpts.SystemHeaderPrefixes[I].Prefix,
Record);
1397 Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader);
1401 Record.push_back(HSOpts.VFSOverlayFiles.size());
1402 for (StringRef VFSOverlayFile : HSOpts.VFSOverlayFiles)
1403 AddString(VFSOverlayFile,
Record);
1408 if (!HSOpts.ModulesSkipPragmaDiagnosticMappings)
1409 WritePragmaDiagnosticMappings(Diags, WritingModule);
1414 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1416 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1417 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1418 unsigned HSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1420 HSEntryUsage.size()};
1421 Stream.EmitRecordWithBlob(HSUsageAbbrevCode,
Record,
bytes(HSEntryUsage));
1427 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1428 Abbrev->Add(BitCodeAbbrevOp(
VFS_USAGE));
1429 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1430 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1431 unsigned VFSUsageAbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1433 Stream.EmitRecordWithBlob(VFSUsageAbbrevCode,
Record,
bytes(VFSUsage));
1438 UnhashedControlBlockRange.second = Stream.GetCurrentBitNo() >> 3;
1442void ASTWriter::WriteControlBlock(Preprocessor &PP, StringRef isysroot) {
1443 using namespace llvm;
1452 auto MetadataAbbrev = std::make_shared<BitCodeAbbrev>();
1453 MetadataAbbrev->Add(BitCodeAbbrevOp(
METADATA));
1454 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1455 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1456 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1457 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 16));
1458 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1460 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1461 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1462 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1463 MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1464 unsigned MetadataAbbrevCode = Stream.EmitAbbrev(std::move(MetadataAbbrev));
1465 assert((!WritingModule || isysroot.empty()) &&
1466 "writing module as a relocatable PCH?");
1471 CLANG_VERSION_MAJOR,
1472 CLANG_VERSION_MINOR,
1474 isWritingStdCXXNamedModules(),
1476 ASTHasCompilerErrors};
1477 Stream.EmitRecordWithBlob(MetadataAbbrevCode,
Record,
1481 if (WritingModule) {
1483 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1485 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1486 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1488 Stream.EmitRecordWithBlob(AbbrevCode,
Record, WritingModule->Name);
1490 auto BaseDir = [&]() -> std::optional<SmallString<128>> {
1496 if (WritingModule->Directory) {
1497 return WritingModule->Directory->getName();
1499 return std::nullopt;
1511 WritingModule->Directory->getName() !=
".")) {
1513 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1515 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1516 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1519 Stream.EmitRecordWithBlob(AbbrevCode,
Record, *BaseDir);
1523 BaseDirectory.assign(BaseDir->begin(), BaseDir->end());
1525 }
else if (!isysroot.empty()) {
1527 SmallString<128> CleanedSysroot(isysroot);
1529 BaseDirectory.assign(CleanedSysroot.begin(), CleanedSysroot.end());
1533 if (WritingModule && WritingModule->Kind == Module::ModuleMapModule) {
1537 AddPath(WritingModule->PresumedModuleMapFile.empty()
1538 ? Map.getModuleMapFileForUniquing(WritingModule)
1539 ->getNameAsRequested()
1540 : StringRef(WritingModule->PresumedModuleMapFile),
1544 if (
auto *AdditionalModMaps =
1545 Map.getAdditionalModuleMapFiles(WritingModule)) {
1546 Record.push_back(AdditionalModMaps->size());
1547 SmallVector<FileEntryRef, 1> ModMaps(AdditionalModMaps->begin(),
1548 AdditionalModMaps->end());
1549 llvm::sort(ModMaps, [](FileEntryRef A, FileEntryRef B) {
1552 for (FileEntryRef F : ModMaps)
1553 AddPath(F.getName(),
Record);
1563 auto Abbrev = std::make_shared<BitCodeAbbrev>();
1564 Abbrev->Add(BitCodeAbbrevOp(
IMPORT));
1565 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
1566 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1567 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1568 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1569 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1570 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1571 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1572 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1573 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1574 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
1576 SmallString<128> Blob;
1578 for (ModuleFile &M : Chain->getModuleManager()) {
1580 if (!M.isDirectlyImported())
1588 AddSourceLocation(M.ImportLoc,
Record);
1589 AddStringBlob(M.ModuleName,
Record, Blob);
1590 Record.push_back(M.StandardCXXModule);
1594 if (M.StandardCXXModule) {
1607 Record.push_back(M.FileName.getImplicitModuleSuffixLength());
1608 AddPathBlob(M.FileName,
Record, Blob);
1611 Stream.EmitRecordWithBlob(AbbrevCode,
Record, Blob);
1621#define LANGOPT(Name, Bits, Default, Compatibility, Description) \
1622 Record.push_back(LangOpts.Name);
1623#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description) \
1624 Record.push_back(static_cast<unsigned>(LangOpts.get##Name()));
1625#include "clang/Basic/LangOptions.def"
1626#define SANITIZER(NAME, ID) \
1627 Record.push_back(LangOpts.Sanitize.has(SanitizerKind::ID));
1628#include "clang/Basic/Sanitizers.def"
1649 AddString(T.getTriple(),
Record);
1657 using CK = CodeGenOptions::CompatibilityKind;
1659 const CodeGenOptions &CGOpts = getCodeGenOpts();
1660#define CODEGENOPT(Name, Bits, Default, Compatibility) \
1661 if constexpr (CK::Compatibility != CK::Benign) \
1662 Record.push_back(static_cast<unsigned>(CGOpts.Name));
1663#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility) \
1664 if constexpr (CK::Compatibility != CK::Benign) \
1665 Record.push_back(static_cast<unsigned>(CGOpts.get##Name()));
1666#define DEBUGOPT(Name, Bits, Default, Compatibility)
1667#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility)
1668#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility)
1669#include "clang/Basic/CodeGenOptions.def"
1685 for (
unsigned I = 0, N = TargetOpts.
Features.size(); I != N; ++I) {
1698 const HeaderSearchOptions &HSOpts =
1701 StringRef HSOpts_ModuleCachePath =
1706 AddString(HSOpts_ModuleCachePath,
Record);
1727 bool WriteMacros = !SkipMacros;
1728 Record.push_back(WriteMacros);
1732 for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
1740 for (
unsigned I = 0, N = PPOpts.
Includes.size(); I != N; ++I)
1745 for (
unsigned I = 0, N = PPOpts.
MacroIncludes.size(); I != N; ++I)
1766 auto FileAbbrev = std::make_shared<BitCodeAbbrev>();
1768 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1769 FileAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1770 unsigned FileAbbrevCode = Stream.EmitAbbrev(std::move(FileAbbrev));
1775 EmitRecordWithPath(FileAbbrevCode,
Record, MainFile->getName());
1782 WriteInputFiles(SourceMgr);
1789struct InputFileEntry {
1793 bool BufferOverridden;
1800 void trySetContentHash(
1802 llvm::function_ref<std::optional<llvm::MemoryBufferRef>()> GetMemBuff) {
1811 auto MemBuff = GetMemBuff();
1813 PP.
Diag(SourceLocation(), diag::err_module_unable_to_hash_content)
1818 uint64_t Hash = xxh3_64bits(MemBuff->getBuffer());
1820 ContentHash[1] =
uint32_t(Hash >> 32);
1826SourceLocation ASTWriter::getAffectingIncludeLoc(
const SourceManager &SourceMgr,
1827 const SrcMgr::FileInfo &
File) {
1828 SourceLocation IncludeLoc =
File.getIncludeLoc();
1830 FileID IncludeFID = SourceMgr.
getFileID(IncludeLoc);
1831 assert(IncludeFID.
isValid() &&
"IncludeLoc in invalid file");
1832 if (!IsSLocAffecting[IncludeFID.ID])
1833 IncludeLoc = SourceLocation();
1838void ASTWriter::WriteInputFiles(SourceManager &SourceMgr) {
1839 using namespace llvm;
1844 auto IFAbbrev = std::make_shared<BitCodeAbbrev>();
1846 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1847 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 12));
1848 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
1849 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1850 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1851 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1852 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1853 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
1854 IFAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1855 unsigned IFAbbrevCode = Stream.EmitAbbrev(std::move(IFAbbrev));
1858 auto IFHAbbrev = std::make_shared<BitCodeAbbrev>();
1860 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1861 IFHAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1862 unsigned IFHAbbrevCode = Stream.EmitAbbrev(std::move(IFHAbbrev));
1864 uint64_t InputFilesOffsetBase = Stream.GetCurrentBitNo();
1868 std::vector<InputFileEntry> SystemFiles;
1872 assert(&SourceMgr.
getSLocEntry(FileID::get(I)) == SLoc);
1879 if (!
Cache->OrigEntry)
1883 if (!IsSLocFileEntryAffecting[I])
1886 InputFileEntry Entry(*
Cache->OrigEntry);
1887 Entry.IsSystemFile =
isSystem(
File.getFileCharacteristic());
1888 Entry.IsTransient =
Cache->IsTransient;
1889 Entry.BufferOverridden =
Cache->BufferOverridden;
1891 FileID IncludeFileID = SourceMgr.
getFileID(
File.getIncludeLoc());
1892 Entry.IsTopLevel = IncludeFileID.
isInvalid() || IncludeFileID.ID < 0 ||
1893 !IsSLocFileEntryAffecting[IncludeFileID.ID];
1896 Entry.trySetContentHash(*PP, [&] {
return Cache->getBufferIfLoaded(); });
1898 if (Entry.IsSystemFile)
1899 SystemFiles.push_back(Entry);
1908 if (!Sysroot.empty()) {
1909 SmallString<128> SDKSettingsJSON = Sysroot;
1910 llvm::sys::path::append(SDKSettingsJSON,
"SDKSettings.json");
1913 InputFileEntry Entry(*FE);
1914 Entry.IsSystemFile =
true;
1915 Entry.IsTransient =
false;
1916 Entry.BufferOverridden =
false;
1917 Entry.IsTopLevel =
true;
1918 Entry.IsModuleMap =
false;
1919 std::unique_ptr<MemoryBuffer> MB;
1920 Entry.trySetContentHash(*PP, [&]() -> std::optional<MemoryBufferRef> {
1922 MB = std::move(*MBOrErr);
1923 return MB->getMemBufferRef();
1925 return std::nullopt;
1927 SystemFiles.push_back(Entry);
1932 auto SortedFiles = llvm::concat<InputFileEntry>(std::move(
UserFiles),
1933 std::move(SystemFiles));
1935 unsigned UserFilesNum = 0;
1937 std::vector<uint64_t> InputFileOffsets;
1938 for (
const auto &Entry : SortedFiles) {
1939 uint32_t &InputFileID = InputFileIDs[Entry.File];
1940 if (InputFileID != 0)
1944 InputFileOffsets.push_back(Stream.GetCurrentBitNo() - InputFilesOffsetBase);
1946 InputFileID = InputFileOffsets.size();
1948 if (!Entry.IsSystemFile)
1954 SmallString<128> NameAsRequested = Entry.File.getNameAsRequested();
1955 SmallString<128> Name = Entry.File.getName();
1957 PreparePathForOutput(NameAsRequested);
1958 PreparePathForOutput(Name);
1960 if (Name == NameAsRequested)
1963 RecordData::value_type
Record[] = {
1965 InputFileOffsets.size(),
1967 (
uint64_t)getTimestampForOutput(Entry.File.getModificationTime()),
1968 Entry.BufferOverridden,
1972 NameAsRequested.size()};
1974 Stream.EmitRecordWithBlob(IFAbbrevCode,
Record,
1975 (NameAsRequested + Name).str());
1981 Entry.ContentHash[1]};
1982 Stream.EmitRecordWithAbbrev(IFHAbbrevCode,
Record);
1989 auto OffsetsAbbrev = std::make_shared<BitCodeAbbrev>();
1991 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1992 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1994 OffsetsAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
1995 unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(std::move(OffsetsAbbrev));
1999 InputFileOffsets.size(), UserFilesNum};
2000 Stream.EmitRecordWithBlob(OffsetsAbbrevCode,
Record,
bytes(InputFileOffsets));
2010 using namespace llvm;
2012 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2014 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2015 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2016 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2017 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2019 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2020 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2021 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 24));
2022 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2023 return Stream.EmitAbbrev(std::move(Abbrev));
2029 using namespace llvm;
2031 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2033 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2034 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2035 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2036 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2037 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2038 return Stream.EmitAbbrev(std::move(Abbrev));
2045 using namespace llvm;
2047 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2051 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2052 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2053 return Stream.EmitAbbrev(std::move(Abbrev));
2059 using namespace llvm;
2061 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2063 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2064 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2065 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2066 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2067 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2068 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2069 return Stream.EmitAbbrev(std::move(Abbrev));
2074static std::pair<unsigned, unsigned>
2076 llvm::encodeULEB128(KeyLen, Out);
2077 llvm::encodeULEB128(DataLen, Out);
2078 return std::make_pair(KeyLen, DataLen);
2084 class HeaderFileInfoTrait {
2088 HeaderFileInfoTrait(ASTWriter &Writer) : Writer(Writer) {}
2095 using key_type_ref =
const key_type &;
2097 using UnresolvedModule =
2098 llvm::PointerIntPair<Module *, 2, ModuleMap::ModuleHeaderRole>;
2101 data_type(
const HeaderFileInfo &HFI,
bool AlreadyIncluded,
2102 ArrayRef<ModuleMap::KnownHeader> KnownHeaders,
2104 : HFI(HFI), AlreadyIncluded(AlreadyIncluded),
2108 bool AlreadyIncluded;
2109 SmallVector<ModuleMap::KnownHeader, 1> KnownHeaders;
2112 using data_type_ref =
const data_type &;
2114 using hash_value_type = unsigned;
2115 using offset_type = unsigned;
2121 uint8_t buf[
sizeof(key.Size) +
sizeof(key.ModTime)];
2122 memcpy(buf, &key.Size,
sizeof(key.Size));
2123 memcpy(buf +
sizeof(key.Size), &key.ModTime,
sizeof(key.ModTime));
2124 return llvm::xxh3_64bits(buf);
2127 std::pair<unsigned, unsigned>
2128 EmitKeyDataLength(raw_ostream& Out, key_type_ref key, data_type_ref
Data) {
2129 unsigned KeyLen = key.Filename.size() + 1 + 8 + 8;
2131 for (
auto ModInfo :
Data.KnownHeaders)
2134 if (
Data.Unresolved.getPointer())
2139 void EmitKey(raw_ostream& Out, key_type_ref key,
unsigned KeyLen) {
2140 using namespace llvm::support;
2142 endian::Writer
LE(Out, llvm::endianness::little);
2147 Out.write(key.Filename.data(), KeyLen);
2150 void EmitData(raw_ostream &Out, key_type_ref key,
2151 data_type_ref
Data,
unsigned DataLen) {
2152 using namespace llvm::support;
2154 endian::Writer
LE(Out, llvm::endianness::little);
2157 unsigned char Flags = (
Data.AlreadyIncluded << 6)
2158 | (
Data.HFI.isImport << 5)
2160 Data.HFI.isPragmaOnce << 4)
2161 | (
Data.HFI.DirInfo << 1);
2162 LE.write<uint8_t>(Flags);
2164 if (
Data.HFI.LazyControllingMacro.isID())
2173 assert((
Value >> 3) == ModID &&
"overflow in header module info");
2178 for (
auto ModInfo :
Data.KnownHeaders)
2179 EmitModule(ModInfo.getModule(), ModInfo.getRole());
2180 if (
Data.Unresolved.getPointer())
2181 EmitModule(
Data.Unresolved.getPointer(),
Data.Unresolved.getInt());
2183 assert(
Out.tell() - Start == DataLen &&
"Wrong data length");
2192void ASTWriter::WriteHeaderSearch(
const HeaderSearch &HS) {
2193 HeaderFileInfoTrait GeneratorTrait(*
this);
2194 llvm::OnDiskChainedHashTableGenerator<HeaderFileInfoTrait>
Generator;
2195 SmallVector<const char *, 4> SavedStrings;
2196 unsigned NumHeaderSearchEntries = 0;
2202 const HeaderFileInfo
Empty;
2203 if (WritingModule) {
2204 llvm::SmallVector<Module *, 16> Worklist(1, WritingModule);
2205 while (!Worklist.empty()) {
2206 Module *M = Worklist.pop_back_val();
2223 if (!U.Size || (!U.ModTime && IncludeTimestamps)) {
2224 PP->
Diag(U.FileNameLoc, diag::err_module_no_size_mtime_for_header)
2225 << WritingModule->getFullModuleName() << U.Size.has_value()
2232 llvm::sys::path::append(Filename, U.FileName);
2233 PreparePathForOutput(Filename);
2235 StringRef FilenameDup = strdup(Filename.c_str());
2236 SavedStrings.push_back(FilenameDup.data());
2238 HeaderFileInfoTrait::key_type Key = {
2239 FilenameDup, *U.Size, IncludeTimestamps ? *U.ModTime : 0};
2240 HeaderFileInfoTrait::data_type
Data = {
2245 ++NumHeaderSearchEntries;
2248 Worklist.append(SubmodulesRange.begin(), SubmodulesRange.end());
2252 SmallVector<OptionalFileEntryRef, 16> FilesByUID;
2258 for (
unsigned UID = 0, LastUID = FilesByUID.size(); UID != LastUID; ++UID) {
2272 StringRef Filename =
File->getName();
2273 SmallString<128> FilenameTmp(Filename);
2274 if (PreparePathForOutput(FilenameTmp)) {
2277 Filename = StringRef(strdup(FilenameTmp.c_str()));
2278 SavedStrings.push_back(Filename.data());
2283 HeaderFileInfoTrait::key_type Key = {
2284 Filename,
File->getSize(),
2285 getTimestampForOutput(
File->getModificationTime())};
2286 HeaderFileInfoTrait::data_type
Data = {
2290 ++NumHeaderSearchEntries;
2294 SmallString<4096> TableData;
2297 using namespace llvm::support;
2299 llvm::raw_svector_ostream
Out(TableData);
2301 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
2302 BucketOffset =
Generator.Emit(Out, GeneratorTrait);
2306 using namespace llvm;
2308 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2310 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2311 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2312 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2313 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2314 unsigned TableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2318 NumHeaderSearchEntries, TableData.size()};
2319 Stream.EmitRecordWithBlob(TableAbbrev,
Record, TableData);
2322 for (
unsigned I = 0, N = SavedStrings.size(); I != N; ++I)
2323 free(
const_cast<char *
>(SavedStrings[I]));
2326static void emitBlob(llvm::BitstreamWriter &Stream, StringRef Blob,
2327 unsigned SLocBufferBlobCompressedAbbrv,
2328 unsigned SLocBufferBlobAbbrv) {
2329 using RecordDataType = ASTWriter::RecordData::value_type;
2334 if (llvm::compression::zstd::isAvailable()) {
2335 llvm::compression::zstd::compress(
2336 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer, 9);
2338 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2339 llvm::toStringRef(CompressedBuffer));
2342 if (llvm::compression::zlib::isAvailable()) {
2343 llvm::compression::zlib::compress(
2344 llvm::arrayRefFromStringRef(Blob.drop_back(1)), CompressedBuffer);
2346 Stream.EmitRecordWithBlob(SLocBufferBlobCompressedAbbrv,
Record,
2347 llvm::toStringRef(CompressedBuffer));
2352 Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv,
Record, Blob);
2363void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr) {
2368 const uint64_t SourceManagerBlockOffset = Stream.GetCurrentBitNo();
2374 unsigned SLocBufferBlobCompressedAbbrv =
2380 std::vector<uint32_t> SLocEntryOffsets;
2381 uint64_t SLocEntryOffsetsBase = Stream.GetCurrentBitNo();
2387 FileID FID = FileID::get(I);
2391 uint64_t Offset = Stream.GetCurrentBitNo() - SLocEntryOffsetsBase;
2392 assert((Offset >> 32) == 0 &&
"SLocEntry offset too large");
2398 if (
Cache->OrigEntry) {
2411 if (!IsSLocAffecting[I])
2413 SLocEntryOffsets.push_back(Offset);
2416 AddSourceLocation(getAffectingIncludeLoc(SourceMgr,
File),
Record);
2417 Record.push_back(
File.getFileCharacteristic());
2420 bool EmitBlob =
false;
2423 "Writing to AST an overridden file is not supported");
2426 assert(InputFileIDs[*Content->
OrigEntry] != 0 &&
"Missed file entry");
2429 Record.push_back(getAdjustedNumCreatedFIDs(FID));
2431 FileDeclIDsTy::iterator FDI = FileDeclIDs.find(FID);
2432 if (FDI != FileDeclIDs.end()) {
2433 Record.push_back(FDI->second->FirstDeclIndex);
2434 Record.push_back(FDI->second->DeclIDs.size());
2440 Stream.EmitRecordWithAbbrev(SLocFileAbbrv,
Record);
2451 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2453 StringRef Name = Buffer ? Buffer->getBufferIdentifier() :
"";
2454 Stream.EmitRecordWithBlob(SLocBufferAbbrv,
Record,
2455 StringRef(Name.data(), Name.size() + 1));
2462 std::optional<llvm::MemoryBufferRef> Buffer = Content->
getBufferOrNone(
2465 Buffer = llvm::MemoryBufferRef(
"<<<INVALID BUFFER>>>",
"");
2466 StringRef Blob(Buffer->getBufferStart(), Buffer->getBufferSize() + 1);
2467 emitBlob(Stream, Blob, SLocBufferBlobCompressedAbbrv,
2468 SLocBufferBlobAbbrv);
2472 const SrcMgr::ExpansionInfo &Expansion = SLoc->
getExpansion();
2473 SLocEntryOffsets.push_back(Offset);
2488 Record.push_back(getAdjustedOffset(NextOffset - SLoc->
getOffset()) - 1);
2489 Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv,
Record);
2495 if (SLocEntryOffsets.empty())
2500 using namespace llvm;
2502 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2504 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2505 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16));
2506 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2507 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2508 unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2510 RecordData::value_type
Record[] = {
2513 SLocEntryOffsetsBase - SourceManagerBlockOffset};
2514 Stream.EmitRecordWithBlob(SLocOffsetsAbbrev,
Record,
2515 bytes(SLocEntryOffsets));
2526 llvm::DenseMap<int, int> FilenameMap;
2527 FilenameMap[-1] = -1;
2528 for (
const auto &L : LineTable) {
2531 for (
auto &LE : L.second) {
2532 if (FilenameMap.insert(std::make_pair(
LE.FilenameID,
2533 FilenameMap.size() - 1)).second)
2534 AddPath(LineTable.getFilename(
LE.FilenameID),
Record);
2540 for (
const auto &L : LineTable) {
2545 AddFileID(L.first,
Record);
2548 Record.push_back(L.second.size());
2549 for (
const auto &LE : L.second) {
2552 Record.push_back(FilenameMap[
LE.FilenameID]);
2553 Record.push_back((
unsigned)
LE.FileKind);
2554 Record.push_back(
LE.IncludeOffset);
2569 if (MI->isBuiltinMacro())
2585void ASTWriter::WritePreprocessor(
const Preprocessor &PP,
bool IsModule) {
2586 uint64_t MacroOffsetsBase = Stream.GetCurrentBitNo();
2590 WritePreprocessorDetail(*PPRec, MacroOffsetsBase);
2593 RecordData ModuleMacroRecord;
2603 SourceLocation AssumeNonNullLoc =
2605 if (AssumeNonNullLoc.
isValid()) {
2607 AddSourceLocation(AssumeNonNullLoc,
Record);
2617 AddSourceLocation(SkipInfo->HashTokenLoc,
Record);
2618 AddSourceLocation(SkipInfo->IfTokenLoc,
Record);
2619 Record.push_back(SkipInfo->FoundNonSkipPortion);
2620 Record.push_back(SkipInfo->FoundElse);
2621 AddSourceLocation(SkipInfo->ElseLoc,
Record);
2637 AddSourceLocation(S,
Record);
2647 PP.
Diag(SourceLocation(), diag::warn_module_uses_date_time) << IsModule;
2654 SmallVector<const IdentifierInfo *, 128> MacroIdentifiers;
2657 if (!isWritingStdCXXNamedModules())
2659 if (Id.second->hadMacroDefinition() &&
2660 (!Id.second->isFromAST() ||
2661 Id.second->hasChangedSinceDeserialization()))
2662 MacroIdentifiers.push_back(Id.second);
2665 llvm::sort(MacroIdentifiers, llvm::deref<std::less<>>());
2669 for (
const IdentifierInfo *Name : MacroIdentifiers) {
2671 uint64_t StartOffset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2672 assert((StartOffset >> 32) == 0 &&
"Macro identifiers offset too large");
2675 bool EmittedModuleMacros =
false;
2683 if (IsModule && WritingModule->isHeaderUnit()) {
2692 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2693 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2694 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2695 Record.push_back(VisMD->isPublic());
2697 ModuleMacroRecord.push_back(getSubmoduleID(WritingModule));
2698 AddMacroRef(MD->
getMacroInfo(), Name, ModuleMacroRecord);
2700 ModuleMacroRecord.clear();
2701 EmittedModuleMacros =
true;
2711 if (
auto *DefMD = dyn_cast<DefMacroDirective>(MD)) {
2712 Record.push_back(getMacroRef(DefMD->getInfo(), Name));
2713 }
else if (
auto *VisMD = dyn_cast<VisibilityMacroDirective>(MD)) {
2714 Record.push_back(VisMD->isPublic());
2720 SmallVector<ModuleMacro *, 8> Worklist(Leafs);
2721 llvm::DenseMap<ModuleMacro *, unsigned> Visits;
2722 while (!Worklist.empty()) {
2723 auto *
Macro = Worklist.pop_back_val();
2726 ModuleMacroRecord.push_back(getSubmoduleID(
Macro->getOwningModule()));
2727 AddMacroRef(
Macro->getMacroInfo(), Name, ModuleMacroRecord);
2728 for (
auto *M :
Macro->overrides())
2729 ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule()));
2732 ModuleMacroRecord.clear();
2735 for (
auto *M :
Macro->overrides())
2736 if (++Visits[M] == M->getNumOverridingMacros())
2737 Worklist.push_back(M);
2739 EmittedModuleMacros =
true;
2742 if (
Record.empty() && !EmittedModuleMacros)
2745 IdentMacroDirectivesOffsetMap[Name] = StartOffset;
2756 std::vector<uint32_t> MacroOffsets;
2758 for (
unsigned I = 0, N = MacroInfosToEmit.size(); I != N; ++I) {
2759 const IdentifierInfo *Name = MacroInfosToEmit[I].Name;
2760 MacroInfo *MI = MacroInfosToEmit[I].MI;
2763 if (ID < FirstMacroID) {
2764 assert(0 &&
"Loaded MacroInfo entered MacroInfosToEmit ?");
2769 unsigned Index =
ID - FirstMacroID;
2770 if (Index >= MacroOffsets.size())
2771 MacroOffsets.resize(Index + 1);
2773 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2774 assert((Offset >> 32) == 0 &&
"Macro offset too large");
2775 MacroOffsets[Index] = Offset;
2777 AddIdentifierRef(Name,
Record);
2793 for (
const IdentifierInfo *Param : MI->
params())
2794 AddIdentifierRef(Param,
Record);
2802 Stream.EmitRecord(Code,
Record);
2806 for (
unsigned TokNo = 0, e = MI->
getNumTokens(); TokNo != e; ++TokNo) {
2821 using namespace llvm;
2823 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2825 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2826 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 32));
2827 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2829 unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2832 MacroOffsetsBase - ASTBlockStartOffset};
2833 Stream.EmitRecordWithBlob(MacroOffsetAbbrev,
Record,
bytes(MacroOffsets));
2837void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec,
2838 uint64_t MacroOffsetsBase) {
2842 SmallVector<PPEntityOffset, 64> PreprocessedEntityOffsets;
2848 unsigned NumPreprocessingRecords = 0;
2849 using namespace llvm;
2852 unsigned InclusionAbbrev = 0;
2854 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2856 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2857 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2858 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));
2859 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2860 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2861 InclusionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2865 unsigned NextPreprocessorEntityID = FirstPreprocessorEntityID;
2867 for (PreprocessingRecord::iterator E = PPRec.
local_begin(),
2870 (
void)++E, ++NumPreprocessingRecords, ++NextPreprocessorEntityID) {
2873 uint64_t Offset = Stream.GetCurrentBitNo() - MacroOffsetsBase;
2874 assert((Offset >> 32) == 0 &&
"Preprocessed entity offset too large");
2875 SourceRange
R = getAdjustedRange((*E)->getSourceRange());
2876 PreprocessedEntityOffsets.emplace_back(
2877 getRawSourceLocationEncoding(
R.getBegin()),
2878 getRawSourceLocationEncoding(
R.getEnd()), Offset);
2880 if (
auto *MD = dyn_cast<MacroDefinitionRecord>(*E)) {
2882 MacroDefinitions[MD] = NextPreprocessorEntityID;
2884 AddIdentifierRef(MD->getName(),
Record);
2889 if (
auto *ME = dyn_cast<MacroExpansion>(*E)) {
2890 Record.push_back(ME->isBuiltinMacro());
2891 if (ME->isBuiltinMacro())
2892 AddIdentifierRef(ME->getName(),
Record);
2894 Record.push_back(MacroDefinitions[ME->getDefinition()]);
2899 if (
auto *ID = dyn_cast<InclusionDirective>(*E)) {
2901 Record.push_back(
ID->getFileName().size());
2902 Record.push_back(
ID->wasInQuotes());
2903 Record.push_back(
static_cast<unsigned>(
ID->getKind()));
2904 Record.push_back(
ID->importedModule());
2905 SmallString<64> Buffer;
2906 Buffer +=
ID->getFileName();
2910 Buffer +=
ID->getFile()->getName();
2911 Stream.EmitRecordWithBlob(InclusionAbbrev,
Record, Buffer);
2915 llvm_unreachable(
"Unhandled PreprocessedEntity in ASTWriter");
2920 if (NumPreprocessingRecords > 0) {
2921 assert(PreprocessedEntityOffsets.size() == NumPreprocessingRecords);
2924 using namespace llvm;
2926 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2928 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2929 unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2932 Stream.EmitRecordWithBlob(PPEOffsetAbbrev,
Record,
2933 bytes(PreprocessedEntityOffsets));
2938 if (SkippedRanges.size() > 0) {
2939 std::vector<PPSkippedRange> SerializedSkippedRanges;
2940 SerializedSkippedRanges.reserve(SkippedRanges.size());
2941 for (
auto const& Range : SkippedRanges)
2942 SerializedSkippedRanges.emplace_back(
2943 getRawSourceLocationEncoding(
Range.getBegin()),
2944 getRawSourceLocationEncoding(
Range.getEnd()));
2946 using namespace llvm;
2947 auto Abbrev = std::make_shared<BitCodeAbbrev>();
2949 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2950 unsigned PPESkippedRangeAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
2954 Stream.EmitRecordWithBlob(PPESkippedRangeAbbrev,
Record,
2955 bytes(SerializedSkippedRanges));
2963 auto Known = SubmoduleIDs.find(Mod);
2964 if (Known != SubmoduleIDs.end())
2965 return Known->second;
2968 if (Top != WritingModule &&
2970 !Top->fullModuleNameIs(StringRef(
getLangOpts().CurrentModule))))
2973 return SubmoduleIDs[Mod] = NextSubmoduleID++;
2976unsigned ASTWriter::getSubmoduleID(
Module *Mod) {
2977 unsigned ID = getLocalOrImportedSubmoduleID(Mod);
2989 unsigned ChildModules = 0;
2993 return ChildModules + 1;
2996void ASTWriter::WriteSubmodules(
Module *WritingModule, ASTContext *Context) {
3001 using namespace llvm;
3003 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3005 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3006 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3007 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4));
3008 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3009 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));
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::Fixed, 1));
3014 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3015 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3016 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3017 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3018 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3019 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3020 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3021 unsigned DefinitionAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3023 Abbrev = std::make_shared<BitCodeAbbrev>();
3025 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3026 unsigned UmbrellaAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3028 Abbrev = std::make_shared<BitCodeAbbrev>();
3030 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3031 unsigned HeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3033 Abbrev = std::make_shared<BitCodeAbbrev>();
3035 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3036 unsigned TopHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3038 Abbrev = std::make_shared<BitCodeAbbrev>();
3040 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3041 unsigned UmbrellaDirAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3043 Abbrev = std::make_shared<BitCodeAbbrev>();
3045 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3046 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3047 unsigned RequiresAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3049 Abbrev = std::make_shared<BitCodeAbbrev>();
3051 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3052 unsigned ExcludedHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3054 Abbrev = std::make_shared<BitCodeAbbrev>();
3056 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3057 unsigned TextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3059 Abbrev = std::make_shared<BitCodeAbbrev>();
3061 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3062 unsigned PrivateHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3064 Abbrev = std::make_shared<BitCodeAbbrev>();
3066 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3067 unsigned PrivateTextualHeaderAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3069 Abbrev = std::make_shared<BitCodeAbbrev>();
3071 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
3072 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3073 unsigned LinkLibraryAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3075 Abbrev = std::make_shared<BitCodeAbbrev>();
3077 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3078 unsigned ConfigMacroAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3080 Abbrev = std::make_shared<BitCodeAbbrev>();
3082 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
3083 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3084 unsigned ConflictAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3086 Abbrev = std::make_shared<BitCodeAbbrev>();
3088 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3089 unsigned ExportAsAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3092 RecordData::value_type
Record[] = {
3098 std::queue<Module *> Q;
3099 Q.push(WritingModule);
3100 while (!Q.empty()) {
3103 unsigned ID = getSubmoduleID(Mod);
3107 assert(SubmoduleIDs[Mod->
Parent] &&
"Submodule parent not written?");
3108 ParentID = SubmoduleIDs[Mod->
Parent];
3112 getRawSourceLocationEncoding(getAdjustedLocation(Mod->
DefinitionLoc));
3115 FileID UnadjustedInferredFID;
3118 int InferredFID = getAdjustedFileID(UnadjustedInferredFID).getOpaqueValue();
3125 (RecordData::value_type)Mod->
Kind,
3127 (RecordData::value_type)InferredFID,
3138 Stream.EmitRecordWithBlob(DefinitionAbbrev,
Record, Mod->
Name);
3144 Stream.EmitRecordWithBlob(RequiresAbbrev,
Record,
R.FeatureName);
3148 if (std::optional<Module::Header> UmbrellaHeader =
3151 Stream.EmitRecordWithBlob(UmbrellaAbbrev,
Record,
3152 UmbrellaHeader->NameAsWritten);
3153 }
else if (std::optional<Module::DirectoryName> UmbrellaDir =
3156 Stream.EmitRecordWithBlob(UmbrellaDirAbbrev,
Record,
3157 UmbrellaDir->NameAsWritten);
3162 unsigned RecordKind;
3164 Module::HeaderKind HeaderKind;
3170 Module::HK_PrivateTextual},
3173 for (
const auto &HL : HeaderLists) {
3174 RecordData::value_type
Record[] = {HL.RecordKind};
3175 for (
const auto &H : Mod->
getHeaders(HL.HeaderKind))
3176 Stream.EmitRecordWithBlob(HL.Abbrev,
Record, H.NameAsWritten);
3183 SmallString<128> HeaderName(H.getName());
3184 PreparePathForOutput(HeaderName);
3185 Stream.EmitRecordWithBlob(TopHeaderAbbrev,
Record, HeaderName);
3193 Record.push_back(getSubmoduleID(I));
3201 Record.push_back(getSubmoduleID(I));
3208 for (
const auto &E : Mod->
Exports) {
3211 Record.push_back(getSubmoduleID(E.getPointer()));
3212 Record.push_back(E.getInt());
3227 Stream.EmitRecordWithBlob(LinkLibraryAbbrev,
Record, LL.Library);
3235 getSubmoduleID(
C.Other)};
3236 Stream.EmitRecordWithBlob(ConflictAbbrev,
Record,
C.Message);
3242 Stream.EmitRecordWithBlob(ConfigMacroAbbrev,
Record, CM);
3247 if (Context && !GeneratingReducedBMI) {
3250 if (wasDeclEmitted(D))
3251 AddDeclRef(D,
Inits);
3269 assert((NextSubmoduleID - FirstSubmoduleID ==
3271 "Wrong # of submodules; found a reference to a non-local, "
3272 "non-imported submodule?");
3275void ASTWriter::WritePragmaDiagnosticMappings(
const DiagnosticsEngine &
Diag,
3277 llvm::SmallDenseMap<const DiagnosticsEngine::DiagState *, unsigned, 64>
3279 unsigned CurrID = 0;
3282 auto EncodeDiagStateFlags =
3283 [](
const DiagnosticsEngine::DiagState *DS) ->
unsigned {
3284 unsigned Result = (unsigned)DS->ExtBehavior;
3286 {(unsigned)DS->IgnoreAllWarnings, (
unsigned)DS->EnableAllWarnings,
3287 (unsigned)DS->WarningsAsErrors, (
unsigned)DS->ErrorsAsFatal,
3288 (unsigned)DS->SuppressSystemWarnings})
3293 unsigned Flags = EncodeDiagStateFlags(
Diag.DiagStatesByLoc.FirstDiagState);
3296 auto AddDiagState = [&](
const DiagnosticsEngine::DiagState *State,
3297 bool IncludeNonPragmaStates) {
3300 assert(Flags == EncodeDiagStateFlags(State) &&
3301 "diag state flags vary in single AST file");
3305 assert(!IncludeNonPragmaStates ||
3306 State ==
Diag.DiagStatesByLoc.FirstDiagState);
3308 unsigned &DiagStateID = DiagStateIDMap[State];
3309 Record.push_back(DiagStateID);
3311 if (DiagStateID == 0) {
3312 DiagStateID = ++CurrID;
3313 SmallVector<std::pair<unsigned, DiagnosticMapping>> Mappings;
3316 auto SizeIdx =
Record.size();
3318 for (
const auto &I : *State) {
3320 if (!I.second.isPragma() && !IncludeNonPragmaStates)
3324 if (!I.second.isPragma() &&
3325 I.second ==
Diag.getDiagnosticIDs()->getDefaultMapping(I.first))
3327 Mappings.push_back(I);
3331 llvm::sort(Mappings, llvm::less_first());
3333 for (
const auto &I : Mappings) {
3334 Record.push_back(I.first);
3335 Record.push_back(I.second.serialize());
3342 AddDiagState(
Diag.DiagStatesByLoc.FirstDiagState, isModule);
3345 auto NumLocationsIdx =
Record.size();
3349 unsigned NumLocations = 0;
3350 for (
auto &FileIDAndFile :
Diag.DiagStatesByLoc.Files) {
3351 if (!FileIDAndFile.first.isValid() ||
3352 !FileIDAndFile.second.HasLocalTransitions)
3356 AddFileID(FileIDAndFile.first,
Record);
3358 Record.push_back(FileIDAndFile.second.StateTransitions.size());
3359 for (
auto &StatePoint : FileIDAndFile.second.StateTransitions) {
3360 Record.push_back(StatePoint.Offset);
3361 AddDiagState(StatePoint.State,
false);
3366 Record[NumLocationsIdx] = NumLocations;
3374 AddSourceLocation(
Diag.DiagStatesByLoc.CurDiagStateLoc,
Record);
3375 AddDiagState(
Diag.DiagStatesByLoc.CurDiagState,
false);
3380 Record.push_back(
Diag.DiagStateOnPushStack.size());
3381 for (
const auto *State :
Diag.DiagStateOnPushStack)
3382 AddDiagState(State,
false);
3392void ASTWriter::WriteType(ASTContext &Context, QualType T) {
3393 TypeIdx &IdxRef = TypeIdxs[T];
3395 IdxRef = TypeIdx(0, NextTypeID++);
3396 TypeIdx Idx = IdxRef;
3399 assert(Idx.
getValue() >= FirstTypeID &&
"Writing predefined type");
3403 ASTTypeWriter(Context, *
this).write(T) - DeclTypesBlockStartOffset;
3407 if (TypeOffsets.size() == Index)
3408 TypeOffsets.emplace_back(Offset);
3409 else if (TypeOffsets.size() < Index) {
3410 TypeOffsets.resize(Index + 1);
3411 TypeOffsets[Index].set(Offset);
3413 llvm_unreachable(
"Types emitted in wrong order");
3422 auto *ND = dyn_cast<NamedDecl>(D);
3437uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context,
3438 const DeclContext *DC) {
3446 uint64_t Offset = Stream.GetCurrentBitNo();
3447 SmallVector<DeclID, 128> KindDeclPairs;
3448 for (
const auto *D : DC->
decls()) {
3449 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(D))
3457 if (GeneratingReducedBMI && !D->isFromExplicitGlobalModule() &&
3461 KindDeclPairs.push_back(D->getKind());
3462 KindDeclPairs.push_back(GetDeclRef(D).getRawValue());
3465 ++NumLexicalDeclContexts;
3467 Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev,
Record,
3468 bytes(KindDeclPairs));
3472void ASTWriter::WriteTypeDeclOffsets() {
3473 using namespace llvm;
3476 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3478 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3479 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3480 unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3483 Stream.EmitRecordWithBlob(TypeOffsetAbbrev,
Record,
bytes(TypeOffsets));
3487 Abbrev = std::make_shared<BitCodeAbbrev>();
3489 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3490 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3491 unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3494 Stream.EmitRecordWithBlob(DeclOffsetAbbrev,
Record,
bytes(DeclOffsets));
3498void ASTWriter::WriteFileDeclIDsMap() {
3499 using namespace llvm;
3501 SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs;
3502 SortedFileDeclIDs.reserve(FileDeclIDs.size());
3503 for (
const auto &P : FileDeclIDs)
3504 SortedFileDeclIDs.push_back(std::make_pair(P.first, P.second.get()));
3505 llvm::sort(SortedFileDeclIDs, llvm::less_first());
3508 SmallVector<DeclID, 256> FileGroupedDeclIDs;
3509 for (
auto &FileDeclEntry : SortedFileDeclIDs) {
3510 DeclIDInFileInfo &Info = *FileDeclEntry.second;
3511 Info.FirstDeclIndex = FileGroupedDeclIDs.size();
3512 llvm::stable_sort(Info.DeclIDs);
3513 for (
auto &LocDeclEntry : Info.DeclIDs)
3514 FileGroupedDeclIDs.push_back(LocDeclEntry.second.getRawValue());
3517 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3519 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3520 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3521 unsigned AbbrevCode = Stream.EmitAbbrev(std::move(Abbrev));
3523 FileGroupedDeclIDs.size()};
3524 Stream.EmitRecordWithBlob(AbbrevCode,
Record,
bytes(FileGroupedDeclIDs));
3527void ASTWriter::WriteComments(ASTContext &Context) {
3529 llvm::scope_exit _([
this] { Stream.ExitBlock(); });
3534 for (
const auto &FO : Context.
Comments.OrderedComments) {
3535 for (
const auto &OC : FO.second) {
3536 const RawComment *I = OC.second;
3554class ASTMethodPoolTrait {
3558 using key_type = Selector;
3559 using key_type_ref = key_type;
3563 ObjCMethodList Instance, Factory;
3565 using data_type_ref =
const data_type &;
3567 using hash_value_type = unsigned;
3568 using offset_type = unsigned;
3570 explicit ASTMethodPoolTrait(ASTWriter &Writer) : Writer(Writer) {}
3572 static hash_value_type
ComputeHash(Selector Sel) {
3576 std::pair<unsigned, unsigned>
3577 EmitKeyDataLength(raw_ostream& Out, Selector Sel,
3578 data_type_ref Methods) {
3582 unsigned DataLen = 4 + 2 + 2;
3583 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3585 if (ShouldWriteMethodListNode(
Method))
3586 DataLen +=
sizeof(
DeclID);
3587 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3589 if (ShouldWriteMethodListNode(
Method))
3590 DataLen +=
sizeof(
DeclID);
3594 void EmitKey(raw_ostream& Out, Selector Sel,
unsigned) {
3595 using namespace llvm::support;
3597 endian::Writer
LE(Out, llvm::endianness::little);
3599 assert((Start >> 32) == 0 &&
"Selector key offset too large");
3602 LE.write<uint16_t>(N);
3605 for (
unsigned I = 0; I != N; ++I)
3610 void EmitData(raw_ostream& Out, key_type_ref,
3611 data_type_ref Methods,
unsigned DataLen) {
3612 using namespace llvm::support;
3614 endian::Writer
LE(Out, llvm::endianness::little);
3617 unsigned NumInstanceMethods = 0;
3618 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3620 if (ShouldWriteMethodListNode(
Method))
3621 ++NumInstanceMethods;
3623 unsigned NumFactoryMethods = 0;
3624 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3626 if (ShouldWriteMethodListNode(
Method))
3627 ++NumFactoryMethods;
3629 unsigned InstanceBits = Methods.Instance.getBits();
3630 assert(InstanceBits < 4);
3631 unsigned InstanceHasMoreThanOneDeclBit =
3632 Methods.Instance.hasMoreThanOneDecl();
3633 unsigned FullInstanceBits = (NumInstanceMethods << 3) |
3634 (InstanceHasMoreThanOneDeclBit << 2) |
3636 unsigned FactoryBits = Methods.Factory.getBits();
3637 assert(FactoryBits < 4);
3638 unsigned FactoryHasMoreThanOneDeclBit =
3639 Methods.Factory.hasMoreThanOneDecl();
3640 unsigned FullFactoryBits = (NumFactoryMethods << 3) |
3641 (FactoryHasMoreThanOneDeclBit << 2) |
3643 LE.write<uint16_t>(FullInstanceBits);
3644 LE.write<uint16_t>(FullFactoryBits);
3645 for (
const ObjCMethodList *
Method = &Methods.Instance;
Method;
3647 if (ShouldWriteMethodListNode(
Method))
3649 for (
const ObjCMethodList *
Method = &Methods.Factory;
Method;
3651 if (ShouldWriteMethodListNode(
Method))
3654 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
3658 static bool ShouldWriteMethodListNode(
const ObjCMethodList *Node) {
3670void ASTWriter::WriteSelectors(Sema &SemaRef) {
3671 using namespace llvm;
3676 unsigned NumTableEntries = 0;
3679 llvm::OnDiskChainedHashTableGenerator<ASTMethodPoolTrait>
Generator;
3680 ASTMethodPoolTrait Trait(*
this);
3684 SelectorOffsets.resize(NextSelectorID - FirstSelectorID);
3685 for (
auto &SelectorAndID : SelectorIDs) {
3686 Selector S = SelectorAndID.first;
3688 SemaObjC::GlobalMethodPool::iterator F =
3690 ASTMethodPoolTrait::data_type
Data = {
3696 Data.Instance = F->second.first;
3697 Data.Factory = F->second.second;
3701 if (Chain && ID < FirstSelectorID) {
3703 bool changed =
false;
3704 for (ObjCMethodList *M = &
Data.Instance; M && M->getMethod();
3706 if (!M->getMethod()->isFromASTFile()) {
3712 for (ObjCMethodList *M = &
Data.Factory; M && M->getMethod();
3714 if (!M->getMethod()->isFromASTFile()) {
3722 }
else if (
Data.Instance.getMethod() ||
Data.Factory.getMethod()) {
3730 SmallString<4096> MethodPool;
3733 using namespace llvm::support;
3735 ASTMethodPoolTrait Trait(*
this);
3736 llvm::raw_svector_ostream
Out(MethodPool);
3738 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
3739 BucketOffset =
Generator.Emit(Out, Trait);
3743 auto Abbrev = std::make_shared<BitCodeAbbrev>();
3745 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3746 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3747 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3748 unsigned MethodPoolAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3754 Stream.EmitRecordWithBlob(MethodPoolAbbrev,
Record, MethodPool);
3758 Abbrev = std::make_shared<BitCodeAbbrev>();
3760 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3761 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
3762 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
3763 unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
3767 RecordData::value_type
Record[] = {
3770 Stream.EmitRecordWithBlob(SelectorOffsetAbbrev,
Record,
3771 bytes(SelectorOffsets));
3777void ASTWriter::WriteReferencedSelectorsPool(Sema &SemaRef) {
3778 using namespace llvm;
3790 Selector Sel = SelectorAndLocation.first;
3791 SourceLocation Loc = SelectorAndLocation.second;
3792 Writer.AddSelectorRef(Sel);
3814 for (; Redecl; Redecl = Redecl->getPreviousDecl()) {
3816 if (!Redecl->isFromASTFile()) {
3820 if (!Redecl->getDeclContext()->getRedeclContext()->Equals(
3828 if (Redecl->getOwningModuleID() == 0)
3833 if (!
First->isFromASTFile())
3844bool IsInterestingIdentifier(
const IdentifierInfo *II, uint64_t MacroOffset,
3845 bool IsModule,
bool IsCPlusPlus) {
3846 bool NeedDecls = !IsModule || !IsCPlusPlus;
3848 bool IsInteresting =
3855 II->
isPoisoned() || (!IsModule && IsInteresting) ||
3863bool IsInterestingNonMacroIdentifier(
const IdentifierInfo *II,
3864 ASTWriter &Writer) {
3866 bool IsCPlusPlus = Writer.
getLangOpts().CPlusPlus;
3867 return IsInterestingIdentifier(II, 0, IsModule, IsCPlusPlus);
3870class ASTIdentifierTableTrait {
3873 IdentifierResolver *IdResolver;
3883 return IsInterestingIdentifier(II, MacroOffset, IsModule,
3888 using key_type =
const IdentifierInfo *;
3889 using key_type_ref = key_type;
3892 using data_type_ref = data_type;
3894 using hash_value_type = unsigned;
3895 using offset_type = unsigned;
3897 ASTIdentifierTableTrait(ASTWriter &Writer, Preprocessor &PP,
3898 IdentifierResolver *IdResolver,
bool IsModule,
3900 : Writer(Writer), PP(PP), IdResolver(IdResolver), IsModule(IsModule),
3901 NeedDecls(!IsModule || !Writer.getLangOpts().
CPlusPlus),
3902 InterestingIdentifierOffsets(InterestingIdentifierOffsets) {}
3904 bool needDecls()
const {
return NeedDecls; }
3906 static hash_value_type
ComputeHash(
const IdentifierInfo* II) {
3907 return llvm::djbHash(II->
getName());
3915 std::pair<unsigned, unsigned>
3916 EmitKeyDataLength(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID) {
3925 if (InterestingIdentifierOffsets &&
3927 InterestingIdentifierOffsets->push_back(
Out.tell());
3938 if (NeedDecls && IdResolver)
3939 DataLen += std::distance(IdResolver->
begin(II), IdResolver->
end()) *
3945 void EmitKey(raw_ostream &Out,
const IdentifierInfo *II,
unsigned KeyLen) {
3949 void EmitData(raw_ostream &Out,
const IdentifierInfo *II,
IdentifierID ID,
3951 using namespace llvm::support;
3953 endian::Writer
LE(Out, llvm::endianness::little);
3963 assert((Bits & 0xffff) == Bits &&
"ObjCOrBuiltinID too big for ASTReader.");
3964 LE.write<uint16_t>(Bits);
3966 bool HasMacroDefinition =
3969 Bits = (Bits << 1) |
unsigned(HasMacroDefinition);
3971 Bits = (Bits << 1) |
unsigned(II->
isPoisoned());
3974 LE.write<uint16_t>(Bits);
3976 if (HasMacroDefinition)
3979 if (NeedDecls && IdResolver) {
3986 SmallVector<NamedDecl *, 16> Decls(IdResolver->
decls(II));
3987 for (NamedDecl *D : llvm::reverse(Decls))
4005void ASTWriter::WriteIdentifierTable(Preprocessor &PP,
4006 IdentifierResolver *IdResolver,
4008 using namespace llvm;
4010 RecordData InterestingIdents;
4015 llvm::OnDiskChainedHashTableGenerator<ASTIdentifierTableTrait>
Generator;
4016 ASTIdentifierTableTrait Trait(*
this, PP, IdResolver, IsModule,
4017 IsModule ? &InterestingIdents :
nullptr);
4021 IdentifierOffsets.resize(NextIdentID - FirstIdentID);
4022 for (
auto IdentIDPair : IdentifierIDs) {
4023 const IdentifierInfo *II = IdentIDPair.first;
4025 assert(II &&
"NULL identifier in identifier table");
4030 (Trait.needDecls() &&
4036 SmallString<4096> IdentifierTable;
4039 using namespace llvm::support;
4041 llvm::raw_svector_ostream
Out(IdentifierTable);
4043 endian::write<uint32_t>(Out, 0, llvm::endianness::little);
4044 BucketOffset =
Generator.Emit(Out, Trait);
4048 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4050 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4051 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4052 unsigned IDTableAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4056 Stream.EmitRecordWithBlob(IDTableAbbrev,
Record, IdentifierTable);
4060 auto Abbrev = std::make_shared<BitCodeAbbrev>();
4062 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4063 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
4064 unsigned IdentifierOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
4067 for (
unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)
4068 assert(IdentifierOffsets[I] &&
"Missing identifier offset?");
4072 IdentifierOffsets.size()};
4073 Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev,
Record,
4074 bytes(IdentifierOffsets));
4078 if (!InterestingIdents.empty())
4086 PendingEmittingVTables.push_back(RD);
4090 TouchedModuleFiles.insert(MF);
4099class ASTDeclContextNameLookupTraitBase {
4107 using data_type = std::pair<unsigned, unsigned>;
4108 using data_type_ref =
const data_type &;
4113 explicit ASTDeclContextNameLookupTraitBase(
ASTWriter &Writer)
4116 data_type getData(
const DeclIDsTy &LocalIDs) {
4117 unsigned Start = DeclIDs.size();
4118 for (
auto ID : LocalIDs)
4119 DeclIDs.push_back(ID);
4120 return std::make_pair(Start, DeclIDs.size());
4123 data_type ImportData(
const reader::ASTDeclContextNameLookupTrait::data_type &FromReader) {
4124 unsigned Start = DeclIDs.size();
4127 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.begin()),
4128 DeclIDIterator<GlobalDeclID, LocalDeclID>(FromReader.end()));
4129 return std::make_pair(Start, DeclIDs.size());
4132 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4134 "have reference to loaded module file but no chain?");
4136 using namespace llvm::support;
4139 llvm::endianness::little);
4142 std::pair<unsigned, unsigned> EmitKeyDataLengthBase(raw_ostream &Out,
4143 DeclarationNameKey Name,
4144 data_type_ref Lookup) {
4145 unsigned KeyLen = 1;
4168 unsigned DataLen =
sizeof(
DeclID) * (Lookup.second - Lookup.first);
4170 return {KeyLen, DataLen};
4173 void EmitKeyBase(raw_ostream &Out, DeclarationNameKey Name) {
4174 using namespace llvm::support;
4176 endian::Writer
LE(Out, llvm::endianness::little);
4191 "Invalid operator?");
4201 llvm_unreachable(
"Invalid name kind?");
4204 void EmitDataBase(raw_ostream &Out, data_type Lookup,
unsigned DataLen) {
4205 using namespace llvm::support;
4207 endian::Writer
LE(Out, llvm::endianness::little);
4209 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I)
4211 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4215class ModuleLevelNameLookupTrait :
public ASTDeclContextNameLookupTraitBase {
4217 using primary_module_hash_type = unsigned;
4219 using key_type = std::pair<DeclarationNameKey, primary_module_hash_type>;
4220 using key_type_ref = key_type;
4222 explicit ModuleLevelNameLookupTrait(ASTWriter &Writer)
4223 : ASTDeclContextNameLookupTraitBase(Writer) {}
4225 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4228 llvm::FoldingSetNodeID
ID;
4229 ID.AddInteger(Key.first.getHash());
4230 ID.AddInteger(Key.second);
4231 return ID.computeStableHash();
4234 std::pair<unsigned, unsigned>
4235 EmitKeyDataLength(raw_ostream &Out, key_type Key, data_type_ref Lookup) {
4236 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Key.first, Lookup);
4237 KeyLen +=
sizeof(Key.second);
4241 void EmitKey(raw_ostream &Out, key_type Key,
unsigned) {
4242 EmitKeyBase(Out, Key.first);
4243 llvm::support::endian::Writer
LE(Out, llvm::endianness::little);
4244 LE.write<primary_module_hash_type>(Key.second);
4247 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4249 EmitDataBase(Out, Lookup, DataLen);
4253class ASTDeclContextNameTrivialLookupTrait
4254 :
public ASTDeclContextNameLookupTraitBase {
4256 using key_type = DeclarationNameKey;
4257 using key_type_ref = key_type;
4260 using ASTDeclContextNameLookupTraitBase::ASTDeclContextNameLookupTraitBase;
4262 using ASTDeclContextNameLookupTraitBase::getData;
4264 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4266 hash_value_type
ComputeHash(key_type Name) {
return Name.getHash(); }
4268 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4269 DeclarationNameKey Name,
4270 data_type_ref Lookup) {
4271 auto [KeyLen, DataLen] = EmitKeyDataLengthBase(Out, Name, Lookup);
4275 void EmitKey(raw_ostream &Out, DeclarationNameKey Name,
unsigned) {
4276 return EmitKeyBase(Out, Name);
4279 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4281 EmitDataBase(Out, Lookup, DataLen);
4285static bool isModuleLocalDecl(NamedDecl *D) {
4290 return isModuleLocalDecl(Parent);
4294 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
4295 if (
auto *CDGD = dyn_cast<CXXDeductionGuideDecl>(FTD->getTemplatedDecl()))
4296 return isModuleLocalDecl(CDGD->getDeducedTemplate());
4312static bool isTULocalInNamedModules(NamedDecl *D) {
4335class ASTDeclContextNameLookupTrait
4336 :
public ASTDeclContextNameTrivialLookupTrait {
4338 using TULocalDeclsMapTy = llvm::DenseMap<key_type, DeclIDsTy>;
4340 using ModuleLevelDeclsMapTy =
4341 llvm::DenseMap<ModuleLevelNameLookupTrait::key_type, DeclIDsTy>;
4344 enum class LookupVisibility {
4354 LookupVisibility getLookupVisibility(NamedDecl *D)
const {
4357 return LookupVisibility::GenerallyVisibile;
4359 if (isModuleLocalDecl(D))
4360 return LookupVisibility::ModuleLocalVisible;
4361 if (isTULocalInNamedModules(D))
4362 return LookupVisibility::TULocal;
4374 if (
auto *ECD = dyn_cast<EnumConstantDecl>(D);
4375 ECD && DC.
isFileContext() && ECD->getTopLevelOwningNamedModule()) {
4380 return Found->isInvisibleOutsideTheOwningModule();
4382 return ECD->isFromExplicitGlobalModule() ||
4383 ECD->isInAnonymousNamespace()
4384 ? LookupVisibility::TULocal
4385 : LookupVisibility::ModuleLocalVisible;
4388 return LookupVisibility::GenerallyVisibile;
4392 ModuleLevelDeclsMapTy ModuleLocalDeclsMap;
4393 TULocalDeclsMapTy TULocalDeclsMap;
4396 using ASTDeclContextNameTrivialLookupTrait::
4397 ASTDeclContextNameTrivialLookupTrait;
4399 ASTDeclContextNameLookupTrait(ASTWriter &Writer, DeclContext &DC)
4400 : ASTDeclContextNameTrivialLookupTrait(Writer), DC(DC) {}
4402 template <
typename Coll> data_type getData(
const Coll &Decls) {
4403 unsigned Start = DeclIDs.size();
4404 auto AddDecl = [
this](NamedDecl *D) {
4405 NamedDecl *DeclForLocalLookup =
4421 switch (getLookupVisibility(DeclForLocalLookup)) {
4422 case LookupVisibility::ModuleLocalVisible:
4425 auto Key = std::make_pair(D->
getDeclName(), *PrimaryModuleHash);
4426 auto Iter = ModuleLocalDeclsMap.find(Key);
4427 if (Iter == ModuleLocalDeclsMap.end())
4428 ModuleLocalDeclsMap.insert({Key, DeclIDsTy{
ID}});
4430 Iter->second.push_back(ID);
4434 case LookupVisibility::TULocal: {
4435 auto Iter = TULocalDeclsMap.find(D->
getDeclName());
4436 if (Iter == TULocalDeclsMap.end())
4439 Iter->second.push_back(ID);
4442 case LookupVisibility::GenerallyVisibile:
4447 DeclIDs.push_back(ID);
4449 ASTReader *Chain = Writer.
getChain();
4450 for (NamedDecl *D : Decls) {
4461 for (
const auto &[_,
First] : Firsts)
4467 return std::make_pair(Start, DeclIDs.size());
4470 const ModuleLevelDeclsMapTy &getModuleLocalDecls() {
4471 return ModuleLocalDeclsMap;
4474 const TULocalDeclsMapTy &getTULocalDecls() {
return TULocalDeclsMap; }
4480class LazySpecializationInfoLookupTrait {
4482 llvm::SmallVector<serialization::reader::LazySpecializationInfo, 64> Specs;
4485 using key_type = unsigned;
4486 using key_type_ref = key_type;
4489 using data_type = std::pair<unsigned, unsigned>;
4490 using data_type_ref =
const data_type &;
4492 using hash_value_type = unsigned;
4493 using offset_type = unsigned;
4495 explicit LazySpecializationInfoLookupTrait(ASTWriter &Writer)
4498 template <
typename Col,
typename Col2>
4499 data_type getData(Col &&
C, Col2 &ExistingInfo) {
4500 unsigned Start = Specs.size();
4503 const_cast<NamedDecl *
>(D));
4508 Specs.push_back(Info);
4509 return std::make_pair(Start, Specs.size());
4512 data_type ImportData(
4514 unsigned Start = Specs.size();
4515 for (
auto ID : FromReader)
4516 Specs.push_back(ID);
4517 return std::make_pair(Start, Specs.size());
4520 static bool EqualKey(key_type_ref a, key_type_ref
b) {
return a ==
b; }
4522 hash_value_type
ComputeHash(key_type Name) {
return Name; }
4524 void EmitFileRef(raw_ostream &Out, ModuleFile *F)
const {
4526 "have reference to loaded module file but no chain?");
4528 using namespace llvm::support;
4531 llvm::endianness::little);
4534 std::pair<unsigned, unsigned> EmitKeyDataLength(raw_ostream &Out,
4536 data_type_ref Lookup) {
4538 unsigned KeyLen = 4;
4540 (Lookup.second - Lookup.first);
4545 void EmitKey(raw_ostream &Out, key_type HashValue,
unsigned) {
4546 using namespace llvm::support;
4548 endian::Writer
LE(Out, llvm::endianness::little);
4552 void EmitData(raw_ostream &Out, key_type_ref, data_type Lookup,
4554 using namespace llvm::support;
4556 endian::Writer
LE(Out, llvm::endianness::little);
4559 for (
unsigned I = Lookup.first, N = Lookup.second; I != N; ++I) {
4560 LE.write<
DeclID>(Specs[I].getRawValue());
4562 assert(
Out.tell() - Start == DataLen &&
"Data length is wrong");
4566unsigned CalculateODRHashForSpecs(
const Decl *Spec) {
4567 ArrayRef<TemplateArgument> Args;
4568 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Spec))
4569 Args = CTSD->getTemplateArgs().asArray();
4570 else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Spec))
4571 Args = VTSD->getTemplateArgs().asArray();
4572 else if (
auto *FD = dyn_cast<FunctionDecl>(Spec))
4573 Args = FD->getTemplateSpecializationArgs()->asArray();
4575 llvm_unreachable(
"New Specialization Kind?");
4581void ASTWriter::GenerateSpecializationInfoLookupTable(
4582 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4583 llvm::SmallVectorImpl<char> &LookupTable,
bool IsPartial) {
4587 MultiOnDiskHashTableGenerator<reader::LazySpecializationInfoLookupTrait,
4588 LazySpecializationInfoLookupTrait>
4590 LazySpecializationInfoLookupTrait Trait(*
this);
4592 llvm::MapVector<unsigned, llvm::SmallVector<const NamedDecl *, 4>>
4598 auto Iter = SpecializationMaps.find(HashedValue);
4599 if (Iter == SpecializationMaps.end())
4600 Iter = SpecializationMaps
4601 .try_emplace(HashedValue,
4602 llvm::SmallVector<const NamedDecl *, 4>())
4612 for (
auto &[HashValue, Specs] : SpecializationMaps) {
4613 SmallVector<serialization::reader::LazySpecializationInfo, 16>
4623 ExisitingSpecs = Lookups->Table.find(HashValue);
4625 Generator.insert(HashValue, Trait.getData(Specs, ExisitingSpecs), Trait);
4635 auto *ToEmitMaybeMergedLookupTable =
4636 (!isGeneratingReducedBMI() && Lookups) ? &Lookups->
Table :
nullptr;
4637 Generator.emit(LookupTable, Trait, ToEmitMaybeMergedLookupTable);
4640uint64_t ASTWriter::WriteSpecializationInfoLookupTable(
4641 const NamedDecl *D, llvm::SmallVectorImpl<const Decl *> &Specializations,
4644 llvm::SmallString<4096> LookupTable;
4645 GenerateSpecializationInfoLookupTable(D, Specializations, LookupTable,
4648 uint64_t Offset = Stream.GetCurrentBitNo();
4649 RecordData::value_type
Record[] = {
static_cast<RecordData::value_type
>(
4651 Stream.EmitRecordWithBlob(IsPartial ? DeclPartialSpecializationsAbbrev
4652 : DeclSpecializationsAbbrev,
4664 for (
auto *D : Result.getLookupResult()) {
4666 if (LocalD->isFromASTFile())
4684void ASTWriter::GenerateNameLookupTable(
4685 ASTContext &Context,
const DeclContext *ConstDC,
4686 llvm::SmallVectorImpl<char> &LookupTable,
4687 llvm::SmallVectorImpl<char> &ModuleLocalLookupTable,
4688 llvm::SmallVectorImpl<char> &TULookupTable) {
4689 assert(!ConstDC->hasLazyLocalLexicalLookups() &&
4690 !ConstDC->hasLazyExternalLexicalLookups() &&
4691 "must call buildLookups first");
4694 auto *DC =
const_cast<DeclContext*
>(ConstDC);
4698 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4699 ASTDeclContextNameLookupTrait>
4701 ASTDeclContextNameLookupTrait Trait(*
this, *DC);
4706 SmallVector<DeclarationName, 16> Names;
4710 bool IncludeConstructorNames =
false;
4711 bool IncludeConversionNames =
false;
4738 if (
Result.getLookupResult().empty())
4741 switch (Name.getNameKind()) {
4743 Names.push_back(Name);
4747 IncludeConstructorNames =
true;
4751 IncludeConversionNames =
true;
4759 if (IncludeConstructorNames || IncludeConversionNames) {
4764 llvm::SmallPtrSet<DeclarationName, 8> AddedNames;
4766 if (
auto *ChildND = dyn_cast<NamedDecl>(ChildD)) {
4767 auto Name = ChildND->getDeclName();
4768 switch (Name.getNameKind()) {
4773 if (!IncludeConstructorNames)
4778 if (!IncludeConversionNames)
4782 if (AddedNames.insert(Name).second)
4783 Names.push_back(Name);
4791 for (
auto &Name : Names)
4798 SmallVector<NamedDecl *, 8> ConstructorDecls;
4799 SmallVector<NamedDecl *, 8> ConversionDecls;
4803 for (
auto &Name : Names) {
4806 switch (Name.getNameKind()) {
4824 if (!ConstructorDecls.empty())
4825 Generator.insert(ConstructorDecls.front()->getDeclName(),
4826 Trait.getData(ConstructorDecls), Trait);
4827 if (!ConversionDecls.empty())
4828 Generator.insert(ConversionDecls.front()->getDeclName(),
4829 Trait.getData(ConversionDecls), Trait);
4841 auto *ToEmitMaybeMergedLookupTable =
4842 (!isGeneratingReducedBMI() && Lookups) ? &Lookups->
Table :
nullptr;
4843 Generator.emit(LookupTable, Trait, ToEmitMaybeMergedLookupTable);
4845 const auto &ModuleLocalDecls = Trait.getModuleLocalDecls();
4846 if (!ModuleLocalDecls.empty()) {
4847 MultiOnDiskHashTableGenerator<reader::ModuleLocalNameLookupTrait,
4848 ModuleLevelNameLookupTrait>
4849 ModuleLocalLookupGenerator;
4850 ModuleLevelNameLookupTrait ModuleLocalTrait(*
this);
4852 for (
const auto &ModuleLocalIter : ModuleLocalDecls) {
4853 const auto &Key = ModuleLocalIter.first;
4854 const auto &IDs = ModuleLocalIter.second;
4855 ModuleLocalLookupGenerator.insert(Key, ModuleLocalTrait.getData(IDs),
4861 auto *ModuleLocalLookups =
4862 (isGeneratingReducedBMI() && Chain &&
4866 ModuleLocalLookupGenerator.emit(ModuleLocalLookupTable, ModuleLocalTrait,
4867 ModuleLocalLookups);
4870 const auto &TULocalDecls = Trait.getTULocalDecls();
4871 if (!TULocalDecls.empty() && !isGeneratingReducedBMI()) {
4872 MultiOnDiskHashTableGenerator<reader::ASTDeclContextNameLookupTrait,
4873 ASTDeclContextNameTrivialLookupTrait>
4875 ASTDeclContextNameTrivialLookupTrait TULocalTrait(*
this);
4877 for (
const auto &TULocalIter : TULocalDecls) {
4878 const auto &Key = TULocalIter.first;
4879 const auto &IDs = TULocalIter.second;
4880 TULookupGenerator.insert(Key, TULocalTrait.getData(IDs), TULocalTrait);
4885 auto *TULocalLookups =
4889 TULookupGenerator.emit(TULookupTable, TULocalTrait, TULocalLookups);
4898void ASTWriter::WriteDeclContextVisibleBlock(
4899 ASTContext &Context, DeclContext *DC, VisibleLookupBlockOffsets &Offsets) {
4909 Prev = Prev->getPreviousDecl())
4910 if (!Prev->isFromASTFile())
4920 SmallVector<std::pair<DeclarationName, DeclContext::lookup_result>, 16>
4923 LookupResults.reserve(Map->size());
4924 for (
auto &Entry : *Map)
4925 LookupResults.push_back(
4926 std::make_pair(Entry.first, Entry.second.getLookupResult()));
4929 llvm::sort(LookupResults, llvm::less_first());
4930 for (
auto &NameAndResult : LookupResults) {
4931 DeclarationName Name = NameAndResult.first;
4938 assert(
Result.empty() &&
"Cannot have a constructor or conversion "
4939 "function name in a namespace!");
4943 for (NamedDecl *ND :
Result) {
4947 if (DoneWritingDeclsAndTypes && !wasDeclEmitted(ND))
4981 if (!Map || Map->empty())
4986 SmallString<4096> LookupTable;
4987 SmallString<4096> ModuleLocalLookupTable;
4988 SmallString<4096> TULookupTable;
4989 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
4994 Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev,
Record,
4996 ++NumVisibleDeclContexts;
4998 if (!ModuleLocalLookupTable.empty()) {
5002 RecordData::value_type ModuleLocalRecord[] = {
5004 Stream.EmitRecordWithBlob(DeclModuleLocalVisibleLookupAbbrev,
5005 ModuleLocalRecord, ModuleLocalLookupTable);
5006 ++NumModuleLocalDeclContexts;
5009 if (!TULookupTable.empty()) {
5012 RecordData::value_type TULocalDeclsRecord[] = {
5014 Stream.EmitRecordWithBlob(DeclTULocalLookupAbbrev, TULocalDeclsRecord,
5016 ++NumTULocalDeclContexts;
5026void ASTWriter::WriteDeclContextVisibleUpdate(ASTContext &Context,
5027 const DeclContext *DC) {
5029 if (!Map || Map->empty())
5033 SmallString<4096> LookupTable;
5034 SmallString<4096> ModuleLocalLookupTable;
5035 SmallString<4096> TULookupTable;
5036 GenerateNameLookupTable(Context, DC, LookupTable, ModuleLocalLookupTable,
5047 Stream.EmitRecordWithBlob(UpdateVisibleAbbrev,
Record, LookupTable);
5049 if (!ModuleLocalLookupTable.empty()) {
5051 RecordData::value_type ModuleLocalRecord[] = {
5053 Stream.EmitRecordWithBlob(ModuleLocalUpdateVisibleAbbrev, ModuleLocalRecord,
5054 ModuleLocalLookupTable);
5057 if (!TULookupTable.empty()) {
5058 RecordData::value_type GMFRecord[] = {
5060 Stream.EmitRecordWithBlob(TULocalUpdateVisibleAbbrev, GMFRecord,
5066void ASTWriter::WriteFPPragmaOptions(
const FPOptionsOverride &Opts) {
5072void ASTWriter::WriteOpenCLExtensions(Sema &SemaRef) {
5078 for (
const auto &I:Opts.OptMap) {
5079 AddString(I.getKey(),
Record);
5080 auto V = I.getValue();
5081 Record.push_back(
V.Supported ? 1 : 0);
5082 Record.push_back(
V.Enabled ? 1 : 0);
5083 Record.push_back(
V.WithPragma ? 1 : 0);
5090void ASTWriter::WriteCUDAPragmas(Sema &SemaRef) {
5091 if (SemaRef.
CUDA().ForceHostDeviceDepth > 0) {
5092 RecordData::value_type
Record[] = {SemaRef.
CUDA().ForceHostDeviceDepth};
5097void ASTWriter::WriteObjCCategories() {
5098 if (ObjCClassesWithCategories.empty())
5101 SmallVector<ObjCCategoriesInfo, 2> CategoriesMap;
5102 RecordData Categories;
5104 for (
unsigned I = 0, N = ObjCClassesWithCategories.size(); I != N; ++I) {
5106 unsigned StartIndex = Categories.size();
5108 ObjCInterfaceDecl *
Class = ObjCClassesWithCategories[I];
5111 Categories.push_back(0);
5115 Cat =
Class->known_categories_begin(),
5116 CatEnd =
Class->known_categories_end();
5117 Cat != CatEnd; ++Cat, ++Size) {
5118 assert(getDeclID(*Cat).isValid() &&
"Bogus category");
5119 AddDeclRef(*Cat, Categories);
5123 Categories[StartIndex] =
Size;
5126 ObjCCategoriesInfo CatInfo = { getDeclID(
Class), StartIndex };
5127 CategoriesMap.push_back(CatInfo);
5132 llvm::array_pod_sort(CategoriesMap.begin(), CategoriesMap.end());
5135 using namespace llvm;
5137 auto Abbrev = std::make_shared<BitCodeAbbrev>();
5139 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
5140 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
5141 unsigned AbbrevID = Stream.EmitAbbrev(std::move(Abbrev));
5144 Stream.EmitRecordWithBlob(AbbrevID,
Record,
5145 reinterpret_cast<char *
>(CategoriesMap.data()),
5146 CategoriesMap.size() *
sizeof(ObjCCategoriesInfo));
5152void ASTWriter::WriteLateParsedTemplates(Sema &SemaRef) {
5159 for (
auto &LPTMapEntry : LPTMap) {
5160 const FunctionDecl *FD = LPTMapEntry.first;
5161 LateParsedTemplate &LPT = *LPTMapEntry.second;
5167 for (
const auto &
Tok : LPT.
Toks) {
5175void ASTWriter::WriteOptimizePragmaOptions(Sema &SemaRef) {
5178 AddSourceLocation(PragmaLoc,
Record);
5183void ASTWriter::WriteMSStructPragmaOptions(Sema &SemaRef) {
5191void ASTWriter::WriteMSPointersToMembersPragmaOptions(Sema &SemaRef) {
5199void ASTWriter::WritePackPragmaOptions(Sema &SemaRef) {
5210 AddAlignPackInfo(StackEntry.Value,
Record);
5211 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5212 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5213 AddString(StackEntry.StackSlotLabel,
Record);
5219void ASTWriter::WriteFloatControlPragmaOptions(Sema &SemaRef) {
5229 for (
const auto &StackEntry : SemaRef.
FpPragmaStack.Stack) {
5230 Record.push_back(StackEntry.Value.getAsOpaqueInt());
5231 AddSourceLocation(StackEntry.PragmaLocation,
Record);
5232 AddSourceLocation(StackEntry.PragmaPushLocation,
Record);
5233 AddString(StackEntry.StackSlotLabel,
Record);
5239void ASTWriter::WriteDeclsWithEffectsToVerify(Sema &SemaRef) {
5249void ASTWriter::WriteModuleFileExtension(Sema &SemaRef,
5250 ModuleFileExtensionWriter &Writer) {
5255 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
5257 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5258 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5259 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5260 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
5261 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
5262 unsigned Abbrev = Stream.EmitAbbrev(std::move(Abv));
5268 Record.push_back(Metadata.MajorVersion);
5269 Record.push_back(Metadata.MinorVersion);
5270 Record.push_back(Metadata.BlockName.size());
5271 Record.push_back(Metadata.UserInfo.size());
5272 SmallString<64> Buffer;
5273 Buffer += Metadata.BlockName;
5274 Buffer += Metadata.UserInfo;
5275 Stream.EmitRecordWithBlob(Abbrev,
Record, Buffer);
5284void ASTWriter::WriteRISCVIntrinsicPragmas(Sema &SemaRef) {
5299 auto &Record = *
this;
5305 Writer->isWritingStdCXXHeaderUnit())))
5306 return Record.push_back(0);
5308 Record.push_back(A->
getKind() + 1);
5312 Record.AddSourceRange(A->
getRange());
5316 Record.push_back(A->getAttributeSpellingListIndexRaw());
5319#include "clang/Serialization/AttrPCHWrite.inc"
5325 for (
const auto *A : Attrs)
5336 if (
Tok.isAnnotation()) {
5338 switch (
Tok.getKind()) {
5339 case tok::annot_pragma_loop_hint: {
5343 Record.push_back(Info->Toks.size());
5344 for (
const auto &T : Info->Toks)
5348 case tok::annot_pragma_pack: {
5351 Record.push_back(
static_cast<unsigned>(Info->Action));
5357 case tok::annot_pragma_openmp:
5358 case tok::annot_pragma_openmp_end:
5359 case tok::annot_pragma_unused:
5360 case tok::annot_pragma_openacc:
5361 case tok::annot_pragma_openacc_end:
5362 case tok::annot_repl_input_end:
5365 llvm_unreachable(
"missing serialization code for annotation token");
5376 Record.push_back(Str.size());
5377 llvm::append_range(
Record, Str);
5382 Record.push_back(Str.size());
5383 llvm::append_range(Blob, Str);
5387 assert(WritingAST &&
"can't prepare path for output when not writing AST");
5390 StringRef PathStr(Path.data(), Path.size());
5391 if (PathStr ==
"<built-in>" || PathStr ==
"<command line>")
5395 PP->getFileManager().makeAbsolutePath(Path,
true);
5397 const char *PathBegin = Path.data();
5398 const char *PathPtr =
5400 if (PathPtr != PathBegin) {
5401 Path.erase(Path.begin(), Path.begin() + (PathPtr - PathBegin));
5425 Stream.EmitRecordWithBlob(Abbrev,
Record, FilePath);
5430 Record.push_back(Version.getMajor());
5431 if (std::optional<unsigned> Minor = Version.getMinor())
5432 Record.push_back(*Minor + 1);
5435 if (std::optional<unsigned> Subminor = Version.getSubminor())
5436 Record.push_back(*Subminor + 1);
5454 assert(ID < IdentifierOffsets.size());
5455 IdentifierOffsets[ID] = Offset;
5461 unsigned ID = SelectorIDs[Sel];
5462 assert(ID &&
"Unknown selector");
5465 if (ID < FirstSelectorID)
5467 SelectorOffsets[ID - FirstSelectorID] = Offset;
5473 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
5474 bool IncludeTimestamps,
bool BuildingImplicitModule,
5475 bool GeneratingReducedBMI)
5476 : Stream(Stream), Buffer(Buffer), ModCache(ModCache),
5477 CodeGenOpts(CodeGenOpts), IncludeTimestamps(IncludeTimestamps),
5478 BuildingImplicitModule(BuildingImplicitModule),
5479 GeneratingReducedBMI(GeneratingReducedBMI) {
5480 for (
const auto &Ext : Extensions) {
5481 if (
auto Writer = Ext->createExtensionWriter(*
this))
5482 ModuleFileExtensionWriters.push_back(std::move(Writer));
5489 assert(WritingAST &&
"can't determine lang opts when not writing AST");
5490 return PP->getLangOpts();
5494 return IncludeTimestamps ? ModTime : 0;
5499 StringRef OutputFile,
Module *WritingModule,
5500 StringRef isysroot) {
5501 llvm::TimeTraceScope scope(
"WriteAST", OutputFile);
5504 Sema *SemaPtr = dyn_cast<Sema *>(Subject);
5511 Stream.Emit((
unsigned)
'C', 8);
5512 Stream.Emit((
unsigned)
'P', 8);
5513 Stream.Emit((
unsigned)
'C', 8);
5514 Stream.Emit((
unsigned)
'H', 8);
5516 WriteBlockInfoBlock();
5519 this->WritingModule = WritingModule;
5520 ASTFileSignature Signature = WriteASTCore(SemaPtr, isysroot, WritingModule);
5522 this->WritingModule =
nullptr;
5523 this->BaseDirectory.clear();
5530template<
typename Vector>
5532 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5538template <
typename Vector>
5541 for (
typename Vector::iterator I = Vec.begin(
nullptr,
true), E = Vec.end();
5547void ASTWriter::computeNonAffectingInputFiles() {
5548 SourceManager &SrcMgr = PP->getSourceManager();
5551 IsSLocAffecting.resize(N,
true);
5552 IsSLocFileEntryAffecting.resize(N,
true);
5557 auto AffectingModuleMaps = GetAffectingModuleMaps(*PP, WritingModule);
5559 unsigned FileIDAdjustment = 0;
5560 unsigned OffsetAdjustment = 0;
5562 NonAffectingFileIDAdjustments.reserve(N);
5563 NonAffectingOffsetAdjustments.reserve(N);
5565 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5566 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5568 for (
unsigned I = 1; I != N; ++I) {
5570 FileID FID = FileID::get(I);
5577 if (!
Cache->OrigEntry)
5585 if (!AffectingModuleMaps)
5589 if (AffectingModuleMaps->DefinitionFileIDs.contains(FID))
5592 IsSLocAffecting[I] =
false;
5593 IsSLocFileEntryAffecting[I] =
5594 AffectingModuleMaps->DefinitionFiles.contains(*
Cache->OrigEntry);
5596 FileIDAdjustment += 1;
5602 if (!NonAffectingFileIDs.empty() &&
5603 NonAffectingFileIDs.back().ID == FID.ID - 1) {
5604 NonAffectingFileIDs.back() = FID;
5606 NonAffectingFileIDAdjustments.back() = FileIDAdjustment;
5607 NonAffectingOffsetAdjustments.back() = OffsetAdjustment;
5611 NonAffectingFileIDs.push_back(FID);
5614 NonAffectingFileIDAdjustments.push_back(FileIDAdjustment);
5615 NonAffectingOffsetAdjustments.push_back(OffsetAdjustment);
5618 if (!PP->getHeaderSearchInfo().getHeaderSearchOpts().ModulesIncludeVFSUsage)
5621 FileManager &FileMgr = PP->getFileManager();
5624 for (StringRef Path :
5625 PP->getHeaderSearchInfo().getHeaderSearchOpts().VFSOverlayFiles)
5627 for (
unsigned I = 1; I != N; ++I) {
5628 if (IsSLocAffecting[I]) {
5634 if (!
Cache->OrigEntry)
5637 Cache->OrigEntry->getNameAsRequested());
5643void ASTWriter::prepareLazyUpdates() {
5646 if (!GeneratingReducedBMI)
5649 DeclUpdateMap DeclUpdatesTmp;
5657 for (
auto &DeclUpdate : DeclUpdates) {
5658 const Decl *D = DeclUpdate.first;
5660 for (
auto &
Update : DeclUpdate.second) {
5663 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
5664 DeclUpdatesTmp[D].push_back(
5665 ASTWriter::DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
5667 DeclUpdatesLazy[D].push_back(
Update);
5670 DeclUpdates.swap(DeclUpdatesTmp);
5672 UpdatedDeclContextsLazy.swap(UpdatedDeclContexts);
5674 DeclsToEmitEvenIfUnreferenced.clear();
5677void ASTWriter::PrepareWritingSpecialDecls(
Sema &SemaRef) {
5678 ASTContext &Context = SemaRef.
Context;
5680 bool isModule = WritingModule !=
nullptr;
5682 prepareLazyUpdates();
5689 PredefinedDecls.insert(D);
5697 RegisterPredefDecl(Context.ObjCProtocolClassDecl,
5701 RegisterPredefDecl(Context.ObjCInstanceTypeDecl,
5705 RegisterPredefDecl(Context.BuiltinMSVaListDecl,
5712 RegisterPredefDecl(Context.CFConstantStringTypeDecl,
5714 RegisterPredefDecl(Context.CFConstantStringTagDecl,
5716#define BuiltinTemplate(BTName) \
5717 RegisterPredefDecl(Context.Decl##BTName, PREDEF_DECL##BTName##_ID);
5718#include "clang/Basic/BuiltinTemplates.inc"
5730 if (GeneratingReducedBMI) {
5756 if (GeneratingReducedBMI)
5778 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I)
5789 "There are local ones at end of translation unit!");
5807 for (
const auto &I : SemaRef.KnownNamespaces)
5812 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
5820 for (
const auto &DeleteExprsInfo :
5827 for (
const auto *I : DeclsToEmitEvenIfUnreferenced)
5829 DeclsToEmitEvenIfUnreferenced.clear();
5834 llvm::SmallVector<const IdentifierInfo*, 256> IIs;
5836 const IdentifierInfo *II =
ID.second;
5842 llvm::sort(IIs, llvm::deref<std::less<>>());
5844 for (
const IdentifierInfo *II : IIs)
5855 for (CXXRecordDecl *RD : PendingEmittingVTables)
5858 PendingEmittingVTables.clear();
5861void ASTWriter::WriteSpecialDeclRecords(
Sema &SemaRef) {
5862 ASTContext &Context = SemaRef.
Context;
5864 bool isModule = WritingModule !=
nullptr;
5867 if (!EagerlyDeserializedDecls.empty())
5870 if (!ModularCodegenDecls.empty())
5876 TentativeDefinitions);
5877 if (!TentativeDefinitions.empty())
5884 UnusedFileScopedDecls);
5885 if (!UnusedFileScopedDecls.empty())
5891 if (!ExtVectorDecls.empty())
5897 for (
unsigned I = 0, N = SemaRef.
VTableUses.size(); I != N; ++I) {
5898 CXXRecordDecl *D = SemaRef.
VTableUses[I].first;
5913 if (!UnusedLocalTypedefNameCandidates.empty())
5915 UnusedLocalTypedefNameCandidates);
5917 if (!GeneratingReducedBMI) {
5927 if (!PendingInstantiations.empty())
5931 auto AddEmittedDeclRefOrZero = [
this](
RecordData &Refs,
Decl *D) {
5945 if (!SemaDeclRefs.empty())
5953 if (!DeclsToCheckForDeferredDiags.empty())
5955 DeclsToCheckForDeferredDiags);
5962 CudaCallDecl || CudaGetParamDecl || CudaLaunchDecl) {
5963 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaCallDecl);
5964 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaGetParamDecl);
5965 AddEmittedDeclRefOrZero(CUDASpecialDeclRefs, CudaLaunchDecl);
5973 DelegatingCtorDecls);
5974 if (!DelegatingCtorDecls.empty())
5979 for (
const auto &I : SemaRef.KnownNamespaces) {
5983 if (!KnownNamespaces.empty())
5988 SmallVector<std::pair<NamedDecl *, SourceLocation>, 16>
Undefined;
5997 if (!UndefinedButUsed.empty())
6004 for (
const auto &DeleteExprsInfo :
6009 AddDeclRef(DeleteExprsInfo.first, DeleteExprsToAnalyze);
6010 DeleteExprsToAnalyze.push_back(DeleteExprsInfo.second.size());
6011 for (
const auto &DeleteLoc : DeleteExprsInfo.second) {
6013 DeleteExprsToAnalyze.push_back(DeleteLoc.second);
6017 if (!DeleteExprsToAnalyze.empty())
6021 for (CXXRecordDecl *RD : PendingEmittingVTables) {
6028 if (!VTablesToEmit.empty())
6034 using namespace llvm;
6036 bool isModule = WritingModule !=
nullptr;
6040 Chain->finalizeForWriting();
6044 computeNonAffectingInputFiles();
6046 writeUnhashedControlBlock(*PP);
6059 IdentifierIDs.clear();
6070 SmallVector<const IdentifierInfo *, 128> IIs;
6071 for (
const auto &ID : PP->getIdentifierTable())
6072 if (IsInterestingNonMacroIdentifier(
ID.second, *
this))
6073 IIs.push_back(
ID.second);
6076 llvm::sort(IIs, llvm::deref<std::less<>>());
6077 for (
const IdentifierInfo *II : IIs)
6085 for (
const auto &WeakUndeclaredIdentifierList :
6087 const IdentifierInfo *
const II = WeakUndeclaredIdentifierList.first;
6088 for (
const auto &WI : WeakUndeclaredIdentifierList.second) {
6101 ASTContext &Context = SemaPtr->
Context;
6103 Context, *
this, ExtnameUndeclaredIdentifiers);
6105 ExtnameUndeclaredIdentifiersWriter.AddIdentifierRef(II);
6106 ExtnameUndeclaredIdentifiersWriter.AddIdentifierRef(
6108 ExtnameUndeclaredIdentifiersWriter.AddSourceLocation(AL->getLocation());
6115 ASTContext &Context = SemaPtr->
Context;
6120 AddTypeRef(Context, Context.ObjCIdRedefinitionType, SpecialTypes);
6121 AddTypeRef(Context, Context.ObjCClassRedefinitionType, SpecialTypes);
6122 AddTypeRef(Context, Context.ObjCSelRedefinitionType, SpecialTypes);
6127 PrepareWritingSpecialDecls(*SemaPtr);
6130 WriteControlBlock(*PP, isysroot);
6133 Stream.FlushToWord();
6134 ASTBlockRange.first = Stream.GetCurrentBitNo() >> 3;
6136 ASTBlockStartOffset = Stream.GetCurrentBitNo();
6153 llvm::SmallVector<Selector, 256> AllSelectors;
6154 for (
auto &SelectorAndID : SelectorIDs)
6155 AllSelectors.push_back(SelectorAndID.first);
6156 for (
auto &Selector : AllSelectors)
6180 auto Abbrev = std::make_shared<BitCodeAbbrev>();
6182 Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
6183 unsigned ModuleOffsetMapAbbrev = Stream.EmitAbbrev(std::move(Abbrev));
6184 SmallString<2048> Buffer;
6186 llvm::raw_svector_ostream
Out(Buffer);
6187 for (ModuleFile &M : Chain->ModuleMgr) {
6188 using namespace llvm::support;
6190 endian::Writer
LE(Out, llvm::endianness::little);
6191 LE.write<uint8_t>(
static_cast<uint8_t
>(M.
Kind));
6197 LE.write<uint16_t>(Name.size());
6198 Out.write(Name.data(), Name.size());
6204 auto writeBaseIDOrNone = [&](
auto BaseID,
bool ShouldWrite) {
6205 assert(BaseID < std::numeric_limits<uint32_t>::max() &&
"base id too high");
6219 Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev,
Record,
6220 Buffer.data(), Buffer.size());
6224 WriteDeclAndTypes(SemaPtr->
Context);
6226 WriteFileDeclIDsMap();
6227 WriteSourceManagerBlock(PP->getSourceManager());
6229 WriteComments(SemaPtr->
Context);
6230 WritePreprocessor(*PP, isModule);
6231 WriteHeaderSearch(PP->getHeaderSearchInfo());
6233 WriteSelectors(*SemaPtr);
6234 WriteReferencedSelectorsPool(*SemaPtr);
6235 WriteLateParsedTemplates(*SemaPtr);
6237 WriteIdentifierTable(*PP, SemaPtr ? &SemaPtr->
IdResolver :
nullptr, isModule);
6240 WriteOpenCLExtensions(*SemaPtr);
6241 WriteCUDAPragmas(*SemaPtr);
6242 WriteRISCVIntrinsicPragmas(*SemaPtr);
6247 WriteSubmodules(WritingModule, SemaPtr ? &SemaPtr->
Context :
nullptr);
6252 WriteSpecialDeclRecords(*SemaPtr);
6255 if (!WeakUndeclaredIdentifiers.empty())
6257 WeakUndeclaredIdentifiers);
6261 if (!ExtnameUndeclaredIdentifiers.empty())
6263 ExtnameUndeclaredIdentifiers);
6265 if (!WritingModule) {
6270 ModuleInfo(uint64_t ID,
Module *M) :
ID(
ID), M(M) {}
6272 llvm::SmallVector<ModuleInfo, 64> Imports;
6275 assert(SubmoduleIDs.contains(I->getImportedModule()));
6276 Imports.push_back(ModuleInfo(SubmoduleIDs[I->getImportedModule()],
6277 I->getImportedModule()));
6281 if (!Imports.empty()) {
6282 auto Cmp = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6285 auto Eq = [](
const ModuleInfo &A,
const ModuleInfo &B) {
6286 return A.ID == B.ID;
6290 llvm::sort(Imports,
Cmp);
6291 Imports.erase(llvm::unique(Imports, Eq), Imports.end());
6294 for (
const auto &Import : Imports) {
6295 ImportedModules.push_back(
Import.ID);
6306 WriteObjCCategories();
6308 if (!WritingModule) {
6309 WriteOptimizePragmaOptions(*SemaPtr);
6310 WriteMSStructPragmaOptions(*SemaPtr);
6311 WriteMSPointersToMembersPragmaOptions(*SemaPtr);
6313 WritePackPragmaOptions(*SemaPtr);
6314 WriteFloatControlPragmaOptions(*SemaPtr);
6315 WriteDeclsWithEffectsToVerify(*SemaPtr);
6319 RecordData::value_type
Record[] = {NumStatements,
6321 NumLexicalDeclContexts,
6322 NumVisibleDeclContexts,
6323 NumModuleLocalDeclContexts,
6324 NumTULocalDeclContexts};
6327 Stream.FlushToWord();
6328 ASTBlockRange.second = Stream.GetCurrentBitNo() >> 3;
6332 for (
const auto &ExtWriter : ModuleFileExtensionWriters)
6333 WriteModuleFileExtension(*SemaPtr, *ExtWriter);
6335 return backpatchSignature();
6341void ASTWriter::AddedManglingNumber(
const Decl *D,
unsigned Number) {
6345 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::ManglingNumber, Number));
6347void ASTWriter::AddedStaticLocalNumbers(
const Decl *D,
unsigned Number) {
6351 DeclUpdates[D].push_back(
6352 DeclUpdate(DeclUpdateKind::StaticLocalNumber, Number));
6361 ASTWriter::UpdateRecord &
Record = DeclUpdates[TU];
6364 DeclUpdate(DeclUpdateKind::CXXAddedAnonymousNamespace, NS));
6368void ASTWriter::WriteDeclAndTypes(
ASTContext &Context) {
6373 DeclTypesBlockStartOffset = Stream.GetCurrentBitNo();
6377 WriteDeclUpdatesBlocks(Context, DeclUpdatesOffsetsRecord);
6378 while (!DeclTypesToEmit.empty()) {
6379 DeclOrType DOT = DeclTypesToEmit.front();
6380 DeclTypesToEmit.pop();
6382 WriteType(Context, DOT.getType());
6384 WriteDecl(Context, DOT.getDecl());
6386 }
while (!DeclUpdates.empty());
6388 DoneWritingDeclsAndTypes =
true;
6392 assert(DelayedNamespace.empty() || GeneratingReducedBMI);
6394 for (NamespaceDecl *NS : DelayedNamespace) {
6395 LookupBlockOffsets Offsets;
6397 Offsets.
LexicalOffset = WriteDeclContextLexicalBlock(Context, NS);
6398 WriteDeclContextVisibleBlock(Context, NS, Offsets);
6419 assert(DeclTypesToEmit.empty());
6420 assert(DeclUpdates.empty());
6425 WriteTypeDeclOffsets();
6426 if (!DeclUpdatesOffsetsRecord.empty())
6429 if (!DelayedNamespaceRecord.empty())
6431 DelayedNamespaceRecord);
6433 if (!RelatedDeclsMap.empty()) {
6437 for (
const auto &Pair : RelatedDeclsMap) {
6438 RelatedDeclsMapRecord.push_back(Pair.first.getRawValue());
6439 RelatedDeclsMapRecord.push_back(Pair.second.size());
6440 for (
const auto &Lambda : Pair.second)
6441 RelatedDeclsMapRecord.push_back(Lambda.getRawValue());
6444 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6446 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Array));
6447 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6448 unsigned FunctionToLambdaMapAbbrev = Stream.EmitAbbrev(std::move(Abv));
6450 FunctionToLambdaMapAbbrev);
6453 if (!SpecializationsUpdates.empty()) {
6454 WriteSpecializationsUpdates(
false);
6455 SpecializationsUpdates.clear();
6458 if (!PartialSpecializationsUpdates.empty()) {
6459 WriteSpecializationsUpdates(
true);
6460 PartialSpecializationsUpdates.clear();
6466 SmallVector<DeclID, 128> NewGlobalKindDeclPairs;
6475 NewGlobalKindDeclPairs.push_back(D->
getKind());
6476 NewGlobalKindDeclPairs.push_back(
GetDeclRef(D).getRawValue());
6479 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6481 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6482 unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));
6485 Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev,
Record,
6486 bytes(NewGlobalKindDeclPairs));
6488 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6490 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6491 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6492 UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6494 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6496 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6497 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6498 ModuleLocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6500 Abv = std::make_shared<llvm::BitCodeAbbrev>();
6502 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6503 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6504 TULocalUpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv));
6507 WriteDeclContextVisibleUpdate(Context, TU);
6510 if (Context.ExternCContext)
6511 WriteDeclContextVisibleUpdate(Context, Context.ExternCContext);
6514 for (
auto *DC : UpdatedDeclContexts)
6515 WriteDeclContextVisibleUpdate(Context, DC);
6518void ASTWriter::WriteSpecializationsUpdates(
bool IsPartial) {
6522 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
6523 Abv->Add(llvm::BitCodeAbbrevOp(RecordType));
6524 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6));
6525 Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));
6526 auto UpdateSpecializationAbbrev = Stream.EmitAbbrev(std::move(Abv));
6529 IsPartial ? PartialSpecializationsUpdates : SpecializationsUpdates;
6530 for (
auto &SpecializationUpdate : SpecUpdates) {
6531 const NamedDecl *D = SpecializationUpdate.first;
6533 llvm::SmallString<4096> LookupTable;
6534 GenerateSpecializationInfoLookupTable(D, SpecializationUpdate.second,
6535 LookupTable, IsPartial);
6538 RecordData::value_type
Record[] = {
6539 static_cast<RecordData::value_type
>(RecordType),
6541 Stream.EmitRecordWithBlob(UpdateSpecializationAbbrev,
Record, LookupTable);
6545void ASTWriter::WriteDeclUpdatesBlocks(
ASTContext &Context,
6546 RecordDataImpl &OffsetsRecord) {
6547 if (DeclUpdates.empty())
6550 DeclUpdateMap LocalUpdates;
6551 LocalUpdates.swap(DeclUpdates);
6553 for (
auto &DeclUpdate : LocalUpdates) {
6554 const Decl *D = DeclUpdate.first;
6556 bool HasUpdatedBody =
false;
6557 bool HasAddedVarDefinition =
false;
6560 for (
auto &
Update : DeclUpdate.second) {
6565 if (Kind == DeclUpdateKind::CXXAddedFunctionDefinition)
6566 HasUpdatedBody =
true;
6567 else if (Kind == DeclUpdateKind::CXXAddedVarDefinition)
6568 HasAddedVarDefinition =
true;
6570 Record.push_back(llvm::to_underlying(Kind));
6573 case DeclUpdateKind::CXXAddedImplicitMember:
6574 case DeclUpdateKind::CXXAddedAnonymousNamespace:
6575 assert(
Update.getDecl() &&
"no decl to add?");
6578 case DeclUpdateKind::CXXAddedFunctionDefinition:
6579 case DeclUpdateKind::CXXAddedVarDefinition:
6582 case DeclUpdateKind::CXXPointOfInstantiation:
6587 case DeclUpdateKind::CXXInstantiatedDefaultArgument:
6592 case DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer:
6597 case DeclUpdateKind::CXXInstantiatedClassDefinition: {
6599 UpdatedDeclContexts.insert(RD->getPrimaryContext());
6600 Record.push_back(RD->isParamDestroyedInCallee());
6601 Record.push_back(llvm::to_underlying(RD->getArgPassingRestrictions()));
6602 Record.AddCXXDefinitionData(RD);
6603 Record.AddOffset(WriteDeclContextLexicalBlock(Context, RD));
6608 if (
auto *MSInfo = RD->getMemberSpecializationInfo()) {
6609 Record.push_back(MSInfo->getTemplateSpecializationKind());
6610 Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
6613 Record.push_back(Spec->getTemplateSpecializationKind());
6614 Record.AddSourceLocation(Spec->getPointOfInstantiation());
6618 auto From = Spec->getInstantiatedFrom();
6619 if (
auto PartialSpec =
6620 From.dyn_cast<ClassTemplatePartialSpecializationDecl*>()) {
6622 Record.AddDeclRef(PartialSpec);
6623 Record.AddTemplateArgumentList(
6624 &Spec->getTemplateInstantiationArgs());
6629 Record.push_back(llvm::to_underlying(RD->getTagKind()));
6630 Record.AddSourceLocation(RD->getLocation());
6631 Record.AddSourceLocation(RD->getBeginLoc());
6632 Record.AddSourceRange(RD->getBraceRange());
6643 case DeclUpdateKind::CXXResolvedDtorDelete:
6648 case DeclUpdateKind::CXXResolvedDtorGlobDelete:
6652 case DeclUpdateKind::CXXResolvedDtorArrayDelete:
6656 case DeclUpdateKind::CXXResolvedDtorGlobArrayDelete:
6660 case DeclUpdateKind::CXXResolvedExceptionSpec: {
6663 Record.writeExceptionSpecInfo(prototype->getExceptionSpecInfo());
6667 case DeclUpdateKind::CXXDeducedReturnType:
6671 case DeclUpdateKind::DeclMarkedUsed:
6674 case DeclUpdateKind::ManglingNumber:
6675 case DeclUpdateKind::StaticLocalNumber:
6679 case DeclUpdateKind::DeclMarkedOpenMPThreadPrivate:
6681 D->
getAttr<OMPThreadPrivateDeclAttr>()->getRange());
6684 case DeclUpdateKind::DeclMarkedOpenMPAllocate: {
6685 auto *A = D->
getAttr<OMPAllocateDeclAttr>();
6686 Record.push_back(A->getAllocatorType());
6687 Record.AddStmt(A->getAllocator());
6688 Record.AddStmt(A->getAlignment());
6689 Record.AddSourceRange(A->getRange());
6693 case DeclUpdateKind::DeclMarkedOpenMPIndirectCall:
6695 D->
getAttr<OMPTargetIndirectCallAttr>()->getRange());
6698 case DeclUpdateKind::DeclMarkedOpenMPDeclareTarget:
6699 Record.push_back(D->
getAttr<OMPDeclareTargetDeclAttr>()->getMapType());
6701 D->
getAttr<OMPDeclareTargetDeclAttr>()->getRange());
6704 case DeclUpdateKind::DeclExported:
6708 case DeclUpdateKind::AddedAttrToRecord:
6709 Record.AddAttributes(llvm::ArrayRef(
Update.getAttr()));
6717 if (HasUpdatedBody) {
6720 llvm::to_underlying(DeclUpdateKind::CXXAddedFunctionDefinition));
6721 Record.push_back(Def->isInlined());
6722 Record.AddSourceLocation(Def->getInnerLocStart());
6723 Record.AddFunctionDefinition(Def);
6724 }
else if (HasAddedVarDefinition) {
6727 llvm::to_underlying(DeclUpdateKind::CXXAddedVarDefinition));
6728 Record.push_back(VD->isInline());
6729 Record.push_back(VD->isInlineSpecified());
6730 Record.AddVarDeclInit(VD);
6747 NonAffectingFileIDs.empty())
6749 auto It = llvm::lower_bound(NonAffectingFileIDs, FID);
6750 unsigned Idx = std::distance(NonAffectingFileIDs.begin(), It);
6751 unsigned Offset = NonAffectingFileIDAdjustments[Idx];
6752 return FileID::get(FID.getOpaqueValue() - Offset);
6755unsigned ASTWriter::getAdjustedNumCreatedFIDs(
FileID FID)
const {
6761 unsigned AdjustedNumCreatedFIDs = 0;
6762 for (
unsigned I = FID.ID, N = I + NumCreatedFIDs; I != N; ++I)
6763 if (IsSLocAffecting[I])
6764 ++AdjustedNumCreatedFIDs;
6765 return AdjustedNumCreatedFIDs;
6775 return SourceRange(getAdjustedLocation(
Range.getBegin()),
6776 getAdjustedLocation(
Range.getEnd()));
6781 return Offset - getAdjustment(Offset);
6786 if (NonAffectingRanges.empty())
6789 if (PP->getSourceManager().isLoadedOffset(Offset))
6792 if (Offset > NonAffectingRanges.back().getEnd().getOffset())
6793 return NonAffectingOffsetAdjustments.back();
6795 if (Offset < NonAffectingRanges.front().getBegin().getOffset())
6799 return Range.getEnd().getOffset() < Offset;
6802 auto It = llvm::lower_bound(NonAffectingRanges, Offset, Contains);
6803 unsigned Idx = std::distance(NonAffectingRanges.begin(), It);
6804 return NonAffectingOffsetAdjustments[Idx];
6808 Record.push_back(getAdjustedFileID(FID).getOpaqueValue());
6814 unsigned ModuleFileIndex = 0;
6817 if (PP->getSourceManager().isLoadedSourceLocation(Loc) && Loc.
isValid()) {
6820 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
6821 assert(SLocMapI !=
getChain()->GlobalSLocOffsetMap.end() &&
6822 "Corrupted global sloc offset map");
6827 ModuleFileIndex = F->
Index + 1;
6835 Loc = getAdjustedLocation(Loc);
6872 MacroInfoToEmitData Info = { Name, MI, ID };
6873 MacroInfosToEmit.push_back(Info);
6879 return IdentMacroDirectivesOffsetMap.lookup(Name);
6883 Record->push_back(Writer->getSelectorRef(SelRef));
6892 if (SID == 0 && Chain) {
6895 Chain->LoadSelector(Sel);
6896 SID = SelectorIDs[Sel];
6899 SID = NextSelectorID++;
6900 SelectorIDs[Sel] = SID;
6942 bool InfoHasSameExpr
6944 Record->push_back(InfoHasSameExpr);
6945 if (InfoHasSameExpr)
6962 TypeLocWriter TLW(*
this);
6972template <
typename IdxForTypeTy>
6974 IdxForTypeTy IdxForType) {
6978 unsigned FastQuals = T.getLocalFastQualifiers();
6979 T.removeLocalFastQualifiers();
6981 if (T.hasLocalNonFastQualifiers())
6982 return IdxForType(T).asTypeID(FastQuals);
6984 assert(!T.hasLocalQualifiers());
6986 if (
const BuiltinType *BT = dyn_cast<BuiltinType>(T.getTypePtr()))
6989 if (T == Context.AutoDeductTy)
6991 if (T == Context.AutoRRefDeductTy)
6994 return IdxForType(T).asTypeID(FastQuals);
7001 assert(!T.getLocalFastQualifiers());
7005 if (DoneWritingDeclsAndTypes) {
7006 assert(0 &&
"New type seen after serializing all the types to emit!");
7012 Idx =
TypeIdx(0, NextTypeID++);
7013 DeclTypesToEmit.push(T);
7019llvm::MapVector<ModuleFile *, const Decl *>
7021 llvm::MapVector<ModuleFile *, const Decl *> Firsts;
7024 if (R->isFromASTFile())
7025 Firsts[Chain->getOwningModuleFile(R)] = R;
7026 else if (IncludeLocal)
7027 Firsts[
nullptr] = R;
7043 Record.push_back(MacroRef >> 32);
7044 Record.push_back(MacroRef & llvm::maskTrailingOnes<MacroID>(32));
7059 assert(WritingAST &&
"Cannot request a declaration ID before AST writing");
7076 assert(!(
reinterpret_cast<uintptr_t>(D) & 0x01) &&
"Invalid decl pointer");
7078 if (ID.isInvalid()) {
7079 if (DoneWritingDeclsAndTypes) {
7080 assert(0 &&
"New decl seen after serializing all the decls to emit!");
7087 DeclTypesToEmit.push(
const_cast<Decl *
>(D));
7102 assert(DeclIDs.contains(D) &&
"Declaration not emitted!");
7109 assert(DoneWritingDeclsAndTypes &&
7110 "wasDeclEmitted should only be called after writing declarations");
7115 bool Emitted = DeclIDs.contains(D);
7117 GeneratingReducedBMI) &&
7118 "The declaration within modules can only be omitted in reduced BMI.");
7122void ASTWriter::getLazyUpdates(
const Decl *D) {
7123 if (!GeneratingReducedBMI)
7126 if (
auto *Iter = DeclUpdatesLazy.find(D); Iter != DeclUpdatesLazy.end()) {
7127 for (DeclUpdate &
Update : Iter->second)
7128 DeclUpdates[D].push_back(
Update);
7129 DeclUpdatesLazy.erase(Iter);
7133 if (
auto *DC = dyn_cast<DeclContext>(D);
7134 DC && UpdatedDeclContextsLazy.count(DC)) {
7135 UpdatedDeclContexts.insert(DC);
7136 UpdatedDeclContextsLazy.remove(DC);
7141 assert(
ID.isValid());
7158 SourceManager &
SM = PP->getSourceManager();
7159 SourceLocation FileLoc =
SM.getFileLoc(Loc);
7160 assert(
SM.isLocalSourceLocation(FileLoc));
7161 auto [FID, Offset] =
SM.getDecomposedLoc(FileLoc);
7164 assert(
SM.getSLocEntry(FID).isFile());
7165 assert(IsSLocAffecting[FID.ID]);
7167 std::unique_ptr<DeclIDInFileInfo> &Info = FileDeclIDs[FID];
7169 Info = std::make_unique<DeclIDInFileInfo>();
7171 std::pair<unsigned, LocalDeclID> LocDecl(Offset, ID);
7172 LocDeclIDsTy &Decls = Info->DeclIDs;
7173 Decls.push_back(LocDecl);
7178 "expected an anonymous declaration");
7182 auto It = AnonymousDeclarationNumbers.find(D);
7183 if (It == AnonymousDeclarationNumbers.end()) {
7186 AnonymousDeclarationNumbers[ND] = Number;
7189 It = AnonymousDeclarationNumbers.find(D);
7190 assert(It != AnonymousDeclarationNumbers.end() &&
7191 "declaration not found within its lexical context");
7246 while (QualifierLoc) {
7247 NestedNames.push_back(QualifierLoc);
7251 Record->push_back(NestedNames.size());
7252 while(!NestedNames.empty()) {
7253 QualifierLoc = NestedNames.pop_back_val();
7256 Record->push_back(llvm::to_underlying(Kind));
7259 AddDeclRef(Qualifier.getAsNamespaceAndPrefix().Namespace);
7281 llvm_unreachable(
"unexpected null nested name specifier");
7288 assert(TemplateParams &&
"No TemplateParams!");
7293 Record->push_back(TemplateParams->
size());
7294 for (
const auto &P : *TemplateParams)
7297 Record->push_back(
true);
7300 Record->push_back(
false);
7307 assert(TemplateArgs &&
"No TemplateArgs!");
7308 Record->push_back(TemplateArgs->
size());
7309 for (
int i = 0, e = TemplateArgs->
size(); i != e; ++i)
7315 assert(ASTTemplArgList &&
"No ASTTemplArgList!");
7325 Record->push_back(
Set.size());
7327 I =
Set.begin(), E =
Set.end(); I != E; ++I) {
7329 Record->push_back(I.getAccess());
7335 Record->push_back(
Base.isVirtual());
7336 Record->push_back(
Base.isBaseOfClass());
7337 Record->push_back(
Base.getAccessSpecifierAsWritten());
7338 Record->push_back(
Base.getInheritConstructors());
7351 for (
auto &
Base : Bases)
7369 for (
auto *
Init : CtorInits) {
7370 if (
Init->isBaseInitializer()) {
7374 }
else if (
Init->isDelegatingInitializer()) {
7377 }
else if (
Init->isMemberInitializer()){
7390 if (
Init->isWritten())
7404 auto &
Data = D->data();
7406 Record->push_back(
Data.IsLambda);
7410#define FIELD(Name, Width, Merge) \
7411 if (!DefinitionBits.canWriteNextNBits(Width)) { \
7412 Record->push_back(DefinitionBits); \
7413 DefinitionBits.reset(0); \
7415 DefinitionBits.addBits(Data.Name, Width);
7417#include "clang/AST/CXXRecordDeclDefinitionBits.def"
7420 Record->push_back(DefinitionBits);
7426 bool ModulesCodegen =
7431 Record->push_back(ModulesCodegen);
7433 Writer->AddDeclRef(D, Writer->ModularCodegenDecls);
7438 Record->push_back(
Data.ComputedVisibleConversions);
7439 if (
Data.ComputedVisibleConversions)
7443 if (!
Data.IsLambda) {
7444 Record->push_back(
Data.NumBases);
7445 if (
Data.NumBases > 0)
7449 Record->push_back(
Data.NumVBases);
7450 if (
Data.NumVBases > 0)
7455 auto &Lambda = D->getLambdaData();
7458 LambdaBits.
addBits(Lambda.DependencyKind, 2);
7459 LambdaBits.
addBit(Lambda.IsGenericLambda);
7460 LambdaBits.
addBits(Lambda.CaptureDefault, 2);
7461 LambdaBits.
addBits(Lambda.NumCaptures, 15);
7462 LambdaBits.
addBit(Lambda.HasKnownInternalLinkage);
7463 Record->push_back(LambdaBits);
7465 Record->push_back(Lambda.NumExplicitCaptures);
7466 Record->push_back(Lambda.ManglingNumber);
7471 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
7478 Record->push_back(CaptureBits);
7480 switch (
Capture.getCaptureKind()) {
7510 assert(ES->CheckedForSideEffects);
7511 Val |= (ES->HasConstantInitialization ? 2 : 0);
7512 Val |= (ES->HasConstantDestruction ? 4 : 0);
7526void ASTWriter::ReaderInitialized(
ASTReader *Reader) {
7527 assert(Reader &&
"Cannot remove chain");
7528 assert((!Chain || Chain == Reader) &&
"Cannot replace chain");
7529 assert(FirstDeclID == NextDeclID &&
7530 FirstTypeID == NextTypeID &&
7531 FirstIdentID == NextIdentID &&
7532 FirstMacroID == NextMacroID &&
7533 FirstSubmoduleID == NextSubmoduleID &&
7534 FirstSelectorID == NextSelectorID &&
7535 "Setting chain after writing has started.");
7541 NextSelectorID = FirstSelectorID;
7542 NextSubmoduleID = FirstSubmoduleID;
7552 unsigned OriginalModuleFileIndex = StoredID >> 32;
7556 if (OriginalModuleFileIndex == 0 && StoredID)
7567 MacroID &StoredID = MacroIDs[MI];
7568 unsigned OriginalModuleFileIndex = StoredID >> 32;
7571 if (OriginalModuleFileIndex == 0 && StoredID)
7580void ASTWriter::TypeRead(TypeIdx Idx,
QualType T) {
7592 TypeIdx &StoredIdx = TypeIdxs[T];
7598 if (ModuleFileIndex == 0 && StoredIdx.
getValue())
7609 DeclIDs[D] = LocalDeclID(ID);
7610 PredefinedDecls.insert(D);
7622 assert(!MacroDefinitions.contains(MD));
7623 MacroDefinitions[MD] =
ID;
7627 assert(!SubmoduleIDs.contains(Mod));
7628 SubmoduleIDs[Mod] =
ID;
7631void ASTWriter::CompletedTagDefinition(
const TagDecl *D) {
7632 if (Chain && Chain->isProcessingUpdateRecords())
return;
7634 assert(!WritingAST &&
"Already writing the AST!");
7635 if (
auto *RD = dyn_cast<CXXRecordDecl>(D)) {
7637 if (RD->isFromASTFile()) {
7642 "completed a tag from another module but not by instantiation?");
7643 DeclUpdates[RD].push_back(
7644 DeclUpdate(DeclUpdateKind::CXXInstantiatedClassDefinition));
7658void ASTWriter::AddedVisibleDecl(
const DeclContext *DC,
const Decl *D) {
7659 if (Chain && Chain->isProcessingUpdateRecords())
return;
7661 "Should not add lookup results to non-lookup contexts!");
7682 assert(!WritingAST &&
"Already writing the AST!");
7683 if (UpdatedDeclContexts.insert(DC) && !
cast<Decl>(DC)->isFromASTFile()) {
7687 llvm::append_range(DeclsToEmitEvenIfUnreferenced, DC->
decls());
7689 DeclsToEmitEvenIfUnreferenced.push_back(D);
7693 if (Chain && Chain->isProcessingUpdateRecords())
return;
7706 assert(!WritingAST &&
"Already writing the AST!");
7707 DeclUpdates[RD].push_back(
7708 DeclUpdate(DeclUpdateKind::CXXAddedImplicitMember, D));
7711void ASTWriter::ResolvedExceptionSpec(
const FunctionDecl *FD) {
7712 if (Chain && Chain->isProcessingUpdateRecords())
return;
7713 assert(!DoneWritingDeclsAndTypes &&
"Already done writing updates!");
7715 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7720 ->castAs<FunctionProtoType>()
7721 ->getExceptionSpecType()))
7722 DeclUpdates[D].push_back(DeclUpdateKind::CXXResolvedExceptionSpec);
7727 if (Chain && Chain->isProcessingUpdateRecords())
return;
7728 assert(!WritingAST &&
"Already writing the AST!");
7730 Chain->forEachImportedKeyDecl(FD, [&](
const Decl *D) {
7731 DeclUpdates[D].push_back(
7732 DeclUpdate(DeclUpdateKind::CXXDeducedReturnType, ReturnType));
7739 if (Chain && Chain->isProcessingUpdateRecords())
return;
7740 assert(!WritingAST &&
"Already writing the AST!");
7741 assert(
Delete &&
"Not given an operator delete");
7743 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7744 DeclUpdates[D].push_back(
7745 DeclUpdate(DeclUpdateKind::CXXResolvedDtorDelete,
Delete));
7751 if (Chain && Chain->isProcessingUpdateRecords())
7753 assert(!WritingAST &&
"Already writing the AST!");
7754 assert(GlobDelete &&
"Not given an operator delete");
7757 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7758 DeclUpdates[D].push_back(
7759 DeclUpdate(DeclUpdateKind::CXXResolvedDtorGlobDelete, GlobDelete));
7765 if (Chain && Chain->isProcessingUpdateRecords())
7767 assert(!WritingAST &&
"Already writing the AST!");
7768 assert(ArrayDelete &&
"Not given an operator delete");
7771 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7772 DeclUpdates[D].push_back(
7773 DeclUpdate(DeclUpdateKind::CXXResolvedDtorArrayDelete, ArrayDelete));
7777void ASTWriter::ResolvedOperatorGlobArrayDelete(
7779 if (Chain && Chain->isProcessingUpdateRecords())
7781 assert(!WritingAST &&
"Already writing the AST!");
7782 assert(GlobArrayDelete &&
"Not given an operator delete");
7785 Chain->forEachImportedKeyDecl(DD, [&](
const Decl *D) {
7786 DeclUpdates[D].push_back(DeclUpdate(
7787 DeclUpdateKind::CXXResolvedDtorGlobArrayDelete, GlobArrayDelete));
7791void ASTWriter::CompletedImplicitDefinition(
const FunctionDecl *D) {
7792 if (Chain && Chain->isProcessingUpdateRecords())
return;
7793 assert(!WritingAST &&
"Already writing the AST!");
7802 DeclUpdates[D].push_back(
7803 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7806void ASTWriter::VariableDefinitionInstantiated(
const VarDecl *D) {
7807 if (Chain && Chain->isProcessingUpdateRecords())
return;
7808 assert(!WritingAST &&
"Already writing the AST!");
7812 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::CXXAddedVarDefinition));
7815void ASTWriter::FunctionDefinitionInstantiated(
const FunctionDecl *D) {
7816 if (Chain && Chain->isProcessingUpdateRecords())
return;
7817 assert(!WritingAST &&
"Already writing the AST!");
7825 DeclUpdates[D].push_back(
7826 DeclUpdate(DeclUpdateKind::CXXAddedFunctionDefinition));
7829void ASTWriter::InstantiationRequested(
const ValueDecl *D) {
7830 if (Chain && Chain->isProcessingUpdateRecords())
return;
7831 assert(!WritingAST &&
"Already writing the AST!");
7838 if (
auto *VD = dyn_cast<VarDecl>(D))
7839 POI = VD->getPointOfInstantiation();
7842 DeclUpdates[D].push_back(
7843 DeclUpdate(DeclUpdateKind::CXXPointOfInstantiation, POI));
7846void ASTWriter::DefaultArgumentInstantiated(
const ParmVarDecl *D) {
7847 if (Chain && Chain->isProcessingUpdateRecords())
return;
7848 assert(!WritingAST &&
"Already writing the AST!");
7852 DeclUpdates[D].push_back(
7853 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultArgument, D));
7856void ASTWriter::DefaultMemberInitializerInstantiated(
const FieldDecl *D) {
7857 assert(!WritingAST &&
"Already writing the AST!");
7861 DeclUpdates[D].push_back(
7862 DeclUpdate(DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer, D));
7867 if (Chain && Chain->isProcessingUpdateRecords())
return;
7868 assert(!WritingAST &&
"Already writing the AST!");
7872 assert(IFD->
getDefinition() &&
"Category on a class without a definition?");
7873 ObjCClassesWithCategories.insert(
7877void ASTWriter::DeclarationMarkedUsed(
const Decl *D) {
7878 if (Chain && Chain->isProcessingUpdateRecords())
return;
7879 assert(!WritingAST &&
"Already writing the AST!");
7888 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclMarkedUsed));
7891void ASTWriter::DeclarationMarkedOpenMPThreadPrivate(
const Decl *D) {
7892 if (Chain && Chain->isProcessingUpdateRecords())
return;
7893 assert(!WritingAST &&
"Already writing the AST!");
7897 DeclUpdates[D].push_back(
7898 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPThreadPrivate));
7901void ASTWriter::DeclarationMarkedOpenMPAllocate(
const Decl *D,
const Attr *A) {
7902 if (Chain && Chain->isProcessingUpdateRecords())
return;
7903 assert(!WritingAST &&
"Already writing the AST!");
7907 DeclUpdates[D].push_back(
7908 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPAllocate, A));
7911void ASTWriter::DeclarationMarkedOpenMPIndirectCall(
const Decl *D) {
7912 if (Chain && Chain->isProcessingUpdateRecords())
7914 assert(!WritingAST &&
"Already writing the AST!");
7918 DeclUpdates[D].push_back(
7919 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPIndirectCall));
7922void ASTWriter::DeclarationMarkedOpenMPDeclareTarget(
const Decl *D,
7924 if (Chain && Chain->isProcessingUpdateRecords())
return;
7925 assert(!WritingAST &&
"Already writing the AST!");
7929 DeclUpdates[D].push_back(
7930 DeclUpdate(DeclUpdateKind::DeclMarkedOpenMPDeclareTarget, Attr));
7933void ASTWriter::RedefinedHiddenDefinition(
const NamedDecl *D,
Module *M) {
7934 if (Chain && Chain->isProcessingUpdateRecords())
return;
7935 assert(!WritingAST &&
"Already writing the AST!");
7937 DeclUpdates[D].push_back(DeclUpdate(DeclUpdateKind::DeclExported, M));
7940void ASTWriter::AddedAttributeToRecord(
const Attr *
Attr,
7942 if (Chain && Chain->isProcessingUpdateRecords())
return;
7943 assert(!WritingAST &&
"Already writing the AST!");
7944 if (!
Record->isFromASTFile())
7946 DeclUpdates[
Record].push_back(
7947 DeclUpdate(DeclUpdateKind::AddedAttrToRecord, Attr));
7950void ASTWriter::AddedCXXTemplateSpecialization(
7952 assert(!WritingAST &&
"Already writing the AST!");
7956 if (Chain && Chain->isProcessingUpdateRecords())
7959 DeclsToEmitEvenIfUnreferenced.push_back(D);
7962void ASTWriter::AddedCXXTemplateSpecialization(
7964 assert(!WritingAST &&
"Already writing the AST!");
7968 if (Chain && Chain->isProcessingUpdateRecords())
7971 DeclsToEmitEvenIfUnreferenced.push_back(D);
7976 assert(!WritingAST &&
"Already writing the AST!");
7980 if (Chain && Chain->isProcessingUpdateRecords())
7983 DeclsToEmitEvenIfUnreferenced.push_back(D);
7992class OMPClauseWriter :
public OMPClauseVisitor<OMPClauseWriter> {
7997#define GEN_CLANG_CLAUSE_CLASS
7998#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
7999#include "llvm/Frontend/OpenMP/OMP.inc"
8008 OMPClauseWriter(*this).writeClause(
C);
8011void OMPClauseWriter::writeClause(
OMPClause *
C) {
8012 Record.push_back(
unsigned(
C->getClauseKind()));
8014 Record.AddSourceLocation(
C->getBeginLoc());
8015 Record.AddSourceLocation(
C->getEndLoc());
8019 Record.push_back(uint64_t(
C->getCaptureRegion()));
8020 Record.AddStmt(
C->getPreInitStmt());
8024 VisitOMPClauseWithPreInit(
C);
8025 Record.AddStmt(
C->getPostUpdateExpr());
8028void OMPClauseWriter::VisitOMPIfClause(
OMPIfClause *
C) {
8029 VisitOMPClauseWithPreInit(
C);
8031 Record.AddSourceLocation(
C->getNameModifierLoc());
8032 Record.AddSourceLocation(
C->getColonLoc());
8033 Record.AddStmt(
C->getCondition());
8034 Record.AddSourceLocation(
C->getLParenLoc());
8038 VisitOMPClauseWithPreInit(
C);
8039 Record.AddStmt(
C->getCondition());
8040 Record.AddSourceLocation(
C->getLParenLoc());
8044 VisitOMPClauseWithPreInit(
C);
8045 Record.writeEnum(
C->getModifier());
8046 Record.AddStmt(
C->getNumThreads());
8047 Record.AddSourceLocation(
C->getModifierLoc());
8048 Record.AddSourceLocation(
C->getLParenLoc());
8052 Record.AddStmt(
C->getSafelen());
8053 Record.AddSourceLocation(
C->getLParenLoc());
8057 Record.AddStmt(
C->getSimdlen());
8058 Record.AddSourceLocation(
C->getLParenLoc());
8062 Record.push_back(
C->getNumSizes());
8063 for (
Expr *Size :
C->getSizesRefs())
8065 Record.AddSourceLocation(
C->getLParenLoc());
8069 Record.push_back(
C->getNumCounts());
8070 Record.push_back(
C->hasOmpFill());
8071 if (
C->hasOmpFill())
8072 Record.push_back(*
C->getOmpFillIndex());
8073 Record.AddSourceLocation(
C->getOmpFillLoc());
8074 for (
Expr *Count :
C->getCountsRefs())
8076 Record.AddSourceLocation(
C->getLParenLoc());
8080 Record.push_back(
C->getNumLoops());
8081 for (
Expr *Size :
C->getArgsRefs())
8083 Record.AddSourceLocation(
C->getLParenLoc());
8089 Record.AddStmt(
C->getFactor());
8090 Record.AddSourceLocation(
C->getLParenLoc());
8094 Record.AddStmt(
C->getFirst());
8095 Record.AddStmt(
C->getCount());
8096 Record.AddSourceLocation(
C->getLParenLoc());
8097 Record.AddSourceLocation(
C->getFirstLoc());
8098 Record.AddSourceLocation(
C->getCountLoc());
8102 Record.AddStmt(
C->getAllocator());
8103 Record.AddSourceLocation(
C->getLParenLoc());
8107 Record.AddStmt(
C->getNumForLoops());
8108 Record.AddSourceLocation(
C->getLParenLoc());
8111void OMPClauseWriter::VisitOMPDetachClause(OMPDetachClause *
C) {
8112 Record.AddStmt(
C->getEventHandler());
8113 Record.AddSourceLocation(
C->getLParenLoc());
8117 Record.push_back(
unsigned(
C->getDefaultKind()));
8118 Record.AddSourceLocation(
C->getLParenLoc());
8119 Record.AddSourceLocation(
C->getDefaultKindKwLoc());
8120 Record.push_back(
unsigned(
C->getDefaultVC()));
8121 Record.AddSourceLocation(
C->getDefaultVCLoc());
8125 Record.AddSourceLocation(
C->getLParenLoc());
8126 Record.AddSourceLocation(
C->getThreadsetKindLoc());
8127 Record.writeEnum(
C->getThreadsetKind());
8130void OMPClauseWriter::VisitOMPTransparentClause(OMPTransparentClause *
C) {
8131 Record.AddSourceLocation(
C->getLParenLoc());
8132 Record.AddStmt(
C->getImpexType());
8135void OMPClauseWriter::VisitOMPProcBindClause(OMPProcBindClause *
C) {
8136 Record.push_back(
unsigned(
C->getProcBindKind()));
8137 Record.AddSourceLocation(
C->getLParenLoc());
8138 Record.AddSourceLocation(
C->getProcBindKindKwLoc());
8141void OMPClauseWriter::VisitOMPScheduleClause(OMPScheduleClause *
C) {
8142 VisitOMPClauseWithPreInit(
C);
8143 Record.push_back(
C->getScheduleKind());
8144 Record.push_back(
C->getFirstScheduleModifier());
8145 Record.push_back(
C->getSecondScheduleModifier());
8146 Record.AddStmt(
C->getChunkSize());
8147 Record.AddSourceLocation(
C->getLParenLoc());
8148 Record.AddSourceLocation(
C->getFirstScheduleModifierLoc());
8149 Record.AddSourceLocation(
C->getSecondScheduleModifierLoc());
8150 Record.AddSourceLocation(
C->getScheduleKindLoc());
8151 Record.AddSourceLocation(
C->getCommaLoc());
8154void OMPClauseWriter::VisitOMPOrderedClause(OMPOrderedClause *
C) {
8155 Record.push_back(
C->getLoopNumIterations().size());
8156 Record.AddStmt(
C->getNumForLoops());
8157 for (
Expr *NumIter :
C->getLoopNumIterations())
8159 for (
unsigned I = 0, E =
C->getLoopNumIterations().size(); I <E; ++I)
8160 Record.AddStmt(
C->getLoopCounter(I));
8161 Record.AddSourceLocation(
C->getLParenLoc());
8164void OMPClauseWriter::VisitOMPNowaitClause(OMPNowaitClause *
C) {
8165 Record.AddStmt(
C->getCondition());
8166 Record.AddSourceLocation(
C->getLParenLoc());
8169void OMPClauseWriter::VisitOMPUntiedClause(OMPUntiedClause *) {}
8171void OMPClauseWriter::VisitOMPMergeableClause(OMPMergeableClause *) {}
8173void OMPClauseWriter::VisitOMPReadClause(OMPReadClause *) {}
8175void OMPClauseWriter::VisitOMPWriteClause(OMPWriteClause *) {}
8177void OMPClauseWriter::VisitOMPUpdateClause(OMPUpdateClause *
C) {
8178 Record.push_back(
C->isExtended() ? 1 : 0);
8179 if (
C->isExtended()) {
8180 Record.AddSourceLocation(
C->getLParenLoc());
8181 Record.AddSourceLocation(
C->getArgumentLoc());
8182 Record.writeEnum(
C->getDependencyKind());
8186void OMPClauseWriter::VisitOMPCaptureClause(OMPCaptureClause *) {}
8188void OMPClauseWriter::VisitOMPCompareClause(OMPCompareClause *) {}
8191void OMPClauseWriter::VisitOMPFailClause(OMPFailClause *
C) {
8192 Record.AddSourceLocation(
C->getLParenLoc());
8193 Record.AddSourceLocation(
C->getFailParameterLoc());
8194 Record.writeEnum(
C->getFailParameter());
8197void OMPClauseWriter::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
8199void OMPClauseWriter::VisitOMPAcqRelClause(OMPAcqRelClause *) {}
8201void OMPClauseWriter::VisitOMPAbsentClause(OMPAbsentClause *
C) {
8202 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8203 Record.AddSourceLocation(
C->getLParenLoc());
8204 for (
auto K :
C->getDirectiveKinds()) {
8209void OMPClauseWriter::VisitOMPHoldsClause(OMPHoldsClause *
C) {
8211 Record.AddSourceLocation(
C->getLParenLoc());
8214void OMPClauseWriter::VisitOMPContainsClause(OMPContainsClause *
C) {
8215 Record.push_back(
static_cast<uint64_t>(
C->getDirectiveKinds().size()));
8216 Record.AddSourceLocation(
C->getLParenLoc());
8217 for (
auto K :
C->getDirectiveKinds()) {
8222void OMPClauseWriter::VisitOMPNoOpenMPClause(OMPNoOpenMPClause *) {}
8224void OMPClauseWriter::VisitOMPNoOpenMPRoutinesClause(
8225 OMPNoOpenMPRoutinesClause *) {}
8227void OMPClauseWriter::VisitOMPNoOpenMPConstructsClause(
8228 OMPNoOpenMPConstructsClause *) {}
8230void OMPClauseWriter::VisitOMPNoParallelismClause(OMPNoParallelismClause *) {}
8232void OMPClauseWriter::VisitOMPAcquireClause(OMPAcquireClause *) {}
8234void OMPClauseWriter::VisitOMPReleaseClause(OMPReleaseClause *) {}
8236void OMPClauseWriter::VisitOMPRelaxedClause(OMPRelaxedClause *) {}
8238void OMPClauseWriter::VisitOMPWeakClause(OMPWeakClause *) {}
8240void OMPClauseWriter::VisitOMPThreadsClause(OMPThreadsClause *) {}
8242void OMPClauseWriter::VisitOMPSIMDClause(OMPSIMDClause *) {}
8244void OMPClauseWriter::VisitOMPNogroupClause(OMPNogroupClause *) {}
8246void OMPClauseWriter::VisitOMPInitClause(OMPInitClause *
C) {
8247 Record.push_back(
C->varlist_size());
8250 Record.writeBool(
C->getIsTarget());
8251 Record.writeBool(
C->getIsTargetSync());
8252 Record.AddSourceLocation(
C->getLParenLoc());
8253 Record.AddSourceLocation(
C->getVarLoc());
8256void OMPClauseWriter::VisitOMPUseClause(OMPUseClause *
C) {
8257 Record.AddStmt(
C->getInteropVar());
8258 Record.AddSourceLocation(
C->getLParenLoc());
8259 Record.AddSourceLocation(
C->getVarLoc());
8262void OMPClauseWriter::VisitOMPDestroyClause(OMPDestroyClause *
C) {
8263 Record.AddStmt(
C->getInteropVar());
8264 Record.AddSourceLocation(
C->getLParenLoc());
8265 Record.AddSourceLocation(
C->getVarLoc());
8268void OMPClauseWriter::VisitOMPNovariantsClause(OMPNovariantsClause *
C) {
8269 VisitOMPClauseWithPreInit(
C);
8270 Record.AddStmt(
C->getCondition());
8271 Record.AddSourceLocation(
C->getLParenLoc());
8274void OMPClauseWriter::VisitOMPNocontextClause(OMPNocontextClause *
C) {
8275 VisitOMPClauseWithPreInit(
C);
8276 Record.AddStmt(
C->getCondition());
8277 Record.AddSourceLocation(
C->getLParenLoc());
8280void OMPClauseWriter::VisitOMPFilterClause(OMPFilterClause *
C) {
8281 VisitOMPClauseWithPreInit(
C);
8282 Record.AddStmt(
C->getThreadID());
8283 Record.AddSourceLocation(
C->getLParenLoc());
8287 Record.AddStmt(
C->getAlignment());
8288 Record.AddSourceLocation(
C->getLParenLoc());
8291void OMPClauseWriter::VisitOMPPrivateClause(OMPPrivateClause *
C) {
8292 Record.push_back(
C->varlist_size());
8293 Record.AddSourceLocation(
C->getLParenLoc());
8294 for (
auto *
VE :
C->varlist()) {
8297 for (
auto *
VE :
C->private_copies()) {
8302void OMPClauseWriter::VisitOMPFirstprivateClause(OMPFirstprivateClause *
C) {
8303 Record.push_back(
C->varlist_size());
8304 VisitOMPClauseWithPreInit(
C);
8305 Record.AddSourceLocation(
C->getLParenLoc());
8306 for (
auto *
VE :
C->varlist()) {
8309 for (
auto *
VE :
C->private_copies()) {
8312 for (
auto *
VE :
C->inits()) {
8317void OMPClauseWriter::VisitOMPLastprivateClause(OMPLastprivateClause *
C) {
8318 Record.push_back(
C->varlist_size());
8319 VisitOMPClauseWithPostUpdate(
C);
8320 Record.AddSourceLocation(
C->getLParenLoc());
8321 Record.writeEnum(
C->getKind());
8322 Record.AddSourceLocation(
C->getKindLoc());
8323 Record.AddSourceLocation(
C->getColonLoc());
8324 for (
auto *
VE :
C->varlist())
8326 for (
auto *E :
C->private_copies())
8328 for (
auto *E :
C->source_exprs())
8330 for (
auto *E :
C->destination_exprs())
8332 for (
auto *E :
C->assignment_ops())
8336void OMPClauseWriter::VisitOMPSharedClause(OMPSharedClause *
C) {
8337 Record.push_back(
C->varlist_size());
8338 Record.AddSourceLocation(
C->getLParenLoc());
8339 for (
auto *
VE :
C->varlist())
8343void OMPClauseWriter::VisitOMPReductionClause(OMPReductionClause *
C) {
8344 Record.push_back(
C->varlist_size());
8345 Record.writeEnum(
C->getModifier());
8346 VisitOMPClauseWithPostUpdate(
C);
8347 Record.AddSourceLocation(
C->getLParenLoc());
8348 Record.AddSourceLocation(
C->getModifierLoc());
8349 Record.AddSourceLocation(
C->getColonLoc());
8350 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8351 Record.AddDeclarationNameInfo(
C->getNameInfo());
8352 for (
auto *
VE :
C->varlist())
8354 for (
auto *
VE :
C->privates())
8356 for (
auto *E :
C->lhs_exprs())
8358 for (
auto *E :
C->rhs_exprs())
8360 for (
auto *E :
C->reduction_ops())
8362 if (
C->getModifier() == clang::OMPC_REDUCTION_inscan) {
8363 for (
auto *E :
C->copy_ops())
8365 for (
auto *E :
C->copy_array_temps())
8367 for (
auto *E :
C->copy_array_elems())
8370 auto PrivateFlags =
C->private_var_reduction_flags();
8371 Record.push_back(std::distance(PrivateFlags.begin(), PrivateFlags.end()));
8372 for (
bool Flag : PrivateFlags)
8376void OMPClauseWriter::VisitOMPTaskReductionClause(OMPTaskReductionClause *
C) {
8377 Record.push_back(
C->varlist_size());
8378 VisitOMPClauseWithPostUpdate(
C);
8379 Record.AddSourceLocation(
C->getLParenLoc());
8380 Record.AddSourceLocation(
C->getColonLoc());
8381 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8382 Record.AddDeclarationNameInfo(
C->getNameInfo());
8383 for (
auto *
VE :
C->varlist())
8385 for (
auto *
VE :
C->privates())
8387 for (
auto *E :
C->lhs_exprs())
8389 for (
auto *E :
C->rhs_exprs())
8391 for (
auto *E :
C->reduction_ops())
8395void OMPClauseWriter::VisitOMPInReductionClause(OMPInReductionClause *
C) {
8396 Record.push_back(
C->varlist_size());
8397 VisitOMPClauseWithPostUpdate(
C);
8398 Record.AddSourceLocation(
C->getLParenLoc());
8399 Record.AddSourceLocation(
C->getColonLoc());
8400 Record.AddNestedNameSpecifierLoc(
C->getQualifierLoc());
8401 Record.AddDeclarationNameInfo(
C->getNameInfo());
8402 for (
auto *
VE :
C->varlist())
8404 for (
auto *
VE :
C->privates())
8406 for (
auto *E :
C->lhs_exprs())
8408 for (
auto *E :
C->rhs_exprs())
8410 for (
auto *E :
C->reduction_ops())
8412 for (
auto *E :
C->taskgroup_descriptors())
8416void OMPClauseWriter::VisitOMPLinearClause(OMPLinearClause *
C) {
8417 Record.push_back(
C->varlist_size());
8418 VisitOMPClauseWithPostUpdate(
C);
8419 Record.AddSourceLocation(
C->getLParenLoc());
8420 Record.AddSourceLocation(
C->getColonLoc());
8421 Record.push_back(
C->getModifier());
8422 Record.AddSourceLocation(
C->getModifierLoc());
8423 for (
auto *
VE :
C->varlist()) {
8426 for (
auto *
VE :
C->privates()) {
8429 for (
auto *
VE :
C->inits()) {
8432 for (
auto *
VE :
C->updates()) {
8435 for (
auto *
VE :
C->finals()) {
8439 Record.AddStmt(
C->getCalcStep());
8440 for (
auto *
VE :
C->used_expressions())
8444void OMPClauseWriter::VisitOMPAlignedClause(OMPAlignedClause *
C) {
8445 Record.push_back(
C->varlist_size());
8446 Record.AddSourceLocation(
C->getLParenLoc());
8447 Record.AddSourceLocation(
C->getColonLoc());
8448 for (
auto *
VE :
C->varlist())
8450 Record.AddStmt(
C->getAlignment());
8453void OMPClauseWriter::VisitOMPCopyinClause(OMPCopyinClause *
C) {
8454 Record.push_back(
C->varlist_size());
8455 Record.AddSourceLocation(
C->getLParenLoc());
8456 for (
auto *
VE :
C->varlist())
8458 for (
auto *E :
C->source_exprs())
8460 for (
auto *E :
C->destination_exprs())
8462 for (
auto *E :
C->assignment_ops())
8466void OMPClauseWriter::VisitOMPCopyprivateClause(OMPCopyprivateClause *
C) {
8467 Record.push_back(
C->varlist_size());
8468 Record.AddSourceLocation(
C->getLParenLoc());
8469 for (
auto *
VE :
C->varlist())
8471 for (
auto *E :
C->source_exprs())
8473 for (
auto *E :
C->destination_exprs())
8475 for (
auto *E :
C->assignment_ops())
8479void OMPClauseWriter::VisitOMPFlushClause(OMPFlushClause *
C) {
8480 Record.push_back(
C->varlist_size());
8481 Record.AddSourceLocation(
C->getLParenLoc());
8482 for (
auto *
VE :
C->varlist())
8486void OMPClauseWriter::VisitOMPDepobjClause(OMPDepobjClause *
C) {
8487 Record.AddStmt(
C->getDepobj());
8488 Record.AddSourceLocation(
C->getLParenLoc());
8491void OMPClauseWriter::VisitOMPDependClause(OMPDependClause *
C) {
8492 Record.push_back(
C->varlist_size());
8493 Record.push_back(
C->getNumLoops());
8494 Record.AddSourceLocation(
C->getLParenLoc());
8495 Record.AddStmt(
C->getModifier());
8496 Record.push_back(
C->getDependencyKind());
8497 Record.AddSourceLocation(
C->getDependencyLoc());
8498 Record.AddSourceLocation(
C->getColonLoc());
8499 Record.AddSourceLocation(
C->getOmpAllMemoryLoc());
8500 for (
auto *
VE :
C->varlist())
8502 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8503 Record.AddStmt(
C->getLoopData(I));
8506void OMPClauseWriter::VisitOMPDeviceClause(OMPDeviceClause *
C) {
8507 VisitOMPClauseWithPreInit(
C);
8508 Record.writeEnum(
C->getModifier());
8509 Record.AddStmt(
C->getDevice());
8510 Record.AddSourceLocation(
C->getModifierLoc());
8511 Record.AddSourceLocation(
C->getLParenLoc());
8514void OMPClauseWriter::VisitOMPMapClause(OMPMapClause *
C) {
8515 Record.push_back(
C->varlist_size());
8516 Record.push_back(
C->getUniqueDeclarationsNum());
8517 Record.push_back(
C->getTotalComponentListNum());
8518 Record.push_back(
C->getTotalComponentsNum());
8519 Record.AddSourceLocation(
C->getLParenLoc());
8520 bool HasIteratorModifier =
false;
8522 Record.push_back(
C->getMapTypeModifier(I));
8523 Record.AddSourceLocation(
C->getMapTypeModifierLoc(I));
8524 if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
8525 HasIteratorModifier =
true;
8527 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8528 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8529 Record.push_back(
C->getMapType());
8530 Record.AddSourceLocation(
C->getMapLoc());
8531 Record.AddSourceLocation(
C->getColonLoc());
8532 for (
auto *E :
C->varlist())
8534 for (
auto *E :
C->mapperlists())
8536 if (HasIteratorModifier)
8537 Record.AddStmt(
C->getIteratorModifier());
8538 for (
auto *D :
C->all_decls())
8540 for (
auto N :
C->all_num_lists())
8542 for (
auto N :
C->all_lists_sizes())
8544 for (
auto &M :
C->all_components()) {
8545 Record.AddStmt(M.getAssociatedExpression());
8546 Record.AddDeclRef(M.getAssociatedDeclaration());
8551 Record.push_back(
C->varlist_size());
8552 Record.writeEnum(
C->getFirstAllocateModifier());
8553 Record.writeEnum(
C->getSecondAllocateModifier());
8554 Record.AddSourceLocation(
C->getLParenLoc());
8555 Record.AddSourceLocation(
C->getColonLoc());
8556 Record.AddStmt(
C->getAllocator());
8557 Record.AddStmt(
C->getAlignment());
8558 for (
auto *
VE :
C->varlist())
8562void OMPClauseWriter::VisitOMPNumTeamsClause(OMPNumTeamsClause *
C) {
8563 Record.push_back(
C->varlist_size());
8564 VisitOMPClauseWithPreInit(
C);
8565 Record.AddSourceLocation(
C->getLParenLoc());
8566 for (
auto *
VE :
C->varlist())
8570void OMPClauseWriter::VisitOMPThreadLimitClause(OMPThreadLimitClause *
C) {
8571 Record.push_back(
C->varlist_size());
8572 VisitOMPClauseWithPreInit(
C);
8573 Record.AddSourceLocation(
C->getLParenLoc());
8574 for (
auto *
VE :
C->varlist())
8578void OMPClauseWriter::VisitOMPPriorityClause(OMPPriorityClause *
C) {
8579 VisitOMPClauseWithPreInit(
C);
8580 Record.AddStmt(
C->getPriority());
8581 Record.AddSourceLocation(
C->getLParenLoc());
8584void OMPClauseWriter::VisitOMPGrainsizeClause(OMPGrainsizeClause *
C) {
8585 VisitOMPClauseWithPreInit(
C);
8586 Record.writeEnum(
C->getModifier());
8587 Record.AddStmt(
C->getGrainsize());
8588 Record.AddSourceLocation(
C->getModifierLoc());
8589 Record.AddSourceLocation(
C->getLParenLoc());
8592void OMPClauseWriter::VisitOMPNumTasksClause(OMPNumTasksClause *
C) {
8593 VisitOMPClauseWithPreInit(
C);
8594 Record.writeEnum(
C->getModifier());
8595 Record.AddStmt(
C->getNumTasks());
8596 Record.AddSourceLocation(
C->getModifierLoc());
8597 Record.AddSourceLocation(
C->getLParenLoc());
8600void OMPClauseWriter::VisitOMPHintClause(OMPHintClause *
C) {
8602 Record.AddSourceLocation(
C->getLParenLoc());
8605void OMPClauseWriter::VisitOMPDistScheduleClause(OMPDistScheduleClause *
C) {
8606 VisitOMPClauseWithPreInit(
C);
8607 Record.push_back(
C->getDistScheduleKind());
8608 Record.AddStmt(
C->getChunkSize());
8609 Record.AddSourceLocation(
C->getLParenLoc());
8610 Record.AddSourceLocation(
C->getDistScheduleKindLoc());
8611 Record.AddSourceLocation(
C->getCommaLoc());
8614void OMPClauseWriter::VisitOMPDefaultmapClause(OMPDefaultmapClause *
C) {
8615 Record.push_back(
C->getDefaultmapKind());
8616 Record.push_back(
C->getDefaultmapModifier());
8617 Record.AddSourceLocation(
C->getLParenLoc());
8618 Record.AddSourceLocation(
C->getDefaultmapModifierLoc());
8619 Record.AddSourceLocation(
C->getDefaultmapKindLoc());
8622void OMPClauseWriter::VisitOMPToClause(OMPToClause *
C) {
8623 Record.push_back(
C->varlist_size());
8624 Record.push_back(
C->getUniqueDeclarationsNum());
8625 Record.push_back(
C->getTotalComponentListNum());
8626 Record.push_back(
C->getTotalComponentsNum());
8627 Record.AddSourceLocation(
C->getLParenLoc());
8629 Record.push_back(
C->getMotionModifier(I));
8630 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8631 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8632 Record.AddStmt(
C->getIteratorModifier());
8634 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8635 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8636 Record.AddSourceLocation(
C->getColonLoc());
8637 for (
auto *E :
C->varlist())
8639 for (
auto *E :
C->mapperlists())
8641 for (
auto *D :
C->all_decls())
8643 for (
auto N :
C->all_num_lists())
8645 for (
auto N :
C->all_lists_sizes())
8647 for (
auto &M :
C->all_components()) {
8648 Record.AddStmt(M.getAssociatedExpression());
8649 Record.writeBool(M.isNonContiguous());
8650 Record.AddDeclRef(M.getAssociatedDeclaration());
8654void OMPClauseWriter::VisitOMPFromClause(OMPFromClause *
C) {
8655 Record.push_back(
C->varlist_size());
8656 Record.push_back(
C->getUniqueDeclarationsNum());
8657 Record.push_back(
C->getTotalComponentListNum());
8658 Record.push_back(
C->getTotalComponentsNum());
8659 Record.AddSourceLocation(
C->getLParenLoc());
8661 Record.push_back(
C->getMotionModifier(I));
8662 Record.AddSourceLocation(
C->getMotionModifierLoc(I));
8663 if (
C->getMotionModifier(I) == OMPC_MOTION_MODIFIER_iterator)
8664 Record.AddStmt(
C->getIteratorModifier());
8666 Record.AddNestedNameSpecifierLoc(
C->getMapperQualifierLoc());
8667 Record.AddDeclarationNameInfo(
C->getMapperIdInfo());
8668 Record.AddSourceLocation(
C->getColonLoc());
8669 for (
auto *E :
C->varlist())
8671 for (
auto *E :
C->mapperlists())
8673 for (
auto *D :
C->all_decls())
8675 for (
auto N :
C->all_num_lists())
8677 for (
auto N :
C->all_lists_sizes())
8679 for (
auto &M :
C->all_components()) {
8680 Record.AddStmt(M.getAssociatedExpression());
8681 Record.writeBool(M.isNonContiguous());
8682 Record.AddDeclRef(M.getAssociatedDeclaration());
8686void OMPClauseWriter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *
C) {
8687 Record.push_back(
C->varlist_size());
8688 Record.push_back(
C->getUniqueDeclarationsNum());
8689 Record.push_back(
C->getTotalComponentListNum());
8690 Record.push_back(
C->getTotalComponentsNum());
8691 Record.AddSourceLocation(
C->getLParenLoc());
8692 Record.writeEnum(
C->getFallbackModifier());
8693 Record.AddSourceLocation(
C->getFallbackModifierLoc());
8694 for (
auto *E :
C->varlist())
8696 for (
auto *
VE :
C->private_copies())
8698 for (
auto *
VE :
C->inits())
8700 for (
auto *D :
C->all_decls())
8702 for (
auto N :
C->all_num_lists())
8704 for (
auto N :
C->all_lists_sizes())
8706 for (
auto &M :
C->all_components()) {
8707 Record.AddStmt(M.getAssociatedExpression());
8708 Record.AddDeclRef(M.getAssociatedDeclaration());
8712void OMPClauseWriter::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *
C) {
8713 Record.push_back(
C->varlist_size());
8714 Record.push_back(
C->getUniqueDeclarationsNum());
8715 Record.push_back(
C->getTotalComponentListNum());
8716 Record.push_back(
C->getTotalComponentsNum());
8717 Record.AddSourceLocation(
C->getLParenLoc());
8718 for (
auto *E :
C->varlist())
8720 for (
auto *D :
C->all_decls())
8722 for (
auto N :
C->all_num_lists())
8724 for (
auto N :
C->all_lists_sizes())
8726 for (
auto &M :
C->all_components()) {
8727 Record.AddStmt(M.getAssociatedExpression());
8728 Record.AddDeclRef(M.getAssociatedDeclaration());
8732void OMPClauseWriter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *
C) {
8733 Record.push_back(
C->varlist_size());
8734 Record.push_back(
C->getUniqueDeclarationsNum());
8735 Record.push_back(
C->getTotalComponentListNum());
8736 Record.push_back(
C->getTotalComponentsNum());
8737 Record.AddSourceLocation(
C->getLParenLoc());
8738 for (
auto *E :
C->varlist())
8740 for (
auto *D :
C->all_decls())
8742 for (
auto N :
C->all_num_lists())
8744 for (
auto N :
C->all_lists_sizes())
8746 for (
auto &M :
C->all_components()) {
8747 Record.AddStmt(M.getAssociatedExpression());
8748 Record.AddDeclRef(M.getAssociatedDeclaration());
8752void OMPClauseWriter::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *
C) {
8753 Record.push_back(
C->varlist_size());
8754 Record.push_back(
C->getUniqueDeclarationsNum());
8755 Record.push_back(
C->getTotalComponentListNum());
8756 Record.push_back(
C->getTotalComponentsNum());
8757 Record.AddSourceLocation(
C->getLParenLoc());
8758 for (
auto *E :
C->varlist())
8760 for (
auto *D :
C->all_decls())
8762 for (
auto N :
C->all_num_lists())
8764 for (
auto N :
C->all_lists_sizes())
8766 for (
auto &M :
C->all_components()) {
8767 Record.AddStmt(M.getAssociatedExpression());
8768 Record.AddDeclRef(M.getAssociatedDeclaration());
8772void OMPClauseWriter::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {}
8774void OMPClauseWriter::VisitOMPUnifiedSharedMemoryClause(
8775 OMPUnifiedSharedMemoryClause *) {}
8777void OMPClauseWriter::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {}
8780OMPClauseWriter::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) {
8783void OMPClauseWriter::VisitOMPAtomicDefaultMemOrderClause(
8784 OMPAtomicDefaultMemOrderClause *
C) {
8785 Record.push_back(
C->getAtomicDefaultMemOrderKind());
8786 Record.AddSourceLocation(
C->getLParenLoc());
8787 Record.AddSourceLocation(
C->getAtomicDefaultMemOrderKindKwLoc());
8790void OMPClauseWriter::VisitOMPSelfMapsClause(OMPSelfMapsClause *) {}
8792void OMPClauseWriter::VisitOMPAtClause(OMPAtClause *
C) {
8793 Record.push_back(
C->getAtKind());
8794 Record.AddSourceLocation(
C->getLParenLoc());
8795 Record.AddSourceLocation(
C->getAtKindKwLoc());
8798void OMPClauseWriter::VisitOMPSeverityClause(OMPSeverityClause *
C) {
8799 Record.push_back(
C->getSeverityKind());
8800 Record.AddSourceLocation(
C->getLParenLoc());
8801 Record.AddSourceLocation(
C->getSeverityKindKwLoc());
8804void OMPClauseWriter::VisitOMPMessageClause(OMPMessageClause *
C) {
8805 VisitOMPClauseWithPreInit(
C);
8806 Record.AddStmt(
C->getMessageString());
8807 Record.AddSourceLocation(
C->getLParenLoc());
8810void OMPClauseWriter::VisitOMPNontemporalClause(OMPNontemporalClause *
C) {
8811 Record.push_back(
C->varlist_size());
8812 Record.AddSourceLocation(
C->getLParenLoc());
8813 for (
auto *
VE :
C->varlist())
8815 for (
auto *E :
C->private_refs())
8819void OMPClauseWriter::VisitOMPInclusiveClause(OMPInclusiveClause *
C) {
8820 Record.push_back(
C->varlist_size());
8821 Record.AddSourceLocation(
C->getLParenLoc());
8822 for (
auto *
VE :
C->varlist())
8826void OMPClauseWriter::VisitOMPExclusiveClause(OMPExclusiveClause *
C) {
8827 Record.push_back(
C->varlist_size());
8828 Record.AddSourceLocation(
C->getLParenLoc());
8829 for (
auto *
VE :
C->varlist())
8833void OMPClauseWriter::VisitOMPOrderClause(OMPOrderClause *
C) {
8834 Record.writeEnum(
C->getKind());
8835 Record.writeEnum(
C->getModifier());
8836 Record.AddSourceLocation(
C->getLParenLoc());
8837 Record.AddSourceLocation(
C->getKindKwLoc());
8838 Record.AddSourceLocation(
C->getModifierKwLoc());
8841void OMPClauseWriter::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *
C) {
8842 Record.push_back(
C->getNumberOfAllocators());
8843 Record.AddSourceLocation(
C->getLParenLoc());
8844 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
8845 OMPUsesAllocatorsClause::Data
Data =
C->getAllocatorData(I);
8853void OMPClauseWriter::VisitOMPAffinityClause(OMPAffinityClause *
C) {
8854 Record.push_back(
C->varlist_size());
8855 Record.AddSourceLocation(
C->getLParenLoc());
8856 Record.AddStmt(
C->getModifier());
8857 Record.AddSourceLocation(
C->getColonLoc());
8858 for (
Expr *E :
C->varlist())
8862void OMPClauseWriter::VisitOMPBindClause(OMPBindClause *
C) {
8863 Record.writeEnum(
C->getBindKind());
8864 Record.AddSourceLocation(
C->getLParenLoc());
8865 Record.AddSourceLocation(
C->getBindKindLoc());
8868void OMPClauseWriter::VisitOMPXDynCGroupMemClause(OMPXDynCGroupMemClause *
C) {
8869 VisitOMPClauseWithPreInit(
C);
8871 Record.AddSourceLocation(
C->getLParenLoc());
8874void OMPClauseWriter::VisitOMPDynGroupprivateClause(
8875 OMPDynGroupprivateClause *
C) {
8876 VisitOMPClauseWithPreInit(
C);
8877 Record.push_back(
C->getDynGroupprivateModifier());
8878 Record.push_back(
C->getDynGroupprivateFallbackModifier());
8880 Record.AddSourceLocation(
C->getLParenLoc());
8881 Record.AddSourceLocation(
C->getDynGroupprivateModifierLoc());
8882 Record.AddSourceLocation(
C->getDynGroupprivateFallbackModifierLoc());
8885void OMPClauseWriter::VisitOMPDoacrossClause(OMPDoacrossClause *
C) {
8886 Record.push_back(
C->varlist_size());
8887 Record.push_back(
C->getNumLoops());
8888 Record.AddSourceLocation(
C->getLParenLoc());
8889 Record.push_back(
C->getDependenceType());
8890 Record.AddSourceLocation(
C->getDependenceLoc());
8891 Record.AddSourceLocation(
C->getColonLoc());
8892 for (
auto *
VE :
C->varlist())
8894 for (
unsigned I = 0, E =
C->getNumLoops(); I < E; ++I)
8895 Record.AddStmt(
C->getLoopData(I));
8898void OMPClauseWriter::VisitOMPXAttributeClause(OMPXAttributeClause *
C) {
8899 Record.AddAttributes(
C->getAttrs());
8900 Record.AddSourceLocation(
C->getBeginLoc());
8901 Record.AddSourceLocation(
C->getLParenLoc());
8902 Record.AddSourceLocation(
C->getEndLoc());
8905void OMPClauseWriter::VisitOMPXBareClause(OMPXBareClause *
C) {}
8909 for (
const auto &
Set : TI->
Sets) {
8916 writeExprRef(
Selector.ScoreOrCondition);
8930 for (
unsigned I = 0, E =
Data->getNumClauses(); I < E; ++I)
8932 if (
Data->hasAssociatedStmt())
8934 for (
unsigned I = 0, E =
Data->getNumChildren(); I < E; ++I)
8940 for (
Expr *E :
C->getVarList())
8946 for (
Expr *E : Exprs)
8955 switch (
C->getClauseKind()) {
8965 AddStmt(
const_cast<Expr*
>(IC->getConditionExpr()));
8972 if (SC->isConditionExprClause()) {
8974 if (SC->hasConditionExpr())
8975 AddStmt(
const_cast<Expr *
>(SC->getConditionExpr()));
8978 for (
Expr *E : SC->getVarList())
8987 for (
Expr *E : NGC->getIntExprs())
9021 static_assert(
sizeof(R) == 1 *
sizeof(
int *));
9044 static_assert(
sizeof(R) == 2 *
sizeof(
int *));
9132 if (AC->hasIntExpr())
9140 if (
Expr *DNE = WC->getDevNumExpr())
9154 if (Arg.getIdentifierInfo())
9173 for (
auto &CombinerRecipe : R.CombinerRecipes) {
9201 for (
Expr *E : TC->getSizeExprs())
9209 for (
unsigned I = 0; I < GC->getNumExprs(); ++I) {
9211 AddStmt(
const_cast<Expr *
>(GC->getExpr(I).second));
9219 if (WC->hasIntExpr())
9227 if (VC->hasIntExpr())
9248 if (BC->isStringArgument())
9257 llvm_unreachable(
"Clause serialization not yet implemented");
9259 llvm_unreachable(
"Invalid Clause Kind");
9268 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 unsigned getNumberOfModules(Module *Mod)
Compute the number of modules within the given tree (including the given module).
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.
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 * { ... }).
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
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.
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
llvm::SmallSetVector< Module *, 2 > AffectingClangModules
The set of top-level modules that affected the compilation of this module, but were not imported.
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.
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...
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.
llvm::DenseMap< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
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_METADATA
Metadata for submodules as a whole.
@ SUBMODULE_REQUIRES
Specifies a required feature.
@ SUBMODULE_PRIVATE_HEADER
Specifies a header that is private to this submodule.
@ SUBMODULE_IMPORTS
Specifies the submodules that are imported by this submodule.
@ SUBMODULE_CONFLICT
Specifies a conflict with another module.
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_DEFINITION
Defines the major attributes of a submodule, including its name and parent.
@ SUBMODULE_LINK_LIBRARY
Specifies a library or framework to link against.
@ SUBMODULE_CONFIG_MACRO
Specifies a configuration macro for this module.
@ SUBMODULE_EXPORTS
Specifies the submodules that are re-exported from this submodule.
@ SUBMODULE_TEXTUAL_HEADER
Specifies a header that is part of the module but must be textually included.
@ SUBMODULE_AFFECTING_MODULES
Specifies affecting modules that were not imported.
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.
@ 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.
@ Result
The result type of a method or function.
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