@@ -161,7 +161,7 @@ bool SILLinkerVisitor::processFunction(SILFunction *F) {
161
161
}
162
162
163
163
bool SILLinkerVisitor::processConformance (ProtocolConformanceRef conformanceRef) {
164
- visitProtocolConformance (conformanceRef);
164
+ visitProtocolConformance (conformanceRef, false );
165
165
process ();
166
166
return Changed;
167
167
}
@@ -247,12 +247,15 @@ static bool mustDeserializeProtocolConformance(SILModule &M,
247
247
&& conformance->isSynthesized ();
248
248
}
249
249
250
- void SILLinkerVisitor::visitProtocolConformance (ProtocolConformanceRef ref) {
250
+ void SILLinkerVisitor::visitProtocolConformance (
251
+ ProtocolConformanceRef ref, bool referencedFromInitExistential) {
251
252
// If an abstract protocol conformance was passed in, do nothing.
252
253
if (ref.isAbstract ())
253
254
return ;
254
255
255
- bool mustDeserialize = mustDeserializeProtocolConformance (Mod, ref);
256
+ bool isEmbedded = Mod.getOptions ().EmbeddedSwift ;
257
+ bool mustDeserialize = (isEmbedded && referencedFromInitExistential) ||
258
+ mustDeserializeProtocolConformance (Mod, ref);
256
259
257
260
// Otherwise try and lookup a witness table for C.
258
261
ProtocolConformance *C = ref.getConcrete ();
@@ -305,7 +308,7 @@ void SILLinkerVisitor::visitProtocolConformance(ProtocolConformanceRef ref) {
305
308
// However, we *must* pull in shared clang-importer-derived conformances
306
309
// we potentially use, since we may not otherwise have a local definition.
307
310
if (mustDeserializeProtocolConformance (Mod, c))
308
- visitProtocolConformance (c);
311
+ visitProtocolConformance (c, referencedFromInitExistential );
309
312
};
310
313
311
314
// For each entry in the witness table...
@@ -355,7 +358,7 @@ void SILLinkerVisitor::visitApplySubstitutions(SubstitutionMap subs) {
355
358
// However, we *must* pull in shared clang-importer-derived conformances
356
359
// we potentially use, since we may not otherwise have a local definition.
357
360
if (mustDeserializeProtocolConformance (Mod, conformance)) {
358
- visitProtocolConformance (conformance);
361
+ visitProtocolConformance (conformance, false );
359
362
}
360
363
}
361
364
}
@@ -371,7 +374,7 @@ void SILLinkerVisitor::visitInitExistentialAddrInst(
371
374
// visiting the open_existential_addr/witness_method before the
372
375
// init_existential_inst.
373
376
for (ProtocolConformanceRef C : IEI->getConformances ()) {
374
- visitProtocolConformance (C);
377
+ visitProtocolConformance (C, true );
375
378
}
376
379
}
377
380
@@ -385,9 +388,10 @@ void SILLinkerVisitor::visitInitExistentialRefInst(
385
388
// not going to be smart about this to enable avoiding any issues with
386
389
// visiting the protocol_method before the init_existential_inst.
387
390
for (ProtocolConformanceRef C : IERI->getConformances ()) {
388
- visitProtocolConformance (C);
391
+ visitProtocolConformance (C, true );
389
392
}
390
393
}
394
+
391
395
void SILLinkerVisitor::visitAllocRefDynamicInst (AllocRefDynamicInst *ARI) {
392
396
if (!isLinkAll ())
393
397
return ;
0 commit comments