forked from OSchip/llvm-project
Revert "[CodeGen] Fix vtable not receiving hidden visibility when using push(visibility)"
This reverts commit r318853: tests are failing on Windows bots llvm-svn: 318866
This commit is contained in:
parent
3295274725
commit
32c9de009a
|
@ -240,7 +240,7 @@ llvm::Constant *CodeGenModule::getOrCreateStaticVarDecl(
|
|||
getModule(), LTy, Ty.isConstant(getContext()), Linkage, Init, Name,
|
||||
nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
|
||||
GV->setAlignment(getContext().getDeclAlign(&D).getQuantity());
|
||||
setGlobalVisibility(GV, &D, ForDefinition);
|
||||
setGlobalVisibility(GV, &D);
|
||||
|
||||
if (supportsCOMDAT() && GV->isWeakForLinker())
|
||||
GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
|
||||
|
|
|
@ -100,7 +100,7 @@ CodeGenVTables::EmitVTTDefinition(llvm::GlobalVariable *VTT,
|
|||
VTT->setComdat(CGM.getModule().getOrInsertComdat(VTT->getName()));
|
||||
|
||||
// Set the right visibility.
|
||||
CGM.setGlobalVisibility(VTT, RD, ForDefinition);
|
||||
CGM.setGlobalVisibility(VTT, RD);
|
||||
}
|
||||
|
||||
llvm::GlobalVariable *CodeGenVTables::GetAddrOfVTT(const CXXRecordDecl *RD) {
|
||||
|
|
|
@ -51,7 +51,7 @@ llvm::Constant *CodeGenModule::GetAddrOfThunk(GlobalDecl GD,
|
|||
|
||||
static void setThunkVisibility(CodeGenModule &CGM, const CXXMethodDecl *MD,
|
||||
const ThunkInfo &Thunk, llvm::Function *Fn) {
|
||||
CGM.setGlobalVisibility(Fn, MD, ForDefinition);
|
||||
CGM.setGlobalVisibility(Fn, MD);
|
||||
}
|
||||
|
||||
static void setThunkProperties(CodeGenModule &CGM, const ThunkInfo &Thunk,
|
||||
|
@ -730,7 +730,7 @@ CodeGenVTables::GenerateConstructionVTable(const CXXRecordDecl *RD,
|
|||
// Create the variable that will hold the construction vtable.
|
||||
llvm::GlobalVariable *VTable =
|
||||
CGM.CreateOrReplaceCXXRuntimeVariable(Name, VTType, Linkage);
|
||||
CGM.setGlobalVisibility(VTable, RD, ForDefinition);
|
||||
CGM.setGlobalVisibility(VTable, RD);
|
||||
|
||||
// V-tables are always unnamed_addr.
|
||||
VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
|
||||
|
|
|
@ -662,8 +662,7 @@ llvm::ConstantInt *CodeGenModule::getSize(CharUnits size) {
|
|||
}
|
||||
|
||||
void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
|
||||
const NamedDecl *D,
|
||||
ForDefinition_t IsForDefinition) const {
|
||||
const NamedDecl *D) const {
|
||||
// Internal definitions always have default visibility.
|
||||
if (GV->hasLocalLinkage()) {
|
||||
GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
|
||||
|
@ -672,8 +671,7 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
|
|||
|
||||
// Set visibility for definitions.
|
||||
LinkageInfo LV = D->getLinkageAndVisibility();
|
||||
if (LV.isVisibilityExplicit() ||
|
||||
(IsForDefinition && !GV->hasAvailableExternallyLinkage()))
|
||||
if (LV.isVisibilityExplicit() || !GV->hasAvailableExternallyLinkage())
|
||||
GV->setVisibility(GetLLVMVisibility(LV.getVisibility()));
|
||||
}
|
||||
|
||||
|
@ -1054,7 +1052,7 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
|
|||
void CodeGenModule::SetCommonAttributes(const Decl *D,
|
||||
llvm::GlobalValue *GV) {
|
||||
if (const auto *ND = dyn_cast_or_null<NamedDecl>(D))
|
||||
setGlobalVisibility(GV, ND, ForDefinition);
|
||||
setGlobalVisibility(GV, ND);
|
||||
else
|
||||
GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
|
||||
|
||||
|
@ -1110,8 +1108,8 @@ void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
|
|||
setNonAliasAttributes(D, F);
|
||||
}
|
||||
|
||||
static void setLinkageForGV(llvm::GlobalValue *GV,
|
||||
const NamedDecl *ND) {
|
||||
static void setLinkageAndVisibilityForGV(llvm::GlobalValue *GV,
|
||||
const NamedDecl *ND) {
|
||||
// Set linkage and visibility in case we never see a definition.
|
||||
LinkageInfo LV = ND->getLinkageAndVisibility();
|
||||
if (!isExternallyVisible(LV.getLinkage())) {
|
||||
|
@ -1127,6 +1125,10 @@ static void setLinkageForGV(llvm::GlobalValue *GV,
|
|||
// separate linkage types for this.
|
||||
GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage);
|
||||
}
|
||||
|
||||
// Set visibility on a declaration only if it's explicit.
|
||||
if (LV.isVisibilityExplicit())
|
||||
GV->setVisibility(CodeGenModule::GetLLVMVisibility(LV.getVisibility()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1195,8 +1197,7 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
|
|||
// Only a few attributes are set on declarations; these may later be
|
||||
// overridden by a definition.
|
||||
|
||||
setLinkageForGV(F, FD);
|
||||
setGlobalVisibility(F, FD, NotForDefinition);
|
||||
setLinkageAndVisibilityForGV(F, FD);
|
||||
|
||||
if (FD->getAttr<PragmaClangTextSectionAttr>()) {
|
||||
F->addFnAttr("implicit-section-name");
|
||||
|
@ -2433,8 +2434,7 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
|
|||
|
||||
GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
|
||||
|
||||
setLinkageForGV(GV, D);
|
||||
setGlobalVisibility(GV, D, NotForDefinition);
|
||||
setLinkageAndVisibilityForGV(GV, D);
|
||||
|
||||
if (D->getTLSKind()) {
|
||||
if (D->getTLSKind() == VarDecl::TLS_Dynamic)
|
||||
|
@ -3253,7 +3253,7 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,
|
|||
setFunctionDLLStorageClass(GD, Fn);
|
||||
|
||||
// FIXME: this is redundant with part of setFunctionDefinitionAttributes
|
||||
setGlobalVisibility(Fn, D, ForDefinition);
|
||||
setGlobalVisibility(Fn, D);
|
||||
|
||||
MaybeHandleStaticInExternC(D, Fn);
|
||||
|
||||
|
@ -3849,7 +3849,7 @@ ConstantAddress CodeGenModule::GetAddrOfGlobalTemporary(
|
|||
getModule(), Type, Constant, Linkage, InitialValue, Name.c_str(),
|
||||
/*InsertBefore=*/nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS);
|
||||
if (emitter) emitter->finalize(GV);
|
||||
setGlobalVisibility(GV, VD, ForDefinition);
|
||||
setGlobalVisibility(GV, VD);
|
||||
GV->setAlignment(Align.getQuantity());
|
||||
if (supportsCOMDAT() && GV->isWeakForLinker())
|
||||
GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
|
||||
|
|
|
@ -710,8 +710,7 @@ public:
|
|||
llvm::ConstantInt *getSize(CharUnits numChars);
|
||||
|
||||
/// Set the visibility for the given LLVM GlobalValue.
|
||||
void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D,
|
||||
ForDefinition_t IsForDefinition) const;
|
||||
void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const;
|
||||
|
||||
/// Set the TLS mode for the given LLVM GlobalValue for the thread-local
|
||||
/// variable declaration D.
|
||||
|
|
|
@ -1527,7 +1527,7 @@ void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
|
|||
VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
|
||||
|
||||
// Set the right visibility.
|
||||
CGM.setGlobalVisibility(VTable, RD, ForDefinition);
|
||||
CGM.setGlobalVisibility(VTable, RD);
|
||||
|
||||
// Use pointer alignment for the vtable. Otherwise we would align them based
|
||||
// on the size of the initializer which doesn't make sense as only single
|
||||
|
@ -1637,7 +1637,6 @@ llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
|
|||
VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
|
||||
Name, VTableType, llvm::GlobalValue::ExternalLinkage);
|
||||
VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
|
||||
CGM.setGlobalVisibility(VTable, RD, NotForDefinition);
|
||||
|
||||
if (RD->hasAttr<DLLImportAttr>())
|
||||
VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
// RUN: %clang -S -emit-llvm -o %t %s
|
||||
// RUN: FileCheck --input-file=%t %s
|
||||
|
||||
#pragma GCC visibility push(hidden)
|
||||
|
||||
struct Base {
|
||||
virtual ~Base() = default;
|
||||
virtual void* Alloc() = 0;
|
||||
};
|
||||
|
||||
class Child : public Base {
|
||||
public:
|
||||
Child() = default;
|
||||
void* Alloc();
|
||||
};
|
||||
|
||||
void test() {
|
||||
Child x;
|
||||
}
|
||||
|
||||
// CHECK: @_ZTV5Child = external hidden unnamed_addr constant
|
Loading…
Reference in New Issue