Skip to content

Commit 09d2e8f

Browse files
committed
IRGen: add forceShared flag to LinkeEntity for type metadata
1 parent 941a742 commit 09d2e8f

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

include/swift/IRGen/Linking.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ class LinkEntity {
127127
// This field appears in the TypeMetadata and ObjCResilientClassStub kinds.
128128
MetadataAddressShift = 8, MetadataAddressMask = 0x0300,
129129

130+
// This field appears in the TypeMetadata kind.
131+
ForceSharedShift = 12, ForceSharedMask = 0x1000,
132+
130133
// This field appears in associated type access functions.
131134
AssociatedTypeIndexShift = 8, AssociatedTypeIndexMask = ~KindMask,
132135

@@ -847,12 +850,14 @@ class LinkEntity {
847850
}
848851

849852
static LinkEntity forTypeMetadata(CanType concreteType,
850-
TypeMetadataAddress addr) {
853+
TypeMetadataAddress addr,
854+
bool forceShared = false) {
851855
assert(!isObjCImplementation(concreteType));
852856
assert(!isEmbedded(concreteType) || isMetadataAllowedInEmbedded(concreteType));
853857
LinkEntity entity;
854858
entity.setForType(Kind::TypeMetadata, concreteType);
855859
entity.Data |= LINKENTITY_SET_FIELD(MetadataAddress, unsigned(addr));
860+
entity.Data |= LINKENTITY_SET_FIELD(ForceShared, unsigned(forceShared));
856861
return entity;
857862
}
858863

@@ -1584,6 +1589,10 @@ class LinkEntity {
15841589
getKind() == Kind::ObjCResilientClassStub);
15851590
return (TypeMetadataAddress)LINKENTITY_GET_FIELD(Data, MetadataAddress);
15861591
}
1592+
bool isForcedShared() const {
1593+
assert(getKind() == Kind::TypeMetadata);
1594+
return (bool)LINKENTITY_GET_FIELD(Data, ForceShared);
1595+
}
15871596
bool isObjCClassRef() const {
15881597
return getKind() == Kind::ObjCClassRef;
15891598
}

lib/IRGen/Linking.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,9 @@ SILLinkage LinkEntity::getLinkage(ForDefinition_t forDefinition) const {
642642
return SILLinkage::Shared;
643643

644644
case Kind::TypeMetadata: {
645+
if (isForcedShared())
646+
return SILLinkage::Shared;
647+
645648
auto *nominal = getType().getAnyNominal();
646649
switch (getMetadataAddress()) {
647650
case TypeMetadataAddress::FullMetadata:

0 commit comments

Comments
 (0)