hans created this revision. hans added reviewers: thakis, mstorsjo, rnk. hans requested review of this revision. Herald added a project: clang.
Even if the reference itself is dllexport, the temporary should not be -- in fact, we're already giving it internal linkage, so dllexporting it is not just wasteful, but will fail to link, as in the example below: $ cat /tmp/a.cc void _DllMainCRTStartup() {} const int __declspec(dllexport) &foo = 42; $ clang-cl -fuse-ld=lld /tmp/a.cc /Zl /link /dll /out:a.dll lld-link: error: <root>: undefined symbol: int const &foo::$RT1 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D118980 Files: clang/lib/CodeGen/CodeGenModule.cpp clang/test/CodeGenCXX/reference-temporary-ms.cpp Index: clang/test/CodeGenCXX/reference-temporary-ms.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/reference-temporary-ms.cpp @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 -fms-extensions | FileCheck %s + +const int __declspec(dllexport) &Exported = 42; + +// The reference temporary shouldn't be dllexport, even if the reference is. +// CHECK: @"?$RT1@Exported@@3ABHB" = internal constant i32 42 + +// CHECK: @"?Exported@@3ABHB" = dso_local dllexport constant i32* @"?$RT1@Exported@@3ABHB" Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -5725,6 +5725,9 @@ /*InsertBefore=*/nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS); if (emitter) emitter->finalize(GV); setGVProperties(GV, VD); + if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass) + // The reference temporary should never be dllexport. + GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass); GV->setAlignment(Align.getAsAlign()); if (supportsCOMDAT() && GV->isWeakForLinker()) GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
Index: clang/test/CodeGenCXX/reference-temporary-ms.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/reference-temporary-ms.cpp @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 -fms-extensions | FileCheck %s + +const int __declspec(dllexport) &Exported = 42; + +// The reference temporary shouldn't be dllexport, even if the reference is. +// CHECK: @"?$RT1@Exported@@3ABHB" = internal constant i32 42 + +// CHECK: @"?Exported@@3ABHB" = dso_local dllexport constant i32* @"?$RT1@Exported@@3ABHB" Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -5725,6 +5725,9 @@ /*InsertBefore=*/nullptr, llvm::GlobalVariable::NotThreadLocal, TargetAS); if (emitter) emitter->finalize(GV); setGVProperties(GV, VD); + if (GV->getDLLStorageClass() == llvm::GlobalVariable::DLLExportStorageClass) + // The reference temporary should never be dllexport. + GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass); GV->setAlignment(Align.getAsAlign()); if (supportsCOMDAT() && GV->isWeakForLinker()) GV->setComdat(TheModule.getOrInsertComdat(GV->getName()));
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits