Revert r236879, "Do not emit thunks with available_externally linkage in comdats"
It broke pecoff, at least i686-cygwin. llvm-svn: 236937
This commit is contained in:
parent
1af9c7b9d4
commit
c7da6da58e
|
@ -210,7 +210,8 @@ llvm::Constant *CodeGenModule::getOrCreateStaticVarDecl(
|
|||
GV->setAlignment(getContext().getDeclAlign(&D).getQuantity());
|
||||
setGlobalVisibility(GV, &D);
|
||||
|
||||
maybeSetTrivialComdat(*GV);
|
||||
if (supportsCOMDAT() && GV->isWeakForLinker())
|
||||
GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
|
||||
|
||||
if (D.getTLSKind())
|
||||
setTLSMode(GV, D);
|
||||
|
|
|
@ -94,7 +94,8 @@ CodeGenVTables::EmitVTTDefinition(llvm::GlobalVariable *VTT,
|
|||
// Set the correct linkage.
|
||||
VTT->setLinkage(Linkage);
|
||||
|
||||
CGM.maybeSetTrivialComdat(*VTT);
|
||||
if (CGM.supportsCOMDAT() && VTT->isWeakForLinker())
|
||||
VTT->setComdat(CGM.getModule().getOrInsertComdat(VTT->getName()));
|
||||
|
||||
// Set the right visibility.
|
||||
CGM.setGlobalVisibility(VTT, RD);
|
||||
|
@ -176,3 +177,4 @@ CodeGenVTables::getSecondaryVirtualPointerIndex(const CXXRecordDecl *RD,
|
|||
|
||||
return I->second;
|
||||
}
|
||||
|
||||
|
|
|
@ -378,6 +378,9 @@ void CodeGenFunction::GenerateThunk(llvm::Function *Fn,
|
|||
// Set the right linkage.
|
||||
CGM.setFunctionLinkage(GD, Fn);
|
||||
|
||||
if (CGM.supportsCOMDAT() && Fn->isWeakForLinker())
|
||||
Fn->setComdat(CGM.getModule().getOrInsertComdat(Fn->getName()));
|
||||
|
||||
// Set the right visibility.
|
||||
const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
|
||||
setThunkVisibility(CGM, MD, Thunk, Fn);
|
||||
|
@ -458,7 +461,6 @@ void CodeGenVTables::emitThunk(GlobalDecl GD, const ThunkInfo &Thunk,
|
|||
CGM.getCXXABI().setThunkLinkage(ThunkFn, ForVTable, GD,
|
||||
!Thunk.Return.isEmpty());
|
||||
}
|
||||
CGM.maybeSetTrivialComdat(*ThunkFn);
|
||||
}
|
||||
|
||||
void CodeGenVTables::maybeEmitThunkForVTable(GlobalDecl GD,
|
||||
|
|
|
@ -1298,7 +1298,8 @@ llvm::Constant *CodeGenModule::GetAddrOfUuidDescriptor(
|
|||
auto *GV = new llvm::GlobalVariable(
|
||||
getModule(), Init->getType(),
|
||||
/*isConstant=*/true, llvm::GlobalValue::LinkOnceODRLinkage, Init, Name);
|
||||
maybeSetTrivialComdat(*GV);
|
||||
if (supportsCOMDAT())
|
||||
GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
|
||||
return GV;
|
||||
}
|
||||
|
||||
|
@ -1849,7 +1850,9 @@ CodeGenModule::CreateOrReplaceCXXRuntimeVariable(StringRef Name,
|
|||
OldGV->eraseFromParent();
|
||||
}
|
||||
|
||||
maybeSetTrivialComdat(*GV);
|
||||
if (supportsCOMDAT() && GV->isWeakForLinker() &&
|
||||
!GV->hasAvailableExternallyLinkage())
|
||||
GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
|
||||
|
||||
return GV;
|
||||
}
|
||||
|
@ -1982,14 +1985,6 @@ void CodeGenModule::maybeSetTrivialComdat(const Decl &D,
|
|||
GO.setComdat(TheModule.getOrInsertComdat(GO.getName()));
|
||||
}
|
||||
|
||||
void CodeGenModule::maybeSetTrivialComdat(llvm::GlobalObject &GO) {
|
||||
if (!supportsCOMDAT())
|
||||
return;
|
||||
if (GO.isWeakForLinker() && !GO.hasAvailableExternallyLinkage()) {
|
||||
GO.setComdat(getModule().getOrInsertComdat(GO.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
|
||||
llvm::Constant *Init = nullptr;
|
||||
QualType ASTTy = D->getType();
|
||||
|
@ -2929,7 +2924,10 @@ GenerateStringLiteral(llvm::Constant *C, llvm::GlobalValue::LinkageTypes LT,
|
|||
nullptr, llvm::GlobalVariable::NotThreadLocal, AddrSpace);
|
||||
GV->setAlignment(Alignment);
|
||||
GV->setUnnamedAddr(true);
|
||||
CGM.maybeSetTrivialComdat(*GV);
|
||||
if (GV->isWeakForLinker()) {
|
||||
assert(CGM.supportsCOMDAT() && "Only COFF uses weak string literals");
|
||||
GV->setComdat(M.getOrInsertComdat(GV->getName()));
|
||||
}
|
||||
|
||||
return GV;
|
||||
}
|
||||
|
@ -3111,7 +3109,8 @@ llvm::Constant *CodeGenModule::GetAddrOfGlobalTemporary(
|
|||
setGlobalVisibility(GV, VD);
|
||||
GV->setAlignment(
|
||||
getContext().getTypeAlignInChars(MaterializedType).getQuantity());
|
||||
maybeSetTrivialComdat(*GV);
|
||||
if (supportsCOMDAT() && GV->isWeakForLinker())
|
||||
GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
|
||||
if (VD->getTLSKind())
|
||||
setTLSMode(GV, *VD);
|
||||
Slot = GV;
|
||||
|
|
|
@ -608,7 +608,6 @@ public:
|
|||
const llvm::Triple &getTriple() const;
|
||||
bool supportsCOMDAT() const;
|
||||
void maybeSetTrivialComdat(const Decl &D, llvm::GlobalObject &GO);
|
||||
void maybeSetTrivialComdat(llvm::GlobalObject &GO);
|
||||
|
||||
CGCXXABI &getCXXABI() const { return *ABI; }
|
||||
llvm::LLVMContext &getLLVMContext() { return VMContext; }
|
||||
|
|
|
@ -1328,7 +1328,8 @@ void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
|
|||
// Set the correct linkage.
|
||||
VTable->setLinkage(Linkage);
|
||||
|
||||
CGM.maybeSetTrivialComdat(*VTable);
|
||||
if (CGM.supportsCOMDAT() && VTable->isWeakForLinker())
|
||||
VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
|
||||
|
||||
// Set the right visibility.
|
||||
CGM.setGlobalVisibility(VTable, RD);
|
||||
|
@ -1795,8 +1796,8 @@ void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF,
|
|||
if (!D.isLocalVarDecl() && C) {
|
||||
guard->setComdat(C);
|
||||
CGF.CurFn->setComdat(C);
|
||||
} else {
|
||||
CGM.maybeSetTrivialComdat(*guard);
|
||||
} else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
|
||||
guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
|
||||
}
|
||||
|
||||
CGM.setStaticLocalDeclGuardAddress(&D, guard);
|
||||
|
@ -2802,7 +2803,8 @@ llvm::Constant *ItaniumRTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
|
|||
new llvm::GlobalVariable(M, Init->getType(),
|
||||
/*Constant=*/true, Linkage, Init, Name);
|
||||
|
||||
CGM.maybeSetTrivialComdat(*GV);
|
||||
if (CGM.supportsCOMDAT() && GV->isWeakForLinker())
|
||||
GV->setComdat(M.getOrInsertComdat(GV->getName()));
|
||||
|
||||
// If there's already an old global variable, replace it with the new one.
|
||||
if (OldGV) {
|
||||
|
@ -3596,7 +3598,8 @@ static llvm::Constant *getClangCallTerminateFn(CodeGenModule &CGM) {
|
|||
// we don't want it to turn into an exported symbol.
|
||||
fn->setLinkage(llvm::Function::LinkOnceODRLinkage);
|
||||
fn->setVisibility(llvm::Function::HiddenVisibility);
|
||||
CGM.maybeSetTrivialComdat(*fn);
|
||||
if (CGM.supportsCOMDAT())
|
||||
fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName()));
|
||||
|
||||
// Set up the function.
|
||||
llvm::BasicBlock *entry =
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// RUN: %clang_cc1 %s -triple=x86_64-pc-linux-gnu -munwind-tables -emit-llvm -o - | FileCheck %s
|
||||
// RUN: %clang_cc1 %s -triple=x86_64-pc-linux-gnu -munwind-tables -emit-llvm -o - -O1 -disable-llvm-optzns | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKOPT
|
||||
// RUN: %clang_cc1 %s -triple=x86_64-pc-linux-gnu -munwind-tables -emit-llvm -o - -O1 -disable-llvm-optzns | FileCheck %s
|
||||
|
||||
namespace Test1 {
|
||||
|
||||
|
@ -361,28 +361,6 @@ namespace Test15 {
|
|||
// CHECK: declare void @_ZThn8_N6Test151C1fEiz
|
||||
}
|
||||
|
||||
namespace Test16 {
|
||||
|
||||
// Check that the thunk for 'B::f' has available_externally linkage
|
||||
// and is not in a comdat.
|
||||
|
||||
template <class C>
|
||||
struct A {
|
||||
virtual void f();
|
||||
};
|
||||
|
||||
template <class D>
|
||||
struct B : virtual A<D> {
|
||||
virtual void f() { }
|
||||
};
|
||||
|
||||
extern template struct B<int>;
|
||||
|
||||
void f(B<int> b) {
|
||||
b.f();
|
||||
}
|
||||
}
|
||||
|
||||
/**** The following has to go at the end of the file ****/
|
||||
|
||||
// This is from Test5:
|
||||
|
@ -393,7 +371,4 @@ void f(B<int> b) {
|
|||
// CHECK-LABEL: define linkonce_odr void @_ZN6Test101C3fooEv
|
||||
// CHECK-LABEL: define linkonce_odr void @_ZThn8_N6Test101C3fooEv
|
||||
|
||||
// CHECKOPT-LABEL: define available_externally void @_ZTv0_n24_N6Test161BIiE1fEv
|
||||
// CHECKOPT-NOT: comdat
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind uwtable{{.*}} }
|
||||
|
|
Loading…
Reference in New Issue