[PATCH] Don't dynamically initialize dllimport vars (PR19939)
Hans Wennborg
hans at chromium.org
Wed Jun 4 11:57:37 PDT 2014
I fat fingered the PR number. This is for PR19933.
On Wed, Jun 4, 2014 at 11:17 AM, Hans Wennborg <hans at chromium.org> wrote:
> Hi rnk, nrieck,
>
> It's wrong and it causes us to assert in LLVM's code emission.
>
> http://reviews.llvm.org/D4020
>
> Files:
> lib/Sema/SemaTemplateInstantiateDecl.cpp
> test/CodeGenCXX/dllimport.cpp
>
> Index: lib/Sema/SemaTemplateInstantiateDecl.cpp
> ===================================================================
> --- lib/Sema/SemaTemplateInstantiateDecl.cpp
> +++ lib/Sema/SemaTemplateInstantiateDecl.cpp
> @@ -3671,6 +3671,12 @@
> // We already have an initializer in the class.
> return;
>
> + if (Var->hasAttr<DLLImportAttr>() &&
> + !(OldVar->getInit() && OldVar->checkInitIsICE())) {
> + // Do not dynamically initialize dllimport variables.
> + return;
> + }
> +
> if (OldVar->getInit()) {
> if (Var->isStaticDataMember() && !OldVar->isOutOfLine())
> PushExpressionEvaluationContext(Sema::ConstantEvaluated, OldVar);
> Index: test/CodeGenCXX/dllimport.cpp
> ===================================================================
> --- test/CodeGenCXX/dllimport.cpp
> +++ test/CodeGenCXX/dllimport.cpp
> @@ -5,6 +5,10 @@
> // RUN: %clang_cc1 -triple i686-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O1 -o - %s -DMSABI | FileCheck --check-prefix=MO1 %s
> // RUN: %clang_cc1 -triple i686-windows-gnu -fno-rtti -emit-llvm -std=c++1y -O1 -o - %s | FileCheck --check-prefix=GO1 %s
>
> +// CHECK-NOT doesn't play nice with CHECK-DAG, so use separate run lines.
> +// RUN: %clang_cc1 -triple i686-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s -DMSABI | FileCheck --check-prefix=MSC2 %s
> +// RUN: %clang_cc1 -triple i686-windows-gnu -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s | FileCheck --check-prefix=GNU2 %s
> +
> // Helper structs to make templates more expressive.
> struct ImplicitInst_Imported {};
> struct ImplicitInst_NotImported {};
> @@ -219,6 +223,11 @@
> __declspec(dllimport) __attribute__((noinline)) inline void noinline() {}
> USE(noinline)
>
> +// MSC2-NOT: @"\01?alwaysInline@@YAXXZ"()
> +// GNU2-NOT: @_Z12alwaysInlinev()
> +__declspec(dllimport) __attribute__((always_inline)) inline void alwaysInline() {}
> +USE(alwaysInline)
> +
> // Redeclarations
> // MSC-DAG: declare dllimport void @"\01?redecl1@@YAXXZ"()
> // GNU-DAG: declare dllimport void @_Z7redecl1v()
> @@ -580,13 +589,26 @@
> int f() { return S<int>::x; }
> }
>
> -//===----------------------------------------------------------------------===//
> -// Negative checks
> -//===----------------------------------------------------------------------===//
> -
> -// These checks are at the end to avoid interference with the DAG checks.
> -
> -// MSC-NOT: @"\01?alwaysInline@@YAXXZ"()
> -// GNU-NOT: @_Z12alwaysInlinev()
> -__declspec(dllimport) __attribute__((always_inline)) inline void alwaysInline() {}
> -USE(alwaysInline)
> +namespace PR19933 {
> +// Don't dynamically initialize dllimport vars.
> +// MSC2-NOT: @llvm.global_ctors
> +// GNU2-NOT: @llvm.global_ctors
> +
> + struct NonPOD { NonPOD(); };
> + template <typename T> struct A { static NonPOD x; };
> + template <typename T> NonPOD A<T>::x;
> + template struct __declspec(dllimport) A<int>;
> + // MSC-DAG: @"\01?x@?$A at H@PR19933@@2UNonPOD at 2@A" = available_externally dllimport global %"struct.PR19933::NonPOD" zeroinitializer
> +
> + int f();
> + template <typename T> struct B { static int x; };
> + template <typename T> int B<T>::x = f();
> + template struct __declspec(dllimport) B<int>;
> + // MSC-DAG: @"\01?x@?$B at H@PR19933@@2HA" = available_externally dllimport global i32 0
> +
> + constexpr int g() { return 42; }
> + template <typename T> struct C { static int x; };
> + template <typename T> int C<T>::x = g();
> + template struct __declspec(dllimport) C<int>;
> + // MSC-DAG: @"\01?x@?$C at H@PR19933@@2HA" = available_externally dllimport global i32 42
> +}
More information about the cfe-commits
mailing list