Skip to content

Commit e82854d

Browse files
committed
Reimplement TargetFunctionTypeMetadata using TrailingObjects
The layout is the same, but this eliminates the handwritten address computations.
1 parent 4da1032 commit e82854d

File tree

2 files changed

+74
-41
lines changed

2 files changed

+74
-41
lines changed

include/swift/ABI/Metadata.h

Lines changed: 65 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,21 +1459,70 @@ struct TargetEnumMetadata : public TargetValueMetadata<Runtime> {
14591459
};
14601460
using 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.
14631468
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>> {
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
};
15661598
using FunctionTypeMetadata = TargetFunctionTypeMetadata<InProcess>;

stdlib/public/runtime/Metadata.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,7 +1354,7 @@ class FunctionCacheEntry {
13541354
const FunctionTypeFlags Flags;
13551355
const FunctionMetadataDifferentiabilityKind DifferentiabilityKind;
13561356
const Metadata *const *Parameters;
1357-
const uint32_t *ParameterFlags;
1357+
const ::ParameterFlags *ParameterFlags;
13581358
const Metadata *Result;
13591359
const Metadata *GlobalActor;
13601360

@@ -1370,14 +1370,13 @@ class FunctionCacheEntry {
13701370
}
13711371
const Metadata *getResult() const { return Result; }
13721372

1373-
const uint32_t *getParameterFlags() const {
1373+
const ::ParameterFlags *getParameterFlags() const {
13741374
return ParameterFlags;
13751375
}
13761376

13771377
::ParameterFlags getParameterFlags(unsigned index) const {
13781378
assert(index < Flags.getNumParameters());
1379-
auto flags = Flags.hasParameterFlags() ? ParameterFlags[index] : 0;
1380-
return ParameterFlags::fromIntValue(flags);
1379+
return Flags.hasParameterFlags() ? ParameterFlags[index] : ::ParameterFlags();
13811380
}
13821381

13831382
const Metadata *getGlobalActor() const { return GlobalActor; }
@@ -1509,7 +1508,7 @@ swift::swift_getFunctionTypeMetadata(FunctionTypeFlags flags,
15091508
"'swift_getFunctionTypeMetadataGlobalActor'");
15101509
FunctionCacheEntry::Key key = {
15111510
flags, FunctionMetadataDifferentiabilityKind::NonDifferentiable, parameters,
1512-
parameterFlags, result, nullptr
1511+
reinterpret_cast<const ParameterFlags *>(parameterFlags), result, nullptr
15131512
};
15141513
return &FunctionTypes.getOrInsert(key).first->Data;
15151514
}
@@ -1525,7 +1524,8 @@ swift::swift_getFunctionTypeMetadataDifferentiable(
15251524
assert(flags.isDifferentiable());
15261525
assert(diffKind.isDifferentiable());
15271526
FunctionCacheEntry::Key key = {
1528-
flags, diffKind, parameters, parameterFlags, result, nullptr
1527+
flags, diffKind, parameters,
1528+
reinterpret_cast<const ParameterFlags *>(parameterFlags), result, nullptr
15291529
};
15301530
return &FunctionTypes.getOrInsert(key).first->Data;
15311531
}
@@ -1537,7 +1537,8 @@ swift::swift_getFunctionTypeMetadataGlobalActor(
15371537
const Metadata *result, const Metadata *globalActor) {
15381538
assert(flags.hasGlobalActor());
15391539
FunctionCacheEntry::Key key = {
1540-
flags, diffKind, parameters, parameterFlags, result, globalActor
1540+
flags, diffKind, parameters,
1541+
reinterpret_cast<const ParameterFlags *>(parameterFlags), result, globalActor
15411542
};
15421543
return &FunctionTypes.getOrInsert(key).first->Data;
15431544
}
@@ -1595,7 +1596,7 @@ FunctionCacheEntry::FunctionCacheEntry(const Key &key) {
15951596
for (unsigned i = 0; i < numParameters; ++i) {
15961597
Data.getParameters()[i] = key.getParameter(i);
15971598
if (flags.hasParameterFlags())
1598-
Data.getParameterFlags()[i] = key.getParameterFlags(i).getIntValue();
1599+
Data.getParameterFlags()[i] = key.getParameterFlags(i);
15991600
}
16001601
}
16011602

0 commit comments

Comments
 (0)