Skip to content

Commit 7f00541

Browse files
authored
Merge pull request #21639 from compnerd/tinkering-linkering
ApplyIRLinkage cleanups
2 parents 5da00da + d3efed2 commit 7f00541

File tree

7 files changed

+48
-47
lines changed

7 files changed

+48
-47
lines changed

include/swift/IRGen/Linking.h

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,31 +1043,35 @@ struct IRLinkage {
10431043
llvm::GlobalValue::DLLStorageClassTypes DLLStorage;
10441044

10451045
static const IRLinkage InternalLinkOnceODR;
1046+
static const IRLinkage InternalWeakODR;
10461047
static const IRLinkage Internal;
1048+
1049+
static const IRLinkage ExternalImport;
1050+
static const IRLinkage ExternalExport;
10471051
};
10481052

10491053
class ApplyIRLinkage {
10501054
IRLinkage IRL;
10511055
public:
10521056
ApplyIRLinkage(IRLinkage IRL) : IRL(IRL) {}
10531057
void to(llvm::GlobalValue *GV) const {
1058+
llvm::Module *M = GV->getParent();
1059+
const llvm::Triple Triple(M->getTargetTriple());
1060+
10541061
GV->setLinkage(IRL.Linkage);
10551062
GV->setVisibility(IRL.Visibility);
1056-
GV->setDLLStorageClass(IRL.DLLStorage);
1057-
1058-
if (IRL.Linkage == llvm::GlobalValue::LinkOnceODRLinkage ||
1059-
IRL.Linkage == llvm::GlobalValue::WeakODRLinkage) {
1060-
llvm::Module *M = GV->getParent();
1061-
const llvm::Triple Triple(M->getTargetTriple());
1063+
if (Triple.isOSBinFormatCOFF() && !Triple.isOSCygMing())
1064+
GV->setDLLStorageClass(IRL.DLLStorage);
10621065

1063-
// TODO: BFD and gold do not handle COMDATs properly
1064-
if (Triple.isOSBinFormatELF())
1065-
return;
1066+
// TODO: BFD and gold do not handle COMDATs properly
1067+
if (Triple.isOSBinFormatELF())
1068+
return;
10661069

1070+
if (IRL.Linkage == llvm::GlobalValue::LinkOnceODRLinkage ||
1071+
IRL.Linkage == llvm::GlobalValue::WeakODRLinkage)
10671072
if (Triple.supportsCOMDAT())
10681073
if (llvm::GlobalObject *GO = dyn_cast<llvm::GlobalObject>(GV))
10691074
GO->setComdat(M->getOrInsertComdat(GV->getName()));
1070-
}
10711075
}
10721076
};
10731077

lib/IRGen/GenDecl.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,9 +1410,8 @@ void IRGenModule::emitVTableStubs() {
14101410

14111411
if (F.getEffectiveSymbolLinkage() == SILLinkage::Hidden)
14121412
alias->setVisibility(llvm::GlobalValue::HiddenVisibility);
1413-
1414-
if (useDllStorage())
1415-
alias->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1413+
else
1414+
ApplyIRLinkage(IRLinkage::ExternalExport).to(alias);
14161415
}
14171416
}
14181417

lib/IRGen/GenFunc.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
#include "swift/AST/PrettyStackTrace.h"
7878
#include "swift/AST/SubstitutionMap.h"
7979
#include "swift/AST/Types.h"
80+
#include "swift/IRGen/Linking.h"
8081
#include "clang/AST/ASTContext.h"
8182
#include "clang/CodeGen/CodeGenABITypes.h"
8283
#include "llvm/IR/Constants.h"
@@ -1621,9 +1622,8 @@ void irgen::emitBlockHeader(IRGenFunction &IGF,
16211622
auto NSConcreteStackBlock =
16221623
IGF.IGM.getModule()->getOrInsertGlobal("_NSConcreteStackBlock",
16231624
IGF.IGM.ObjCClassStructTy);
1624-
if (IGF.IGM.useDllStorage())
1625-
cast<llvm::GlobalVariable>(NSConcreteStackBlock)
1626-
->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1625+
ApplyIRLinkage(IRLinkage::ExternalImport)
1626+
.to(cast<llvm::GlobalVariable>(NSConcreteStackBlock));
16271627

16281628
//
16291629
// Set the flags.

lib/IRGen/GenReflection.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,7 @@ llvm::Constant *IRGenModule::getMangledAssociatedConformance(
230230
llvm::GlobalValue::LinkOnceODRLinkage,
231231
nullptr,
232232
symbolName);
233-
ApplyIRLinkage({llvm::GlobalValue::LinkOnceODRLinkage,
234-
llvm::GlobalValue::HiddenVisibility,
235-
llvm::GlobalValue::DefaultStorageClass})
236-
.to(var);
233+
ApplyIRLinkage(IRLinkage::InternalLinkOnceODR).to(var);
237234
var->setAlignment(2);
238235
setTrueConstGlobal(var);
239236
var->setSection(getReflectionTypeRefSectionName());

lib/IRGen/IRGenModule.cpp

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -659,8 +659,8 @@ IRGenModule::createStringConstant(StringRef Str,
659659
return NAME; \
660660
NAME = Module.getOrInsertGlobal(SYM, FullTypeMetadataStructTy); \
661661
if (useDllStorage() && !isStandardLibrary()) \
662-
cast<llvm::GlobalVariable>(NAME)->setDLLStorageClass( \
663-
llvm::GlobalValue::DLLImportStorageClass); \
662+
ApplyIRLinkage(IRLinkage::ExternalImport) \
663+
.to(cast<llvm::GlobalVariable>(NAME)); \
664664
return NAME; \
665665
}
666666

@@ -681,9 +681,8 @@ llvm::Constant *IRGenModule::getObjCEmptyCachePtr() {
681681
// struct objc_cache _objc_empty_cache;
682682
ObjCEmptyCachePtr = Module.getOrInsertGlobal("_objc_empty_cache",
683683
OpaquePtrTy->getElementType());
684-
if (useDllStorage())
685-
cast<llvm::GlobalVariable>(ObjCEmptyCachePtr)
686-
->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
684+
ApplyIRLinkage(IRLinkage::ExternalImport)
685+
.to(cast<llvm::GlobalVariable>(ObjCEmptyCachePtr));
687686
} else {
688687
// FIXME: Remove even the null value per rdar://problem/18801263
689688
ObjCEmptyCachePtr = llvm::ConstantPointerNull::get(OpaquePtrTy);
@@ -714,9 +713,8 @@ Address IRGenModule::getAddrOfObjCISAMask() {
714713
assert(TargetInfo.hasISAMasking());
715714
if (!ObjCISAMaskPtr) {
716715
ObjCISAMaskPtr = Module.getOrInsertGlobal("swift_isaMask", IntPtrTy);
717-
if (useDllStorage())
718-
cast<llvm::GlobalVariable>(ObjCISAMaskPtr)
719-
->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
716+
ApplyIRLinkage(IRLinkage::ExternalImport)
717+
.to(cast<llvm::GlobalVariable>(ObjCISAMaskPtr));
720718
}
721719
return Address(ObjCISAMaskPtr, getPointerAlignment());
722720
}
@@ -960,11 +958,7 @@ void IRGenModule::addLinkLibrary(const LinkLibrary &linkLib) {
960958
encodeForceLoadSymbolName(buf, linkLib.getName());
961959
auto ForceImportThunk =
962960
Module.getOrInsertFunction(buf, llvm::FunctionType::get(VoidTy, false));
963-
ApplyIRLinkage({llvm::GlobalValue::ExternalLinkage,
964-
llvm::GlobalValue::DefaultVisibility,
965-
useDllStorage()
966-
? llvm::GlobalValue::DLLImportStorageClass
967-
: llvm::GlobalValue::DefaultStorageClass})
961+
ApplyIRLinkage(IRLinkage::ExternalImport)
968962
.to(cast<llvm::GlobalValue>(ForceImportThunk));
969963

970964
buf += "_$";
@@ -975,10 +969,7 @@ void IRGenModule::addLinkLibrary(const LinkLibrary &linkLib) {
975969
/*isConstant=*/true,
976970
llvm::GlobalValue::WeakODRLinkage,
977971
ForceImportThunk, buf.str());
978-
ApplyIRLinkage({llvm::GlobalValue::WeakODRLinkage,
979-
llvm::GlobalValue::HiddenVisibility,
980-
llvm::GlobalValue::DefaultStorageClass})
981-
.to(ref);
972+
ApplyIRLinkage(IRLinkage::InternalWeakODR).to(ref);
982973
auto casted = llvm::ConstantExpr::getBitCast(ref, Int8PtrTy);
983974
LLVMUsed.push_back(casted);
984975
}
@@ -1090,12 +1081,7 @@ void IRGenModule::emitAutolinkInfo() {
10901081
llvm::Function::Create(llvm::FunctionType::get(VoidTy, false),
10911082
llvm::GlobalValue::ExternalLinkage, buf,
10921083
&Module);
1093-
ApplyIRLinkage({llvm::GlobalValue::ExternalLinkage,
1094-
llvm::GlobalValue::DefaultVisibility,
1095-
useDllStorage()
1096-
? llvm::GlobalValue::DLLExportStorageClass
1097-
: llvm::GlobalValue::DefaultStorageClass})
1098-
.to(ForceImportThunk);
1084+
ApplyIRLinkage(IRLinkage::ExternalExport).to(ForceImportThunk);
10991085

11001086
auto BB = llvm::BasicBlock::Create(getLLVMContext(), "", ForceImportThunk);
11011087
llvm::IRBuilder<> IRB(BB);

lib/IRGen/Linking.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,30 @@ const IRLinkage IRLinkage::InternalLinkOnceODR = {
3737
llvm::GlobalValue::DefaultStorageClass,
3838
};
3939

40+
const IRLinkage IRLinkage::InternalWeakODR = {
41+
llvm::GlobalValue::WeakODRLinkage,
42+
llvm::GlobalValue::HiddenVisibility,
43+
llvm::GlobalValue::DefaultStorageClass,
44+
};
45+
4046
const IRLinkage IRLinkage::Internal = {
4147
llvm::GlobalValue::InternalLinkage,
4248
llvm::GlobalValue::DefaultVisibility,
4349
llvm::GlobalValue::DefaultStorageClass,
4450
};
4551

52+
const IRLinkage IRLinkage::ExternalImport = {
53+
llvm::GlobalValue::ExternalLinkage,
54+
llvm::GlobalValue::DefaultVisibility,
55+
llvm::GlobalValue::DLLImportStorageClass,
56+
};
57+
58+
const IRLinkage IRLinkage::ExternalExport = {
59+
llvm::GlobalValue::ExternalLinkage,
60+
llvm::GlobalValue::DefaultVisibility,
61+
llvm::GlobalValue::DLLExportStorageClass,
62+
};
63+
4664
bool swift::irgen::useDllStorage(const llvm::Triple &triple) {
4765
return triple.isOSBinFormatCOFF() && !triple.isOSCygMing();
4866
}

lib/IRGen/MetadataRequest.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,7 @@ llvm::Constant *IRGenModule::getAddrOfStringForMetadataRef(
248248
nullptr,
249249
symbolName);
250250

251-
ApplyIRLinkage({llvm::GlobalValue::LinkOnceODRLinkage,
252-
llvm::GlobalValue::HiddenVisibility,
253-
llvm::GlobalValue::DefaultStorageClass})
254-
.to(var);
251+
ApplyIRLinkage(IRLinkage::InternalLinkOnceODR).to(var);
255252
if (alignment)
256253
var->setAlignment(alignment);
257254
setTrueConstGlobal(var);

0 commit comments

Comments
 (0)