From b4662c3e5a543540bdde3c1326a6db12eaeac591 Mon Sep 17 00:00:00 2001 From: Nico Rieck Date: Thu, 29 May 2014 16:50:46 +0000 Subject: [PATCH] MS ABI: Emit static data members with proper linkage llvm-svn: 209826 --- clang/lib/CodeGen/CodeGenModule.cpp | 9 +++++++-- clang/test/CodeGenCXX/dllexport-members.cpp | 13 ++++++------- clang/test/CodeGenCXX/dllimport-members.cpp | 20 ++++++-------------- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 484373b..f42e67d 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1964,10 +1964,15 @@ llvm::GlobalValue::LinkageTypes CodeGenModule::getLLVMLinkageForDeclarator( // If required by the ABI, give definitions of static data members with inline // initializers at least linkonce_odr linkage. + auto const VD = dyn_cast(D); if (getCXXABI().isInlineInitializedStaticDataMemberLinkOnce() && - isa(D) && - isVarDeclInlineInitializedStaticDataMember(cast(D))) + VD && isVarDeclInlineInitializedStaticDataMember(VD)) { + if (VD->hasAttr()) + return llvm::GlobalValue::AvailableExternallyLinkage; + if (VD->hasAttr()) + return llvm::GlobalValue::WeakODRLinkage; return llvm::GlobalValue::LinkOnceODRLinkage; + } // C++ doesn't have tentative definitions and thus cannot have common // linkage. diff --git a/clang/test/CodeGenCXX/dllexport-members.cpp b/clang/test/CodeGenCXX/dllexport-members.cpp index 90a1896..aa3dbb7 100644 --- a/clang/test/CodeGenCXX/dllexport-members.cpp +++ b/clang/test/CodeGenCXX/dllexport-members.cpp @@ -119,10 +119,9 @@ public: // MSC-DAG: @"\01?StaticField@ExportMembers@@2HA" = dllexport global i32 1, align 4 // MSC-DAG: @"\01?StaticConstField@ExportMembers@@2HB" = dllexport constant i32 1, align 4 - // FIXME: These three should be weak_odr. - // MSC-DAG: @"\01?StaticConstFieldEqualInit@ExportMembers@@2HB" = linkonce_odr dllexport constant i32 1, align 4 - // MSC-DAG: @"\01?StaticConstFieldBraceInit@ExportMembers@@2HB" = linkonce_odr dllexport constant i32 1, align 4 - // MSC-DAG: @"\01?ConstexprField@ExportMembers@@2HB" = linkonce_odr dllexport constant i32 1, align 4 + // MSC-DAG: @"\01?StaticConstFieldEqualInit@ExportMembers@@2HB" = weak_odr dllexport constant i32 1, align 4 + // MSC-DAG: @"\01?StaticConstFieldBraceInit@ExportMembers@@2HB" = weak_odr dllexport constant i32 1, align 4 + // MSC-DAG: @"\01?ConstexprField@ExportMembers@@2HB" = weak_odr dllexport constant i32 1, align 4 // GNU-DAG: @_ZN13ExportMembers11StaticFieldE = dllexport global i32 1, align 4 // GNU-DAG: @_ZN13ExportMembers16StaticConstFieldE = dllexport constant i32 1, align 4 // GNU-DAG: @_ZN13ExportMembers25StaticConstFieldEqualInitE = dllexport constant i32 1, align 4 @@ -243,9 +242,9 @@ public: // MSC-DAG: @"\01?StaticField@Nested@ExportMembers@@2HA" = dllexport global i32 1, align 4 // MSC-DAG: @"\01?StaticConstField@Nested@ExportMembers@@2HB" = dllexport constant i32 1, align 4 - // MSC-DAG: @"\01?StaticConstFieldEqualInit@Nested@ExportMembers@@2HB" = linkonce_odr dllexport constant i32 1, align 4 - // MSC-DAG: @"\01?StaticConstFieldBraceInit@Nested@ExportMembers@@2HB" = linkonce_odr dllexport constant i32 1, align 4 - // MSC-DAG: @"\01?ConstexprField@Nested@ExportMembers@@2HB" = linkonce_odr dllexport constant i32 1, align 4 + // MSC-DAG: @"\01?StaticConstFieldEqualInit@Nested@ExportMembers@@2HB" = weak_odr dllexport constant i32 1, align 4 + // MSC-DAG: @"\01?StaticConstFieldBraceInit@Nested@ExportMembers@@2HB" = weak_odr dllexport constant i32 1, align 4 + // MSC-DAG: @"\01?ConstexprField@Nested@ExportMembers@@2HB" = weak_odr dllexport constant i32 1, align 4 // GNU-DAG: @_ZN13ExportMembers6Nested11StaticFieldE = dllexport global i32 1, align 4 // GNU-DAG: @_ZN13ExportMembers6Nested16StaticConstFieldE = dllexport constant i32 1, align 4 // GNU-DAG: @_ZN13ExportMembers6Nested25StaticConstFieldEqualInitE = dllexport constant i32 1, align 4 diff --git a/clang/test/CodeGenCXX/dllimport-members.cpp b/clang/test/CodeGenCXX/dllimport-members.cpp index fc18328..571fbb4 100644 --- a/clang/test/CodeGenCXX/dllimport-members.cpp +++ b/clang/test/CodeGenCXX/dllimport-members.cpp @@ -178,9 +178,9 @@ public: // MSC-DAG: @"\01?StaticField@ImportMembers@@2HA" = external dllimport global i32 // MSC-DAG: @"\01?StaticConstField@ImportMembers@@2HB" = external dllimport constant i32 - // MSC-DAG-FIXME: @"\01?StaticConstFieldEqualInit@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 - // MSC-DAG-FIXME: @"\01?StaticConstFieldBraceInit@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 - // MSC-DAG-FIXME: @"\01?ConstexprField@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 + // MSC-DAG: @"\01?StaticConstFieldEqualInit@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 + // MSC-DAG: @"\01?StaticConstFieldBraceInit@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 + // MSC-DAG: @"\01?ConstexprField@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 // GNU-DAG: @_ZN13ImportMembers11StaticFieldE = external dllimport global i32 // GNU-DAG: @_ZN13ImportMembers16StaticConstFieldE = external dllimport constant i32 // GNU-DAG: @_ZN13ImportMembers25StaticConstFieldEqualInitE = external dllimport constant i32 @@ -188,11 +188,9 @@ public: // GNU-DAG: @_ZN13ImportMembers14ConstexprFieldE = external dllimport constant i32 __declspec(dllimport) static int StaticField; __declspec(dllimport) static const int StaticConstField; - #ifndef MSABI // FIXME __declspec(dllimport) static const int StaticConstFieldEqualInit = 1; __declspec(dllimport) static const int StaticConstFieldBraceInit{1}; __declspec(dllimport) constexpr static int ConstexprField = 1; - #endif template friend void useMemFun(); }; @@ -230,11 +228,9 @@ USEMF(ImportMembers, ignored) USEMV(ImportMembers, StaticField) USEMV(ImportMembers, StaticConstField) -#ifndef MSABI // FIXME USEMV(ImportMembers, StaticConstFieldEqualInit) USEMV(ImportMembers, StaticConstFieldBraceInit) USEMV(ImportMembers, ConstexprField) -#endif // Import individual members of a nested class. @@ -355,9 +351,9 @@ public: // MSC-DAG: @"\01?StaticField@Nested@ImportMembers@@2HA" = external dllimport global i32 // MSC-DAG: @"\01?StaticConstField@Nested@ImportMembers@@2HB" = external dllimport constant i32 - // MSC-DAG-FIXME: @"\01?StaticConstFieldEqualInit@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 - // MSC-DAG-FIXME: @"\01?StaticConstFieldBraceInit@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 - // MSC-DAG-FIXME: @"\01?ConstexprField@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 + // MSC-DAG: @"\01?StaticConstFieldEqualInit@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 + // MSC-DAG: @"\01?StaticConstFieldBraceInit@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 + // MSC-DAG: @"\01?ConstexprField@Nested@ImportMembers@@2HB" = available_externally dllimport constant i32 1, align 4 // GNU-DAG: @_ZN13ImportMembers6Nested11StaticFieldE = external dllimport global i32 // GNU-DAG: @_ZN13ImportMembers6Nested16StaticConstFieldE = external dllimport constant i32 // GNU-DAG: @_ZN13ImportMembers6Nested25StaticConstFieldEqualInitE = external dllimport constant i32 @@ -365,11 +361,9 @@ public: // GNU-DAG: @_ZN13ImportMembers6Nested14ConstexprFieldE = external dllimport constant i32 __declspec(dllimport) static int StaticField; __declspec(dllimport) static const int StaticConstField; - #ifndef MSABI // FIXME __declspec(dllimport) static const int StaticConstFieldEqualInit = 1; __declspec(dllimport) static const int StaticConstFieldBraceInit{1}; __declspec(dllimport) constexpr static int ConstexprField = 1; - #endif template friend void useMemFun(); }; @@ -407,11 +401,9 @@ USEMF(ImportMembers::Nested, ignored) USEMV(ImportMembers::Nested, StaticField) USEMV(ImportMembers::Nested, StaticConstField) -#ifndef MSABI // FIXME USEMV(ImportMembers::Nested, StaticConstFieldEqualInit) USEMV(ImportMembers::Nested, StaticConstFieldBraceInit) USEMV(ImportMembers::Nested, ConstexprField) -#endif // Import special member functions. -- 2.7.4