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