Skip to content

Commit f6b0d2d

Browse files
committed
[ABI/IRGen] Add custom function parameter flags representation for metadata use
1 parent 728d2a4 commit f6b0d2d

File tree

14 files changed

+170
-95
lines changed

14 files changed

+170
-95
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -551,10 +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,
557-
ParamFlagsMask = 0x01000000U,
554+
ConventionMask = 0x0F000000U,
555+
ConventionShift = 25U,
556+
ThrowsMask = 0x10000000U,
557+
ParamFlagsMask = 0x01000000U,
558558
};
559559
int_type Data;
560560

@@ -615,6 +615,56 @@ class TargetFunctionTypeFlags {
615615
};
616616
using FunctionTypeFlags = TargetFunctionTypeFlags<size_t>;
617617

618+
template <typename int_type>
619+
class TargetParameterTypeFlags {
620+
enum : int_type {
621+
InOutMask = 1 << 0,
622+
SharedMask = 1 << 1,
623+
VariadicMask = 1 << 2,
624+
};
625+
int_type Data;
626+
627+
constexpr TargetParameterTypeFlags(int_type Data) : Data(Data) {}
628+
629+
public:
630+
constexpr TargetParameterTypeFlags() : Data(0) {}
631+
632+
constexpr TargetParameterTypeFlags<int_type> withInOut(bool isInOut) const {
633+
return TargetParameterTypeFlags<int_type>((Data & ~InOutMask) |
634+
(isInOut ? InOutMask : 0));
635+
}
636+
637+
constexpr TargetParameterTypeFlags<int_type> withShared(bool isShared) const {
638+
return TargetParameterTypeFlags<int_type>((Data & ~SharedMask) |
639+
(isShared ? SharedMask : 0));
640+
}
641+
642+
constexpr TargetParameterTypeFlags<int_type>
643+
withVariadic(bool isVariadic) const {
644+
return TargetParameterTypeFlags<int_type>((Data & ~VariadicMask) |
645+
(isVariadic ? VariadicMask : 0));
646+
}
647+
648+
bool isNone() const { return Data == 0; }
649+
bool isInOut() const { return Data & InOutMask; }
650+
bool isShared() const { return Data & SharedMask; }
651+
bool isVariadic() const { return Data & VariadicMask; }
652+
653+
int_type getIntValue() const { return Data; }
654+
655+
static TargetParameterTypeFlags<int_type> fromIntValue(int_type Data) {
656+
return TargetParameterTypeFlags(Data);
657+
}
658+
659+
bool operator==(TargetParameterTypeFlags<int_type> other) const {
660+
return Data == other.Data;
661+
}
662+
bool operator!=(TargetParameterTypeFlags<int_type> other) const {
663+
return Data != other.Data;
664+
}
665+
};
666+
using ParameterFlags = TargetParameterTypeFlags<uint32_t>;
667+
618668
/// Field types and flags as represented in a nominal type's field/case type
619669
/// vector.
620670
class FieldType {

include/swift/Reflection/TypeRef.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ class FunctionTypeRef final : public TypeRef {
344344
for (const auto &Param : Parameters) {
345345
ID.addString(Param.getLabel().str());
346346
ID.addPointer(Param.getType());
347-
ID.addInteger(static_cast<uint32_t>(Param.getFlags().toRaw()));
347+
ID.addInteger(static_cast<uint32_t>(Param.getFlags().getIntValue()));
348348
}
349349
ID.addPointer(Result);
350350
ID.addInteger(static_cast<uint64_t>(Flags.getIntValue()));

include/swift/Remote/MetadataReader.h

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#ifndef SWIFT_REMOTE_METADATAREADER_H
1818
#define SWIFT_REMOTE_METADATAREADER_H
1919

20-
#include "swift/AST/Types.h"
2120
#include "swift/Runtime/Metadata.h"
2221
#include "swift/Remote/MemoryReader.h"
2322
#include "swift/Demangling/Demangler.h"
@@ -33,9 +32,9 @@ namespace remote {
3332
template <typename BuiltType> class FunctionParam {
3433
StringRef Label;
3534
BuiltType Type;
36-
ParameterTypeFlags Flags;
35+
ParameterFlags Flags;
3736

38-
FunctionParam(StringRef label, BuiltType type, ParameterTypeFlags flags)
37+
FunctionParam(StringRef label, BuiltType type, ParameterFlags flags)
3938
: Label(label), Type(type), Flags(flags) {}
4039

4140
public:
@@ -45,15 +44,15 @@ template <typename BuiltType> class FunctionParam {
4544

4645
StringRef getLabel() const { return Label; }
4746
BuiltType getType() const { return Type; }
48-
ParameterTypeFlags getFlags() const { return Flags; }
47+
ParameterFlags getFlags() const { return Flags; }
4948

5049
void setLabel(StringRef label) { Label = label; }
5150
void setType(BuiltType type) { Type = type; }
5251

5352
void setVariadic() { Flags = Flags.withVariadic(true); }
5453
void setShared() { Flags = Flags.withShared(true); }
5554
void setInOut() { Flags = Flags.withInOut(true); }
56-
void setFlags(ParameterTypeFlags flags) { Flags = flags; };
55+
void setFlags(ParameterFlags flags) { Flags = flags; };
5756

5857
FunctionParam withLabel(StringRef label) const {
5958
return FunctionParam(label, Type, Flags);
@@ -63,7 +62,7 @@ template <typename BuiltType> class FunctionParam {
6362
return FunctionParam(Label, type, Flags);
6463
}
6564

66-
FunctionParam withFlags(ParameterTypeFlags flags) const {
65+
FunctionParam withFlags(ParameterFlags flags) const {
6766
return FunctionParam(Label, Type, flags);
6867
}
6968
};
@@ -805,17 +804,17 @@ class MetadataReader {
805804
StoredPointer ArgumentAddress = MetadataAddress +
806805
sizeof(TargetFunctionTypeMetadata<Runtime>);
807806
StoredPointer ParameterFlagsAddress =
808-
ArgumentAddress + (numParameters * sizeof(StoredPointer));
807+
ArgumentAddress + (numParameters * sizeof(StoredPointer));
809808

810-
for (StoredPointer i = 0; i < numParameters; ++i,
811-
ArgumentAddress += sizeof(StoredPointer),
812-
ParameterFlagsAddress += sizeof(StoredPointer)) {
813-
StoredPointer ParameterAddress;
809+
for (unsigned i = 0; i < numParameters; ++i,
810+
ArgumentAddress += sizeof(StoredPointer),
811+
ParameterFlagsAddress += sizeof(uint32_t)) {
812+
StoredPointer ParamMetadata;
814813
if (!Reader->readInteger(RemoteAddress(ArgumentAddress),
815-
&ParameterAddress))
814+
&ParamMetadata))
816815
return BuiltType();
817816

818-
if (auto ParamTypeRef = readTypeFromMetadata(ParameterAddress)) {
817+
if (auto ParamTypeRef = readTypeFromMetadata(ParamMetadata)) {
819818
FunctionParam<BuiltType> Param;
820819
Param.setType(ParamTypeRef);
821820

@@ -824,8 +823,7 @@ class MetadataReader {
824823
if (!Reader->readInteger(RemoteAddress(ParameterFlagsAddress),
825824
&ParameterFlags))
826825
return BuiltType();
827-
828-
Param.setFlags(ParameterTypeFlags::fromRaw(ParameterFlags));
826+
Param.setFlags(ParameterFlags::fromIntValue(ParameterFlags));
829827
}
830828

831829
Parameters.push_back(std::move(Param));

include/swift/Runtime/Metadata.h

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1762,17 +1762,18 @@ struct TargetFunctionTypeMetadata : public TargetMetadata<Runtime> {
17621762

17631763
TargetPointer<Runtime, uint32_t> getParameterFlags() {
17641764
return reinterpret_cast<TargetPointer<Runtime, uint32_t>>(
1765-
reinterpret_cast<Argument *>(this + 1) + getNumArguments());
1765+
reinterpret_cast<Argument *>(this + 1) + getNumArguments());
17661766
}
17671767

17681768
TargetPointer<Runtime, const uint32_t> getParameterFlags() const {
17691769
return reinterpret_cast<TargetPointer<Runtime, const uint32_t>>(
1770-
reinterpret_cast<const Argument *>(this + 1) + getNumArguments());
1770+
reinterpret_cast<const Argument *>(this + 1) + getNumArguments());
17711771
}
17721772

1773-
uint32_t getParameterFlags(unsigned index) const {
1774-
assert(index <= getNumArguments());
1775-
return hasParameterFlags() ? getParameterFlags()[index] : 0;
1773+
ParameterFlags getParameterFlags(unsigned index) const {
1774+
assert(index < getNumArguments());
1775+
auto flags = hasParameterFlags() ? getParameterFlags()[index] : 0;
1776+
return ParameterFlags::fromIntValue(flags);
17761777
}
17771778

17781779
StoredSize getNumArguments() const {
@@ -2654,7 +2655,7 @@ swift_getGenericWitnessTable(GenericWitnessTable *genericTable,
26542655
SWIFT_RUNTIME_EXPORT
26552656
const FunctionTypeMetadata *
26562657
swift_getFunctionTypeMetadata(FunctionTypeFlags flags,
2657-
const Metadata **parameters,
2658+
const Metadata *const *parameters,
26582659
const uint32_t *parameterFlags,
26592660
const Metadata *result);
26602661

@@ -2668,7 +2669,7 @@ SWIFT_RUNTIME_EXPORT
26682669
const FunctionTypeMetadata *
26692670
swift_getFunctionTypeMetadata1WithFlags(FunctionTypeFlags flags,
26702671
const Metadata *arg0,
2671-
const uint32_t flags0,
2672+
ParameterFlags flags0,
26722673
const Metadata *result);
26732674

26742675
SWIFT_RUNTIME_EXPORT
@@ -2682,9 +2683,9 @@ SWIFT_RUNTIME_EXPORT
26822683
const FunctionTypeMetadata *
26832684
swift_getFunctionTypeMetadata2WithFlags(FunctionTypeFlags flags,
26842685
const Metadata *arg0,
2685-
const uint32_t flags0,
2686+
ParameterFlags flags0,
26862687
const Metadata *arg1,
2687-
const uint32_t flags1,
2688+
ParameterFlags flags1,
26882689
const Metadata *result);
26892690

26902691
SWIFT_RUNTIME_EXPORT
@@ -2699,11 +2700,11 @@ SWIFT_RUNTIME_EXPORT
26992700
const FunctionTypeMetadata *swift_getFunctionTypeMetadata3WithFlags(
27002701
FunctionTypeFlags flags,
27012702
const Metadata *arg0,
2702-
const uint32_t flags0,
2703+
ParameterFlags flags0,
27032704
const Metadata *arg1,
2704-
const uint32_t flags1,
2705+
ParameterFlags flags1,
27052706
const Metadata *arg2,
2706-
const uint32_t flags2,
2707+
ParameterFlags flags2,
27072708
const Metadata *result);
27082709

27092710
/// \brief Fetch a uniqued metadata for a thin function type.

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,9 @@ FUNCTION(ArrayDestroy, swift_arrayDestroy, DefaultCC,
765765
// const Metadata *result);
766766
FUNCTION(GetFunctionMetadata, swift_getFunctionTypeMetadata, DefaultCC,
767767
RETURNS(TypeMetadataPtrTy),
768-
ARGS(SizeTy, TypeMetadataPtrTy->getPointerTo(), Int32Ty->getPointerTo(),
768+
ARGS(SizeTy,
769+
TypeMetadataPtrTy->getPointerTo(0),
770+
Int32Ty->getPointerTo(0),
769771
TypeMetadataPtrTy),
770772
ATTRS(NoUnwind, ReadNone))
771773

lib/IRGen/GenMeta.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -757,12 +757,19 @@ namespace {
757757
flagsVal.getIntValue());
758758

759759
auto collectParameters =
760-
[&](llvm::function_ref<void(unsigned, llvm::Value *, uint8_t)>
760+
[&](llvm::function_ref<void(unsigned, llvm::Value *,
761+
ParameterFlags flags)>
761762
processor) {
762763
for (auto index : indices(params)) {
763764
auto param = params[index];
764765
auto flags = param.getParameterFlags();
765-
processor(index, getFunctionParameterRef(param), flags.toRaw());
766+
767+
auto parameterFlags = ParameterFlags()
768+
.withInOut(flags.isInOut())
769+
.withShared(flags.isShared())
770+
.withVariadic(flags.isVariadic());
771+
772+
processor(index, getFunctionParameterRef(param), parameterFlags);
766773
}
767774
};
768775

@@ -771,10 +778,12 @@ namespace {
771778
-> llvm::Constant * {
772779
arguments.push_back(flags);
773780

774-
collectParameters([&](unsigned i, llvm::Value *typeRef, uint8_t flags) {
781+
collectParameters([&](unsigned i, llvm::Value *typeRef,
782+
ParameterFlags flags) {
775783
arguments.push_back(typeRef);
776784
if (hasFlags)
777-
arguments.push_back(llvm::ConstantInt::get(IGF.IGM.Int32Ty, flags));
785+
arguments.push_back(
786+
llvm::ConstantInt::get(IGF.IGM.Int32Ty, flags.getIntValue()));
778787
});
779788

780789
arguments.push_back(result);
@@ -831,12 +840,12 @@ namespace {
831840
ConstantInitBuilder paramFlags(IGF.IGM);
832841
auto flagsArr = paramFlags.beginArray();
833842
collectParameters([&](unsigned i, llvm::Value *typeRef,
834-
uint8_t flags) {
843+
ParameterFlags flags) {
835844
auto argPtr = IGF.Builder.CreateStructGEP(parameters, i,
836845
IGF.IGM.getPointerSize());
837846
IGF.Builder.CreateStore(typeRef, argPtr);
838847
if (hasFlags)
839-
flagsArr.addInt32(flags);
848+
flagsArr.addInt32(flags.getIntValue());
840849
});
841850

842851
auto parametersPtr =

lib/RemoteAST/RemoteAST.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,12 @@ class RemoteASTTypeBuilder {
334334

335335
auto label = Ctx.getIdentifier(param.getLabel());
336336
auto flags = param.getFlags();
337-
funcParams.push_back(AnyFunctionType::Param(type, label, flags));
337+
auto parameterFlags = ParameterTypeFlags()
338+
.withInOut(flags.isInOut())
339+
.withShared(flags.isShared())
340+
.withVariadic(flags.isVariadic());
341+
342+
funcParams.push_back(AnyFunctionType::Param(type, label, parameterFlags));
338343
}
339344

340345
return FunctionType::get(funcParams, output, einfo);

stdlib/public/Reflection/TypeRef.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,6 @@ class PrintTypeRef : public TypeRefVisitor<PrintTypeRef, void> {
147147
if (flags.isShared())
148148
printHeader("shared");
149149

150-
if (flags.isEscaping())
151-
printHeader("escaping");
152-
153150
printRec(param.getType());
154151

155152
if (!flags.isNone()) {

stdlib/public/runtime/Demangle.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
#include "swift/AST/Types.h"
1413
#include "swift/Runtime/Metadata.h"
1514
#include "swift/Strings.h"
1615
#include "Private.h"
@@ -322,7 +321,7 @@ swift::_swift_buildDemanglingForMetadata(const Metadata *type,
322321
std::vector<NodePointer> inputs;
323322
for (unsigned i = 0, e = func->getNumArguments(); i < e; ++i) {
324323
auto arg = func->getArguments()[i];
325-
auto flags = ParameterTypeFlags::fromRaw(func->getParameterFlags(i));
324+
auto flags = func->getParameterFlags(i);
326325
auto input = _swift_buildDemanglingForMetadata(arg, Dem);
327326

328327
if (flags.isInOut()) {

0 commit comments

Comments
 (0)