@@ -1408,7 +1408,12 @@ class SynthesizedProtocolAttr : public DeclAttribute {
14081408
14091409// / The @_specialize attribute, which forces specialization on the specified
14101410// / type list.
1411- class SpecializeAttr : public DeclAttribute {
1411+ class SpecializeAttr final
1412+ : public DeclAttribute,
1413+ private llvm::TrailingObjects<SpecializeAttr, Identifier> {
1414+ friend class SpecializeAttrTargetDeclRequest ;
1415+ friend TrailingObjects;
1416+
14121417public:
14131418 // NOTE: When adding new kinds, you must update the inline bitfield macro.
14141419 enum class SpecializationKind {
@@ -1420,18 +1425,48 @@ class SpecializeAttr : public DeclAttribute {
14201425 TrailingWhereClause *trailingWhereClause;
14211426 GenericSignature specializedSignature;
14221427
1428+ DeclNameRef targetFunctionName;
1429+ LazyMemberLoader *resolver = nullptr ;
1430+ uint64_t resolverContextData;
1431+ size_t numSPIGroups;
1432+
14231433 SpecializeAttr (SourceLoc atLoc, SourceRange Range,
14241434 TrailingWhereClause *clause, bool exported,
1425- SpecializationKind kind,
1426- GenericSignature specializedSignature);
1435+ SpecializationKind kind, GenericSignature specializedSignature,
1436+ DeclNameRef targetFunctionName,
1437+ ArrayRef<Identifier> spiGroups);
14271438
14281439public:
14291440 static SpecializeAttr *create (ASTContext &Ctx, SourceLoc atLoc,
14301441 SourceRange Range, TrailingWhereClause *clause,
14311442 bool exported, SpecializationKind kind,
1443+ DeclNameRef targetFunctionName,
1444+ ArrayRef<Identifier> spiGroups,
14321445 GenericSignature specializedSignature
14331446 = nullptr );
14341447
1448+ static SpecializeAttr *create (ASTContext &ctx, bool exported,
1449+ SpecializationKind kind,
1450+ ArrayRef<Identifier> spiGroups,
1451+ GenericSignature specializedSignature,
1452+ DeclNameRef replacedFunction);
1453+
1454+ static SpecializeAttr *create (ASTContext &ctx, bool exported,
1455+ SpecializationKind kind,
1456+ ArrayRef<Identifier> spiGroups,
1457+ GenericSignature specializedSignature,
1458+ DeclNameRef replacedFunction,
1459+ LazyMemberLoader *resolver, uint64_t data);
1460+
1461+ // / Name of SPIs declared by the attribute.
1462+ // /
1463+ // / Note: A single SPI name per attribute is currently supported but this
1464+ // / may change with the syntax change.
1465+ ArrayRef<Identifier> getSPIGroups () const {
1466+ return { this ->template getTrailingObjects <Identifier>(),
1467+ numSPIGroups };
1468+ }
1469+
14351470 TrailingWhereClause *getTrailingWhereClause () const ;
14361471
14371472 GenericSignature getSpecializedSignature () const {
@@ -1458,6 +1493,13 @@ class SpecializeAttr : public DeclAttribute {
14581493 return getSpecializationKind () == SpecializationKind::Partial;
14591494 }
14601495
1496+ DeclNameRef getTargetFunctionName () const {
1497+ return targetFunctionName;
1498+ }
1499+
1500+ // / \p forDecl is the value decl that the attribute belongs to.
1501+ ValueDecl *getTargetFunctionDecl (const ValueDecl *forDecl) const ;
1502+
14611503 static bool classof (const DeclAttribute *DA) {
14621504 return DA->getKind () == DAK_Specialize;
14631505 }
0 commit comments