r324059 - [MinGW] Emit typeinfo locally for dllimported classes without key functions

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 5 02:01:03 PST 2018


Merged to 6.0 in r324219.

On Fri, Feb 2, 2018 at 7:22 AM, Martin Storsjo via cfe-commits
<cfe-commits at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list