Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit 82f31b5

Browse files
committed
Reland "Fix vtable not receiving hidden visibility when using push(visibility)"
I had to reland this change in order to make the test work on windows This change should resolve https://bugs.llvm.org/show_bug.cgi?id=35022 https://reviews.llvm.org/D39627 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@319269 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent b4b0ed7 commit 82f31b5

7 files changed

+41
-19
lines changed

lib/CodeGen/CGDecl.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ llvm::Constant *CodeGenModule::getOrCreateStaticVarDecl(
240240
getModule(), LTy, Ty.isConstant(getContext()), Linkage, Init, Name,
241241
nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
242242
GV->setAlignment(getContext().getDeclAlign(&D).getQuantity());
243-
setGlobalVisibility(GV, &D);
243+
setGlobalVisibility(GV, &D, ForDefinition);
244244

245245
if (supportsCOMDAT() && GV->isWeakForLinker())
246246
GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));

lib/CodeGen/CGVTT.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ CodeGenVTables::EmitVTTDefinition(llvm::GlobalVariable *VTT,
100100
VTT->setComdat(CGM.getModule().getOrInsertComdat(VTT->getName()));
101101

102102
// Set the right visibility.
103-
CGM.setGlobalVisibility(VTT, RD);
103+
CGM.setGlobalVisibility(VTT, RD, ForDefinition);
104104
}
105105

106106
llvm::GlobalVariable *CodeGenVTables::GetAddrOfVTT(const CXXRecordDecl *RD) {

lib/CodeGen/CGVTables.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ llvm::Constant *CodeGenModule::GetAddrOfThunk(GlobalDecl GD,
5151

5252
static void setThunkVisibility(CodeGenModule &CGM, const CXXMethodDecl *MD,
5353
const ThunkInfo &Thunk, llvm::Function *Fn) {
54-
CGM.setGlobalVisibility(Fn, MD);
54+
CGM.setGlobalVisibility(Fn, MD, ForDefinition);
5555
}
5656

5757
static void setThunkProperties(CodeGenModule &CGM, const ThunkInfo &Thunk,
@@ -730,7 +730,7 @@ CodeGenVTables::GenerateConstructionVTable(const CXXRecordDecl *RD,
730730
// Create the variable that will hold the construction vtable.
731731
llvm::GlobalVariable *VTable =
732732
CGM.CreateOrReplaceCXXRuntimeVariable(Name, VTType, Linkage);
733-
CGM.setGlobalVisibility(VTable, RD);
733+
CGM.setGlobalVisibility(VTable, RD, ForDefinition);
734734

735735
// V-tables are always unnamed_addr.
736736
VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);

lib/CodeGen/CodeGenModule.cpp

+13-13
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,8 @@ llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) {
669669
}
670670

671671
void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
672-
const NamedDecl *D) const {
672+
const NamedDecl *D,
673+
ForDefinition_t IsForDefinition) const {
673674
// Internal definitions always have default visibility.
674675
if (GV->hasLocalLinkage()) {
675676
GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
@@ -678,7 +679,8 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
678679

679680
// Set visibility for definitions.
680681
LinkageInfo LV = D->getLinkageAndVisibility();
681-
if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage())
682+
if (LV.isVisibilityExplicit() ||
683+
(IsForDefinition && !GV->hasAvailableExternallyLinkage()))
682684
GV->setVisibility(GetLLVMVisibility(LV.getVisibility()));
683685
}
684686

@@ -1059,7 +1061,7 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
10591061
void CodeGenModule::SetCommonAttributes(const Decl *D,
10601062
llvm::GlobalValue *GV) {
10611063
if (const auto *ND = dyn_cast_or_null<NamedDecl>(D))
1062-
setGlobalVisibility(GV, ND);
1064+
setGlobalVisibility(GV, ND, ForDefinition);
10631065
else
10641066
GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
10651067

@@ -1115,8 +1117,8 @@ void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
11151117
setNonAliasAttributes(D, F);
11161118
}
11171119

1118-
static void setLinkageAndVisibilityForGV(llvm::GlobalValue *GV,
1119-
const NamedDecl *ND) {
1120+
static void setLinkageForGV(llvm::GlobalValue *GV,
1121+
const NamedDecl *ND) {
11201122
// Set linkage and visibility in case we never see a definition.
11211123
LinkageInfo LV = ND->getLinkageAndVisibility();
11221124
if (!isExternallyVisible(LV.getLinkage())) {
@@ -1132,10 +1134,6 @@ static void setLinkageAndVisibilityForGV(llvm::GlobalValue *GV,
11321134
// separate linkage types for this.
11331135
GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
11341136
}
1135-
1136-
// Set visibility on a declaration only if it's explicit.
1137-
if (LV.isVisibilityExplicit())
1138-
GV->setVisibility(CodeGenModule::GetLLVMVisibility(LV.getVisibility()));
11391137
}
11401138
}
11411139

@@ -1204,7 +1202,8 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
12041202
// Only a few attributes are set on declarations; these may later be
12051203
// overridden by a definition.
12061204

1207-
setLinkageAndVisibilityForGV(F, FD);
1205+
setLinkageForGV(F, FD);
1206+
setGlobalVisibility(F, FD, NotForDefinition);
12081207

12091208
if (FD->getAttr<PragmaClangTextSectionAttr>()) {
12101209
F->addFnAttr("implicit-section-name");
@@ -2441,7 +2440,8 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
24412440

24422441
GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
24432442

2444-
setLinkageAndVisibilityForGV(GV, D);
2443+
setLinkageForGV(GV, D);
2444+
setGlobalVisibility(GV, D, NotForDefinition);
24452445

24462446
if (D->getTLSKind()) {
24472447
if (D->getTLSKind() == VarDecl::TLS_Dynamic)
@@ -3260,7 +3260,7 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,
32603260
setFunctionDLLStorageClass(GD, Fn);
32613261

32623262
// FIXME: this is redundant with part of setFunctionDefinitionAttributes
3263-
setGlobalVisibility(Fn, D);
3263+
setGlobalVisibility(Fn, D, ForDefinition);
32643264

32653265
MaybeHandleStaticInExternC(D, Fn);
32663266

@@ -3856,7 +3856,7 @@ ConstantAddress CodeGenModule::GetAddrOfGlobalTemporary(
38563856
getModule(), Type, Constant, Linkage, InitialValue, Name.c_str(),
38573857
/*InsertBefore=*/nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
38583858
if (emitter) emitter->finalize(GV);
3859-
setGlobalVisibility(GV, VD);
3859+
setGlobalVisibility(GV, VD, ForDefinition);
38603860
GV->setAlignment(Align.getQuantity());
38613861
if (supportsCOMDAT() && GV->isWeakForLinker())
38623862
GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));

lib/CodeGen/CodeGenModule.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,8 @@ class CodeGenModule : public CodeGenTypeCache {
710710
llvm::ConstantInt *getSize(CharUnits numChars);
711711

712712
/// Set the visibility for the given LLVM GlobalValue.
713-
void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const;
713+
void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D,
714+
ForDefinition_t IsForDefinition) const;
714715

715716
/// Set the TLS mode for the given LLVM GlobalValue for the thread-local
716717
/// variable declaration D.

lib/CodeGen/ItaniumCXXABI.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1527,7 +1527,7 @@ void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
15271527
VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
15281528

15291529
// Set the right visibility.
1530-
CGM.setGlobalVisibility(VTable, RD);
1530+
CGM.setGlobalVisibility(VTable, RD, ForDefinition);
15311531

15321532
// Use pointer alignment for the vtable. Otherwise we would align them based
15331533
// on the size of the initializer which doesn't make sense as only single
@@ -1637,6 +1637,7 @@ llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
16371637
VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
16381638
Name, VTableType, llvm::GlobalValue::ExternalLinkage);
16391639
VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
1640+
CGM.setGlobalVisibility(VTable, RD, NotForDefinition);
16401641

16411642
if (RD->hasAttr<DLLImportAttr>())
16421643
VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// RUN: %clang_cc1 -triple x86_64-linux-unknown -emit-llvm %s -o - | FileCheck %s
2+
3+
#pragma GCC visibility push(hidden)
4+
5+
struct Base {
6+
virtual ~Base() = default;
7+
virtual void* Alloc() = 0;
8+
};
9+
10+
class Child : public Base {
11+
public:
12+
Child() = default;
13+
void* Alloc();
14+
};
15+
16+
void test() {
17+
Child x;
18+
}
19+
20+
// CHECK: @_ZTV5Child = external hidden unnamed_addr constant

0 commit comments

Comments
 (0)