@@ -669,7 +669,8 @@ llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) {
669
669
}
670
670
671
671
void CodeGenModule::setGlobalVisibility (llvm::GlobalValue *GV,
672
- const NamedDecl *D) const {
672
+ const NamedDecl *D,
673
+ ForDefinition_t IsForDefinition) const {
673
674
// Internal definitions always have default visibility.
674
675
if (GV->hasLocalLinkage ()) {
675
676
GV->setVisibility (llvm::GlobalValue::DefaultVisibility);
@@ -678,7 +679,8 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
678
679
679
680
// Set visibility for definitions.
680
681
LinkageInfo LV = D->getLinkageAndVisibility ();
681
- if (LV.isVisibilityExplicit () || !GV->hasAvailableExternallyLinkage ())
682
+ if (LV.isVisibilityExplicit () ||
683
+ (IsForDefinition && !GV->hasAvailableExternallyLinkage ()))
682
684
GV->setVisibility (GetLLVMVisibility (LV.getVisibility ()));
683
685
}
684
686
@@ -1059,7 +1061,7 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
1059
1061
void CodeGenModule::SetCommonAttributes (const Decl *D,
1060
1062
llvm::GlobalValue *GV) {
1061
1063
if (const auto *ND = dyn_cast_or_null<NamedDecl>(D))
1062
- setGlobalVisibility (GV, ND);
1064
+ setGlobalVisibility (GV, ND, ForDefinition );
1063
1065
else
1064
1066
GV->setVisibility (llvm::GlobalValue::DefaultVisibility);
1065
1067
@@ -1115,8 +1117,8 @@ void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
1115
1117
setNonAliasAttributes (D, F);
1116
1118
}
1117
1119
1118
- static void setLinkageAndVisibilityForGV (llvm::GlobalValue *GV,
1119
- const NamedDecl *ND) {
1120
+ static void setLinkageForGV (llvm::GlobalValue *GV,
1121
+ const NamedDecl *ND) {
1120
1122
// Set linkage and visibility in case we never see a definition.
1121
1123
LinkageInfo LV = ND->getLinkageAndVisibility ();
1122
1124
if (!isExternallyVisible (LV.getLinkage ())) {
@@ -1132,10 +1134,6 @@ static void setLinkageAndVisibilityForGV(llvm::GlobalValue *GV,
1132
1134
// separate linkage types for this.
1133
1135
GV->setLinkage (llvm::GlobalValue::ExternalWeakLinkage);
1134
1136
}
1135
-
1136
- // Set visibility on a declaration only if it's explicit.
1137
- if (LV.isVisibilityExplicit ())
1138
- GV->setVisibility (CodeGenModule::GetLLVMVisibility (LV.getVisibility ()));
1139
1137
}
1140
1138
}
1141
1139
@@ -1204,7 +1202,8 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
1204
1202
// Only a few attributes are set on declarations; these may later be
1205
1203
// overridden by a definition.
1206
1204
1207
- setLinkageAndVisibilityForGV (F, FD);
1205
+ setLinkageForGV (F, FD);
1206
+ setGlobalVisibility (F, FD, NotForDefinition);
1208
1207
1209
1208
if (FD->getAttr <PragmaClangTextSectionAttr>()) {
1210
1209
F->addFnAttr (" implicit-section-name" );
@@ -2441,7 +2440,8 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
2441
2440
2442
2441
GV->setAlignment (getContext ().getDeclAlign (D).getQuantity ());
2443
2442
2444
- setLinkageAndVisibilityForGV (GV, D);
2443
+ setLinkageForGV (GV, D);
2444
+ setGlobalVisibility (GV, D, NotForDefinition);
2445
2445
2446
2446
if (D->getTLSKind ()) {
2447
2447
if (D->getTLSKind () == VarDecl::TLS_Dynamic)
@@ -3260,7 +3260,7 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,
3260
3260
setFunctionDLLStorageClass (GD, Fn);
3261
3261
3262
3262
// FIXME: this is redundant with part of setFunctionDefinitionAttributes
3263
- setGlobalVisibility (Fn, D);
3263
+ setGlobalVisibility (Fn, D, ForDefinition );
3264
3264
3265
3265
MaybeHandleStaticInExternC (D, Fn);
3266
3266
@@ -3856,7 +3856,7 @@ ConstantAddress CodeGenModule::GetAddrOfGlobalTemporary(
3856
3856
getModule (), Type, Constant, Linkage, InitialValue, Name.c_str (),
3857
3857
/* InsertBefore=*/ nullptr , llvm::GlobalVariable::NotThreadLocal, TargetAS);
3858
3858
if (emitter) emitter->finalize (GV);
3859
- setGlobalVisibility (GV, VD);
3859
+ setGlobalVisibility (GV, VD, ForDefinition );
3860
3860
GV->setAlignment (Align.getQuantity ());
3861
3861
if (supportsCOMDAT () && GV->isWeakForLinker ())
3862
3862
GV->setComdat (TheModule.getOrInsertComdat (GV->getName ()));
0 commit comments