Skip to content

Commit a92e9b3

Browse files
committed
SILOptimizer: make vtable pruning less aggressive
A class which is marked as internal or public can be visible outside of the current file, where the use of the VWT indirectly is possible. If the VWT is modified and inlined, it is possible that the offsets will no longer match resulting in an invalid dispatch. Limit the pass to when WMO is enabled or the type is private in non-WMO cases.
1 parent 9b01139 commit a92e9b3

File tree

2 files changed

+18
-12
lines changed

2 files changed

+18
-12
lines changed

lib/SILOptimizer/Transforms/PruneVTables.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,16 @@ using namespace swift;
2727

2828
namespace {
2929
class PruneVTables : public SILModuleTransform {
30-
void runOnVTable(SILModule *M,
31-
SILVTable *vtable) {
30+
void runOnVTable(SILModule *M, SILVTable *vtable) {
3231
LLVM_DEBUG(llvm::dbgs() << "PruneVTables inspecting table:\n";
3332
vtable->print(llvm::dbgs()));
33+
if (!M->isWholeModule() &&
34+
vtable->getClass()->getEffectiveAccess() >= AccessLevel::FilePrivate) {
35+
LLVM_DEBUG(llvm::dbgs() << "Ignoring visible table: ";
36+
vtable->print(llvm::dbgs()));
37+
return;
38+
}
39+
3440
for (auto &entry : vtable->getMutableEntries()) {
3541

3642
// We don't need to worry about entries that are overridden,

test/SILOptimizer/prune-vtables.sil

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ sil @PrivateA_yesOverrides : $@convention(method) (@guaranteed PrivateA) -> ()
1414
sil @PrivateA_isFinal : $@convention(method) (@guaranteed PrivateA) -> ()
1515

1616
// NOWMO-LABEL: sil_vtable PrivateA {
17-
// NOWMO: #PrivateA.noOverrides{{.*}} [nonoverridden]
17+
// NOWMO: #PrivateA.noOverrides{{[^[]]*}}
1818
// NOWMO-NOT: #PrivateA.yesOverrides{{.*}} [nonoverridden]
19-
// NOWMO: #PrivateA.isFinal{{.*}} [nonoverridden]
19+
// NOWMO: #PrivateA.isFinal{{[^[]]*}}
2020

2121
// WMO-LABEL: sil_vtable PrivateA {
2222
// WMO: #PrivateA.noOverrides{{.*}} [nonoverridden]
@@ -35,9 +35,9 @@ private class PrivateB: PrivateA {
3535
sil @PrivateB_yesOverrides : $@convention(method) (@guaranteed PrivateB) -> ()
3636

3737
// NOWMO-LABEL: sil_vtable PrivateB {
38-
// NOWMO: #PrivateA.noOverrides{{.*}} [nonoverridden]
38+
// NOWMO: #PrivateA.noOverrides{{[^[]]*}}
3939
// NOWMO-NOT: #PrivateA.yesOverrides{{.*}} [nonoverridden]
40-
// NOWMO: #PrivateA.isFinal{{.*}} [nonoverridden]
40+
// NOWMO: #PrivateA.isFinal{{[^[]]*}}
4141

4242
// WMO-LABEL: sil_vtable PrivateB {
4343
// WMO: #PrivateA.noOverrides{{.*}} [nonoverridden]
@@ -62,7 +62,7 @@ sil @InternalA_isFinal : $@convention(method) (@guaranteed InternalA) -> ()
6262
// NOWMO-LABEL: sil_vtable InternalA {
6363
// NOWMO-NOT: #InternalA.noOverrides{{.*}} [nonoverridden]
6464
// NOWMO-NOT: #InternalA.yesOverrides{{.*}} [nonoverridden]
65-
// NOWMO: #InternalA.isFinal{{.*}} [nonoverridden]
65+
// NOWMO: #InternalA.isFinal{{[^[]]*}}
6666

6767
// WMO-LABEL: sil_vtable InternalA {
6868
// WMO: #InternalA.noOverrides{{.*}} [nonoverridden]
@@ -83,7 +83,7 @@ sil @InternalB_yesOverrides : $@convention(method) (@guaranteed InternalB) -> ()
8383
// NOWMO-LABEL: sil_vtable InternalB {
8484
// NOWMO-NOT: #InternalA.noOverrides{{.*}} [nonoverridden]
8585
// NOWMO-NOT: #InternalA.yesOverrides{{.*}} [nonoverridden]
86-
// NOWMO: #InternalA.isFinal{{.*}} [nonoverridden]
86+
// NOWMO: #InternalA.isFinal{{[^[]]*}}
8787

8888
// WMO-LABEL: sil_vtable InternalB {
8989
// WMO: #InternalA.noOverrides{{.*}} [nonoverridden]
@@ -108,7 +108,7 @@ sil @PublicA_isFinal : $@convention(method) (@guaranteed PublicA) -> ()
108108
// NOWMO-LABEL: sil_vtable PublicA {
109109
// NOWMO-NOT: #PublicA.noOverrides{{.*}} [nonoverridden]
110110
// NOWMO-NOT: #PublicA.yesOverrides{{.*}} [nonoverridden]
111-
// NOWMO: #PublicA.isFinal{{.*}} [nonoverridden]
111+
// NOWMO: #PublicA.isFinal{{[^[]]*}}
112112

113113
// WMO-LABEL: sil_vtable PublicA {
114114
// WMO: #PublicA.noOverrides{{.*}} [nonoverridden]
@@ -129,7 +129,7 @@ sil @PublicB_yesOverrides : $@convention(method) (@guaranteed PublicB) -> ()
129129
// NOWMO-LABEL: sil_vtable PublicB {
130130
// NOWMO-NOT: #PublicA.noOverrides{{.*}} [nonoverridden]
131131
// NOWMO-NOT: #PublicA.yesOverrides{{.*}} [nonoverridden]
132-
// NOWMO: #PublicA.isFinal{{.*}} [nonoverridden]
132+
// NOWMO: #PublicA.isFinal{{[^[]]*}}
133133

134134
// WMO-LABEL: sil_vtable PublicB {
135135
// WMO: #PublicA.noOverrides{{.*}} [nonoverridden]
@@ -154,7 +154,7 @@ sil @OpenA_isFinal : $@convention(method) (@guaranteed OpenA) -> ()
154154
// NOWMO-LABEL: sil_vtable OpenA {
155155
// NOWMO-NOT: #OpenA.noOverrides{{.*}} [nonoverridden]
156156
// NOWMO-NOT: #OpenA.yesOverrides{{.*}} [nonoverridden]
157-
// NOWMO: #OpenA.isFinal{{.*}} [nonoverridden]
157+
// NOWMO: #OpenA.isFinal{{[^[]]*}}
158158

159159
// WMO-LABEL: sil_vtable OpenA {
160160
// WMO-NOT: #OpenA.noOverrides{{.*}} [nonoverridden]
@@ -175,7 +175,7 @@ sil @OpenB_yesOverrides : $@convention(method) (@guaranteed OpenB) -> ()
175175
// NOWMO-LABEL: sil_vtable OpenB {
176176
// NOWMO-NOT: #OpenA.noOverrides{{.*}} [nonoverridden]
177177
// NOWMO-NOT: #OpenA.yesOverrides{{.*}} [nonoverridden]
178-
// NOWMO: #OpenA.isFinal{{.*}} [nonoverridden]
178+
// NOWMO: #OpenA.isFinal{{[^[]]*}}
179179

180180
// WMO-LABEL: sil_vtable OpenB {
181181
// WMO-NOT: #OpenA.noOverrides{{.*}} [nonoverridden]

0 commit comments

Comments
 (0)