r273237 - [CodeGen] Do not run initializers for imported variables
David Majnemer via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 20 20:40:16 PDT 2016
Author: majnemer
Date: Mon Jun 20 22:40:16 2016
New Revision: 273237
URL: http://llvm.org/viewvc/llvm-project?rev=273237&view=rev
Log:
[CodeGen] Do not run initializers for imported variables
The export side is responsible for running any initializers, they are
run when the module is first loaded. Attempting to run an initializer
for the import side is not possible.
This fixes PR28216.
Added:
cfe/trunk/test/CodeGenCXX/PR28216.cpp
Modified:
cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=273237&r1=273236&r2=273237&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Mon Jun 20 22:40:16 2016
@@ -323,6 +323,10 @@ CodeGenModule::EmitCXXGlobalVarDeclInitF
D->hasAttr<CUDASharedAttr>()))
return;
+ // DLL imported variables will be initialized by the export side.
+ if (D->hasAttr<DLLImportAttr>())
+ return;
+
// Check if we've already initialized this decl.
auto I = DelayedCXXInitPosition.find(D);
if (I != DelayedCXXInitPosition.end() && I->second == ~0U)
Added: cfe/trunk/test/CodeGenCXX/PR28216.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/PR28216.cpp?rev=273237&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/PR28216.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/PR28216.cpp Mon Jun 20 22:40:16 2016
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 %s -triple i686-pc-win32 -fms-extensions -emit-llvm -o - | FileCheck %s
+
+template <typename>
+struct __declspec(dllimport) S {
+ S();
+};
+
+template <typename T>
+struct __declspec(dllimport) U {
+ static S<T> u;
+};
+
+template <typename T>
+S<T> U<T>::u;
+
+template S<int> U<int>::u;
+// CHECK-NOT: define internal void @"\01??__Eu@?$U at H@@2U?$S at H@@A at YAXXZ"(
+
+S<int> &i = U<int>::u;
More information about the cfe-commits
mailing list