diff options
| author | Martin Storsjo <martin@martin.st> | 2017-08-31 09:46:27 +0000 |
|---|---|---|
| committer | Martin Storsjo <martin@martin.st> | 2017-08-31 09:46:27 +0000 |
| commit | 7bfb69725942b366756deb12d4559fd02b403032 (patch) | |
| tree | 7a9fda99cd7461bd693c37f2bcddff8deafb493c | |
| parent | 5f9346471c97ad4c8fa3535c7bf4ced92530799a (diff) | |
| download | bcm5719-llvm-7bfb69725942b366756deb12d4559fd02b403032.tar.gz bcm5719-llvm-7bfb69725942b366756deb12d4559fd02b403032.zip | |
Revert r312224: "[ItaniumCXXABI] Always use linkonce_odr linkage for RTTI data on MinGW"
Breaks on buildbot:
http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/4548/steps/test-check-all/logs/stdio
The test in CodeGenCXX/virt-dtor-key.cpp tests using %itanium_abi_triple;
on non-windows platforms, this resolves to the current platform triple
(where there was no behaviour change), while on windows, it resolves to
a mingw triple (where the behaviour was intentionally changed).
llvm-svn: 312229
| -rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 16 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/rtti-mingw64.cpp | 5 |
2 files changed, 9 insertions, 12 deletions
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index e07dbdd3abd..d78c032cec8 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -2998,13 +2998,15 @@ static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM, if (RD->hasAttr<DLLImportAttr>() && ShouldUseExternalRTTIDescriptor(CGM, Ty)) return llvm::GlobalValue::ExternalLinkage; - // MinGW always uses LinkOnceODRLinkage for type info. - if (RD->isDynamicClass() && - !CGM.getContext() - .getTargetInfo() - .getTriple() - .isWindowsGNUEnvironment()) - return CGM.getVTableLinkage(RD); + if (RD->isDynamicClass()) { + llvm::GlobalValue::LinkageTypes LT = CGM.getVTableLinkage(RD); + // MinGW won't export the RTTI information when there is a key function. + // Make sure we emit our own copy instead of attempting to dllimport it. + if (RD->hasAttr<DLLImportAttr>() && + llvm::GlobalValue::isAvailableExternallyLinkage(LT)) + LT = llvm::GlobalValue::LinkOnceODRLinkage; + return LT; + } } return llvm::GlobalValue::LinkOnceODRLinkage; diff --git a/clang/test/CodeGenCXX/rtti-mingw64.cpp b/clang/test/CodeGenCXX/rtti-mingw64.cpp index 9f3e03961e8..818b11b64bc 100644 --- a/clang/test/CodeGenCXX/rtti-mingw64.cpp +++ b/clang/test/CodeGenCXX/rtti-mingw64.cpp @@ -2,12 +2,7 @@ struct A { int a; }; struct B : virtual A { int b; }; B b; -class C { - virtual ~C(); -}; -C::~C() {} -// CHECK: @_ZTI1C = linkonce_odr // CHECK: @_ZTI1B = linkonce_odr constant { i8*, i8*, i32, i32, i8*, i64 } // CHECK-SAME: i8* bitcast (i8** getelementptr inbounds (i8*, i8** @_ZTVN10__cxxabiv121__vmi_class_type_infoE, i64 2) to i8*), // CHECK-SAME: i8* getelementptr inbounds ([3 x i8], [3 x i8]* @_ZTS1B, i32 0, i32 0), |

