24#include "llvm/Bitstream/BitstreamWriter.h"
25#include "llvm/Support/ErrorHandling.h"
28using namespace serialization;
38template <
typename DT>
bool isDefinitionInDependentContext(DT *
D) {
39 return D->isDependentContext() &&
D->isThisDeclarationADefinition();
56 bool GeneratingReducedBMI =
false;
62 Code((serialization::
DeclCode)0), AbbrevToUse(0),
63 GeneratingReducedBMI(GeneratingReducedBMI) {}
67 llvm::report_fatal_error(StringRef(
"unexpected declaration kind '") +
69 return Record.Emit(Code, AbbrevToUse);
188 for (
auto *typeParam : *typeParams) {
189 Record.AddDeclRef(typeParam);
198 const Decl *
D,
bool IncludeLocal,
199 llvm::MapVector<ModuleFile *, const Decl *> &Firsts) {
203 if (R->isFromASTFile())
205 else if (IncludeLocal)
214 llvm::MapVector<ModuleFile *, const Decl *> Firsts;
217 for (
const auto &F : Firsts)
218 Record.AddDeclRef(F.second);
228 assert((isa<ClassTemplateSpecializationDecl>(
D) ||
229 isa<VarTemplateSpecializationDecl>(
D) || isa<FunctionDecl>(
D)) &&
230 "Must not be called with other decls");
231 llvm::MapVector<ModuleFile *, const Decl *> Firsts;
234 for (
const auto &F : Firsts) {
237 PartialSpecsInMap.push_back(F.second);
239 SpecsInMap.push_back(F.second);
244 template <
typename EntryType>
253 return Common->PartialSpecializations;
260 template<
typename DeclTy>
262 auto *Common =
D->getCommonPtr();
267 if (Writer.Chain !=
Record.getASTContext().getExternalSource() &&
269 D->LoadLazySpecializations();
276 for (
auto &Entry : Common->Specializations)
283 for (
auto *
D : AllSpecs) {
288 Record.AddOffset(Writer.WriteSpecializationInfoLookupTable(
292 if (isa<FunctionTemplateDecl>(
D)) {
293 assert(PartialSpecs.empty());
297 Record.AddOffset(Writer.WriteSpecializationInfoLookupTable(
298 D, PartialSpecs,
true));
321 Writer.PartialSpecializationsUpdates[cast<NamedDecl>(Template)]
324 Writer.SpecializationsUpdates[cast<NamedDecl>(Template)].push_back(
331 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
332 if (FD->isInlined() || FD->isConstexpr())
335 if (FD->isDependentContext())
342 if (
auto *VD = dyn_cast<VarDecl>(
D)) {
343 if (!VD->getDeclContext()->getRedeclContext()->isFileContext() ||
344 VD->isInline() || VD->isConstexpr() || isa<ParmVarDecl>(VD) ||
348 VD->hasConstantInitialization())
364 if (
auto *DD = dyn_cast<DeclaratorDecl>(
D)) {
365 if (
auto *TInfo = DD->getTypeSourceInfo())
366 Record.AddTypeLoc(TInfo->getTypeLoc());
372 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
374 Record.push_back(FD->doesThisDeclarationHaveABody());
375 if (FD->doesThisDeclarationHaveABody())
376 Record.AddFunctionDefinition(FD);
385 if (
auto *VD = dyn_cast<VarDecl>(
D)) {
387 Record.AddVarDeclInit(VD);
394 if (
auto *FD = dyn_cast<FieldDecl>(
D)) {
395 if (FD->hasInClassInitializer()) {
396 if (
Expr *
Init = FD->getInClassInitializer()) {
409 if (
auto *DC = dyn_cast<DeclContext>(
D))
434 Record.push_back(DeclBits);
455 while (
auto *NS = dyn_cast<NamespaceDecl>(DC->getRedeclContext())) {
456 if (!NS->isFromASTFile())
458 Writer.UpdatedDeclContexts.insert(NS->getPrimaryContext());
459 if (!NS->isInlineNamespace())
461 DC = NS->getParent();
467 StringRef Arg =
D->getArg();
468 Record.push_back(Arg.size());
471 Record.push_back(
D->getCommentKind());
478 StringRef Name =
D->getName();
479 StringRef
Value =
D->getValue();
489 llvm_unreachable(
"Translation units aren't directly serialized");
494 Record.AddDeclarationName(
D->getDeclName());
509 Record.AddTypeSourceInfo(
D->getTypeSourceInfo());
510 Record.push_back(
D->isModed());
512 Record.AddTypeRef(
D->getUnderlyingType());
513 Record.AddDeclRef(
D->getAnonDeclWithTypedefName(
false));
534 Record.AddDeclRef(
D->getDescribedAliasTemplate());
540 "You need to update the serializer after you change the "
548 TagDeclBits.
addBits(llvm::to_underlying(
D->getTagKind()), 3);
549 TagDeclBits.
addBit(!isa<CXXRecordDecl>(
D) ?
D->isCompleteDefinition() : 0);
550 TagDeclBits.
addBit(
D->isEmbeddedInDeclarator());
551 TagDeclBits.
addBit(
D->isFreeStanding());
552 TagDeclBits.
addBit(
D->isCompleteDefinitionRequired());
554 D->hasExtInfo() ? 1 : (
D->getTypedefNameForAnonDecl() ? 2 : 0),
556 Record.push_back(TagDeclBits);
558 Record.AddSourceRange(
D->getBraceRange());
560 if (
D->hasExtInfo()) {
561 Record.AddQualifierInfo(*
D->getExtInfo());
562 }
else if (
auto *TD =
D->getTypedefNameForAnonDecl()) {
564 Record.AddIdentifierRef(TD->getDeclName().getAsIdentifierInfo());
570 "You need to update the serializer after you change the "
574 Record.AddTypeSourceInfo(
D->getIntegerTypeSourceInfo());
575 if (!
D->getIntegerTypeSourceInfo())
576 Record.AddTypeRef(
D->getIntegerType());
577 Record.AddTypeRef(
D->getPromotionType());
580 EnumDeclBits.
addBits(
D->getNumPositiveBits(), 8);
581 EnumDeclBits.
addBits(
D->getNumNegativeBits(), 8);
582 EnumDeclBits.
addBit(
D->isScoped());
583 EnumDeclBits.
addBit(
D->isScopedUsingClassTag());
584 EnumDeclBits.
addBit(
D->isFixed());
585 Record.push_back(EnumDeclBits);
587 Record.push_back(
D->getODRHash());
590 Record.AddDeclRef(MemberInfo->getInstantiatedFrom());
591 Record.push_back(MemberInfo->getTemplateSpecializationKind());
592 Record.AddSourceLocation(MemberInfo->getPointOfInstantiation());
594 Record.AddDeclRef(
nullptr);
599 !
D->getTypedefNameForAnonDecl() &&
603 !
D->getIntegerTypeSourceInfo() && !
D->getMemberSpecializationInfo() &&
613 "You need to update the serializer after you change the "
619 RecordDeclBits.
addBit(
D->hasFlexibleArrayMember());
620 RecordDeclBits.
addBit(
D->isAnonymousStructOrUnion());
621 RecordDeclBits.
addBit(
D->hasObjectMember());
622 RecordDeclBits.
addBit(
D->hasVolatileMember());
623 RecordDeclBits.
addBit(
D->isNonTrivialToPrimitiveDefaultInitialize());
624 RecordDeclBits.
addBit(
D->isNonTrivialToPrimitiveCopy());
625 RecordDeclBits.
addBit(
D->isNonTrivialToPrimitiveDestroy());
626 RecordDeclBits.
addBit(
D->hasNonTrivialToPrimitiveDefaultInitializeCUnion());
627 RecordDeclBits.
addBit(
D->hasNonTrivialToPrimitiveDestructCUnion());
628 RecordDeclBits.
addBit(
D->hasNonTrivialToPrimitiveCopyCUnion());
629 RecordDeclBits.
addBit(
D->hasUninitializedExplicitInitFields());
630 RecordDeclBits.
addBit(
D->isParamDestroyedInCallee());
631 RecordDeclBits.
addBits(llvm::to_underlying(
D->getArgPassingRestrictions()), 2);
632 Record.push_back(RecordDeclBits);
636 if (!isa<CXXRecordDecl>(
D))
637 Record.push_back(
D->getODRHash());
641 !
D->getTypedefNameForAnonDecl() &&
654 Record.AddTypeRef(
D->getType());
659 Record.push_back(
D->getInitExpr()? 1 : 0);
660 if (
D->getInitExpr())
661 Record.AddStmt(
D->getInitExpr());
662 Record.AddAPSInt(
D->getInitVal());
669 Record.AddSourceLocation(
D->getInnerLocStart());
670 Record.push_back(
D->hasExtInfo());
671 if (
D->hasExtInfo()) {
672 DeclaratorDecl::ExtInfo *Info =
D->getExtInfo();
673 Record.AddQualifierInfo(*Info);
674 Record.AddStmt(Info->TrailingRequiresClause);
677 Record.AddTypeRef(
D->getTypeSourceInfo() ?
D->getTypeSourceInfo()->getType()
683 "You need to update the serializer after you change the "
688 Record.push_back(
D->getTemplatedKind());
689 switch (
D->getTemplatedKind()) {
693 Record.AddDeclRef(
D->getInstantiatedFromDecl());
696 Record.AddDeclRef(
D->getDescribedFunctionTemplate());
707 FTSInfo =
D->getTemplateSpecializationInfo();
720 Record.AddASTTemplateArgumentListInfo(
728 Record.AddDeclRef(MemberInfo->getInstantiatedFrom());
729 Record.push_back(MemberInfo->getTemplateSpecializationKind());
730 Record.AddSourceLocation(MemberInfo->getPointOfInstantiation());
744 DFTSInfo =
D->getDependentSpecializationInfo();
754 Record.AddASTTemplateArgumentListInfo(
761 Record.AddDeclarationNameLoc(
D->DNLoc,
D->getDeclName());
769 FunctionDeclBits.
addBits(llvm::to_underlying(
D->getLinkageInternal()), 3);
770 FunctionDeclBits.
addBits((uint32_t)
D->getStorageClass(), 3);
771 FunctionDeclBits.
addBit(
D->isInlineSpecified());
772 FunctionDeclBits.
addBit(
D->isInlined());
773 FunctionDeclBits.
addBit(
D->hasSkippedBody());
774 FunctionDeclBits.
addBit(
D->isVirtualAsWritten());
775 FunctionDeclBits.
addBit(
D->isPureVirtual());
776 FunctionDeclBits.
addBit(
D->hasInheritedPrototype());
777 FunctionDeclBits.
addBit(
D->hasWrittenPrototype());
778 FunctionDeclBits.
addBit(
D->isDeletedBit());
779 FunctionDeclBits.
addBit(
D->isTrivial());
780 FunctionDeclBits.
addBit(
D->isTrivialForCall());
781 FunctionDeclBits.
addBit(
D->isDefaulted());
782 FunctionDeclBits.
addBit(
D->isExplicitlyDefaulted());
783 FunctionDeclBits.
addBit(
D->isIneligibleOrNotSelected());
784 FunctionDeclBits.
addBits((uint64_t)(
D->getConstexprKind()), 2);
785 FunctionDeclBits.
addBit(
D->hasImplicitReturnZero());
786 FunctionDeclBits.
addBit(
D->isMultiVersion());
787 FunctionDeclBits.
addBit(
D->isLateTemplateParsed());
788 FunctionDeclBits.
addBit(
D->isInstantiatedFromMemberTemplate());
789 FunctionDeclBits.
addBit(
D->FriendConstraintRefersToEnclosingTemplate());
790 FunctionDeclBits.
addBit(
D->usesSEHTry());
791 Record.push_back(FunctionDeclBits);
794 if (
D->isExplicitlyDefaulted())
795 Record.AddSourceLocation(
D->getDefaultLoc());
797 Record.push_back(
D->getODRHash());
799 if (
D->isDefaulted() ||
D->isDeletedAsWritten()) {
800 if (
auto *FDI =
D->getDefalutedOrDeletedInfo()) {
804 Record.push_back(1 | (DeletedMessage ? 2 : 0));
806 Record.AddStmt(DeletedMessage);
808 Record.push_back(FDI->getUnqualifiedLookups().size());
810 Record.AddDeclRef(
P.getDecl());
811 Record.push_back(
P.getAccess());
822 if (
auto *RD = dyn_cast<CXXRecordDecl>(
D->getLexicalParent());
823 RD && isDefinitionInDependentContext(RD)) {
824 Writer.RelatedDeclsMap[Writer.
GetDeclRef(RD)].push_back(
829 Record.push_back(
D->param_size());
830 for (
auto *
P :
D->parameters())
837 uint64_t Kind =
static_cast<uint64_t
>(ES.
getKind());
838 Kind = Kind << 1 | static_cast<bool>(ES.
getExpr());
849 Record.push_back(
static_cast<unsigned char>(
D->getDeductionCandidateKind()));
850 Record.AddDeclRef(
D->getSourceDeductionGuide());
852 static_cast<unsigned char>(
D->getSourceDeductionGuideKind()));
858 "You need to update the serializer after you change the "
859 "ObjCMethodDeclBits");
864 bool HasBodyStuff =
D->
getBody() !=
nullptr;
865 Record.push_back(HasBodyStuff);
869 Record.AddDeclRef(
D->getSelfDecl());
870 Record.AddDeclRef(
D->getCmdDecl());
871 Record.push_back(
D->isInstanceMethod());
872 Record.push_back(
D->isVariadic());
873 Record.push_back(
D->isPropertyAccessor());
874 Record.push_back(
D->isSynthesizedAccessorStub());
875 Record.push_back(
D->isDefined());
876 Record.push_back(
D->isOverriding());
877 Record.push_back(
D->hasSkippedBody());
879 Record.push_back(
D->isRedeclaration());
880 Record.push_back(
D->hasRedeclaration());
881 if (
D->hasRedeclaration()) {
882 assert(
Record.getASTContext().getObjCMethodRedeclaration(
D));
883 Record.AddDeclRef(
Record.getASTContext().getObjCMethodRedeclaration(
D));
887 Record.push_back(llvm::to_underlying(
D->getImplementationControl()));
889 Record.push_back(
D->getObjCDeclQualifier());
890 Record.push_back(
D->hasRelatedResultType());
891 Record.AddTypeRef(
D->getReturnType());
892 Record.AddTypeSourceInfo(
D->getReturnTypeSourceInfo());
894 Record.push_back(
D->param_size());
895 for (
const auto *
P :
D->parameters())
898 Record.push_back(
D->getSelLocsKind());
899 unsigned NumStoredSelLocs =
D->getNumStoredSelLocs();
901 Record.push_back(NumStoredSelLocs);
902 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
903 Record.AddSourceLocation(SelLocs[i]);
912 Record.AddSourceLocation(
D->VarianceLoc);
913 Record.AddSourceLocation(
D->ColonLoc);
920 "You need to update the serializer after you change the "
921 "ObjCContainerDeclBits");
924 Record.AddSourceLocation(
D->getAtStartLoc());
925 Record.AddSourceRange(
D->getAtEndRange());
935 Record.push_back(
D->isThisDeclarationADefinition());
936 if (
D->isThisDeclarationADefinition()) {
938 ObjCInterfaceDecl::DefinitionData &
Data =
D->data();
940 Record.AddTypeSourceInfo(
D->getSuperClassTInfo());
941 Record.AddSourceLocation(
D->getEndOfDefinitionLoc());
942 Record.push_back(
Data.HasDesignatedInitializers);
943 Record.push_back(
D->getODRHash());
946 Record.push_back(
Data.ReferencedProtocols.size());
947 for (
const auto *
P :
D->protocols())
949 for (
const auto &PL :
D->protocol_locs())
950 Record.AddSourceLocation(PL);
953 Record.push_back(
Data.AllReferencedProtocols.size());
955 P =
Data.AllReferencedProtocols.begin(),
956 PEnd =
Data.AllReferencedProtocols.end();
963 Writer.ObjCClassesWithCategories.insert(
D);
966 for (; Cat; Cat = Cat->getNextClassCategoryRaw())
977 Record.push_back(
D->getAccessControl());
978 Record.push_back(
D->getSynthesize());
999 Record.push_back(
D->isThisDeclarationADefinition());
1000 if (
D->isThisDeclarationADefinition()) {
1001 Record.push_back(
D->protocol_size());
1002 for (
const auto *I :
D->protocols())
1004 for (
const auto &PL :
D->protocol_locs())
1005 Record.AddSourceLocation(PL);
1006 Record.push_back(
D->getODRHash());
1019 Record.AddSourceLocation(
D->getCategoryNameLoc());
1020 Record.AddSourceLocation(
D->getIvarLBraceLoc());
1021 Record.AddSourceLocation(
D->getIvarRBraceLoc());
1022 Record.AddDeclRef(
D->getClassInterface());
1024 Record.push_back(
D->protocol_size());
1025 for (
const auto *I :
D->protocols())
1027 for (
const auto &PL :
D->protocol_locs())
1028 Record.AddSourceLocation(PL);
1034 Record.AddDeclRef(
D->getClassInterface());
1040 Record.AddSourceLocation(
D->getAtLoc());
1041 Record.AddSourceLocation(
D->getLParenLoc());
1042 Record.AddTypeRef(
D->getType());
1043 Record.AddTypeSourceInfo(
D->getTypeSourceInfo());
1045 Record.push_back((
unsigned)
D->getPropertyAttributes());
1046 Record.push_back((
unsigned)
D->getPropertyAttributesAsWritten());
1048 Record.push_back((
unsigned)
D->getPropertyImplementation());
1049 Record.AddDeclarationName(
D->getGetterName());
1050 Record.AddSourceLocation(
D->getGetterNameLoc());
1051 Record.AddDeclarationName(
D->getSetterName());
1052 Record.AddSourceLocation(
D->getSetterNameLoc());
1053 Record.AddDeclRef(
D->getGetterMethodDecl());
1054 Record.AddDeclRef(
D->getSetterMethodDecl());
1055 Record.AddDeclRef(
D->getPropertyIvarDecl());
1061 Record.AddDeclRef(
D->getClassInterface());
1067 Record.AddSourceLocation(
D->getCategoryNameLoc());
1073 Record.AddDeclRef(
D->getSuperClass());
1074 Record.AddSourceLocation(
D->getSuperClassLoc());
1075 Record.AddSourceLocation(
D->getIvarLBraceLoc());
1076 Record.AddSourceLocation(
D->getIvarRBraceLoc());
1077 Record.push_back(
D->hasNonZeroConstructors());
1078 Record.push_back(
D->hasDestructors());
1079 Record.push_back(
D->NumIvarInitializers);
1080 if (
D->NumIvarInitializers)
1081 Record.AddCXXCtorInitializers(
1089 Record.AddDeclRef(
D->getPropertyDecl());
1090 Record.AddDeclRef(
D->getPropertyIvarDecl());
1091 Record.AddSourceLocation(
D->getPropertyIvarDeclLoc());
1092 Record.AddDeclRef(
D->getGetterMethodDecl());
1093 Record.AddDeclRef(
D->getSetterMethodDecl());
1094 Record.AddStmt(
D->getGetterCXXConstructor());
1095 Record.AddStmt(
D->getSetterCXXAssignment());
1101 Record.push_back(
D->isMutable());
1103 Record.push_back((
D->StorageKind << 1) |
D->BitField);
1104 if (
D->StorageKind == FieldDecl::ISK_CapturedVLAType)
1106 else if (
D->BitField)
1107 Record.AddStmt(
D->getBitWidth());
1109 if (!
D->getDeclName() ||
D->isPlaceholderVar(Writer.
getLangOpts()))
1111 Record.getASTContext().getInstantiatedFromUnnamedFieldDecl(
D));
1121 !
D->getBitWidth() &&
1122 !
D->hasInClassInitializer() &&
1123 !
D->hasCapturedVLAType() &&
1135 Record.AddIdentifierRef(
D->getGetterId());
1136 Record.AddIdentifierRef(
D->getSetterId());
1153 Record.AddAPValue(
D->getValue());
1159 Record.AddAPValue(
D->getValue());
1165 Record.push_back(
D->getChainingSize());
1167 for (
const auto *
P :
D->chain())
1180 VarDeclBits.
addBits(llvm::to_underlying(
D->getLinkageInternal()),
1183 bool ModulesCodegen =
false;
1184 if (Writer.WritingModule &&
D->getStorageDuration() ==
SD_Static &&
1185 !
D->getDescribedVarTemplate()) {
1192 Writer.
getLangOpts().BuildingPCHWithObjectFile)) &&
1193 Record.getASTContext().GetGVALinkageForVariable(
D) >=
1196 VarDeclBits.
addBit(ModulesCodegen);
1198 VarDeclBits.
addBits(
D->getStorageClass(), 3);
1199 VarDeclBits.
addBits(
D->getTSCSpec(), 2);
1200 VarDeclBits.
addBits(
D->getInitStyle(), 2);
1201 VarDeclBits.
addBit(
D->isARCPseudoStrong());
1203 bool HasDeducedType =
false;
1204 if (!isa<ParmVarDecl>(
D)) {
1205 VarDeclBits.
addBit(
D->isThisDeclarationADemotedDefinition());
1206 VarDeclBits.
addBit(
D->isExceptionVariable());
1207 VarDeclBits.
addBit(
D->isNRVOVariable());
1208 VarDeclBits.
addBit(
D->isCXXForRangeDecl());
1210 VarDeclBits.
addBit(
D->isInline());
1211 VarDeclBits.
addBit(
D->isInlineSpecified());
1212 VarDeclBits.
addBit(
D->isConstexpr());
1213 VarDeclBits.
addBit(
D->isInitCapture());
1214 VarDeclBits.
addBit(
D->isPreviousDeclInSameBlockScope());
1216 VarDeclBits.
addBit(
D->isEscapingByref());
1217 HasDeducedType =
D->getType()->getContainedDeducedType();
1218 VarDeclBits.
addBit(HasDeducedType);
1220 if (
const auto *IPD = dyn_cast<ImplicitParamDecl>(
D))
1221 VarDeclBits.
addBits(llvm::to_underlying(IPD->getParameterKind()),
1226 VarDeclBits.
addBit(
D->isObjCForDecl());
1229 Record.push_back(VarDeclBits);
1237 if (
Init.getCopyExpr())
1242 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1245 Record.push_back(VarTemplate);
1246 Record.AddDeclRef(TemplD);
1248 =
D->getMemberSpecializationInfo()) {
1249 Record.push_back(StaticDataMemberSpecialization);
1250 Record.AddDeclRef(SpecInfo->getInstantiatedFrom());
1251 Record.push_back(SpecInfo->getTemplateSpecializationKind());
1252 Record.AddSourceLocation(SpecInfo->getPointOfInstantiation());
1254 Record.push_back(VarNotTemplate);
1262 D->
getKind() == Decl::Var && !
D->isInline() && !
D->isConstexpr() &&
1263 !
D->isInitCapture() && !
D->isPreviousDeclInSameBlockScope() &&
1264 !
D->isEscapingByref() && !HasDeducedType &&
1265 D->getStorageDuration() !=
SD_Static && !
D->getDescribedVarTemplate() &&
1266 !
D->getMemberSpecializationInfo() && !
D->isObjCForDecl() &&
1267 !isa<ImplicitParamDecl>(
D) && !
D->isEscapingByref())
1284 Record.push_back(
D->getFunctionScopeIndex());
1287 ParmVarDeclBits.
addBit(
D->isObjCMethodParameter());
1288 ParmVarDeclBits.
addBits(
D->getFunctionScopeDepth(), 7);
1290 ParmVarDeclBits.
addBits(
D->getObjCDeclQualifier(), 7);
1291 ParmVarDeclBits.
addBit(
D->isKNRPromoted());
1292 ParmVarDeclBits.
addBit(
D->hasInheritedDefaultArg());
1293 ParmVarDeclBits.
addBit(
D->hasUninstantiatedDefaultArg());
1294 ParmVarDeclBits.
addBit(
D->getExplicitObjectParamThisLoc().isValid());
1295 Record.push_back(ParmVarDeclBits);
1297 if (
D->hasUninstantiatedDefaultArg())
1298 Record.AddStmt(
D->getUninstantiatedDefaultArg());
1299 if (
D->getExplicitObjectParamThisLoc().isValid())
1300 Record.AddSourceLocation(
D->getExplicitObjectParamThisLoc());
1310 D->getInit() ==
nullptr)
1315 assert(!
D->getTSCSpec() &&
"PARM_VAR_DECL can't use TLS");
1316 assert(!
D->isThisDeclarationADemotedDefinition()
1317 &&
"PARM_VAR_DECL can't be demoted definition.");
1319 assert(!
D->isExceptionVariable() &&
"PARM_VAR_DECL can't be exception var");
1320 assert(
D->
getPreviousDecl() ==
nullptr &&
"PARM_VAR_DECL can't be redecl");
1321 assert(!
D->isStaticDataMember() &&
1322 "PARM_VAR_DECL can't be static data member");
1327 Record.push_back(
D->bindings().size());
1330 for (
auto *B :
D->bindings())
1337 Record.AddStmt(
D->getBinding());
1343 Record.AddStmt(
D->getAsmString());
1344 Record.AddSourceLocation(
D->getRParenLoc());
1362 Record.AddDeclRef(
D->getExtendingDecl());
1363 Record.AddStmt(
D->getTemporaryExpr());
1364 Record.push_back(
static_cast<bool>(
D->getValue()));
1366 Record.AddAPValue(*
D->getValue());
1367 Record.push_back(
D->getManglingNumber());
1373 Record.AddTypeSourceInfo(
D->getSignatureAsWritten());
1374 Record.push_back(
D->param_size());
1377 Record.push_back(
D->isVariadic());
1378 Record.push_back(
D->blockMissingReturnType());
1379 Record.push_back(
D->isConversionFromLambda());
1380 Record.push_back(
D->doesNotEscape());
1381 Record.push_back(
D->canAvoidCopyToHeap());
1382 Record.push_back(
D->capturesCXXThis());
1383 Record.push_back(
D->getNumCaptures());
1384 for (
const auto &capture :
D->captures()) {
1385 Record.AddDeclRef(capture.getVariable());
1388 if (capture.isByRef()) flags |= 1;
1389 if (capture.isNested()) flags |= 2;
1390 if (capture.hasCopyExpr()) flags |= 4;
1393 if (capture.hasCopyExpr())
Record.AddStmt(capture.getCopyExpr());
1400 Record.push_back(
D->getNumParams());
1402 for (
unsigned I = 0; I <
D->getNumParams(); ++I)
1403 Record.AddDeclRef(
D->getParam(I));
1404 Record.push_back(
D->isNothrow() ? 1 : 0);
1422 "You need to update the serializer after you change the"
1423 "LinkageSpecDeclBits");
1426 Record.push_back(llvm::to_underlying(
D->getLanguage()));
1427 Record.AddSourceLocation(
D->getExternLoc());
1428 Record.AddSourceLocation(
D->getRBraceLoc());
1434 Record.AddSourceLocation(
D->getRBraceLoc());
1450 NamespaceDeclBits.
addBit(
D->isInline());
1451 NamespaceDeclBits.
addBit(
D->isNested());
1452 Record.push_back(NamespaceDeclBits);
1455 Record.AddSourceLocation(
D->getRBraceLoc());
1458 Record.AddDeclRef(
D->getAnonymousNamespace());
1461 if (Writer.
hasChain() &&
D->isAnonymousNamespace() &&
1468 D->getParent()->getRedeclContext()->getPrimaryContext());
1469 if (
Parent->isFromASTFile() || isa<TranslationUnitDecl>(
Parent)) {
1470 Writer.DeclUpdates[
Parent].push_back(
1479 Record.AddSourceLocation(
D->getNamespaceLoc());
1480 Record.AddSourceLocation(
D->getTargetNameLoc());
1481 Record.AddNestedNameSpecifierLoc(
D->getQualifierLoc());
1482 Record.AddDeclRef(
D->getNamespace());
1488 Record.AddSourceLocation(
D->getUsingLoc());
1489 Record.AddNestedNameSpecifierLoc(
D->getQualifierLoc());
1490 Record.AddDeclarationNameLoc(
D->DNLoc,
D->getDeclName());
1491 Record.AddDeclRef(
D->FirstUsingShadow.getPointer());
1492 Record.push_back(
D->hasTypename());
1493 Record.AddDeclRef(
Record.getASTContext().getInstantiatedFromUsingDecl(
D));
1499 Record.AddSourceLocation(
D->getUsingLoc());
1500 Record.AddSourceLocation(
D->getEnumLoc());
1501 Record.AddTypeSourceInfo(
D->getEnumType());
1502 Record.AddDeclRef(
D->FirstUsingShadow.getPointer());
1503 Record.AddDeclRef(
Record.getASTContext().getInstantiatedFromUsingEnumDecl(
D));
1508 Record.push_back(
D->NumExpansions);
1510 Record.AddDeclRef(
D->getInstantiatedFromUsingDecl());
1511 for (
auto *
E :
D->expansions())
1519 Record.AddDeclRef(
D->getTargetDecl());
1521 Record.AddDeclRef(
D->UsingOrNextShadow);
1523 Record.getASTContext().getInstantiatedFromUsingShadowDecl(
D));
1537 Record.AddDeclRef(
D->NominatedBaseClassShadowDecl);
1538 Record.AddDeclRef(
D->ConstructedBaseClassShadowDecl);
1539 Record.push_back(
D->IsVirtual);
1545 Record.AddSourceLocation(
D->getUsingLoc());
1546 Record.AddSourceLocation(
D->getNamespaceKeyLocation());
1547 Record.AddNestedNameSpecifierLoc(
D->getQualifierLoc());
1548 Record.AddDeclRef(
D->getNominatedNamespace());
1549 Record.AddDeclRef(dyn_cast<Decl>(
D->getCommonAncestor()));
1555 Record.AddSourceLocation(
D->getUsingLoc());
1556 Record.AddNestedNameSpecifierLoc(
D->getQualifierLoc());
1557 Record.AddDeclarationNameLoc(
D->DNLoc,
D->getDeclName());
1558 Record.AddSourceLocation(
D->getEllipsisLoc());
1565 Record.AddSourceLocation(
D->getTypenameLoc());
1566 Record.AddNestedNameSpecifierLoc(
D->getQualifierLoc());
1567 Record.AddSourceLocation(
D->getEllipsisLoc());
1581 CXXRecNotTemplate = 0,
1583 CXXRecMemberSpecialization,
1587 Record.push_back(CXXRecTemplate);
1588 Record.AddDeclRef(TemplD);
1590 =
D->getMemberSpecializationInfo()) {
1591 Record.push_back(CXXRecMemberSpecialization);
1592 Record.AddDeclRef(MSInfo->getInstantiatedFrom());
1593 Record.push_back(MSInfo->getTemplateSpecializationKind());
1594 Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
1595 }
else if (
D->isLambda()) {
1597 Record.push_back(CXXLambda);
1598 if (
auto *Context =
D->getLambdaContextDecl()) {
1599 Record.AddDeclRef(Context);
1600 Record.push_back(
D->getLambdaIndexInContext());
1606 if (
auto *FD = llvm::dyn_cast_or_null<FunctionDecl>(
D->
getDeclContext());
1607 FD && isDefinitionInDependentContext(FD)) {
1608 Writer.RelatedDeclsMap[Writer.
GetDeclRef(FD)].push_back(
1612 Record.push_back(CXXRecNotTemplate);
1615 Record.push_back(
D->isThisDeclarationADefinition());
1616 if (
D->isThisDeclarationADefinition())
1617 Record.AddCXXDefinitionData(
D);
1627 if (
D->isCompleteDefinition())
1628 Record.AddDeclRef(
Record.getASTContext().getCurrentKeyFunction(
D));
1636 Record.push_back(
D->size_overridden_methods());
1648 !
D->hasExtInfo() && !
D->isExplicitlyDefaulted()) {
1654 else if (
D->getTemplatedKind() ==
1657 D->getTemplateSpecializationInfo();
1666 }
else if (
D->getTemplatedKind() ==
1669 D->getDependentSpecializationInfo();
1680 "You need to update the serializer after you change the "
1681 "CXXConstructorDeclBits");
1683 Record.push_back(
D->getTrailingAllocKind());
1685 if (
auto Inherited =
D->getInheritedConstructor()) {
1686 Record.AddDeclRef(Inherited.getShadowDecl());
1687 Record.AddDeclRef(Inherited.getConstructor());
1697 Record.AddDeclRef(
D->getOperatorDelete());
1698 if (
D->getOperatorDelete())
1699 Record.AddStmt(
D->getOperatorDeleteThisArg());
1712 Record.push_back(Writer.getSubmoduleID(
D->getImportedModule()));
1714 Record.push_back(!IdentifierLocs.empty());
1715 if (IdentifierLocs.empty()) {
1719 for (
unsigned I = 0, N = IdentifierLocs.size(); I != N; ++I)
1720 Record.AddSourceLocation(IdentifierLocs[I]);
1721 Record.push_back(IdentifierLocs.size());
1730 Record.AddSourceLocation(
D->getColonLoc());
1737 Record.push_back(
D->NumTPLists);
1739 bool hasFriendDecl = isa<NamedDecl *>(
D->Friend);
1740 Record.push_back(hasFriendDecl);
1742 Record.AddDeclRef(
D->getFriendDecl());
1744 Record.AddTypeSourceInfo(
D->getFriendType());
1745 for (
unsigned i = 0; i <
D->NumTPLists; ++i)
1746 Record.AddTemplateParameterList(
D->getFriendTypeTemplateParameterList(i));
1747 Record.AddDeclRef(
D->getNextFriend());
1748 Record.push_back(
D->UnsupportedFriend);
1749 Record.AddSourceLocation(
D->FriendLoc);
1750 Record.AddSourceLocation(
D->EllipsisLoc);
1756 Record.push_back(
D->getNumTemplateParameters());
1757 for (
unsigned i = 0, e =
D->getNumTemplateParameters(); i != e; ++i)
1758 Record.AddTemplateParameterList(
D->getTemplateParameterList(i));
1759 Record.push_back(
D->getFriendDecl() !=
nullptr);
1760 if (
D->getFriendDecl())
1761 Record.AddDeclRef(
D->getFriendDecl());
1763 Record.AddTypeSourceInfo(
D->getFriendType());
1764 Record.AddSourceLocation(
D->getFriendLoc());
1771 Record.AddTemplateParameterList(
D->getTemplateParameters());
1772 Record.AddDeclRef(
D->getTemplatedDecl());
1777 Record.AddStmt(
D->getConstraintExpr());
1783 Record.push_back(
D->getTemplateArguments().size());
1786 Record.AddTemplateArgument(Arg);
1801 Record.AddDeclRef(
D->getInstantiatedFromMemberTemplate());
1802 if (
D->getInstantiatedFromMemberTemplate())
1803 Record.push_back(
D->isMemberSpecialization());
1820 Record.getASTContext().DeclarationNames.getCXXDeductionGuideName(
D);
1836 =
D->getSpecializedTemplateOrPartial();
1838 Record.AddDeclRef(InstFromD);
1840 Record.AddDeclRef(cast<ClassTemplatePartialSpecializationDecl *>(InstFrom));
1841 Record.AddTemplateArgumentList(&
D->getTemplateInstantiationArgs());
1844 Record.AddTemplateArgumentList(&
D->getTemplateArgs());
1845 Record.AddSourceLocation(
D->getPointOfInstantiation());
1846 Record.push_back(
D->getSpecializationKind());
1854 bool ExplicitInstantiation =
1855 D->getTemplateSpecializationKind() ==
1858 Record.push_back(ExplicitInstantiation);
1859 if (ExplicitInstantiation) {
1860 Record.AddSourceLocation(
D->getExternKeywordLoc());
1861 Record.AddSourceLocation(
D->getTemplateKeywordLoc());
1865 D->getTemplateArgsAsWritten();
1866 Record.push_back(!!ArgsWritten);
1868 Record.AddASTTemplateArgumentListInfo(ArgsWritten);
1877 Record.getASTContext().DeclarationNames.getCXXDeductionGuideName(
1878 D->getSpecializedTemplate());
1888 Record.AddTemplateParameterList(
D->getTemplateParameters());
1894 Record.AddDeclRef(
D->getInstantiatedFromMember());
1895 Record.push_back(
D->isMemberSpecialization());
1913 llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
1914 InstFrom =
D->getSpecializedTemplateOrPartial();
1916 Record.AddDeclRef(InstFromD);
1918 Record.AddDeclRef(cast<VarTemplatePartialSpecializationDecl *>(InstFrom));
1919 Record.AddTemplateArgumentList(&
D->getTemplateInstantiationArgs());
1922 bool ExplicitInstantiation =
1923 D->getTemplateSpecializationKind() ==
1926 Record.push_back(ExplicitInstantiation);
1927 if (ExplicitInstantiation) {
1928 Record.AddSourceLocation(
D->getExternKeywordLoc());
1929 Record.AddSourceLocation(
D->getTemplateKeywordLoc());
1933 D->getTemplateArgsAsWritten();
1934 Record.push_back(!!ArgsWritten);
1936 Record.AddASTTemplateArgumentListInfo(ArgsWritten);
1938 Record.AddTemplateArgumentList(&
D->getTemplateArgs());
1939 Record.AddSourceLocation(
D->getPointOfInstantiation());
1940 Record.push_back(
D->getSpecializationKind());
1941 Record.push_back(
D->IsCompleteDefinition);
1957 Record.AddTemplateParameterList(
D->getTemplateParameters());
1963 Record.AddDeclRef(
D->getInstantiatedFromMember());
1964 Record.push_back(
D->isMemberSpecialization());
1979 Record.push_back(
D->hasTypeConstraint());
1982 Record.push_back(
D->wasDeclaredWithTypename());
1985 if (
D->hasTypeConstraint())
1986 Record.push_back(TC !=
nullptr);
1989 Record.push_back(CR !=
nullptr);
1991 Record.AddConceptReference(CR);
1993 Record.push_back(
D->isExpandedParameterPack());
1994 if (
D->isExpandedParameterPack())
1995 Record.push_back(
D->getNumExpansionParameters());
1998 bool OwnsDefaultArg =
D->hasDefaultArgument() &&
1999 !
D->defaultArgumentWasInherited();
2000 Record.push_back(OwnsDefaultArg);
2002 Record.AddTemplateArgumentLoc(
D->getDefaultArgument());
2004 if (!
D->hasTypeConstraint() && !OwnsDefaultArg &&
2020 if (
D->isExpandedParameterPack())
2021 Record.push_back(
D->getNumExpansionTypes());
2025 Record.push_back(
D->getDepth());
2026 Record.push_back(
D->getPosition());
2030 if (
D->isExpandedParameterPack()) {
2031 for (
unsigned I = 0, N =
D->getNumExpansionTypes(); I != N; ++I) {
2032 Record.AddTypeRef(
D->getExpansionType(I));
2033 Record.AddTypeSourceInfo(
D->getExpansionTypeSourceInfo(I));
2040 bool OwnsDefaultArg =
D->hasDefaultArgument() &&
2041 !
D->defaultArgumentWasInherited();
2042 Record.push_back(OwnsDefaultArg);
2044 Record.AddTemplateArgumentLoc(
D->getDefaultArgument());
2053 if (
D->isExpandedParameterPack())
2054 Record.push_back(
D->getNumExpansionTemplateParameters());
2057 Record.push_back(
D->wasDeclaredWithTypename());
2059 Record.push_back(
D->getDepth());
2060 Record.push_back(
D->getPosition());
2062 if (
D->isExpandedParameterPack()) {
2063 for (
unsigned I = 0, N =
D->getNumExpansionTemplateParameters();
2065 Record.AddTemplateParameterList(
D->getExpansionTemplateParameters(I));
2070 bool OwnsDefaultArg =
D->hasDefaultArgument() &&
2071 !
D->defaultArgumentWasInherited();
2072 Record.push_back(OwnsDefaultArg);
2074 Record.AddTemplateArgumentLoc(
D->getDefaultArgument());
2086 Record.AddStmt(
D->getAssertExpr());
2087 Record.push_back(
D->isFailed());
2088 Record.AddStmt(
D->getMessage());
2089 Record.AddSourceLocation(
D->getRParenLoc());
2096 "You need to update the serializer after you change the "
2099 uint64_t LexicalOffset = 0;
2100 uint64_t VisibleOffset = 0;
2101 uint64_t ModuleLocalOffset = 0;
2102 uint64_t TULocalOffset = 0;
2105 cast<NamespaceDecl>(DC)->isFromExplicitGlobalModule()) {
2109 Writer.DelayedNamespace.push_back(cast<NamespaceDecl>(DC));
2112 Writer.WriteDeclContextLexicalBlock(
Record.getASTContext(), DC);
2113 Writer.WriteDeclContextVisibleBlock(
Record.getASTContext(), DC,
2114 VisibleOffset, ModuleLocalOffset,
2118 Record.AddOffset(LexicalOffset);
2119 Record.AddOffset(VisibleOffset);
2120 Record.AddOffset(ModuleLocalOffset);
2121 Record.AddOffset(TULocalOffset);
2125 assert(
IsLocalDecl(
D) &&
"expected a local declaration");
2131 const Decl *&CacheEntry = FirstLocalDeclCache[Canon];
2138 return CacheEntry =
D;
2141template <
typename T>
2144 T *MostRecent =
First->getMostRecentDecl();
2145 T *DAsT =
static_cast<T *
>(
D);
2146 if (MostRecent !=
First) {
2148 "Not considered redeclarable?");
2155 if (DAsT == FirstLocal) {
2159 unsigned I =
Record.size();
2172 if (!Prev->isFromASTFile())
2177 if (LocalRedecls.empty())
2183 Record.AddDeclRef(FirstLocal);
2203 Record.push_back(
D->isCBuffer());
2204 Record.AddSourceLocation(
D->getLocStart());
2205 Record.AddSourceLocation(
D->getLBraceLoc());
2206 Record.AddSourceLocation(
D->getRBraceLoc());
2212 Record.writeOMPChildren(
D->Data);
2218 Record.writeOMPChildren(
D->Data);
2224 Record.writeOMPChildren(
D->Data);
2231 "You need to update the serializer after you change the "
2232 "NumOMPDeclareReductionDeclBits");
2236 Record.AddStmt(
D->getCombinerIn());
2237 Record.AddStmt(
D->getCombinerOut());
2238 Record.AddStmt(
D->getCombiner());
2239 Record.AddStmt(
D->getInitOrig());
2240 Record.AddStmt(
D->getInitPriv());
2241 Record.AddStmt(
D->getInitializer());
2242 Record.push_back(llvm::to_underlying(
D->getInitializerKind()));
2243 Record.AddDeclRef(
D->getPrevDeclInScope());
2248 Record.writeOMPChildren(
D->Data);
2250 Record.AddDeclarationName(
D->getVarName());
2251 Record.AddDeclRef(
D->getPrevDeclInScope());
2265template <FunctionDecl::TemplatedKind Kind>
2266std::shared_ptr<llvm::BitCodeAbbrev>
2268 using namespace llvm;
2270 auto Abv = std::make_shared<BitCodeAbbrev>();
2271 Abv->Add(BitCodeAbbrevOp(Code));
2273 Abv->Add(BitCodeAbbrevOp(0));
2274 Abv->Add(BitCodeAbbrevOp(Kind));
2279 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2282 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2284 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2285 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2287 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2288 }
else if constexpr (
Kind ==
2290 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2291 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2293 Abv->Add(BitCodeAbbrevOp(1));
2296 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2297 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2298 Abv->Add(BitCodeAbbrevOp(0));
2299 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2300 Abv->Add(BitCodeAbbrevOp(0));
2302 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2306 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2307 Abv->Add(BitCodeAbbrevOp(0));
2309 llvm_unreachable(
"Unknown templated kind?");
2312 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2321 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2322 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2325 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2326 Abv->Add(BitCodeAbbrevOp(0));
2328 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2330 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2331 Abv->Add(BitCodeAbbrevOp(0));
2332 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2334 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 11));
2335 Abv->Add(BitCodeAbbrevOp(
2336 BitCodeAbbrevOp::Fixed,
2344 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2345 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2354 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2355 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2359template <FunctionDecl::TemplatedKind Kind>
2360std::shared_ptr<llvm::BitCodeAbbrev> getCXXMethodAbbrev() {
2365void ASTWriter::WriteDeclAbbrevs() {
2366 using namespace llvm;
2368 std::shared_ptr<BitCodeAbbrev> Abv;
2371 Abv = std::make_shared<BitCodeAbbrev>();
2374 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2382 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2383 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2385 Abv->Add(BitCodeAbbrevOp(0));
2386 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2387 Abv->Add(BitCodeAbbrevOp(0));
2389 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2391 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2392 Abv->Add(BitCodeAbbrevOp(0));
2393 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2395 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2396 Abv->Add(BitCodeAbbrevOp(0));
2398 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2399 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2400 DeclFieldAbbrev = Stream.EmitAbbrev(std::move(Abv));
2403 Abv = std::make_shared<BitCodeAbbrev>();
2406 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2411 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2412 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2414 Abv->Add(BitCodeAbbrevOp(0));
2415 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2416 Abv->Add(BitCodeAbbrevOp(0));
2418 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2420 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2421 Abv->Add(BitCodeAbbrevOp(0));
2422 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2424 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2425 Abv->Add(BitCodeAbbrevOp(0));
2427 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2428 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2430 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2431 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2432 DeclObjCIvarAbbrev = Stream.EmitAbbrev(std::move(Abv));
2435 Abv = std::make_shared<BitCodeAbbrev>();
2438 Abv->Add(BitCodeAbbrevOp(0));
2440 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2448 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2449 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2451 Abv->Add(BitCodeAbbrevOp(0));
2452 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2453 Abv->Add(BitCodeAbbrevOp(0));
2455 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2456 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2458 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2459 Abv->Add(BitCodeAbbrevOp(
2460 BitCodeAbbrevOp::Fixed,
2464 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2465 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2467 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2468 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2469 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2470 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 20));
2471 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2472 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2474 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2475 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2476 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2477 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2478 DeclEnumAbbrev = Stream.EmitAbbrev(std::move(Abv));
2481 Abv = std::make_shared<BitCodeAbbrev>();
2484 Abv->Add(BitCodeAbbrevOp(0));
2486 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2494 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2495 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2497 Abv->Add(BitCodeAbbrevOp(0));
2498 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2499 Abv->Add(BitCodeAbbrevOp(0));
2501 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2502 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2504 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2505 Abv->Add(BitCodeAbbrevOp(
2506 BitCodeAbbrevOp::Fixed,
2510 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2511 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2513 Abv->Add(BitCodeAbbrevOp(
2514 BitCodeAbbrevOp::Fixed,
2525 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 26));
2528 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2529 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2530 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2531 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2532 DeclRecordAbbrev = Stream.EmitAbbrev(std::move(Abv));
2535 Abv = std::make_shared<BitCodeAbbrev>();
2538 Abv->Add(BitCodeAbbrevOp(0));
2540 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2546 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2547 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2549 Abv->Add(BitCodeAbbrevOp(0));
2550 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2551 Abv->Add(BitCodeAbbrevOp(0));
2553 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2555 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2556 Abv->Add(BitCodeAbbrevOp(0));
2557 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2560 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2563 Abv->Add(BitCodeAbbrevOp(0));
2565 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2566 Abv->Add(BitCodeAbbrevOp(
2567 BitCodeAbbrevOp::Fixed,
2572 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2573 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2574 DeclParmVarAbbrev = Stream.EmitAbbrev(std::move(Abv));
2577 Abv = std::make_shared<BitCodeAbbrev>();
2580 Abv->Add(BitCodeAbbrevOp(0));
2582 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2588 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2589 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2591 Abv->Add(BitCodeAbbrevOp(0));
2592 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2593 Abv->Add(BitCodeAbbrevOp(0));
2595 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2596 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2598 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2599 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2600 DeclTypedefAbbrev = Stream.EmitAbbrev(std::move(Abv));
2603 Abv = std::make_shared<BitCodeAbbrev>();
2606 Abv->Add(BitCodeAbbrevOp(0));
2608 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2613 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2614 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2616 Abv->Add(BitCodeAbbrevOp(0));
2617 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2618 Abv->Add(BitCodeAbbrevOp(0));
2620 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2622 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2623 Abv->Add(BitCodeAbbrevOp(0));
2624 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2626 Abv->Add(BitCodeAbbrevOp(
2627 BitCodeAbbrevOp::Fixed,
2635 Abv->Add(BitCodeAbbrevOp(0));
2637 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2638 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2639 DeclVarAbbrev = Stream.EmitAbbrev(std::move(Abv));
2642 DeclCXXMethodAbbrev =
2643 Stream.EmitAbbrev(getCXXMethodAbbrev<FunctionDecl::TK_NonTemplate>());
2644 DeclTemplateCXXMethodAbbrev = Stream.EmitAbbrev(
2645 getCXXMethodAbbrev<FunctionDecl::TK_FunctionTemplate>());
2646 DeclDependentNonTemplateCXXMethodAbbrev = Stream.EmitAbbrev(
2647 getCXXMethodAbbrev<FunctionDecl::TK_DependentNonTemplate>());
2648 DeclMemberSpecializedCXXMethodAbbrev = Stream.EmitAbbrev(
2649 getCXXMethodAbbrev<FunctionDecl::TK_MemberSpecialization>());
2650 DeclTemplateSpecializedCXXMethodAbbrev = Stream.EmitAbbrev(
2651 getCXXMethodAbbrev<FunctionDecl::TK_FunctionTemplateSpecialization>());
2652 DeclDependentSpecializationCXXMethodAbbrev = Stream.EmitAbbrev(
2657 Abv = std::make_shared<BitCodeAbbrev>();
2659 Abv->Add(BitCodeAbbrevOp(0));
2661 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2667 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2668 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2670 Abv->Add(BitCodeAbbrevOp(0));
2671 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2672 Abv->Add(BitCodeAbbrevOp(0));
2674 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2675 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2678 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2679 Abv->Add(BitCodeAbbrevOp(0));
2680 DeclTemplateTypeParmAbbrev = Stream.EmitAbbrev(std::move(Abv));
2683 Abv = std::make_shared<BitCodeAbbrev>();
2686 Abv->Add(BitCodeAbbrevOp(0));
2688 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2693 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2694 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2696 Abv->Add(BitCodeAbbrevOp(0));
2697 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2698 Abv->Add(BitCodeAbbrevOp(0));
2700 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2701 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 11));
2702 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2703 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR,
2705 DeclUsingShadowAbbrev = Stream.EmitAbbrev(std::move(Abv));
2708 Abv = std::make_shared<BitCodeAbbrev>();
2713 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));
2714 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2719 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5));
2720 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2721 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2722 DeclRefExprAbbrev = Stream.EmitAbbrev(std::move(Abv));
2725 Abv = std::make_shared<BitCodeAbbrev>();
2730 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2731 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2733 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2734 Abv->Add(BitCodeAbbrevOp(32));
2735 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2736 IntegerLiteralAbbrev = Stream.EmitAbbrev(std::move(Abv));
2739 Abv = std::make_shared<BitCodeAbbrev>();
2744 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2745 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2747 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2748 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2749 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2750 CharacterLiteralAbbrev = Stream.EmitAbbrev(std::move(Abv));
2753 Abv = std::make_shared<BitCodeAbbrev>();
2758 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2759 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2761 Abv->Add(BitCodeAbbrevOp(0));
2763 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 9));
2765 ExprImplicitCastAbbrev = Stream.EmitAbbrev(std::move(Abv));
2768 Abv = std::make_shared<BitCodeAbbrev>();
2774 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5));
2775 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2778 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2779 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2780 BinaryOperatorAbbrev = Stream.EmitAbbrev(std::move(Abv));
2783 Abv = std::make_shared<BitCodeAbbrev>();
2789 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5));
2790 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2794 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2795 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2797 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2798 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2799 CompoundAssignOperatorAbbrev = Stream.EmitAbbrev(std::move(Abv));
2802 Abv = std::make_shared<BitCodeAbbrev>();
2807 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2808 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2810 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2811 Abv->Add(BitCodeAbbrevOp(0));
2812 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2813 CallExprAbbrev = Stream.EmitAbbrev(std::move(Abv));
2816 Abv = std::make_shared<BitCodeAbbrev>();
2821 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2822 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2824 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2825 Abv->Add(BitCodeAbbrevOp(0));
2826 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2828 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2829 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2830 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2831 CXXOperatorCallExprAbbrev = Stream.EmitAbbrev(std::move(Abv));
2834 Abv = std::make_shared<BitCodeAbbrev>();
2839 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
2840 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2842 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2843 Abv->Add(BitCodeAbbrevOp(0));
2844 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2846 CXXMemberCallExprAbbrev = Stream.EmitAbbrev(std::move(Abv));
2849 Abv = std::make_shared<BitCodeAbbrev>();
2853 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2854 Abv->Add(BitCodeAbbrevOp(0));
2855 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2856 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2857 CompoundStmtAbbrev = Stream.EmitAbbrev(std::move(Abv));
2859 Abv = std::make_shared<BitCodeAbbrev>();
2861 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2862 DeclContextLexicalAbbrev = Stream.EmitAbbrev(std::move(Abv));
2864 Abv = std::make_shared<BitCodeAbbrev>();
2866 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2867 DeclContextVisibleLookupAbbrev = Stream.EmitAbbrev(std::move(Abv));
2869 Abv = std::make_shared<BitCodeAbbrev>();
2871 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2872 DeclModuleLocalVisibleLookupAbbrev = Stream.EmitAbbrev(std::move(Abv));
2874 Abv = std::make_shared<BitCodeAbbrev>();
2876 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2877 DeclTULocalLookupAbbrev = Stream.EmitAbbrev(std::move(Abv));
2879 Abv = std::make_shared<BitCodeAbbrev>();
2881 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2882 DeclSpecializationsAbbrev = Stream.EmitAbbrev(std::move(Abv));
2884 Abv = std::make_shared<BitCodeAbbrev>();
2886 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2887 DeclPartialSpecializationsAbbrev = Stream.EmitAbbrev(std::move(Abv));
2912 if (isa<PragmaCommentDecl, PragmaDetectMismatchDecl>(
D))
2922 if (isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCImplDecl>(
D))
2940 assert(!
D->
isFromASTFile() &&
"should not be emitting imported decl");
2947 assert(ID >= FirstDeclID &&
"invalid decl ID");
2963 unsigned Index =
ID.getRawValue() - FirstDeclID.
getRawValue();
2964 if (DeclOffsets.size() == Index)
2965 DeclOffsets.emplace_back(RawLoc, Offset, DeclTypesBlockStartOffset);
2966 else if (DeclOffsets.size() < Index) {
2968 DeclOffsets.resize(Index+1);
2969 DeclOffsets[Index].setRawLoc(RawLoc);
2970 DeclOffsets[Index].setBitOffset(Offset, DeclTypesBlockStartOffset);
2972 llvm_unreachable(
"declarations should be emitted in ID order");
2977 associateDeclWithFile(
D, ID);
2990 bool ModulesCodegen =
false;
2992 std::optional<GVALinkage>
Linkage;
2993 if (Writer->WritingModule &&
2999 Linkage = getASTContext().GetGVALinkageForFunction(FD);
3003 (FD->
hasAttr<DLLExportAttr>() &&
3004 Writer->
getLangOpts().BuildingPCHWithObjectFile)) {
3008 if (!FD->
hasAttr<AlwaysInlineAttr>()) {
3010 Linkage = getASTContext().GetGVALinkageForFunction(FD);
3016 Record->push_back(ModulesCodegen);
3018 Writer->
AddDeclRef(FD, Writer->ModularCodegenDecls);
3019 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
3020 Record->push_back(CD->getNumCtorInitializers());
3021 if (CD->getNumCtorInitializers())
static void addExplicitSpecifier(ExplicitSpecifier ES, ASTRecordWriter &Record)
static bool isRequiredDecl(const Decl *D, ASTContext &Context, Module *WritingModule)
isRequiredDecl - Check if this is a "required" Decl, which must be seen by consumers of the AST.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
llvm::MachO::Record Record
This file defines OpenMP AST classes for clauses.
Defines the SourceManager interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
MutableArrayRef< FunctionTemplateSpecializationInfo > getPartialSpecializations(FunctionTemplateDecl::Common *)
void VisitBindingDecl(BindingDecl *D)
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
void VisitEmptyDecl(EmptyDecl *D)
void VisitCXXMethodDecl(CXXMethodDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
void VisitOMPRequiresDecl(OMPRequiresDecl *D)
void VisitNamedDecl(NamedDecl *D)
void CollectFirstDeclFromEachModule(const Decl *D, bool IncludeLocal, llvm::MapVector< ModuleFile *, const Decl * > &Firsts)
Collect the first declaration from each module file that provides a declaration of D.
RedeclarableTemplateDecl::SpecEntryTraits< EntryType >::DeclType * getSpecializationDecl(EntryType &T)
Get the specialization decl from an entry in the specialization list.
void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D)
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)
void VisitNamespaceDecl(NamespaceDecl *D)
void VisitOMPAllocateDecl(OMPAllocateDecl *D)
void VisitExportDecl(ExportDecl *D)
void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)
void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
void VisitParmVarDecl(ParmVarDecl *D)
void VisitRedeclarable(Redeclarable< T > *D)
void VisitFriendDecl(FriendDecl *D)
void VisitDeclaratorDecl(DeclaratorDecl *D)
void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
void VisitConceptDecl(ConceptDecl *D)
void AddFirstSpecializationDeclFromEachModule(const Decl *D, llvm::SmallVectorImpl< const Decl * > &SpecsInMap, llvm::SmallVectorImpl< const Decl * > &PartialSpecsInMap)
Add to the record the first template specialization from each module file that provides a declaration...
void VisitObjCPropertyDecl(ObjCPropertyDecl *D)
void VisitBlockDecl(BlockDecl *D)
void VisitLabelDecl(LabelDecl *LD)
void VisitTemplateDecl(TemplateDecl *D)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitCXXDestructorDecl(CXXDestructorDecl *D)
void VisitFieldDecl(FieldDecl *D)
void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)
void VisitObjCContainerDecl(ObjCContainerDecl *D)
void RegisterTemplateSpecialization(const Decl *Template, const Decl *Specialization)
Ensure that this template specialization is associated with the specified template on reload.
void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)
void VisitCXXConversionDecl(CXXConversionDecl *D)
void VisitUsingShadowDecl(UsingShadowDecl *D)
void VisitValueDecl(ValueDecl *D)
void VisitIndirectFieldDecl(IndirectFieldDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *D)
decltype(T::PartialSpecializations) & getPartialSpecializations(T *Common)
Get the list of partial specializations from a template's common ptr.
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitAccessSpecDecl(AccessSpecDecl *D)
ASTDeclWriter(ASTWriter &Writer, ASTContext &Context, ASTWriter::RecordDataImpl &Record, bool GeneratingReducedBMI)
void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
void VisitMSPropertyDecl(MSPropertyDecl *D)
void VisitUsingEnumDecl(UsingEnumDecl *D)
void VisitTypeDecl(TypeDecl *D)
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
void VisitEnumConstantDecl(EnumConstantDecl *D)
void VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitCapturedDecl(CapturedDecl *D)
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
void VisitPragmaCommentDecl(PragmaCommentDecl *D)
void VisitRecordDecl(RecordDecl *D)
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
void VisitTypedefDecl(TypedefDecl *D)
void VisitMSGuidDecl(MSGuidDecl *D)
void VisitTypedefNameDecl(TypedefNameDecl *D)
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
void VisitUsingDecl(UsingDecl *D)
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
void AddTemplateSpecializations(DeclTy *D)
void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)
void VisitObjCImplementationDecl(ObjCImplementationDecl *D)
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
void VisitObjCMethodDecl(ObjCMethodDecl *D)
void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
void VisitVarTemplateDecl(VarTemplateDecl *D)
void VisitHLSLBufferDecl(HLSLBufferDecl *D)
void VisitObjCImplDecl(ObjCImplDecl *D)
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
void VisitVarDecl(VarDecl *D)
void VisitImportDecl(ImportDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *D)
void VisitClassTemplateDecl(ClassTemplateDecl *D)
void VisitFunctionDecl(FunctionDecl *D)
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
void VisitEnumDecl(EnumDecl *D)
void VisitTranslationUnitDecl(TranslationUnitDecl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitStaticAssertDecl(StaticAssertDecl *D)
void VisitDeclContext(DeclContext *DC)
Emit the DeclContext part of a declaration context decl.
void AddObjCTypeParamList(ObjCTypeParamList *typeParams)
Add an Objective-C type parameter list to the given record.
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
void AddFirstDeclFromEachModule(const Decl *D, bool IncludeLocal)
Add to the record the first declaration from each module file that provides a declaration of D.
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitDecompositionDecl(DecompositionDecl *D)
void VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D)
void VisitTagDecl(TagDecl *D)
void VisitTypeAliasDecl(TypeAliasDecl *D)
void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
An object for streaming information to a record.
void AddFunctionDefinition(const FunctionDecl *FD)
Add a definition for the given function to the queue of statements to emit.
uint64_t Emit(unsigned Code, unsigned Abbrev=0)
Emit the record to the stream, followed by its substatements, and return its offset.
void AddStmt(Stmt *S)
Add the given statement or expression to the queue of statements to emit.
void AddCXXCtorInitializers(ArrayRef< CXXCtorInitializer * > CtorInits)
Emit a CXXCtorInitializer array.
void AddDeclRef(const Decl *D)
Emit a reference to a declaration.
Writes an AST file containing the contents of a translation unit.
unsigned getDeclParmVarAbbrev() const
unsigned getDeclTemplateTypeParmAbbrev() const
bool isWritingStdCXXNamedModules() const
unsigned getDeclObjCIvarAbbrev() const
unsigned getDeclTypedefAbbrev() const
unsigned getDeclUsingShadowAbbrev() const
bool isGeneratingReducedBMI() const
unsigned getDeclVarAbbrev() const
unsigned getDeclEnumAbbrev() const
bool IsLocalDecl(const Decl *D)
Is this a local declaration (that is, one that will be written to our AST file)? This is the case for...
void ClearSwitchCaseIDs()
LocalDeclID GetDeclRef(const Decl *D)
Force a declaration to be emitted and get its local ID to the module file been writing.
unsigned getDeclCXXMethodAbbrev(FunctionDecl::TemplatedKind Kind) const
const Decl * getFirstLocalDecl(const Decl *D)
Find the first local declaration of a given local redeclarable decl.
SourceLocationEncoding::RawLocEncoding getRawSourceLocationEncoding(SourceLocation Loc, LocSeq *Seq=nullptr)
Return the raw encodings for source locations.
SmallVector< uint64_t, 64 > RecordData
unsigned getAnonymousDeclarationNumber(const NamedDecl *D)
unsigned getDeclFieldAbbrev() const
const LangOptions & getLangOpts() const
unsigned getDeclRecordAbbrev() const
void AddDeclRef(const Decl *D, RecordDataImpl &Record)
Emit a reference to a declaration.
Represents an access specifier followed by colon ':'.
A binding in a decomposition declaration.
A simple helper class to pack several bits in order into (a) 32 bit integer(s).
void addBits(uint32_t Value, uint32_t BitsWidth)
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
Represents a C++ deduction guide declaration.
Represents a C++ destructor within a class.
Represents a static or instance method of a struct/union/class.
Represents a C++ struct/union/class.
static bool classofKind(Kind K)
Represents the body of a CapturedStmt, and serves as its DeclContext.
unsigned getNumParams() const
unsigned getContextParamPosition() const
ImplicitParamDecl * getParam(unsigned i) const
Declaration of a class template.
Represents a class template specialization, which refers to a class template with a given set of temp...
Declaration of a C++20 concept.
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
A POD class for pairing a NamedDecl* with an access specifier.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
@ NumOMPDeclareReductionDeclBits
lookup_result noload_lookup(DeclarationName Name)
Find the declarations with the given name that are visible within this context; don't attempt to retr...
@ NumObjCContainerDeclBits
@ NumCXXConstructorDeclBits
DeclID getRawValue() const
A simple visitor class that helps create declaration visitors.
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 ...
SourceLocation getEndLoc() const LLVM_READONLY
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
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.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
ModuleOwnershipKind getModuleOwnershipKind() const
Get the kind of module ownership for this declaration.
bool isParameterPack() const
Whether this declaration is a parameter pack.
virtual Stmt * getBody() const
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
bool isReferenced() const
Whether any declaration of this entity was referenced.
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 isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isInvalidDecl() const
unsigned getIdentifierNamespace() const
SourceLocation getLocation() const
const char * getDeclKindName() const
bool isTopLevelDeclInObjCContainer() const
Whether this declaration is a top-level declaration (function, global variable, etc....
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Represents a ValueDecl that came out of a declarator.
A decomposition declaration.
Provides information about a dependent function-template specialization declaration.
ArrayRef< FunctionTemplateDecl * > getCandidates() const
Returns the candidates for the primary function template.
const ASTTemplateArgumentListInfo * TemplateArgumentsAsWritten
The template arguments as written in the sources, if provided.
Represents an empty-declaration.
An instance of this object exists for each enum constant that is defined.
Store information needed for an explicit specifier.
ExplicitSpecKind getKind() const
const Expr * getExpr() const
Represents a standard C++ module export declaration.
This represents one expression.
Represents a member of a struct/union/class.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Declaration of a friend template.
Represents a function declaration or definition.
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
@ TK_MemberSpecialization
@ TK_DependentNonTemplate
@ TK_FunctionTemplateSpecialization
@ TK_DependentFunctionTemplateSpecialization
Declaration of a template function.
FunctionTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
TemplateArgumentList * TemplateArguments
The template arguments used to produce the function template specialization from the function templat...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
MemberSpecializationInfo * getMemberSpecializationInfo() const
Get the specialization info if this function template specialization is also a member specialization:
const ASTTemplateArgumentListInfo * TemplateArgumentsAsWritten
The template arguments as written in the sources, if provided.
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this function template specialization.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Represents a field injected from an anonymous union/struct into the parent scope.
Represents the declaration of a label.
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Represents a linkage specification.
An instance of this class represents the declaration of a property member.
Provides information a specialization of a member of a class template, which may be a member function...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this member.
NamedDecl * getInstantiatedFrom() const
Retrieve the member declaration from which this member was instantiated.
Describes a module or submodule.
bool isInterfaceOrPartition() const
bool isNamedModule() const
Does this Module is a named module of a standard named module?
This represents a decl that may have a name.
Represents a C++ namespace alias.
Represent a C++ namespace.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
This represents '#pragma omp allocate ...' directive.
Pseudo declaration for capturing expressions.
This represents '#pragma omp declare mapper ...' directive.
This represents '#pragma omp declare reduction ...' directive.
This represents '#pragma omp requires...' directive.
This represents '#pragma omp threadprivate ...' directive.
Represents a field declaration created by an @defs(...).
static bool classofKind(Kind K)
ObjCCategoryDecl - Represents a category declaration.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCCompatibleAliasDecl - Represents alias of a class.
ObjCContainerDecl - Represents a container for method declarations.
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
ObjCIvarDecl - Represents an ObjC instance variable.
static bool classofKind(Kind K)
ObjCMethodDecl - Represents an instance or class method declaration.
Represents one property declaration in an Objective-C interface.
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Represents an Objective-C protocol declaration.
Represents the declaration of an Objective-C type parameter.
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
unsigned size() const
Determine the number of type parameters in this list.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
Represents a partial function definition.
Represents a parameter to a function.
Represents a #pragma detect_mismatch line.
PrettyDeclStackTraceEntry - If a crash occurs in the parser while parsing something related to a decl...
A (possibly-)qualified type.
Represents a struct/union/class.
Declaration of a redeclarable template.
Provides common interface for the Decls that can be redeclared.
Represents the body of a requires-expression.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
Represents a C++11 static_assert declaration.
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
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.
Represents a template argument.
@ Type
The template argument is a type.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
A template parameter object.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
A declaration that models statements at global scope.
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Declaration of an alias template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
ConceptReference * getConceptReference() const
Represents a declaration of a type.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Base class for declarations which introduce a typedef-name.
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
Represents a dependent using declaration which was marked with typename.
Represents a dependent using declaration which was not marked with typename.
Represents a C++ using-declaration.
Represents C++ using-directive.
Represents a C++ using-enum-declaration.
Represents a pack of using declarations that a single using-declarator pack-expanded into.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
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.
@ CInit
C-style initialization with assignment.
Declaration of a variable template.
Represents a variable template specialization, which refers to a variable template with a given set o...
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
DeclCode
Record codes for each kind of declaration.
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CAPTURED
A CapturedDecl record.
@ 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_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl 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_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
@ 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_MS_GUID
A MSGuidDecl 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_USING_PACK
A UsingPackDecl 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_OUTLINEDFUNCTION
A OutlinedFunctionDecl record.
@ DECL_BLOCK
A BlockDecl record.
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
@ DECL_VAR
A VarDecl record.
@ DECL_UNRESOLVED_USING_IF_EXISTS
An UnresolvedUsingIfExistsDecl 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_LABEL
A LabelDecl record.
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
@ DECL_CONSTRUCTOR_USING_SHADOW
A ConstructorUsingShadowDecl record.
@ DECL_USING_ENUM
A UsingEnumDecl 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_BINDING
A BindingDecl 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_DECOMPOSITION
A DecompositionDecl record.
@ 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_CXX_DEDUCTION_GUIDE
A CXXDeductionGuideDecl record.
@ DECL_OMP_REQUIRES
An OMPRequiresDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_TEMPLATE_PARAM_OBJECT
A TemplateParamObjectDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_LIFETIME_EXTENDED_TEMPORARY
An LifetimeExtendedTemporaryDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION
An ImplicitConceptSpecializationDecl 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.
@ EXPR_COMPOUND_ASSIGN_OPERATOR
A CompoundAssignOperator record.
@ EXPR_CXX_OPERATOR_CALL
A CXXOperatorCallExpr record.
@ EXPR_IMPLICIT_CAST
An ImplicitCastExpr record.
@ EXPR_CHARACTER_LITERAL
A CharacterLiteral record.
@ STMT_COMPOUND
A CompoundStmt record.
@ EXPR_CALL
A CallExpr record.
@ EXPR_BINARY_OPERATOR
A BinaryOperator record.
@ EXPR_DECL_REF
A DeclRefExpr record.
@ EXPR_INTEGER_LITERAL
An IntegerLiteral record.
@ EXPR_CXX_MEMBER_CALL
A CXXMemberCallExpr record.
bool isRedeclarableDeclKind(unsigned Kind)
Determine whether the given declaration kind is redeclarable.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
@ UPD_CXX_ADDED_ANONYMOUS_NAMESPACE
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
@ GVA_AvailableExternally
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ SD_Static
Static storage duration.
bool CanElideDeclDef(const Decl *D)
If we can elide the definition of.
const FunctionProtoType * T
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
Diagnostic wrappers for TextAPI types for error reporting.
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
Copy initialization expr of a __block variable and a boolean flag that indicates whether the expressi...
Data that is common to all of the declarations of a given function template.
Parts of a decomposed MSGuidDecl.
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
static DeclType * getDecl(EntryType *D)