@@ -1408,7 +1408,12 @@ class SynthesizedProtocolAttr : public DeclAttribute {
1408
1408
1409
1409
// / The @_specialize attribute, which forces specialization on the specified
1410
1410
// / 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
+
1412
1417
public:
1413
1418
// NOTE: When adding new kinds, you must update the inline bitfield macro.
1414
1419
enum class SpecializationKind {
@@ -1420,18 +1425,48 @@ class SpecializeAttr : public DeclAttribute {
1420
1425
TrailingWhereClause *trailingWhereClause;
1421
1426
GenericSignature specializedSignature;
1422
1427
1428
+ DeclNameRef targetFunctionName;
1429
+ LazyMemberLoader *resolver = nullptr ;
1430
+ uint64_t resolverContextData;
1431
+ size_t numSPIGroups;
1432
+
1423
1433
SpecializeAttr (SourceLoc atLoc, SourceRange Range,
1424
1434
TrailingWhereClause *clause, bool exported,
1425
- SpecializationKind kind,
1426
- GenericSignature specializedSignature);
1435
+ SpecializationKind kind, GenericSignature specializedSignature,
1436
+ DeclNameRef targetFunctionName,
1437
+ ArrayRef<Identifier> spiGroups);
1427
1438
1428
1439
public:
1429
1440
static SpecializeAttr *create (ASTContext &Ctx, SourceLoc atLoc,
1430
1441
SourceRange Range, TrailingWhereClause *clause,
1431
1442
bool exported, SpecializationKind kind,
1443
+ DeclNameRef targetFunctionName,
1444
+ ArrayRef<Identifier> spiGroups,
1432
1445
GenericSignature specializedSignature
1433
1446
= nullptr );
1434
1447
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
+
1435
1470
TrailingWhereClause *getTrailingWhereClause () const ;
1436
1471
1437
1472
GenericSignature getSpecializedSignature () const {
@@ -1458,6 +1493,13 @@ class SpecializeAttr : public DeclAttribute {
1458
1493
return getSpecializationKind () == SpecializationKind::Partial;
1459
1494
}
1460
1495
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
+
1461
1503
static bool classof (const DeclAttribute *DA) {
1462
1504
return DA->getKind () == DAK_Specialize;
1463
1505
}
0 commit comments