https://github.com/nga888 updated https://github.com/llvm/llvm-project/pull/94664
>From 05175ee44ce0b796b641beb34b18d7974c8355d2 Mon Sep 17 00:00:00 2001 From: Andrew Ng <andrew...@sony.com> Date: Fri, 31 May 2024 17:17:18 +0100 Subject: [PATCH 1/2] [clang] Fix loss of `dllexport` for exported template specialization When dropping DLL attributes, ensure that the most recent declaration is being checked. --- clang/lib/CodeGen/CodeGenModule.cpp | 17 +++++++++++++---- ...tiate-dllexport-template-specialization.cpp | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 clang/test/CodeGenCXX/windows-instantiate-dllexport-template-specialization.cpp diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index be7bf0b72dc0c..dcd80bc19e25c 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -4561,10 +4561,19 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction( } // Handle dropped DLL attributes. - if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>() && - !shouldMapVisibilityToDLLExport(cast_or_null<NamedDecl>(D))) { - Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); - setDSOLocal(Entry); + if (D) { + auto SC = Entry->getDLLStorageClass(); + if (SC != llvm::GlobalValue::DefaultStorageClass) { + const Decl *MRD = D->getMostRecentDecl(); + if (((SC == llvm::GlobalValue::DLLImportStorageClass && + !MRD->hasAttr<DLLImportAttr>()) || + (SC == llvm::GlobalValue::DLLExportStorageClass && + !MRD->hasAttr<DLLExportAttr>())) && + !shouldMapVisibilityToDLLExport(cast<NamedDecl>(MRD))) { + Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); + setDSOLocal(Entry); + } + } } // If there are two attempts to define the same mangled name, issue an diff --git a/clang/test/CodeGenCXX/windows-instantiate-dllexport-template-specialization.cpp b/clang/test/CodeGenCXX/windows-instantiate-dllexport-template-specialization.cpp new file mode 100644 index 0000000000000..97f341ba1f909 --- /dev/null +++ b/clang/test/CodeGenCXX/windows-instantiate-dllexport-template-specialization.cpp @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -triple i686-windows -fdeclspec -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-MS +// RUN: %clang_cc1 -triple i686-windows-itanium -fdeclspec -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-scei-ps4 -fdeclspec -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-sie-ps5 -fdeclspec -emit-llvm %s -o - | FileCheck %s + +struct s { + template <bool b = true> static bool f(); +}; + +template <typename T> bool template_using_f(T) { return s::f(); } + +bool use_template_using_f() { return template_using_f(0); } + +template<> +bool __declspec(dllexport) s::f<true>() { return true; } + +// CHECK-MS: dllexport {{.*}} @"??$f@$00@s@@SA_NXZ" +// CHECK: dllexport {{.*}} @_ZN1s1fILb1EEEbv >From 01e6a04c6ab4fbb07d0497fd85c495d4c98f17fc Mon Sep 17 00:00:00 2001 From: Andrew Ng <andrew...@sony.com> Date: Fri, 7 Jun 2024 17:47:23 +0100 Subject: [PATCH 2/2] Apply new DLL attribute dropping logic to globals too Moved logic to determine DLL attribute dropping into `shouldDropDLLAttribute()` and use in `GetOrCreateLLVMFunction()` and `GetOrCreateLLVMGlobal()`. --- clang/lib/CodeGen/CodeGenModule.cpp | 32 +++++++++++++++-------------- clang/lib/CodeGen/CodeGenModule.h | 2 ++ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index dcd80bc19e25c..f3f89b829220d 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -4509,6 +4509,19 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) { return Resolver; } +bool CodeGenModule::shouldDropDLLAttribute(const Decl *D, + const llvm::GlobalValue *GV) const { + auto SC = GV->getDLLStorageClass(); + if (SC == llvm::GlobalValue::DefaultStorageClass) + return false; + const Decl *MRD = D->getMostRecentDecl(); + return (((SC == llvm::GlobalValue::DLLImportStorageClass && + !MRD->hasAttr<DLLImportAttr>()) || + (SC == llvm::GlobalValue::DLLExportStorageClass && + !MRD->hasAttr<DLLExportAttr>())) && + !shouldMapVisibilityToDLLExport(cast<NamedDecl>(MRD))); +} + /// GetOrCreateLLVMFunction - If the specified mangled name is not in the /// module, create and return an llvm Function with the specified type. If there /// is something in the module with the specified name, return it potentially @@ -4561,19 +4574,9 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction( } // Handle dropped DLL attributes. - if (D) { - auto SC = Entry->getDLLStorageClass(); - if (SC != llvm::GlobalValue::DefaultStorageClass) { - const Decl *MRD = D->getMostRecentDecl(); - if (((SC == llvm::GlobalValue::DLLImportStorageClass && - !MRD->hasAttr<DLLImportAttr>()) || - (SC == llvm::GlobalValue::DLLExportStorageClass && - !MRD->hasAttr<DLLExportAttr>())) && - !shouldMapVisibilityToDLLExport(cast<NamedDecl>(MRD))) { - Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); - setDSOLocal(Entry); - } - } + if (D && shouldDropDLLAttribute(D, Entry)) { + Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); + setDSOLocal(Entry); } // If there are two attempts to define the same mangled name, issue an @@ -4865,8 +4868,7 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, llvm::Type *Ty, } // Handle dropped DLL attributes. - if (D && !D->hasAttr<DLLImportAttr>() && !D->hasAttr<DLLExportAttr>() && - !shouldMapVisibilityToDLLExport(D)) + if (D && shouldDropDLLAttribute(D, Entry)) Entry->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); if (LangOpts.OpenMP && !LangOpts.OpenMPSimd && D) diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index dc24971a3c186..9b63f47ef42cb 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -1594,6 +1594,8 @@ class CodeGenModule : public CodeGenTypeCache { } private: + bool shouldDropDLLAttribute(const Decl *D, const llvm::GlobalValue *GV) const; + llvm::Constant *GetOrCreateLLVMFunction( StringRef MangledName, llvm::Type *Ty, GlobalDecl D, bool ForVTable, bool DontDefer = false, bool IsThunk = false, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits