@@ -1156,9 +1156,17 @@ static bool isLazilyEmittedFunction(SILFunction &f, SILModule &m) {
1156
1156
f.getLoweredFunctionType ()->getSubstGenericSignature ()) {
1157
1157
return true ;
1158
1158
}
1159
-
1160
- if (f.isPossiblyUsedExternally ())
1159
+
1160
+ if (f.isPossiblyUsedExternally ()) {
1161
+ // Under the embedded linkage model, if it has a non-unique definition,
1162
+ // treat it lazily.
1163
+ if (f.hasNonUniqueDefinition () && !f.isSwiftRuntimeFunction ()
1164
+ && !f.markedAsUsed ()) {
1165
+ return true ;
1166
+ }
1167
+
1161
1168
return false ;
1169
+ }
1162
1170
1163
1171
if (f.getDynamicallyReplacedFunction ())
1164
1172
return false ;
@@ -2244,7 +2252,8 @@ void IRGenerator::emitEntryPointInfo() {
2244
2252
static IRLinkage
2245
2253
getIRLinkage (StringRef name, const UniversalLinkageInfo &info,
2246
2254
SILLinkage linkage, ForDefinition_t isDefinition,
2247
- bool isWeakImported, bool isKnownLocal = false ) {
2255
+ bool isWeakImported, bool isKnownLocal,
2256
+ bool hasNonUniqueDefinition) {
2248
2257
#define RESULT (LINKAGE, VISIBILITY, DLL_STORAGE ) \
2249
2258
IRLinkage{llvm::GlobalValue::LINKAGE##Linkage, \
2250
2259
llvm::GlobalValue::VISIBILITY##Visibility, \
@@ -2275,7 +2284,9 @@ getIRLinkage(StringRef name, const UniversalLinkageInfo &info,
2275
2284
case SILLinkage::Package: {
2276
2285
auto linkage = llvm::GlobalValue::ExternalLinkage;
2277
2286
2278
- if (info.MergeableSymbols )
2287
+ if (hasNonUniqueDefinition)
2288
+ linkage = llvm::GlobalValue::WeakODRLinkage;
2289
+ else if (info.MergeableSymbols )
2279
2290
linkage = llvm::GlobalValue::WeakODRLinkage;
2280
2291
2281
2292
return {linkage, PublicDefinitionVisibility,
@@ -2293,6 +2304,8 @@ getIRLinkage(StringRef name, const UniversalLinkageInfo &info,
2293
2304
: RESULT (External, Hidden, Default);
2294
2305
2295
2306
case SILLinkage::Hidden:
2307
+ if (hasNonUniqueDefinition)
2308
+ return RESULT (WeakODR, Hidden, Default);
2296
2309
if (info.MergeableSymbols )
2297
2310
return RESULT (WeakODR, Hidden, Default);
2298
2311
@@ -2301,7 +2314,7 @@ getIRLinkage(StringRef name, const UniversalLinkageInfo &info,
2301
2314
case SILLinkage::Private: {
2302
2315
if (info.forcePublicDecls () && !isDefinition)
2303
2316
return getIRLinkage (name, info, SILLinkage::PublicExternal, isDefinition,
2304
- isWeakImported, isKnownLocal);
2317
+ isWeakImported, isKnownLocal, hasNonUniqueDefinition );
2305
2318
2306
2319
auto linkage = info.needLinkerToMergeDuplicateSymbols ()
2307
2320
? llvm::GlobalValue::LinkOnceODRLinkage
@@ -2357,7 +2370,8 @@ void irgen::updateLinkageForDefinition(IRGenModule &IGM,
2357
2370
auto IRL =
2358
2371
getIRLinkage (global->hasName () ? global->getName () : StringRef (),
2359
2372
linkInfo, entity.getLinkage (ForDefinition), ForDefinition,
2360
- weakImported, isKnownLocal);
2373
+ weakImported, isKnownLocal,
2374
+ entity.hasNonUniqueDefinition ());
2361
2375
ApplyIRLinkage (IRL).to (global);
2362
2376
2363
2377
LinkInfo link = LinkInfo::get (IGM, entity, ForDefinition);
@@ -2410,7 +2424,8 @@ LinkInfo LinkInfo::get(const UniversalLinkageInfo &linkInfo,
2410
2424
bool weakImported = entity.isWeakImported (swiftModule);
2411
2425
result.IRL = getIRLinkage (result.Name , linkInfo,
2412
2426
entity.getLinkage (isDefinition), isDefinition,
2413
- weakImported, isKnownLocal);
2427
+ weakImported, isKnownLocal,
2428
+ entity.hasNonUniqueDefinition ());
2414
2429
result.ForDefinition = isDefinition;
2415
2430
return result;
2416
2431
}
@@ -2421,7 +2436,8 @@ LinkInfo LinkInfo::get(const UniversalLinkageInfo &linkInfo, StringRef name,
2421
2436
LinkInfo result;
2422
2437
result.Name += name;
2423
2438
result.IRL = getIRLinkage (name, linkInfo, linkage, isDefinition,
2424
- isWeakImported, linkInfo.Internalize );
2439
+ isWeakImported, linkInfo.Internalize ,
2440
+ /* hasNonUniqueDefinition=*/ false );
2425
2441
result.ForDefinition = isDefinition;
2426
2442
return result;
2427
2443
}
0 commit comments