Merged to 6.0 in r324219.
On Fri, Feb 2, 2018 at 7:22 AM, Martin Storsjo via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: mstorsjo > Date: Thu Feb 1 22:22:35 2018 > New Revision: 324059 > > URL: http://llvm.org/viewvc/llvm-project?rev=324059&view=rev > Log: > [MinGW] Emit typeinfo locally for dllimported classes without key functions > > This fixes building Qt as shared libraries with clang in MinGW > mode; previously subclasses of the QObjectData class (in other > DLLs than the base DLL) failed to find the typeinfo symbols > (that neither were emitted in the base DLL nor in the DLL > containing the subclass). > > If the virtual destructor in the newly added testcase wouldn't > be pure (or if there'd be another non-pure virtual method), > it'd be a key function and things would work out even before this > change. Make sure to locally emit the typeinfo for these classes > as well. > > This matches what GCC does in this specific testcase. > > This fixes the root issue that spawned PR35146. (The difference > to GCC that is initially described in that bug still is present > though.) > > Differential Revision: https://reviews.llvm.org/D42641 > > Added: > cfe/trunk/test/CodeGenCXX/dllimport-missing-key.cpp > Modified: > cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp > cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp > > Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=324059&r1=324058&r2=324059&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original) > +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Thu Feb 1 22:22:35 2018 > @@ -2761,6 +2761,11 @@ static bool ShouldUseExternalRTTIDescrip > // N.B. We must always emit the RTTI data ourselves if there exists a key > // function. > bool IsDLLImport = RD->hasAttr<DLLImportAttr>(); > + > + // Don't import the RTTI but emit it locally. > + if (CGM.getTriple().isWindowsGNUEnvironment() && IsDLLImport) > + return false; > + > if (CGM.getVTables().isVTableExternal(RD)) > return IsDLLImport && !CGM.getTriple().isWindowsItaniumEnvironment() > ? false > > Added: cfe/trunk/test/CodeGenCXX/dllimport-missing-key.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport-missing-key.cpp?rev=324059&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/dllimport-missing-key.cpp (added) > +++ cfe/trunk/test/CodeGenCXX/dllimport-missing-key.cpp Thu Feb 1 22:22:35 > 2018 > @@ -0,0 +1,20 @@ > +// RUN: %clang_cc1 -triple i686-windows-gnu -emit-llvm -std=c++1y -O0 -o - > %s -w | FileCheck --check-prefix=GNU %s > + > +class __declspec(dllimport) QObjectData { > +public: > + virtual ~QObjectData() = 0; > + void *ptr; > + > + int method() const; > +}; > + > +class LocalClass : public QObjectData { > +}; > + > +void call() { > + (new LocalClass())->method(); > +} > + > +// GNU-DAG: @_ZTV11QObjectData = available_externally dllimport > +// GNU-DAG: @_ZTS11QObjectData = linkonce_odr > +// GNU-DAG: @_ZTI11QObjectData = linkonce_odr > > Modified: cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp?rev=324059&r1=324058&r2=324059&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp Thu Feb 1 22:22:35 2018 > @@ -12,7 +12,7 @@ struct __declspec(dllimport) S { > // MSVC-DAG: @"\01??_R3S@@8" = linkonce_odr > > // GNU-DAG: @_ZTV1S = available_externally dllimport > -// GNU-DAG: @_ZTI1S = external dllimport > +// GNU-DAG: @_ZTI1S = linkonce_odr > > struct U : S { > } u; > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits