diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1099,7 +1099,7 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const { - if (GV->hasDLLImportStorageClass()) + if (GV->hasDLLExportStorageClass() || GV->hasDLLImportStorageClass()) return; // Internal definitions always have default visibility. if (GV->hasLocalLinkage()) { diff --git a/clang/test/CodeGenCXX/dllstorage-hidden.cpp b/clang/test/CodeGenCXX/dllstorage-hidden.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenCXX/dllstorage-hidden.cpp @@ -0,0 +1,26 @@ +/// dllimport and dllexport express non-hidden intention. Don't apply hidden visibility. + +// RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-extensions -emit-llvm -fvisibility-inlines-hidden -o - %s | FileCheck %s --check-prefix=MSVC +// RUN: %clang_cc1 -triple x86_64-windows-gnu -fms-extensions -emit-llvm -fvisibility-inlines-hidden -o - %s | FileCheck %s --check-prefix=GNU +// RUN: %clang_cc1 -triple x86_64-windows-gnu -fms-extensions -emit-llvm -fvisibility hidden -o - %s | FileCheck %s --check-prefix=GNU + +#define CONCAT2(x, y) x##y +#define CONCAT(x, y) CONCAT2(x, y) +#define USE(func) void CONCAT(use, __LINE__)() { func(); } + +// MSVC-DAG: declare dllimport void @"?bar@foo@@QEAAXXZ"( +// GNU-DAG: define linkonce_odr hidden void @_ZN3foo3barEv( + +struct __attribute__((dllimport)) foo { + void bar() {} +}; +void zed(foo *p) { p->bar(); } + +// MSVC-DAG: define dso_local dllexport void @"?exported@@YAXXZ"( +// GNU-DAG: define dso_local dllexport void @_Z8exportedv( +__attribute__((dllexport)) void exported() {} + +// MSVC-DAG: define weak_odr dso_local dllexport void @"?exported_inline@@YAXXZ"( +// GNU-DAG: define weak_odr dso_local dllexport void @_Z15exported_inlinev( +__declspec(dllexport) inline void exported_inline() {} +USE(exported_inline) diff --git a/clang/test/CodeGenCXX/hidden-dllimport.cpp b/clang/test/CodeGenCXX/hidden-dllimport.cpp deleted file mode 100644 --- a/clang/test/CodeGenCXX/hidden-dllimport.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-pc-windows-msvc -emit-llvm -fvisibility-inlines-hidden -o - %s | FileCheck %s - -// We used to declare this hidden dllimport, which is contradictory. - -// CHECK: declare dllimport void @"?bar@foo@@QEAAXXZ"(%struct.foo* {{[^,]*}}) - -struct __attribute__((dllimport)) foo { - void bar() {} -}; -void zed(foo *p) { p->bar(); }