Skip to content

Commit 728d2a4

Browse files
committed
[IRGen] Fix function metadata endpoints to use separate parameter/flags arguments
Switch most general endpoint to be `flags, parameters, parameterFlags, result`, instead of opaque `void **`, more specialized ones to use follow argument scheme: `flags, param0, [flags0], ..., paramN, [flagsN], result` and store parameter/flags information separately in `FunctionCacheEntry::{Key, Data}` as well.
1 parent 99f188e commit 728d2a4

File tree

8 files changed

+240
-157
lines changed

8 files changed

+240
-157
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -551,9 +551,10 @@ template <typename int_type>
551551
class TargetFunctionTypeFlags {
552552
enum : int_type {
553553
NumArgumentsMask = 0x00FFFFFFU,
554-
ConventionMask = 0x0F000000U,
555-
ConventionShift = 24U,
556-
ThrowsMask = 0x10000000U,
554+
ConventionMask = 0x0F000000U,
555+
ConventionShift = 24U,
556+
ThrowsMask = 0x10000000U,
557+
ParamFlagsMask = 0x01000000U,
557558
};
558559
int_type Data;
559560

@@ -576,7 +577,13 @@ class TargetFunctionTypeFlags {
576577
return TargetFunctionTypeFlags<int_type>((Data & ~ThrowsMask) |
577578
(throws ? ThrowsMask : 0));
578579
}
579-
580+
581+
constexpr TargetFunctionTypeFlags<int_type>
582+
withParameterFlags(bool hasFlags) const {
583+
return TargetFunctionTypeFlags<int_type>((Data & ~ParamFlagsMask) |
584+
(hasFlags ? ParamFlagsMask : 0));
585+
}
586+
580587
unsigned getNumArguments() const {
581588
return Data & NumArgumentsMask;
582589
}
@@ -588,7 +595,9 @@ class TargetFunctionTypeFlags {
588595
bool throws() const {
589596
return bool(Data & ThrowsMask);
590597
}
591-
598+
599+
bool hasParameterFlags() const { return bool(Data & ParamFlagsMask); }
600+
592601
int_type getIntValue() const {
593602
return Data;
594603
}

include/swift/Remote/MetadataReader.h

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -799,23 +799,35 @@ class MetadataReader {
799799
}
800800
case MetadataKind::Function: {
801801
auto Function = cast<TargetFunctionTypeMetadata<Runtime>>(Meta);
802+
auto numParameters = Function->getNumArguments();
802803

803804
std::vector<FunctionParam<BuiltType>> Parameters;
804805
StoredPointer ArgumentAddress = MetadataAddress +
805806
sizeof(TargetFunctionTypeMetadata<Runtime>);
806-
for (StoredPointer i = 0; i < Function->getNumArguments(); ++i,
807-
ArgumentAddress += sizeof(StoredPointer)) {
807+
StoredPointer ParameterFlagsAddress =
808+
ArgumentAddress + (numParameters * sizeof(StoredPointer));
809+
810+
for (StoredPointer i = 0; i < numParameters; ++i,
811+
ArgumentAddress += sizeof(StoredPointer),
812+
ParameterFlagsAddress += sizeof(StoredPointer)) {
808813
StoredPointer ParameterAddress;
809814
if (!Reader->readInteger(RemoteAddress(ArgumentAddress),
810815
&ParameterAddress))
811816
return BuiltType();
812817

813-
FunctionParam<BuiltType> Param;
814818
if (auto ParamTypeRef = readTypeFromMetadata(ParameterAddress)) {
815-
auto ParameterFlags = Function->getParameterFlags(i);
816-
819+
FunctionParam<BuiltType> Param;
817820
Param.setType(ParamTypeRef);
818-
Param.setFlags(ParameterTypeFlags::fromRaw(ParameterFlags));
821+
822+
if (Function->hasParameterFlags()) {
823+
uint32_t ParameterFlags;
824+
if (!Reader->readInteger(RemoteAddress(ParameterFlagsAddress),
825+
&ParameterFlags))
826+
return BuiltType();
827+
828+
Param.setFlags(ParameterTypeFlags::fromRaw(ParameterFlags));
829+
}
830+
819831
Parameters.push_back(std::move(Param));
820832
} else {
821833
return BuiltType();

include/swift/Runtime/Metadata.h

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,12 +1760,19 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
17601760
return reinterpret_cast<TargetPointer<Runtime, const Argument>>(this + 1);
17611761
}
17621762

1763+
TargetPointer<Runtime, uint32_t> getParameterFlags() {
1764+
return reinterpret_cast<TargetPointer<Runtime, uint32_t>>(
1765+
reinterpret_cast<Argument *>(this + 1) + getNumArguments());
1766+
}
1767+
1768+
TargetPointer<Runtime, const uint32_t> getParameterFlags() const {
1769+
return reinterpret_cast<TargetPointer<Runtime, const uint32_t>>(
1770+
reinterpret_cast<const Argument *>(this + 1) + getNumArguments());
1771+
}
1772+
17631773
uint32_t getParameterFlags(unsigned index) const {
1764-
auto numParams = getNumArguments();
1765-
assert(index < numParams);
1766-
auto *flags = reinterpret_cast<const uint32_t *>(this + 1 +
1767-
numParams * sizeof(Argument));
1768-
return flags[index];
1774+
assert(index <= getNumArguments());
1775+
return hasParameterFlags() ? getParameterFlags()[index] : 0;
17691776
}
17701777

17711778
StoredSize getNumArguments() const {
@@ -1775,6 +1782,7 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
17751782
return Flags.getConvention();
17761783
}
17771784
bool throws() const { return Flags.throws(); }
1785+
bool hasParameterFlags() const { return Flags.hasParameterFlags(); }
17781786

17791787
static constexpr StoredSize OffsetToFlags = sizeof(TargetMetadata<Runtime>);
17801788

@@ -2645,52 +2653,58 @@ swift_getGenericWitnessTable(GenericWitnessTable *genericTable,
26452653
/// \brief Fetch a uniqued metadata for a function type.
26462654
SWIFT_RUNTIME_EXPORT
26472655
const FunctionTypeMetadata *
2648-
swift_getFunctionTypeMetadata(const void *flagsArgsAndResult[]);
2656+
swift_getFunctionTypeMetadata(FunctionTypeFlags flags,
2657+
const Metadata **parameters,
2658+
const uint32_t *parameterFlags,
2659+
const Metadata *result);
26492660

26502661
SWIFT_RUNTIME_EXPORT
26512662
const FunctionTypeMetadata *
26522663
swift_getFunctionTypeMetadata1(FunctionTypeFlags flags,
26532664
const Metadata *arg0,
2654-
const Metadata *resultMetadata);
2665+
const Metadata *result);
26552666

26562667
SWIFT_RUNTIME_EXPORT
26572668
const FunctionTypeMetadata *
26582669
swift_getFunctionTypeMetadata1WithFlags(FunctionTypeFlags flags,
26592670
const Metadata *arg0,
2660-
const uint32_t *paramFlags,
2661-
const Metadata *resultMetadata);
2671+
const uint32_t flags0,
2672+
const Metadata *result);
26622673

26632674
SWIFT_RUNTIME_EXPORT
26642675
const FunctionTypeMetadata *
26652676
swift_getFunctionTypeMetadata2(FunctionTypeFlags flags,
26662677
const Metadata *arg0,
26672678
const Metadata *arg1,
2668-
const Metadata *resultMetadata);
2679+
const Metadata *result);
26692680

26702681
SWIFT_RUNTIME_EXPORT
26712682
const FunctionTypeMetadata *
26722683
swift_getFunctionTypeMetadata2WithFlags(FunctionTypeFlags flags,
26732684
const Metadata *arg0,
2685+
const uint32_t flags0,
26742686
const Metadata *arg1,
2675-
const uint32_t *paramFlags,
2676-
const Metadata *resultMetadata);
2687+
const uint32_t flags1,
2688+
const Metadata *result);
26772689

26782690
SWIFT_RUNTIME_EXPORT
26792691
const FunctionTypeMetadata *swift_getFunctionTypeMetadata3(
26802692
FunctionTypeFlags flags,
26812693
const Metadata *arg0,
26822694
const Metadata *arg1,
26832695
const Metadata *arg2,
2684-
const Metadata *resultMetadata);
2696+
const Metadata *result);
26852697

26862698
SWIFT_RUNTIME_EXPORT
26872699
const FunctionTypeMetadata *swift_getFunctionTypeMetadata3WithFlags(
26882700
FunctionTypeFlags flags,
26892701
const Metadata *arg0,
2702+
const uint32_t flags0,
26902703
const Metadata *arg1,
2704+
const uint32_t flags1,
26912705
const Metadata *arg2,
2692-
const uint32_t *paramFlags,
2693-
const Metadata *resultMetadata);
2706+
const uint32_t flags2,
2707+
const Metadata *result);
26942708

26952709
/// \brief Fetch a uniqued metadata for a thin function type.
26962710
SWIFT_RUNTIME_EXPORT

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -759,10 +759,14 @@ FUNCTION(ArrayDestroy, swift_arrayDestroy, DefaultCC,
759759
ARGS(OpaquePtrTy, SizeTy, TypeMetadataPtrTy),
760760
ATTRS(NoUnwind))
761761

762-
// Metadata *swift_getFunctionTypeMetadata(const void **args);
762+
// Metadata *swift_getFunctionTypeMetadata(unsigned long flags,
763+
// const Metadata **parameters,
764+
// const uint32_t *parameterFlags,
765+
// const Metadata *result);
763766
FUNCTION(GetFunctionMetadata, swift_getFunctionTypeMetadata, DefaultCC,
764767
RETURNS(TypeMetadataPtrTy),
765-
ARGS(Int8PtrTy->getPointerTo(0)),
768+
ARGS(SizeTy, TypeMetadataPtrTy->getPointerTo(), Int32Ty->getPointerTo(),
769+
TypeMetadataPtrTy),
766770
ATTRS(NoUnwind, ReadNone))
767771

768772
// Metadata *swift_getFunctionTypeMetadata1(unsigned long flags,
@@ -775,13 +779,12 @@ FUNCTION(GetFunctionMetadata1, swift_getFunctionTypeMetadata1, DefaultCC,
775779

776780
// Metadata *swift_getFunctionTypeMetadata1WithFlags(unsigned long flags,
777781
// const Metadata *arg0,
778-
// const uint32_t *paramFlags,
782+
// const uint32_t paramFlags,
779783
// const Metadata *resultMetadata);
780784
FUNCTION(GetFunctionMetadata1WithFlags, swift_getFunctionTypeMetadata1WithFlags,
781785
DefaultCC,
782786
RETURNS(TypeMetadataPtrTy),
783-
ARGS(SizeTy, TypeMetadataPtrTy, Int32Ty->getPointerTo(),
784-
TypeMetadataPtrTy),
787+
ARGS(SizeTy, TypeMetadataPtrTy, Int32Ty, TypeMetadataPtrTy),
785788
ATTRS(NoUnwind, ReadNone))
786789

787790
// Metadata *swift_getFunctionTypeMetadata2(unsigned long flags,
@@ -796,14 +799,15 @@ FUNCTION(GetFunctionMetadata2, swift_getFunctionTypeMetadata2,
796799

797800
// Metadata *swift_getFunctionTypeMetadata2WithFlags(unsigned long flags,
798801
// const Metadata *arg0,
802+
// const uint32_t flags0,
799803
// const Metadata *arg1,
800-
// const uint32_t *paramFlags,
804+
// const uint32_t flags1,
801805
// const Metadata *resultMetadata);
802806
FUNCTION(GetFunctionMetadata2WithFlags, swift_getFunctionTypeMetadata2WithFlags,
803807
DefaultCC,
804808
RETURNS(TypeMetadataPtrTy),
805-
ARGS(SizeTy, TypeMetadataPtrTy, TypeMetadataPtrTy,
806-
Int32Ty->getPointerTo(), TypeMetadataPtrTy),
809+
ARGS(SizeTy, TypeMetadataPtrTy, Int32Ty, TypeMetadataPtrTy, Int32Ty,
810+
TypeMetadataPtrTy),
807811
ATTRS(NoUnwind, ReadNone))
808812

809813
// Metadata *swift_getFunctionTypeMetadata3(unsigned long flags,
@@ -820,15 +824,17 @@ FUNCTION(GetFunctionMetadata3, swift_getFunctionTypeMetadata3,
820824

821825
// Metadata *swift_getFunctionTypeMetadata3WithFlags(unsigned long flags,
822826
// const Metadata *arg0,
827+
// const uint32_t flags0,
823828
// const Metadata *arg1,
829+
// const uint32_t flags1,
824830
// const Metadata *arg2,
825-
// const uint32_t *paramFlags,
831+
// const uint32_t flags2,
826832
// const Metadata *resultMetadata);
827833
FUNCTION(GetFunctionMetadata3WithFlags, swift_getFunctionTypeMetadata3WithFlags,
828834
DefaultCC,
829835
RETURNS(TypeMetadataPtrTy),
830-
ARGS(SizeTy, TypeMetadataPtrTy, TypeMetadataPtrTy, TypeMetadataPtrTy,
831-
Int32Ty->getPointerTo(), TypeMetadataPtrTy),
836+
ARGS(SizeTy, TypeMetadataPtrTy, Int32Ty, TypeMetadataPtrTy, Int32Ty,
837+
TypeMetadataPtrTy, Int32Ty, TypeMetadataPtrTy),
832838
ATTRS(NoUnwind, ReadNone))
833839

834840
// Metadata *swift_getForeignTypeMetadata(Metadata *nonUnique);

0 commit comments

Comments
 (0)