@@ -161,7 +161,7 @@ bool SILLinkerVisitor::processFunction(SILFunction *F) {
161161}
162162
163163bool SILLinkerVisitor::processConformance (ProtocolConformanceRef conformanceRef) {
164- visitProtocolConformance (conformanceRef);
164+ visitProtocolConformance (conformanceRef, false );
165165 process ();
166166 return Changed;
167167}
@@ -247,12 +247,15 @@ static bool mustDeserializeProtocolConformance(SILModule &M,
247247 && conformance->isSynthesized ();
248248}
249249
250- void SILLinkerVisitor::visitProtocolConformance (ProtocolConformanceRef ref) {
250+ void SILLinkerVisitor::visitProtocolConformance (
251+ ProtocolConformanceRef ref, bool referencedFromInitExistential) {
251252 // If an abstract protocol conformance was passed in, do nothing.
252253 if (ref.isAbstract ())
253254 return ;
254255
255- bool mustDeserialize = mustDeserializeProtocolConformance (Mod, ref);
256+ bool isEmbedded = Mod.getOptions ().EmbeddedSwift ;
257+ bool mustDeserialize = (isEmbedded && referencedFromInitExistential) ||
258+ mustDeserializeProtocolConformance (Mod, ref);
256259
257260 // Otherwise try and lookup a witness table for C.
258261 ProtocolConformance *C = ref.getConcrete ();
@@ -305,7 +308,7 @@ void SILLinkerVisitor::visitProtocolConformance(ProtocolConformanceRef ref) {
305308 // However, we *must* pull in shared clang-importer-derived conformances
306309 // we potentially use, since we may not otherwise have a local definition.
307310 if (mustDeserializeProtocolConformance (Mod, c))
308- visitProtocolConformance (c);
311+ visitProtocolConformance (c, referencedFromInitExistential );
309312 };
310313
311314 // For each entry in the witness table...
@@ -355,7 +358,7 @@ void SILLinkerVisitor::visitApplySubstitutions(SubstitutionMap subs) {
355358 // However, we *must* pull in shared clang-importer-derived conformances
356359 // we potentially use, since we may not otherwise have a local definition.
357360 if (mustDeserializeProtocolConformance (Mod, conformance)) {
358- visitProtocolConformance (conformance);
361+ visitProtocolConformance (conformance, false );
359362 }
360363 }
361364}
@@ -371,7 +374,7 @@ void SILLinkerVisitor::visitInitExistentialAddrInst(
371374 // visiting the open_existential_addr/witness_method before the
372375 // init_existential_inst.
373376 for (ProtocolConformanceRef C : IEI->getConformances ()) {
374- visitProtocolConformance (C);
377+ visitProtocolConformance (C, true );
375378 }
376379}
377380
@@ -385,9 +388,10 @@ void SILLinkerVisitor::visitInitExistentialRefInst(
385388 // not going to be smart about this to enable avoiding any issues with
386389 // visiting the protocol_method before the init_existential_inst.
387390 for (ProtocolConformanceRef C : IERI->getConformances ()) {
388- visitProtocolConformance (C);
391+ visitProtocolConformance (C, true );
389392 }
390393}
394+
391395void SILLinkerVisitor::visitAllocRefDynamicInst (AllocRefDynamicInst *ARI) {
392396 if (!isLinkAll ())
393397 return ;
0 commit comments