Skip to content

Commit 30a74f6

Browse files
committed
SIL: remove the private_external SILLinkage
This was a relict from the -sil-serialize-all days. This linkage doesn't make any sense because a private function cannot be referenced from another module (or file, in case of non-wmo compilation).
1 parent b4966a4 commit 30a74f6

20 files changed

+32
-47
lines changed

include/swift/SIL/SILLinkage.h

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,6 @@ enum class SILLinkage : uint8_t {
8585
/// shared.
8686
SharedExternal,
8787

88-
/// The same as SharedExternal, except that the definition is private in the
89-
/// other module. This can only occur if an inlined fragile function from
90-
/// another module references a private definition in the other module.
91-
PrivateExternal,
92-
9388
/// The default linkage for a definition.
9489
DefaultForDefinition = Public,
9590

@@ -138,8 +133,6 @@ inline SILLinkage stripExternalFromLinkage(SILLinkage linkage) {
138133
return SILLinkage::Hidden;
139134
if (linkage == SILLinkage::SharedExternal)
140135
return SILLinkage::Shared;
141-
if (linkage == SILLinkage::PrivateExternal)
142-
return SILLinkage::Private;
143136
return linkage;
144137
}
145138

@@ -158,10 +151,8 @@ inline SILLinkage addExternalToLinkage(SILLinkage linkage) {
158151
case SILLinkage::Hidden:
159152
return SILLinkage::HiddenExternal;
160153
case SILLinkage::Private:
161-
return SILLinkage::PrivateExternal;
162154
case SILLinkage::PublicExternal:
163155
case SILLinkage::SharedExternal:
164-
case SILLinkage::PrivateExternal:
165156
case SILLinkage::HiddenExternal:
166157
return linkage;
167158
}
@@ -197,7 +188,6 @@ inline bool hasPublicVisibility(SILLinkage linkage) {
197188
case SILLinkage::Shared:
198189
case SILLinkage::SharedExternal:
199190
case SILLinkage::Private:
200-
case SILLinkage::PrivateExternal:
201191
case SILLinkage::HiddenExternal:
202192
return false;
203193
}
@@ -216,7 +206,6 @@ inline bool hasSharedVisibility(SILLinkage linkage) {
216206
case SILLinkage::Hidden:
217207
case SILLinkage::HiddenExternal:
218208
case SILLinkage::Private:
219-
case SILLinkage::PrivateExternal:
220209
return false;
221210
}
222211

@@ -226,7 +215,6 @@ inline bool hasSharedVisibility(SILLinkage linkage) {
226215
inline bool hasPrivateVisibility(SILLinkage linkage) {
227216
switch (linkage) {
228217
case SILLinkage::Private:
229-
case SILLinkage::PrivateExternal:
230218
return true;
231219
case SILLinkage::Public:
232220
case SILLinkage::PublicExternal:
@@ -247,8 +235,7 @@ inline SILLinkage effectiveLinkageForClassMember(SILLinkage linkage,
247235
case SubclassScope::External:
248236
if (linkage == SILLinkage::Private || linkage == SILLinkage::Hidden)
249237
return SILLinkage::Public;
250-
if (linkage == SILLinkage::PrivateExternal ||
251-
linkage == SILLinkage::HiddenExternal)
238+
if (linkage == SILLinkage::HiddenExternal)
252239
return SILLinkage::PublicExternal;
253240
break;
254241

lib/IRGen/GenDecl.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2074,7 +2074,6 @@ getIRLinkage(const UniversalLinkageInfo &info, SILLinkage linkage,
20742074
}
20752075

20762076
case SILLinkage::HiddenExternal:
2077-
case SILLinkage::PrivateExternal:
20782077
if (isDefinition)
20792078
return RESULT(AvailableExternally, Hidden, Default);
20802079

lib/IRGen/GenMeta.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2023,7 +2023,6 @@ namespace {
20232023
case SILLinkage::Hidden:
20242024
case SILLinkage::HiddenExternal:
20252025
case SILLinkage::Private:
2026-
case SILLinkage::PrivateExternal:
20272026
return true;
20282027

20292028
case SILLinkage::Shared:

lib/IRGen/Linking.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,8 @@ SILLinkage LinkEntity::getLinkage(ForDefinition_t forDefinition) const {
609609
auto *nominal = getType().getAnyNominal();
610610
if (getDeclLinkage(nominal) == FormalLinkage::PublicNonUnique)
611611
return SILLinkage::Shared;
612-
return forDefinition ? SILLinkage::Private : SILLinkage::PrivateExternal;
612+
assert(forDefinition);
613+
return SILLinkage::Private;
613614
}
614615

615616
case Kind::TypeMetadataAccessFunction:

lib/SIL/IR/SIL.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ swift::getLinkageForProtocolConformance(const RootProtocolConformance *C,
8686
switch (access) {
8787
case AccessLevel::Private:
8888
case AccessLevel::FilePrivate:
89-
return (definition ? SILLinkage::Private : SILLinkage::PrivateExternal);
89+
return SILLinkage::Private;
9090

9191
case AccessLevel::Internal:
9292
return (definition ? SILLinkage::Hidden : SILLinkage::HiddenExternal);
@@ -280,7 +280,6 @@ bool AbstractStorageDecl::exportsPropertyDescriptor() const {
280280
return false;
281281

282282
case SILLinkage::HiddenExternal:
283-
case SILLinkage::PrivateExternal:
284283
case SILLinkage::PublicExternal:
285284
case SILLinkage::SharedExternal:
286285
llvm_unreachable("should be definition linkage?");

lib/SIL/IR/SILDeclRef.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ SILLinkage SILDeclRef::getLinkage(ForDefinition_t forDefinition) const {
412412
switch (effectiveAccess) {
413413
case AccessLevel::Private:
414414
case AccessLevel::FilePrivate:
415-
return maybeAddExternal(SILLinkage::Private);
415+
return SILLinkage::Private;
416416

417417
case AccessLevel::Internal:
418418
if (limit == Limit::OnDemand)

lib/SIL/IR/SILModule.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,10 @@ class SILModule::SerializationCallback final
7979
decl->setLinkage(SILLinkage::SharedExternal);
8080
return;
8181
case SILLinkage::Private:
82-
decl->setLinkage(SILLinkage::PrivateExternal);
83-
return;
82+
llvm_unreachable("cannot make a private external symbol");
8483
case SILLinkage::PublicExternal:
8584
case SILLinkage::HiddenExternal:
8685
case SILLinkage::SharedExternal:
87-
case SILLinkage::PrivateExternal:
8886
return;
8987
}
9088
}

lib/SIL/IR/SILPrinter.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2746,7 +2746,6 @@ static StringRef getLinkageString(SILLinkage linkage) {
27462746
case SILLinkage::PublicExternal: return "public_external ";
27472747
case SILLinkage::HiddenExternal: return "hidden_external ";
27482748
case SILLinkage::SharedExternal: return "shared_external ";
2749-
case SILLinkage::PrivateExternal: return "private_external ";
27502749
}
27512750
llvm_unreachable("bad linkage");
27522751
}

lib/SIL/Parser/ParseSIL.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,6 @@ static bool parseSILLinkage(Optional<SILLinkage> &Result, Parser &P) {
779779
.Case("public_external", SILLinkage::PublicExternal)
780780
.Case("hidden_external", SILLinkage::HiddenExternal)
781781
.Case("shared_external", SILLinkage::SharedExternal)
782-
.Case("private_external", SILLinkage::PrivateExternal)
783782
.Default(None);
784783

785784
// If we succeed, consume the token.

lib/SILGen/SILGen.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,26 @@ SILGenModule::SILGenModule(SILModule &M, ModuleDecl *SM)
6565

6666
SILGenModule::~SILGenModule() {
6767
assert(!TopLevelSGF && "active source file lowering!?");
68+
69+
// Update the linkage of external private functions to public_external,
70+
// because there is no private_external linkage. External private functions
71+
// can occur in the following cases:
72+
//
73+
// * private class methods which are referenced from the vtable of a derived
74+
// class in a different file/module. Such private methods are always
75+
// generated with public linkage in the other file/module.
76+
//
77+
// * in lldb: lldb can access private declarations in other files/modules
78+
//
79+
// * private functions with a @_silgen_name attribute but without a body
80+
//
81+
// * when compiling with -disable-access-control
82+
//
83+
for (SILFunction &f : M.getFunctionList()) {
84+
if (f.getLinkage() == SILLinkage::Private && f.isExternalDeclaration())
85+
f.setLinkage(SILLinkage::PublicExternal);
86+
}
87+
6888
M.verify();
6989
}
7090

0 commit comments

Comments
 (0)