Skip to content

Commit df1acfd

Browse files
committed
IRGen: prevent WeakExternal on COFF
We cannot use ExternalWeakLinkage on PE/COFF as the semantics for that do not exist. It is theoretically possible to emulate this by manually creating a default value for the symbol that evaluates to 0, but that requires adding a set of linker directives and variable definitions. Disable the weak linkage rather than generate an invalid module.
1 parent 1d10a6a commit df1acfd

File tree

3 files changed

+5
-2
lines changed

3 files changed

+5
-2
lines changed

include/swift/IRGen/Linking.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ bool useDllStorage(const llvm::Triple &triple);
4242
class UniversalLinkageInfo {
4343
public:
4444
bool IsELFObject;
45+
bool IsCOFFObject;
4546
bool UseDLLStorage;
4647

4748
/// True iff are multiple llvm modules.

lib/IRGen/GenDecl.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,8 +1466,9 @@ getIRLinkage(const UniversalLinkageInfo &info, SILLinkage linkage,
14661466
if (isDefinition)
14671467
return RESULT(AvailableExternally, Default, Default);
14681468

1469-
auto linkage = isWeakImported ? llvm::GlobalValue::ExternalWeakLinkage
1470-
: llvm::GlobalValue::ExternalLinkage;
1469+
auto linkage = llvm::GlobalValue::ExternalLinkage;
1470+
if (!info.IsCOFFObject && isWeakImported)
1471+
linkage = llvm::GlobalValue::ExternalWeakLinkage;
14711472
return {linkage, llvm::GlobalValue::DefaultVisibility, ImportedStorage};
14721473
}
14731474

lib/IRGen/Linking.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ UniversalLinkageInfo::UniversalLinkageInfo(const llvm::Triple &triple,
7373
bool hasMultipleIGMs,
7474
bool isWholeModule)
7575
: IsELFObject(triple.isOSBinFormatELF()),
76+
IsCOFFObject(triple.isOSBinFormatCOFF()),
7677
UseDLLStorage(useDllStorage(triple)), HasMultipleIGMs(hasMultipleIGMs),
7778
IsWholeModule(isWholeModule) {}
7879

0 commit comments

Comments
 (0)