@@ -917,8 +917,10 @@ llvm::Constant *IRGenModule::getAddrOfAssociatedTypeGenericParamRef(
917
917
918
918
auto var = B.finishAndCreateGlobal (symbolName, Alignment (4 ),
919
919
/* constant*/ true );
920
- var->setLinkage (llvm::GlobalValue::LinkOnceODRLinkage);
921
- var->setVisibility (llvm::GlobalValue::HiddenVisibility);
920
+ ApplyIRLinkage ({llvm::GlobalValue::LinkOnceODRLinkage,
921
+ llvm::GlobalValue::HiddenVisibility,
922
+ llvm::GlobalValue::DefaultStorageClass})
923
+ .to (var);
922
924
setTrueConstGlobal (var);
923
925
return var;
924
926
}
@@ -1348,16 +1350,14 @@ void IRGenModule::emitVTableStubs() {
1348
1350
}
1349
1351
}
1350
1352
1351
- static std::tuple<llvm::GlobalValue::LinkageTypes,
1352
- llvm::GlobalValue::VisibilityTypes,
1353
- llvm::GlobalValue::DLLStorageClassTypes>
1353
+ static IRLinkage
1354
1354
getIRLinkage (const UniversalLinkageInfo &info, SILLinkage linkage,
1355
1355
ForDefinition_t isDefinition,
1356
1356
bool isWeakImported) {
1357
1357
#define RESULT (LINKAGE, VISIBILITY, DLL_STORAGE ) \
1358
- std::make_tuple ( llvm::GlobalValue::LINKAGE##Linkage, \
1359
- llvm::GlobalValue::VISIBILITY##Visibility, \
1360
- llvm::GlobalValue::DLL_STORAGE##StorageClass)
1358
+ IRLinkage{ llvm::GlobalValue::LINKAGE##Linkage, \
1359
+ llvm::GlobalValue::VISIBILITY##Visibility, \
1360
+ llvm::GlobalValue::DLL_STORAGE##StorageClass}
1361
1361
1362
1362
// Use protected visibility for public symbols we define on ELF. ld.so
1363
1363
// doesn't support relative relocations at load time, which interferes with
@@ -1375,8 +1375,8 @@ getIRLinkage(const UniversalLinkageInfo &info, SILLinkage linkage,
1375
1375
1376
1376
switch (linkage) {
1377
1377
case SILLinkage::Public:
1378
- return std::make_tuple ( llvm::GlobalValue::ExternalLinkage,
1379
- PublicDefinitionVisibility, ExportedStorage) ;
1378
+ return { llvm::GlobalValue::ExternalLinkage, PublicDefinitionVisibility ,
1379
+ ExportedStorage} ;
1380
1380
1381
1381
case SILLinkage::Shared:
1382
1382
case SILLinkage::SharedExternal:
@@ -1394,34 +1394,25 @@ getIRLinkage(const UniversalLinkageInfo &info, SILLinkage linkage,
1394
1394
auto visibility = info.shouldAllPrivateDeclsBeVisibleFromOtherFiles ()
1395
1395
? llvm::GlobalValue::HiddenVisibility
1396
1396
: llvm::GlobalValue::DefaultVisibility;
1397
- return std::make_tuple (linkage, visibility,
1398
- llvm::GlobalValue::DefaultStorageClass);
1397
+ return {linkage, visibility, llvm::GlobalValue::DefaultStorageClass};
1399
1398
}
1400
1399
1401
1400
case SILLinkage::PublicExternal: {
1402
- if (isDefinition) {
1403
- return std::make_tuple (llvm::GlobalValue::AvailableExternallyLinkage,
1404
- llvm::GlobalValue::DefaultVisibility,
1405
- llvm::GlobalValue::DefaultStorageClass);
1406
- }
1401
+ if (isDefinition)
1402
+ return RESULT (AvailableExternally, Default, Default);
1407
1403
1408
1404
auto linkage = isWeakImported ? llvm::GlobalValue::ExternalWeakLinkage
1409
1405
: llvm::GlobalValue::ExternalLinkage;
1410
- return std::make_tuple (linkage, llvm::GlobalValue::DefaultVisibility,
1411
- ImportedStorage);
1406
+ return {linkage, llvm::GlobalValue::DefaultVisibility, ImportedStorage};
1412
1407
}
1413
1408
1414
1409
case SILLinkage::HiddenExternal:
1415
1410
case SILLinkage::PrivateExternal:
1416
- if (isDefinition) {
1417
- return std::make_tuple (llvm::GlobalValue::AvailableExternallyLinkage,
1418
- llvm::GlobalValue::HiddenVisibility,
1419
- llvm::GlobalValue::DefaultStorageClass);
1420
- }
1411
+ if (isDefinition)
1412
+ return RESULT (AvailableExternally, Hidden, Default);
1421
1413
1422
- return std::make_tuple (llvm::GlobalValue::ExternalLinkage,
1423
- llvm::GlobalValue::DefaultVisibility,
1424
- ImportedStorage);
1414
+ return {llvm::GlobalValue::ExternalLinkage,
1415
+ llvm::GlobalValue::DefaultVisibility, ImportedStorage};
1425
1416
1426
1417
}
1427
1418
@@ -1436,22 +1427,18 @@ void irgen::updateLinkageForDefinition(IRGenModule &IGM,
1436
1427
// TODO: there are probably cases where we can avoid redoing the
1437
1428
// entire linkage computation.
1438
1429
UniversalLinkageInfo linkInfo (IGM);
1439
- auto linkage =
1430
+ auto IRL =
1440
1431
getIRLinkage (linkInfo, entity.getLinkage (ForDefinition),
1441
1432
ForDefinition, entity.isWeakImported (IGM.getSwiftModule ()));
1442
- global->setLinkage (std::get<0 >(linkage));
1443
- global->setVisibility (std::get<1 >(linkage));
1444
- global->setDLLStorageClass (std::get<2 >(linkage));
1433
+ ApplyIRLinkage (IRL).to (global);
1445
1434
1446
1435
// Everything externally visible is considered used in Swift.
1447
1436
// That mostly means we need to be good at not marking things external.
1448
1437
//
1449
1438
// Exclude "main", because it should naturally be used, and because adding it
1450
1439
// to llvm.used leaves a dangling use when the REPL attempts to discard
1451
1440
// intermediate mains.
1452
- if (LinkInfo::isUsed (std::get<0 >(linkage), std::get<1 >(linkage),
1453
- std::get<2 >(linkage)) &&
1454
- global->getName () != SWIFT_ENTRY_POINT_FUNCTION)
1441
+ if (LinkInfo::isUsed (IRL) && global->getName () != SWIFT_ENTRY_POINT_FUNCTION)
1455
1442
IGM.addUsedGlobal (global);
1456
1443
}
1457
1444
@@ -1477,9 +1464,8 @@ LinkInfo LinkInfo::get(const UniversalLinkageInfo &linkInfo,
1477
1464
ForDefinition_t (swiftModule->isStdlibModule () || isDefinition);
1478
1465
1479
1466
entity.mangle (result.Name );
1480
- std::tie (result.Linkage , result.Visibility , result.DLLStorageClass ) =
1481
- getIRLinkage (linkInfo, entity.getLinkage (isStdlibOrDefinition),
1482
- isDefinition, entity.isWeakImported (swiftModule));
1467
+ result.IRL = getIRLinkage (linkInfo, entity.getLinkage (isStdlibOrDefinition),
1468
+ isDefinition, entity.isWeakImported (swiftModule));
1483
1469
result.ForDefinition = isDefinition;
1484
1470
return result;
1485
1471
}
@@ -1490,8 +1476,7 @@ LinkInfo LinkInfo::get(const UniversalLinkageInfo &linkInfo, StringRef name,
1490
1476
LinkInfo result;
1491
1477
1492
1478
result.Name += name;
1493
- std::tie (result.Linkage , result.Visibility , result.DLLStorageClass ) =
1494
- getIRLinkage (linkInfo, linkage, isDefinition, isWeakImported);
1479
+ result.IRL = getIRLinkage (linkInfo, linkage, isDefinition, isWeakImported);
1495
1480
result.ForDefinition = isDefinition;
1496
1481
return result;
1497
1482
}
@@ -1523,6 +1508,7 @@ llvm::Function *irgen::createFunction(IRGenModule &IGM,
1523
1508
1524
1509
llvm::Function *fn =
1525
1510
llvm::Function::Create (signature.getType (), linkInfo.getLinkage (), name);
1511
+ // TODO(compnerd) apply COMDAT to definitions
1526
1512
fn->setVisibility (linkInfo.getVisibility ());
1527
1513
fn->setDLLStorageClass (linkInfo.getDLLStorage ());
1528
1514
fn->setCallingConv (signature.getCallingConv ());
@@ -1531,7 +1517,7 @@ llvm::Function *irgen::createFunction(IRGenModule &IGM,
1531
1517
IGM.Module .getFunctionList ().insert (insertBefore->getIterator (), fn);
1532
1518
} else {
1533
1519
IGM.Module .getFunctionList ().push_back (fn);
1534
- }
1520
+ }
1535
1521
1536
1522
llvm::AttrBuilder initialAttrs;
1537
1523
IGM.constructInitialFnAttributes (initialAttrs, FuncOptMode);
@@ -1556,16 +1542,14 @@ llvm::Function *irgen::createFunction(IRGenModule &IGM,
1556
1542
return fn;
1557
1543
}
1558
1544
1559
- bool LinkInfo::isUsed (llvm::GlobalValue::LinkageTypes Linkage,
1560
- llvm::GlobalValue::VisibilityTypes Visibility,
1561
- llvm::GlobalValue::DLLStorageClassTypes DLLStorage) {
1545
+ bool LinkInfo::isUsed (IRLinkage IRL) {
1562
1546
// Everything externally visible is considered used in Swift.
1563
1547
// That mostly means we need to be good at not marking things external.
1564
- return Linkage == llvm::GlobalValue::ExternalLinkage &&
1565
- (Visibility == llvm::GlobalValue::DefaultVisibility ||
1566
- Visibility == llvm::GlobalValue::ProtectedVisibility) &&
1567
- (DLLStorage == llvm::GlobalValue::DefaultStorageClass ||
1568
- DLLStorage == llvm::GlobalValue::DLLExportStorageClass);
1548
+ return IRL. Linkage == llvm::GlobalValue::ExternalLinkage &&
1549
+ (IRL. Visibility == llvm::GlobalValue::DefaultVisibility ||
1550
+ IRL. Visibility == llvm::GlobalValue::ProtectedVisibility) &&
1551
+ (IRL. DLLStorage == llvm::GlobalValue::DefaultStorageClass ||
1552
+ IRL. DLLStorage == llvm::GlobalValue::DLLExportStorageClass);
1569
1553
}
1570
1554
1571
1555
// / Get or create an LLVM global variable with these linkage rules.
@@ -1591,8 +1575,10 @@ llvm::GlobalVariable *swift::irgen::createVariable(
1591
1575
auto var = new llvm::GlobalVariable (IGM.Module , storageType,
1592
1576
/* constant*/ false , linkInfo.getLinkage (),
1593
1577
/* initializer*/ nullptr , name);
1594
- var->setVisibility (linkInfo.getVisibility ());
1595
- var->setDLLStorageClass (linkInfo.getDLLStorage ());
1578
+ ApplyIRLinkage ({linkInfo.getLinkage (),
1579
+ linkInfo.getVisibility (),
1580
+ linkInfo.getDLLStorage ()})
1581
+ .to (var);
1596
1582
var->setAlignment (alignment.getValue ());
1597
1583
1598
1584
// Everything externally visible is considered used in Swift.
@@ -2886,8 +2872,8 @@ llvm::GlobalValue *IRGenModule::defineAlias(LinkEntity entity,
2886
2872
auto *alias = llvm::GlobalAlias::create (
2887
2873
ptrTy->getElementType (), ptrTy->getAddressSpace (), link.getLinkage (),
2888
2874
link.getName (), definition, &Module);
2889
- alias-> setVisibility ( link.getVisibility ());
2890
- alias-> setDLLStorageClass (link. getDLLStorage () );
2875
+ ApplyIRLinkage ({ link.getLinkage (), link. getVisibility (), link. getDLLStorage ()})
2876
+ . to (alias );
2891
2877
2892
2878
if (link.isUsed ()) {
2893
2879
addUsedGlobal (alias);
@@ -3815,9 +3801,10 @@ static llvm::Function *shouldDefineHelper(IRGenModule &IGM,
3815
3801
if (!def) return nullptr ;
3816
3802
if (!def->empty ()) return nullptr ;
3817
3803
3818
- def->setLinkage (llvm::Function::LinkOnceODRLinkage);
3819
- def->setVisibility (llvm::Function::HiddenVisibility);
3820
- def->setDLLStorageClass (llvm::GlobalVariable::DefaultStorageClass);
3804
+ ApplyIRLinkage ({llvm::GlobalValue::LinkOnceODRLinkage,
3805
+ llvm::GlobalValue::HiddenVisibility,
3806
+ llvm::GlobalValue::DefaultStorageClass})
3807
+ .to (def);
3821
3808
def->setDoesNotThrow ();
3822
3809
def->setCallingConv (IGM.DefaultCC );
3823
3810
if (setIsNoInline)
0 commit comments