From da24e9cee35c466e5305e38b4e519f9c06b71fa7 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Mon, 2 Jun 2014 23:13:03 +0000 Subject: [PATCH] Itanium ABI: Update getAddrOfVTable to set the DLL storage class for vtables This corresponds to the same change for the MS ABI in r209908. Differential Revision: http://reviews.llvm.org/D3993 llvm-svn: 210054 --- clang/lib/CodeGen/ItaniumCXXABI.cpp | 6 ++++++ clang/test/CodeGenCXX/dllexport.cpp | 1 + clang/test/CodeGenCXX/dllimport.cpp | 24 +++++++++++++++++++----- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index f5d2372..951174b 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -1069,6 +1069,12 @@ llvm::GlobalVariable *ItaniumCXXABI::getAddrOfVTable(const CXXRecordDecl *RD, VTable = CGM.CreateOrReplaceCXXRuntimeVariable( Name, ArrayType, llvm::GlobalValue::ExternalLinkage); VTable->setUnnamedAddr(true); + + if (RD->hasAttr()) + VTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); + else if (RD->hasAttr()) + VTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); + return VTable; } diff --git a/clang/test/CodeGenCXX/dllexport.cpp b/clang/test/CodeGenCXX/dllexport.cpp index df8524d..adb856c 100644 --- a/clang/test/CodeGenCXX/dllexport.cpp +++ b/clang/test/CodeGenCXX/dllexport.cpp @@ -502,6 +502,7 @@ struct __declspec(dllexport) W { virtual void foo() {} }; // M32-DAG: define weak_odr dllexport x86_thiscallcc %struct.W* @"\01??0W@@QAE@ABU0@@Z" // vftable: // M32-DAG: @"\01??_7W@@6B@" = weak_odr dllexport unnamed_addr constant [1 x i8*] [i8* bitcast (void (%struct.W*)* @"\01?foo@W@@UAEXXZ" to i8*)] +// G32-DAG: @_ZTV1W = weak_odr dllexport unnamed_addr constant [3 x i8*] [i8* null, i8* bitcast ({ i8*, i8* }* @_ZTI1W to i8*), i8* bitcast (void (%struct.W*)* @_ZN1W3fooEv to i8*)] struct __declspec(dllexport) X : public virtual W {}; // vbtable: diff --git a/clang/test/CodeGenCXX/dllimport.cpp b/clang/test/CodeGenCXX/dllimport.cpp index a0d153e..ed36d8d 100644 --- a/clang/test/CodeGenCXX/dllimport.cpp +++ b/clang/test/CodeGenCXX/dllimport.cpp @@ -219,11 +219,6 @@ USE(inlineDef) __declspec(dllimport) __attribute__((noinline)) inline void noinline() {} USE(noinline) -// MSC-NOT: @"\01?alwaysInline@@YAXXZ"() -// GNU-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() @@ -527,6 +522,14 @@ struct __declspec(dllimport) W { virtual void foo() {} }; USECLASS(W) // vftable: // MO1-DAG: @"\01??_7W@@6B@" = available_externally dllimport unnamed_addr constant [1 x i8*] [i8* bitcast (void (%struct.W*)* @"\01?foo@W@@UAEXXZ" to i8*)] +// GO1-DAG: @_ZTV1W = available_externally dllimport unnamed_addr constant [3 x i8*] [i8* null, i8* null, i8* bitcast (void (%struct.W*)* @_ZN1W3fooEv to i8*)] + +struct __declspec(dllimport) KeyFuncClass { + constexpr KeyFuncClass() {} + virtual void foo(); +}; +constexpr KeyFuncClass keyFuncClassVar; +// G32-DAG: @_ZTV12KeyFuncClass = external dllimport unnamed_addr constant [3 x i8*] struct __declspec(dllimport) X : public virtual W {}; USECLASS(X) @@ -567,3 +570,14 @@ namespace Vtordisp { }; template class C; } + +//===----------------------------------------------------------------------===// +// 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) -- 2.7.4