@@ -29,43 +29,71 @@ namespace {
29
29
class PruneVTables : public SILModuleTransform {
30
30
void runOnVTable (SILModule *M,
31
31
SILVTable *vtable) {
32
+ LLVM_DEBUG (llvm::dbgs () << " PruneVTables inspecting table:\n " ;
33
+ vtable->print (llvm::dbgs ()));
32
34
for (auto &entry : vtable->getMutableEntries ()) {
33
35
34
36
// We don't need to worry about entries that are overridden,
35
37
// or have already been found to have no overrides.
36
- if (entry.isNonOverridden ())
38
+ if (entry.isNonOverridden ()) {
39
+ LLVM_DEBUG (llvm::dbgs () << " -- entry for " ;
40
+ entry.getMethod ().print (llvm::dbgs ());
41
+ llvm::dbgs () << " is already nonoverridden\n " );
37
42
continue ;
43
+ }
38
44
39
45
switch (entry.getKind ()) {
40
46
case SILVTable::Entry::Normal:
41
47
case SILVTable::Entry::Inherited:
42
48
break ;
43
49
44
50
case SILVTable::Entry::Override:
51
+ LLVM_DEBUG (llvm::dbgs () << " -- entry for " ;
52
+ entry.getMethod ().print (llvm::dbgs ());
53
+ llvm::dbgs () << " is an override\n " );
45
54
continue ;
46
55
}
47
56
48
57
// The destructor entry must remain.
49
58
if (entry.getMethod ().kind == SILDeclRef::Kind::Deallocator) {
59
+ LLVM_DEBUG (llvm::dbgs () << " -- entry for " ;
60
+ entry.getMethod ().print (llvm::dbgs ());
61
+ llvm::dbgs () << " is a destructor\n " );
50
62
continue ;
51
63
}
52
64
53
65
auto methodDecl = entry.getMethod ().getAbstractFunctionDecl ();
54
- if (!methodDecl)
66
+ if (!methodDecl) {
67
+ LLVM_DEBUG (llvm::dbgs () << " -- entry for " ;
68
+ entry.getMethod ().print (llvm::dbgs ());
69
+ llvm::dbgs () << " is not a function decl\n " );
55
70
continue ;
71
+ }
56
72
57
73
// Is the method declared final?
58
74
if (!methodDecl->isFinal ()) {
59
75
// Are callees of this entry statically knowable?
60
- if (!calleesAreStaticallyKnowable (*M, entry.getMethod ()))
76
+ if (!calleesAreStaticallyKnowable (*M, entry.getMethod ())) {
77
+ LLVM_DEBUG (llvm::dbgs () << " -- entry for " ;
78
+ entry.getMethod ().print (llvm::dbgs ());
79
+ llvm::dbgs () << " does not have statically-knowable callees\n " );
61
80
continue ;
81
+ }
62
82
63
83
// Does the method have any overrides in this module?
64
- if (methodDecl->isOverridden ())
84
+ if (methodDecl->isOverridden ()) {
85
+ LLVM_DEBUG (llvm::dbgs () << " -- entry for " ;
86
+ entry.getMethod ().print (llvm::dbgs ());
87
+ llvm::dbgs () << " has overrides\n " );
65
88
continue ;
89
+ }
66
90
}
91
+ LLVM_DEBUG (llvm::dbgs () << " ++ entry for " ;
92
+ entry.getMethod ().print (llvm::dbgs ());
93
+ llvm::dbgs () << " can be marked non-overridden!\n " );
67
94
++NumNonoverriddenVTableEntries;
68
95
entry.setNonOverridden (true );
96
+ vtable->updateVTableCache (entry);
69
97
}
70
98
}
71
99
0 commit comments