From 80baa95966aa337e165214e85f4f0ba198705d9d Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Wed, 21 Jan 2015 01:04:30 +0000 Subject: [PATCH] MS ABI: Let guard variables be present in COMDATs A guard variable in a COMDAT'd function should also be in a COMDAT. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226629 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MicrosoftCXXABI.cpp | 3 +++ test/CodeGenCXX/dllexport.cpp | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 12029bc13b..71d6e7800d 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -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"); diff --git a/test/CodeGenCXX/dllexport.cpp b/test/CodeGenCXX/dllexport.cpp index 53c7de2ee2..0845c6dd7f 100644 --- a/test/CodeGenCXX/dllexport.cpp +++ b/test/CodeGenCXX/dllexport.cpp @@ -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(); -- 2.40.0