MS ABI: Let guard variables be present in COMDATs

A guard variable in a COMDAT'd function should also be in a COMDAT.

llvm-svn: 226629
This commit is contained in:
David Majnemer 2015-01-21 01:04:30 +00:00
parent 740d59ec49
commit 3072fc885e
2 changed files with 5 additions and 2 deletions

View File

@ -1923,6 +1923,9 @@ void MicrosoftCXXABI::EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
GV->getLinkage(), Zero, GuardName.str());
GI->Guard->setVisibility(GV->getVisibility());
GI->Guard->setDLLStorageClass(GV->getDLLStorageClass());
if (GI->Guard->isWeakForLinker())
GI->Guard->setComdat(
CGM.getModule().getOrInsertComdat(GI->Guard->getName()));
} else {
assert(GI->Guard->getLinkage() == GV->getLinkage() &&
"static local from the same function had different linkage");

View File

@ -82,8 +82,8 @@ int __declspec(dllexport) nonInlineStaticLocalsFunc() {
return x++;
};
// MSC-DAG: @"\01?x@?1??inlineStaticLocalsFunc@@YAHXZ@4HA" = weak_odr dllexport global i32 0
// MSC-DAG: @"\01??_B?1??inlineStaticLocalsFunc@@YAHXZ@51" = weak_odr dllexport global i32 0
// MSC-DAG: @"\01?x@?1??inlineStaticLocalsFunc@@YAHXZ@4HA" = weak_odr dllexport global i32 0, comdat
// MSC-DAG: @"\01??_B?1??inlineStaticLocalsFunc@@YAHXZ@51" = weak_odr dllexport global i32 0, comdat
// Note: MinGW doesn't seem to export the static local here.
inline int __declspec(dllexport) inlineStaticLocalsFunc() {
static int x = f();