r324991 - Fix for PR32992. Static const classes not exported.
Ammarguellat, Zahira via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 19 13:18:45 PST 2018
Hans,
The reproducer below generates wrong export symbols compared to MSVC but I am not sure it is related to my change.
Compiling this with MSVC generates these symbols:
ksh-3.2$ dumpbin /directives t3.obj | grep EXPORT
/EXPORT:??4?$d at H@@QEAAAEAV0 at AEBV0@@Z
/EXPORT:??4?$d at H@@QEAAAEAV0@$$QEAV0@@Z
/EXPORT:??4?$h at H@f@@QEAAAEAV01 at AEBV01@@Z
/EXPORT:??4?$h at H@f@@QEAAAEAV01@$$QEAV01@@Z
/EXPORT:??4i@@QEAAAEAV0 at AEBV0@@Z
/EXPORT:??4i@@QEAAAEAV0@$$QEAV0@@Z
Compiling with clang (my patches no included) generate these symbols:
ksh-3.2$ dumpbin /directives t3.o | grep EXPORT
/EXPORT:??4?$d at H@@QEAAAEAV0 at AEBV0@@Z
/EXPORT:??4?$d at H@@QEAAAEAV0@$$QEAV0@@Z
/EXPORT:??4?$h at H@f@@QEAAAEAV01 at AEBV01@@Z
/EXPORT:??4?$h at H@f@@QEAAAEAV01@$$QEAV01@@Z
/EXPORT:??4i@@QEAAAEAV0 at AEBV0@@Z
/EXPORT:??4i@@QEAAAEAV0@$$QEAV0@@Z
/EXPORT:?e@?$d at H@@0W4b at a@@B,DATA <== This is not generated in MSVC.
Although this is a bug that needs to be fixes, it is in my opinion un-related to the patches I have proposed.
Your thoughts?
Thanks.
-Zahira
-----Original Message-----
From: hwennborg at google.com [mailto:hwennborg at google.com] On Behalf Of Hans Wennborg
Sent: Monday, February 19, 2018 5:11 AM
To: cfe-commits <cfe-commits at lists.llvm.org>; Ammarguellat, Zahira <zahira.ammarguellat at intel.com>
Subject: Re: r324991 - Fix for PR32992. Static const classes not exported.
Reduced repro:
$ clang -cc1 -triple i386-pc-windows-msvc19.11.0 -emit-pch -fms-extensions -fms-compatibility -fms-compatibility-version=19.11
-std=c++14 -fdelayed-template-parsing -x c++-header a.ii -o /dev/null
a.ii:
namespace a {
enum b { c };
}
template <typename> class d { static constexpr a::b e = a::c; }; namespace f { template <typename g = int> class h : d<g> {}; } using f::h; class __declspec(dllexport) i : h<> {};
On Wed, Feb 14, 2018 at 4:22 PM, Hans Wennborg <hans at chromium.org<mailto:hans at chromium.org>> wrote:
> I ended up having to revert this in r325133 as it broke the Chromium
> build. Please see
> https://bugs.chromium.org/p/chromium/issues/detail?id=812231#c1 for a
> reproducer.
>
> On Tue, Feb 13, 2018 at 10:19 AM, Hans Wennborg via cfe-commits
> <cfe-commits at lists.llvm.org<mailto:cfe-commits at lists.llvm.org>> wrote:
>> Author: hans
>> Date: Tue Feb 13 01:19:43 2018
>> New Revision: 324991
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=324991&view=rev
>> Log:
>> Fix for PR32992. Static const classes not exported.
>>
>> Patch by zahiraam!
>>
>> Differential Revision: https://reviews.llvm.org/D42968
>>
>> Modified:
>> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>> cfe/trunk/test/CodeGenCXX/dllexport.cpp
>>
>> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cp
>> p?rev=324991&r1=324990&r2=324991&view=diff
>> =====================================================================
>> =========
>> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Tue Feb 13 01:19:43 2018
>> @@ -5476,7 +5476,7 @@ static void CheckAbstractClassUsage(Abst
>> }
>> }
>>
>> -static void ReferenceDllExportedMethods(Sema &S, CXXRecordDecl
>> *Class) {
>> +static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl
>> +*Class) {
>> Attr *ClassAttr = getDLLAttr(Class);
>> if (!ClassAttr)
>> return;
>> @@ -5491,6 +5491,16 @@ static void ReferenceDllExportedMethods(
>> return;
>>
>> for (Decl *Member : Class->decls()) {
>> + // Defined static variables that are members of an exported base
>> + // class must be marked export too. Push them to implicit instantiation
>> + // queue.
>> + auto *VD = dyn_cast<VarDecl>(Member);
>> + if (VD && Member->getAttr<DLLExportAttr>() &&
>> + VD->getStorageClass() == SC_Static &&
>> + TSK == TSK_ImplicitInstantiation)
>> + S.PendingLocalImplicitInstantiations.push_back(
>> + std::make_pair(VD, VD->getLocation()));
>> +
>> auto *MD = dyn_cast<CXXMethodDecl>(Member);
>> if (!MD)
>> continue;
>> @@ -10902,12 +10912,12 @@ void Sema::ActOnFinishCXXNonNestedClass(
>>
>> void Sema::referenceDLLExportedClassMethods() {
>> if (!DelayedDllExportClasses.empty()) {
>> - // Calling ReferenceDllExportedMethods might cause the current function to
>> + // Calling ReferenceDllExportedMembers might cause the current
>> + function to
>> // be called again, so use a local copy of DelayedDllExportClasses.
>> SmallVector<CXXRecordDecl *, 4> WorkList;
>> std::swap(DelayedDllExportClasses, WorkList);
>> for (CXXRecordDecl *Class : WorkList)
>> - ReferenceDllExportedMethods(*this, Class);
>> + ReferenceDllExportedMembers(*this, Class);
>> }
>> }
>>
>>
>> Modified: cfe/trunk/test/CodeGenCXX/dllexport.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllexpo
>> rt.cpp?rev=324991&r1=324990&r2=324991&view=diff
>> =====================================================================
>> =========
>> --- cfe/trunk/test/CodeGenCXX/dllexport.cpp (original)
>> +++ cfe/trunk/test/CodeGenCXX/dllexport.cpp Tue Feb 13 01:19:43 2018
>> @@ -28,6 +28,7 @@ struct External { int v; };
>>
>> // The vftable for struct W is comdat largest because we have RTTI.
>> // M32-DAG: $"\01??_7W@@6B@" = comdat largest
>> +// M32-DAG: $"\01?smember@?$Base at H@PR32992@@0HA" = comdat any
>>
>>
>>
>> //===----------------------------------------------------------------
>> ------===// @@ -977,3 +978,21 @@ class __declspec(dllexport)
>> ACE_Service_ // MSVC2015-DAG: define weak_odr dllexport
>> {{.+}}ACE_Service_Object@@Q{{.+}}@$$Q
>> // The declarations should not be exported.
>> // MSVC2013-NOT: define weak_odr dllexport
>> {{.+}}ACE_Service_Object@@Q{{.+}}@$$Q
>> +
>> +namespace PR32992 {
>> +// Static data members of a instantiated base class should be exported.
>> +template <class T>
>> +class Base {
>> + virtual void myfunc() {}
>> + static int smember;
>> +};
>> +// MS-DAG: @"\01?smember@?$Base at H@PR32992@@0HA" = weak_odr
>> +dllexport global i32 77, comdat, align 4 template <class T> int
>> +Base<T>::smember = 77; template <class T> class
>> +__declspec(dllexport) Derived2 : Base<T> {
>> + void myfunc() {}
>> +};
>> +class Derived : public Derived2<int> {
>> + void myfunc() {}
>> +};
>> +} // namespace PR32992
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org<mailto:cfe-commits at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180219/40243311/attachment-0001.html>
More information about the cfe-commits
mailing list