@@ -460,8 +460,47 @@ class ExternalFunctionDefinitionsElimination : FunctionLivenessComputation {
460460
461461 // / ExternalFunctionDefinitionsElimination pass does not take functions
462462 // / reachable via vtables and witness_tables into account when computing
463- // / a function liveness information.
463+ // / a function liveness information. The only exceptions are external
464+ // / transparent functions, because bodies of external transparent functions
465+ // / should never be removed.
464466 void findAnchorsInTables () override {
467+ // Check vtable methods.
468+ for (SILVTable &vTable : Module->getVTableList ()) {
469+ for (auto &entry : vTable.getEntries ()) {
470+ SILFunction *F = entry.second ;
471+ if (F->isTransparent () && isAvailableExternally (F->getLinkage ()))
472+ ensureAlive (F);
473+ }
474+ }
475+
476+ // Check witness methods.
477+ for (SILWitnessTable &WT : Module->getWitnessTableList ()) {
478+ bool tableIsAlive = isVisibleExternally (WT.getConformance ()->getProtocol ());
479+ for (const SILWitnessTable::Entry &entry : WT.getEntries ()) {
480+ if (entry.getKind () != SILWitnessTable::Method)
481+ continue ;
482+
483+ auto methodWitness = entry.getMethodWitness ();
484+ SILFunction *F = methodWitness.Witness ;
485+ if (!F)
486+ continue ;
487+ if (F->isTransparent () && isAvailableExternally (F->getLinkage ()))
488+ ensureAlive (F);
489+ }
490+ }
491+
492+ // Check default witness methods.
493+ for (SILDefaultWitnessTable &WT : Module->getDefaultWitnessTableList ()) {
494+ for (const SILDefaultWitnessTable::Entry &entry : WT.getEntries ()) {
495+ if (!entry.isValid ())
496+ continue ;
497+
498+ SILFunction *F = entry.getWitness ();
499+ if (F->isTransparent () && isAvailableExternally (F->getLinkage ()))
500+ ensureAlive (F);
501+ }
502+ }
503+
465504 }
466505
467506 bool findAliveFunctions () {
0 commit comments