mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-31 20:44:18 +00:00
[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 llvm-svn: 324059
This commit is contained in:
parent
53489ada12
commit
3b528944ef
@ -2761,6 +2761,11 @@ static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
|
||||
// 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
|
||||
|
20
clang/test/CodeGenCXX/dllimport-missing-key.cpp
Normal file
20
clang/test/CodeGenCXX/dllimport-missing-key.cpp
Normal file
@ -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
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user