Skip to content

Commit f14ca43

Browse files
authored
Merge pull request #58694 from CodaFi/AST-spumonte
[5.7][Remote AST] Support Parameterized Existential Types
2 parents 0388673 + 48b1dae commit f14ca43

File tree

14 files changed

+585
-61
lines changed

14 files changed

+585
-61
lines changed

include/swift/ABI/GenericContext.h

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ struct TargetGenericContextDescriptorHeader {
5858
/// Key arguments include generic parameters and conformance
5959
/// requirements which are part of the identity of the context.
6060
///
61-
/// The key area of the argument layout considers of a sequence
61+
/// The key area of the argument layout consists of a sequence
6262
/// of type metadata pointers (in the same order as the parameter
6363
/// descriptors, for those parameters which satisfy hasKeyArgument())
6464
/// followed by a sequence of witness table pointers (in the same
@@ -191,25 +191,48 @@ using GenericRequirementDescriptor =
191191
extern const GenericParamDescriptor
192192
ImplicitGenericParamDescriptors[MaxNumImplicitGenericParamDescriptors];
193193

194+
inline const GenericParamDescriptor *
195+
externalTargetImplicitGenericParamDescriptors() {
196+
static const GenericParamDescriptor
197+
buffer[MaxNumImplicitGenericParamDescriptors] = {
198+
#define D GenericParamDescriptor::implicit()
199+
D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D,
200+
D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D,
201+
D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D
202+
#undef D
203+
};
204+
return buffer;
205+
}
206+
207+
template <class Runtime>
208+
const GenericParamDescriptor *targetImplicitGenericParamDescriptors() {
209+
return externalTargetImplicitGenericParamDescriptors();
210+
}
211+
template <>
212+
inline const GenericParamDescriptor *targetImplicitGenericParamDescriptors<InProcess>() {
213+
return ImplicitGenericParamDescriptors;
214+
}
215+
194216
/// A runtime description of a generic signature.
217+
template<typename Runtime>
195218
class RuntimeGenericSignature {
196-
GenericContextDescriptorHeader Header;
219+
TargetGenericContextDescriptorHeader<Runtime> Header;
197220
const GenericParamDescriptor *Params;
198-
const GenericRequirementDescriptor *Requirements;
221+
const TargetGenericRequirementDescriptor<Runtime> *Requirements;
199222
public:
200223
RuntimeGenericSignature()
201224
: Header{0, 0, 0, 0}, Params(nullptr), Requirements(nullptr) {}
202225

203-
RuntimeGenericSignature(const GenericContextDescriptorHeader &header,
226+
RuntimeGenericSignature(const TargetGenericContextDescriptorHeader<Runtime> &header,
204227
const GenericParamDescriptor *params,
205-
const GenericRequirementDescriptor *requirements)
228+
const TargetGenericRequirementDescriptor<Runtime> *requirements)
206229
: Header(header), Params(params), Requirements(requirements) {}
207230

208231
llvm::ArrayRef<GenericParamDescriptor> getParams() const {
209232
return llvm::makeArrayRef(Params, Header.NumParams);
210233
}
211234

212-
llvm::ArrayRef<GenericRequirementDescriptor> getRequirements() const {
235+
llvm::ArrayRef<TargetGenericRequirementDescriptor<Runtime>> getRequirements() const {
213236
return llvm::makeArrayRef(Requirements, Header.NumRequirements);
214237
}
215238

@@ -375,8 +398,8 @@ class TrailingGenericContextObjects<TargetSelf<Runtime>,
375398
* sizeof(StoredPointer);
376399
}
377400

378-
RuntimeGenericSignature getGenericSignature() const {
379-
if (!asSelf()->isGeneric()) return RuntimeGenericSignature();
401+
RuntimeGenericSignature<Runtime> getGenericSignature() const {
402+
if (!asSelf()->isGeneric()) return RuntimeGenericSignature<Runtime>();
380403
return {getGenericContextHeader(),
381404
getGenericParams().data(),
382405
getGenericRequirements().data()};

include/swift/ABI/Metadata.h

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1735,6 +1735,12 @@ struct TargetExistentialTypeMetadata
17351735
using ExistentialTypeMetadata
17361736
= TargetExistentialTypeMetadata<InProcess>;
17371737

1738+
template<typename Runtime>
1739+
struct TargetExistentialTypeExpression {
1740+
/// The type expression.
1741+
TargetRelativeDirectPointer<Runtime, const char, /*nullable*/ false> name;
1742+
};
1743+
17381744
/// A description of the shape of an existential type.
17391745
///
17401746
/// An existential type has the general form:
@@ -1791,7 +1797,7 @@ struct TargetExtendedExistentialTypeShape
17911797
// Optional generalization signature header
17921798
TargetGenericContextDescriptorHeader<Runtime>,
17931799
// Optional type subexpression
1794-
TargetRelativeDirectPointer<Runtime, const char, /*nullable*/ false>,
1800+
TargetExistentialTypeExpression<Runtime>,
17951801
// Optional suggested value witnesses
17961802
TargetRelativeIndirectablePointer<Runtime, const TargetValueWitnessTable<Runtime>,
17971803
/*nullable*/ false>,
@@ -1802,8 +1808,6 @@ struct TargetExtendedExistentialTypeShape
18021808
// for generalization signature
18031809
TargetGenericRequirementDescriptor<Runtime>> {
18041810
private:
1805-
using RelativeStringPointer =
1806-
TargetRelativeDirectPointer<Runtime, const char, /*nullable*/ false>;
18071811
using RelativeValueWitnessTablePointer =
18081812
TargetRelativeIndirectablePointer<Runtime,
18091813
const TargetValueWitnessTable<Runtime>,
@@ -1812,7 +1816,7 @@ struct TargetExtendedExistentialTypeShape
18121816
swift::ABI::TrailingObjects<
18131817
TargetExtendedExistentialTypeShape<Runtime>,
18141818
TargetGenericContextDescriptorHeader<Runtime>,
1815-
RelativeStringPointer,
1819+
TargetExistentialTypeExpression<Runtime>,
18161820
RelativeValueWitnessTablePointer,
18171821
GenericParamDescriptor,
18181822
TargetGenericRequirementDescriptor<Runtime>>;
@@ -1825,7 +1829,7 @@ struct TargetExtendedExistentialTypeShape
18251829
return Flags.hasGeneralizationSignature();
18261830
}
18271831

1828-
size_t numTrailingObjects(OverloadToken<RelativeStringPointer>) const {
1832+
size_t numTrailingObjects(OverloadToken<TargetExistentialTypeExpression<Runtime>>) const {
18291833
return Flags.hasTypeExpression();
18301834
}
18311835

@@ -1879,12 +1883,13 @@ struct TargetExtendedExistentialTypeShape
18791883
/// we nonetheless distinguish at compile time. Storing this also
18801884
/// allows us to far more easily produce a formal type from this
18811885
/// shape reflectively.
1882-
RelativeStringPointer ExistentialType;
1886+
TargetRelativeDirectPointer<Runtime, const char, /*nullable*/ false>
1887+
ExistentialType;
18831888

18841889
/// The header describing the requirement signature of the existential.
18851890
TargetGenericContextDescriptorHeader<Runtime> ReqSigHeader;
18861891

1887-
RuntimeGenericSignature getRequirementSignature() const {
1892+
RuntimeGenericSignature<Runtime> getRequirementSignature() const {
18881893
return {ReqSigHeader, getReqSigParams(), getReqSigRequirements()};
18891894
}
18901895

@@ -1894,8 +1899,8 @@ struct TargetExtendedExistentialTypeShape
18941899

18951900
const GenericParamDescriptor *getReqSigParams() const {
18961901
return Flags.hasImplicitReqSigParams()
1897-
? ImplicitGenericParamDescriptors
1898-
: this->template getTrailingObjects<GenericParamDescriptor>();
1902+
? swift::targetImplicitGenericParamDescriptors<Runtime>()
1903+
: this->template getTrailingObjects<GenericParamDescriptor>();
18991904
}
19001905

19011906
unsigned getNumReqSigRequirements() const {
@@ -1911,10 +1916,11 @@ struct TargetExtendedExistentialTypeShape
19111916
/// The type expression of the existential, as a symbolic mangled type
19121917
/// string. Must be null if the header is just the (single)
19131918
/// requirement type parameter.
1914-
TargetPointer<Runtime, const char> getTypeExpression() const {
1919+
const TargetExistentialTypeExpression<Runtime> *getTypeExpression() const {
19151920
return Flags.hasTypeExpression()
1916-
? this->template getTrailingObjects<RelativeStringPointer>()->get()
1917-
: nullptr;
1921+
? this->template getTrailingObjects<
1922+
TargetExistentialTypeExpression<Runtime>>()
1923+
: nullptr;
19181924
}
19191925

19201926
bool isTypeExpressionOpaque() const {
@@ -1961,8 +1967,8 @@ struct TargetExtendedExistentialTypeShape
19611967
return Flags.hasGeneralizationSignature();
19621968
}
19631969

1964-
RuntimeGenericSignature getGeneralizationSignature() const {
1965-
if (!hasGeneralizationSignature()) return RuntimeGenericSignature();
1970+
RuntimeGenericSignature<Runtime> getGeneralizationSignature() const {
1971+
if (!hasGeneralizationSignature()) return RuntimeGenericSignature<Runtime>();
19661972
return {*getGenSigHeader(), getGenSigParams(), getGenSigRequirements()};
19671973
}
19681974

@@ -1974,7 +1980,7 @@ struct TargetExtendedExistentialTypeShape
19741980
const GenericParamDescriptor *getGenSigParams() const {
19751981
assert(hasGeneralizationSignature());
19761982
if (Flags.hasImplicitGenSigParams())
1977-
return ImplicitGenericParamDescriptors;
1983+
return swift::targetImplicitGenericParamDescriptors<Runtime>();
19781984
auto base = this->template getTrailingObjects<GenericParamDescriptor>();
19791985
if (!Flags.hasImplicitReqSigParams())
19801986
base += getNumReqSigParams();
@@ -2086,6 +2092,8 @@ struct TargetExtendedExistentialTypeMetadata
20862092
swift::ABI::TrailingObjects<
20872093
TargetExtendedExistentialTypeMetadata<Runtime>,
20882094
ConstTargetPointer<Runtime, void>> {
2095+
using StoredSize = typename Runtime::StoredSize;
2096+
20892097
private:
20902098
using TrailingObjects =
20912099
swift::ABI::TrailingObjects<
@@ -2097,9 +2105,12 @@ struct TargetExtendedExistentialTypeMetadata
20972105
using OverloadToken = typename TrailingObjects::template OverloadToken<T>;
20982106

20992107
size_t numTrailingObjects(OverloadToken<ConstTargetPointer<Runtime, void>>) const {
2100-
return Shape->getGenSigLayoutSizeInWords();
2108+
return Shape->getGenSigArgumentLayoutSizeInWords();
21012109
}
21022110

2111+
public:
2112+
static constexpr StoredSize OffsetToArguments = sizeof(TargetMetadata<Runtime>);
2113+
21032114
public:
21042115
explicit constexpr
21052116
TargetExtendedExistentialTypeMetadata(const ExtendedExistentialTypeShape *shape)
@@ -2113,6 +2124,11 @@ struct TargetExtendedExistentialTypeMetadata
21132124
ConstTargetPointer<Runtime, void> const *getGeneralizationArguments() const {
21142125
return this->template getTrailingObjects<ConstTargetPointer<Runtime, void>>();
21152126
}
2127+
2128+
public:
2129+
static bool classof(const TargetMetadata<Runtime> *metadata) {
2130+
return metadata->getKind() == MetadataKind::ExtendedExistential;
2131+
}
21162132
};
21172133
using ExtendedExistentialTypeMetadata
21182134
= TargetExtendedExistentialTypeMetadata<InProcess>;

include/swift/AST/ASTDemangler.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ class ASTBuilder {
5959
using BuiltType = swift::Type;
6060
using BuiltTypeDecl = swift::GenericTypeDecl *; // nominal or type alias
6161
using BuiltProtocolDecl = swift::ProtocolDecl *;
62+
using BuiltGenericSignature = swift::GenericSignature;
63+
using BuiltGenericTypeParam = swift::GenericTypeParamType *;
64+
using BuiltRequirement = swift::Requirement;
65+
using BuiltSubstitutionMap = swift::SubstitutionMap;
66+
6267
explicit ASTBuilder(ASTContext &ctx) : Ctx(ctx) {}
6368

6469
ASTContext &getASTContext() { return Ctx; }
@@ -112,6 +117,8 @@ class ASTBuilder {
112117
bool isClassBound,
113118
bool forRequirement = true);
114119

120+
Type createProtocolTypeFromDecl(ProtocolDecl *protocol);
121+
115122
Type createParameterizedProtocolType(Type base, ArrayRef<Type> args);
116123

117124
Type createExistentialMetatypeType(Type instance,
@@ -134,7 +141,6 @@ class ASTBuilder {
134141
Type createSILBoxType(Type base);
135142
using BuiltSILBoxField = llvm::PointerIntPair<Type, 1>;
136143
using BuiltSubstitution = std::pair<Type, Type>;
137-
using BuiltRequirement = swift::Requirement;
138144
using BuiltLayoutConstraint = swift::LayoutConstraint;
139145
Type createSILBoxTypeWithLayout(ArrayRef<BuiltSILBoxField> Fields,
140146
ArrayRef<BuiltSubstitution> Substitutions,
@@ -167,6 +173,15 @@ class ASTBuilder {
167173

168174
Type createParenType(Type base);
169175

176+
BuiltGenericSignature
177+
createGenericSignature(ArrayRef<BuiltType> params,
178+
ArrayRef<BuiltRequirement> requirements);
179+
180+
BuiltSubstitutionMap createSubstitutionMap(BuiltGenericSignature sig,
181+
ArrayRef<BuiltType> replacements);
182+
183+
Type subst(Type subject, const BuiltSubstitutionMap &Subs) const;
184+
170185
LayoutConstraint getLayoutConstraint(LayoutConstraintKind kind);
171186
LayoutConstraint getLayoutConstraintWithSizeAlign(LayoutConstraintKind kind,
172187
unsigned size,

include/swift/Demangling/TypeDecoder.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,9 @@ class TypeDecoder {
464464
using BuiltSubstitution = typename BuilderType::BuiltSubstitution;
465465
using BuiltRequirement = typename BuilderType::BuiltRequirement;
466466
using BuiltLayoutConstraint = typename BuilderType::BuiltLayoutConstraint;
467+
using BuiltGenericTypeParam = typename BuilderType::BuiltGenericTypeParam;
468+
using BuiltGenericSignature = typename BuilderType::BuiltGenericSignature;
469+
using BuiltSubstitutionMap = typename BuilderType::BuiltSubstitutionMap;
467470
using NodeKind = Demangle::Node::Kind;
468471

469472
BuilderType &Builder;

include/swift/Reflection/TypeRef.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,37 @@ class DependentMemberTypeRef final : public TypeRef {
741741
}
742742
};
743743

744+
/// A representation of a dynamically-constructed generic signature.
745+
///
746+
/// \note This class is not a \c TypeRef.
747+
class GenericSignatureRef final {
748+
std::vector<const GenericTypeParameterTypeRef *> Params;
749+
std::vector<TypeRefRequirement> Requirements;
750+
751+
public:
752+
GenericSignatureRef(
753+
llvm::ArrayRef<const GenericTypeParameterTypeRef *> Params,
754+
llvm::ArrayRef<TypeRefRequirement> Requirements)
755+
: Params(Params.begin(), Params.end()),
756+
Requirements(Requirements.begin(), Requirements.end()) {}
757+
758+
template <typename Allocator>
759+
static const GenericSignatureRef *
760+
create(Allocator &A,
761+
llvm::ArrayRef<const GenericTypeParameterTypeRef *> Params,
762+
llvm::ArrayRef<TypeRefRequirement> Requirements) {
763+
return A.makeGenericSignatureRef(Params, Requirements);
764+
}
765+
766+
const llvm::ArrayRef<const GenericTypeParameterTypeRef *> getParams() const {
767+
return Params;
768+
}
769+
770+
const llvm::ArrayRef<TypeRefRequirement> getRequirements() const {
771+
return Requirements;
772+
}
773+
};
774+
744775
class ForeignClassTypeRef final : public TypeRef {
745776
std::string Name;
746777

0 commit comments

Comments
 (0)