@@ -1459,21 +1459,70 @@ struct TargetEnumMetadata : public TargetValueMetadata<Runtime> {
14591459};
14601460using EnumMetadata = TargetEnumMetadata<InProcess>;
14611461
1462+ template <typename Runtime>
1463+ struct TargetFunctionGlobalActorMetadata {
1464+ ConstTargetMetadataPointer<Runtime, swift::TargetMetadata> GlobalActorType;
1465+ };
1466+
14621467// / The structure of function type metadata.
14631468template <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>> {
14651476 using StoredSize = typename Runtime::StoredSize;
14661477 using Parameter = ConstTargetMetadataPointer<Runtime, swift::TargetMetadata>;
14671478
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:
14681493 TargetFunctionTypeFlags<StoredSize> Flags;
14691494
14701495 // / The type metadata for the result type.
14711496 ConstTargetMetadataPointer<Runtime, swift::TargetMetadata> ResultType;
14721497
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+ }
14741523
14751524 const Parameter *getParameters () const {
1476- return reinterpret_cast < const Parameter *>( this + 1 );
1525+ return this -> template getTrailingObjects < Parameter>( );
14771526 }
14781527
14791528 Parameter getParameter (unsigned index) const {
@@ -1483,8 +1532,7 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
14831532
14841533 ParameterFlags getParameterFlags (unsigned index) const {
14851534 assert (index < getNumParameters ());
1486- auto flags = hasParameterFlags () ? getParameterFlags ()[index] : 0 ;
1487- return ParameterFlags::fromIntValue (flags);
1535+ return hasParameterFlags () ? getParameterFlags ()[index] : ParameterFlags ();
14881536 }
14891537
14901538 StoredSize getNumParameters () const {
@@ -1507,32 +1555,24 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
15071555 return metadata->getKind () == MetadataKind::Function;
15081556 }
15091557
1510- uint32_t *getParameterFlags () {
1511- return reinterpret_cast < uint32_t *>( getParameters () + getNumParameters () );
1558+ ParameterFlags *getParameterFlags () {
1559+ return this -> template getTrailingObjects <ParameterFlags>( );
15121560 }
15131561
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>();
15171564 }
15181565
15191566 TargetFunctionMetadataDifferentiabilityKind<StoredSize> *
15201567 getDifferentiabilityKindAddress () {
15211568 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>>();
15291570 }
15301571
15311572 TargetFunctionMetadataDifferentiabilityKind<StoredSize>
15321573 getDifferentiabilityKind () const {
15331574 if (isDifferentiable ()) {
1534- return *const_cast <TargetFunctionTypeMetadata<Runtime> *>(this )
1535- ->getDifferentiabilityKindAddress ();
1575+ return *(this ->template getTrailingObjects <TargetFunctionMetadataDifferentiabilityKind<StoredSize>>());
15361576 }
15371577 return TargetFunctionMetadataDifferentiabilityKind<StoredSize>
15381578 ::NonDifferentiable;
@@ -1541,26 +1581,18 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
15411581 ConstTargetMetadataPointer<Runtime, swift::TargetMetadata> *
15421582 getGlobalActorAddr () {
15431583 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 ;
15551587 }
15561588
15571589 ConstTargetMetadataPointer<Runtime, swift::TargetMetadata>
15581590 getGlobalActor () const {
15591591 if (!hasGlobalActor ())
15601592 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 ;
15641596 }
15651597};
15661598using FunctionTypeMetadata = TargetFunctionTypeMetadata<InProcess>;
0 commit comments