@@ -1156,9 +1156,17 @@ static bool isLazilyEmittedFunction(SILFunction &f, SILModule &m) {
11561156 f.getLoweredFunctionType ()->getSubstGenericSignature ()) {
11571157 return true ;
11581158 }
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+
11611168 return false ;
1169+ }
11621170
11631171 if (f.getDynamicallyReplacedFunction ())
11641172 return false ;
@@ -2244,7 +2252,8 @@ void IRGenerator::emitEntryPointInfo() {
22442252static IRLinkage
22452253getIRLinkage (StringRef name, const UniversalLinkageInfo &info,
22462254 SILLinkage linkage, ForDefinition_t isDefinition,
2247- bool isWeakImported, bool isKnownLocal = false ) {
2255+ bool isWeakImported, bool isKnownLocal,
2256+ bool hasNonUniqueDefinition) {
22482257#define RESULT (LINKAGE, VISIBILITY, DLL_STORAGE ) \
22492258 IRLinkage{llvm::GlobalValue::LINKAGE##Linkage, \
22502259 llvm::GlobalValue::VISIBILITY##Visibility, \
@@ -2275,7 +2284,9 @@ getIRLinkage(StringRef name, const UniversalLinkageInfo &info,
22752284 case SILLinkage::Package: {
22762285 auto linkage = llvm::GlobalValue::ExternalLinkage;
22772286
2278- if (info.MergeableSymbols )
2287+ if (hasNonUniqueDefinition)
2288+ linkage = llvm::GlobalValue::WeakODRLinkage;
2289+ else if (info.MergeableSymbols )
22792290 linkage = llvm::GlobalValue::WeakODRLinkage;
22802291
22812292 return {linkage, PublicDefinitionVisibility,
@@ -2293,6 +2304,8 @@ getIRLinkage(StringRef name, const UniversalLinkageInfo &info,
22932304 : RESULT (External, Hidden, Default);
22942305
22952306 case SILLinkage::Hidden:
2307+ if (hasNonUniqueDefinition)
2308+ return RESULT (WeakODR, Hidden, Default);
22962309 if (info.MergeableSymbols )
22972310 return RESULT (WeakODR, Hidden, Default);
22982311
@@ -2301,7 +2314,7 @@ getIRLinkage(StringRef name, const UniversalLinkageInfo &info,
23012314 case SILLinkage::Private: {
23022315 if (info.forcePublicDecls () && !isDefinition)
23032316 return getIRLinkage (name, info, SILLinkage::PublicExternal, isDefinition,
2304- isWeakImported, isKnownLocal);
2317+ isWeakImported, isKnownLocal, hasNonUniqueDefinition );
23052318
23062319 auto linkage = info.needLinkerToMergeDuplicateSymbols ()
23072320 ? llvm::GlobalValue::LinkOnceODRLinkage
@@ -2357,7 +2370,8 @@ void irgen::updateLinkageForDefinition(IRGenModule &IGM,
23572370 auto IRL =
23582371 getIRLinkage (global->hasName () ? global->getName () : StringRef (),
23592372 linkInfo, entity.getLinkage (ForDefinition), ForDefinition,
2360- weakImported, isKnownLocal);
2373+ weakImported, isKnownLocal,
2374+ entity.hasNonUniqueDefinition ());
23612375 ApplyIRLinkage (IRL).to (global);
23622376
23632377 LinkInfo link = LinkInfo::get (IGM, entity, ForDefinition);
@@ -2410,7 +2424,8 @@ LinkInfo LinkInfo::get(const UniversalLinkageInfo &linkInfo,
24102424 bool weakImported = entity.isWeakImported (swiftModule);
24112425 result.IRL = getIRLinkage (result.Name , linkInfo,
24122426 entity.getLinkage (isDefinition), isDefinition,
2413- weakImported, isKnownLocal);
2427+ weakImported, isKnownLocal,
2428+ entity.hasNonUniqueDefinition ());
24142429 result.ForDefinition = isDefinition;
24152430 return result;
24162431}
@@ -2421,7 +2436,8 @@ LinkInfo LinkInfo::get(const UniversalLinkageInfo &linkInfo, StringRef name,
24212436 LinkInfo result;
24222437 result.Name += name;
24232438 result.IRL = getIRLinkage (name, linkInfo, linkage, isDefinition,
2424- isWeakImported, linkInfo.Internalize );
2439+ isWeakImported, linkInfo.Internalize ,
2440+ /* hasNonUniqueDefinition=*/ false );
24252441 result.ForDefinition = isDefinition;
24262442 return result;
24272443}
0 commit comments