@@ -1459,21 +1459,70 @@ struct TargetEnumMetadata : public TargetValueMetadata<Runtime> {
1459
1459
};
1460
1460
using EnumMetadata = TargetEnumMetadata<InProcess>;
1461
1461
1462
+ template <typename Runtime>
1463
+ struct TargetFunctionGlobalActorMetadata {
1464
+ ConstTargetMetadataPointer<Runtime, swift::TargetMetadata> GlobalActorType;
1465
+ };
1466
+
1462
1467
// / The structure of function type metadata.
1463
1468
template <typename Runtime>
1464
- struct TargetFunctionTypeMetadata : public TargetMetadata <Runtime> {
1469
+ struct TargetFunctionTypeMetadata : public TargetMetadata <Runtime>,
1470
+ swift::ABI::TrailingObjects<
1471
+ TargetFunctionTypeMetadata<Runtime>,
1472
+ ConstTargetMetadataPointer<Runtime, swift::TargetMetadata>,
1473
+ ParameterFlags,
1474
+ TargetFunctionMetadataDifferentiabilityKind<typename Runtime::StoredSize>,
1475
+ TargetFunctionGlobalActorMetadata<Runtime>> {
1465
1476
using StoredSize = typename Runtime::StoredSize;
1466
1477
using Parameter = ConstTargetMetadataPointer<Runtime, swift::TargetMetadata>;
1467
1478
1479
+ private:
1480
+ using TrailingObjects =
1481
+ swift::ABI::TrailingObjects<
1482
+ TargetFunctionTypeMetadata<Runtime>,
1483
+ Parameter,
1484
+ ParameterFlags,
1485
+ TargetFunctionMetadataDifferentiabilityKind<StoredSize>,
1486
+ TargetFunctionGlobalActorMetadata<Runtime>>;
1487
+ friend TrailingObjects;
1488
+
1489
+ template <typename T>
1490
+ using OverloadToken = typename TrailingObjects::template OverloadToken<T>;
1491
+
1492
+ public:
1468
1493
TargetFunctionTypeFlags<StoredSize> Flags;
1469
1494
1470
1495
// / The type metadata for the result type.
1471
1496
ConstTargetMetadataPointer<Runtime, swift::TargetMetadata> ResultType;
1472
1497
1473
- Parameter *getParameters () { return reinterpret_cast <Parameter *>(this + 1 ); }
1498
+ private:
1499
+ size_t numTrailingObjects (OverloadToken<Parameter>) const {
1500
+ return getNumParameters ();
1501
+ }
1502
+
1503
+ size_t numTrailingObjects (OverloadToken<ParameterFlags>) const {
1504
+ return hasParameterFlags () ? getNumParameters () : 0 ;
1505
+ }
1506
+
1507
+ size_t numTrailingObjects (
1508
+ OverloadToken<TargetFunctionMetadataDifferentiabilityKind<StoredSize>>
1509
+ ) const {
1510
+ return isDifferentiable () ? 1 : 0 ;
1511
+ }
1512
+
1513
+ size_t numTrailingObjects (
1514
+ OverloadToken<TargetFunctionGlobalActorMetadata<Runtime>>
1515
+ ) const {
1516
+ return hasGlobalActor () ? 1 : 0 ;
1517
+ }
1518
+
1519
+ public:
1520
+ Parameter *getParameters () {
1521
+ return this ->template getTrailingObjects <Parameter>();
1522
+ }
1474
1523
1475
1524
const Parameter *getParameters () const {
1476
- return reinterpret_cast < const Parameter *>( this + 1 );
1525
+ return this -> template getTrailingObjects < Parameter>( );
1477
1526
}
1478
1527
1479
1528
Parameter getParameter (unsigned index) const {
@@ -1483,8 +1532,7 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
1483
1532
1484
1533
ParameterFlags getParameterFlags (unsigned index) const {
1485
1534
assert (index < getNumParameters ());
1486
- auto flags = hasParameterFlags () ? getParameterFlags ()[index] : 0 ;
1487
- return ParameterFlags::fromIntValue (flags);
1535
+ return hasParameterFlags () ? getParameterFlags ()[index] : ParameterFlags ();
1488
1536
}
1489
1537
1490
1538
StoredSize getNumParameters () const {
@@ -1507,32 +1555,24 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
1507
1555
return metadata->getKind () == MetadataKind::Function;
1508
1556
}
1509
1557
1510
- uint32_t *getParameterFlags () {
1511
- return reinterpret_cast < uint32_t *>( getParameters () + getNumParameters () );
1558
+ ParameterFlags *getParameterFlags () {
1559
+ return this -> template getTrailingObjects <ParameterFlags>( );
1512
1560
}
1513
1561
1514
- const uint32_t *getParameterFlags () const {
1515
- return reinterpret_cast <const uint32_t *>(getParameters () +
1516
- getNumParameters ());
1562
+ const ParameterFlags *getParameterFlags () const {
1563
+ return this ->template getTrailingObjects <ParameterFlags>();
1517
1564
}
1518
1565
1519
1566
TargetFunctionMetadataDifferentiabilityKind<StoredSize> *
1520
1567
getDifferentiabilityKindAddress () {
1521
1568
assert (isDifferentiable ());
1522
- void *previousEndAddr = hasParameterFlags ()
1523
- ? reinterpret_cast <void *>(getParameterFlags () + getNumParameters ())
1524
- : reinterpret_cast <void *>(getParameters () + getNumParameters ());
1525
- return reinterpret_cast <
1526
- TargetFunctionMetadataDifferentiabilityKind<StoredSize> *>(
1527
- llvm::alignAddr (previousEndAddr,
1528
- llvm::Align (alignof (typename Runtime::StoredPointer))));
1569
+ return this ->template getTrailingObjects <TargetFunctionMetadataDifferentiabilityKind<StoredSize>>();
1529
1570
}
1530
1571
1531
1572
TargetFunctionMetadataDifferentiabilityKind<StoredSize>
1532
1573
getDifferentiabilityKind () const {
1533
1574
if (isDifferentiable ()) {
1534
- return *const_cast <TargetFunctionTypeMetadata<Runtime> *>(this )
1535
- ->getDifferentiabilityKindAddress ();
1575
+ return *(this ->template getTrailingObjects <TargetFunctionMetadataDifferentiabilityKind<StoredSize>>());
1536
1576
}
1537
1577
return TargetFunctionMetadataDifferentiabilityKind<StoredSize>
1538
1578
::NonDifferentiable;
@@ -1541,26 +1581,18 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
1541
1581
ConstTargetMetadataPointer<Runtime, swift::TargetMetadata> *
1542
1582
getGlobalActorAddr () {
1543
1583
assert (hasGlobalActor ());
1544
-
1545
- void *endAddr =
1546
- isDifferentiable ()
1547
- ? reinterpret_cast <void *>(getDifferentiabilityKindAddress () + 1 ) :
1548
- hasParameterFlags ()
1549
- ? reinterpret_cast <void *>(getParameterFlags () + getNumParameters ()) :
1550
- reinterpret_cast <void *>(getParameters () + getNumParameters ());
1551
- return reinterpret_cast <
1552
- ConstTargetMetadataPointer<Runtime, swift::TargetMetadata> *>(
1553
- llvm::alignAddr (
1554
- endAddr, llvm::Align (alignof (typename Runtime::StoredPointer))));
1584
+ auto globalActorAddr =
1585
+ this ->template getTrailingObjects <TargetFunctionGlobalActorMetadata<Runtime>>();
1586
+ return &globalActorAddr->GlobalActorType ;
1555
1587
}
1556
1588
1557
1589
ConstTargetMetadataPointer<Runtime, swift::TargetMetadata>
1558
1590
getGlobalActor () const {
1559
1591
if (!hasGlobalActor ())
1560
1592
return ConstTargetMetadataPointer<Runtime, swift::TargetMetadata>();
1561
-
1562
- return * const_cast <TargetFunctionTypeMetadata <Runtime> *>( this )
1563
- -> getGlobalActorAddr () ;
1593
+ auto globalActorAddr =
1594
+ this -> template getTrailingObjects <TargetFunctionGlobalActorMetadata <Runtime>>();
1595
+ return globalActorAddr-> GlobalActorType ;
1564
1596
}
1565
1597
};
1566
1598
using FunctionTypeMetadata = TargetFunctionTypeMetadata<InProcess>;
0 commit comments