@@ -90,6 +90,7 @@ class DeadFunctionAndGlobalElimination {
9090 llvm::SmallPtrSet<void *, 32 > AliveFunctionsAndTables;
9191
9292 bool keepExternalWitnessTablesAlive;
93+ bool keepStringSwitchIntrinsicAlive;
9394
9495 // / Checks is a function is alive, e.g. because it is visible externally.
9596 bool isAnchorFunction (SILFunction *F) {
@@ -124,6 +125,15 @@ class DeadFunctionAndGlobalElimination {
124125 if (F->getRepresentation () == SILFunctionTypeRepresentation::ObjCMethod)
125126 return true ;
126127
128+ // To support ObjectOutliner's replacing of calls to findStringSwitchCase
129+ // with _findStringSwitchCaseWithCache. In Embedded Swift, we have to load
130+ // the body of this function early and specialize it, so that ObjectOutliner
131+ // can reference it later. To make this work we have to avoid DFE'ing it in
132+ // the early DFE pass. Late DFE will take care of it if actually unused.
133+ if (keepStringSwitchIntrinsicAlive &&
134+ F->hasSemanticsAttr (" findStringSwitchCaseWithCache" ))
135+ return true ;
136+
127137 return false ;
128138 }
129139
@@ -713,9 +723,11 @@ class DeadFunctionAndGlobalElimination {
713723
714724public:
715725 DeadFunctionAndGlobalElimination (SILModule *module ,
716- bool keepExternalWitnessTablesAlive) :
726+ bool keepExternalWitnessTablesAlive,
727+ bool keepStringSwitchIntrinsicAlive) :
717728 Module (module ),
718- keepExternalWitnessTablesAlive (keepExternalWitnessTablesAlive) {}
729+ keepExternalWitnessTablesAlive (keepExternalWitnessTablesAlive),
730+ keepStringSwitchIntrinsicAlive (keepStringSwitchIntrinsicAlive) {}
719731
720732 // / The main entry point of the optimization.
721733 void eliminateFunctionsAndGlobals (SILModuleTransform *DFEPass) {
@@ -799,8 +811,10 @@ class DeadFunctionAndGlobalEliminationPass : public SILModuleTransform {
799811 // can eliminate such functions.
800812 getModule ()->invalidateSILLoaderCaches ();
801813
802- DeadFunctionAndGlobalElimination deadFunctionElimination (getModule (),
803- /* keepExternalWitnessTablesAlive*/ !isLateDFE);
814+ DeadFunctionAndGlobalElimination deadFunctionElimination (
815+ getModule (),
816+ /* keepExternalWitnessTablesAlive*/ !isLateDFE,
817+ /* keepStringSwitchIntrinsicAlive*/ !isLateDFE);
804818 deadFunctionElimination.eliminateFunctionsAndGlobals (this );
805819 }
806820};
0 commit comments