Index: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp =================================================================== --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp @@ -2998,15 +2998,13 @@ if (RD->hasAttr() && ShouldUseExternalRTTIDescriptor(CGM, Ty)) return llvm::GlobalValue::ExternalLinkage; - 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() && - llvm::GlobalValue::isAvailableExternallyLinkage(LT)) - LT = llvm::GlobalValue::LinkOnceODRLinkage; - return LT; - } + // MinGW always uses LinkOnceODRLinkage for type info. + if (RD->isDynamicClass() && + !CGM.getContext() + .getTargetInfo() + .getTriple() + .isWindowsGNUEnvironment()) + return CGM.getVTableLinkage(RD); } return llvm::GlobalValue::LinkOnceODRLinkage; Index: cfe/trunk/test/CodeGenCXX/rtti-mingw64.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/rtti-mingw64.cpp +++ cfe/trunk/test/CodeGenCXX/rtti-mingw64.cpp @@ -2,7 +2,12 @@ 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), Index: cfe/trunk/test/CodeGenCXX/virt-dtor-key.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/virt-dtor-key.cpp +++ cfe/trunk/test/CodeGenCXX/virt-dtor-key.cpp @@ -1,5 +1,7 @@ -// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple i386-linux -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple i386-windows-gnu -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-MINGW // CHECK: @_ZTI3foo = constant +// CHECK-MINGW: @_ZTI3foo = linkonce_odr class foo { foo(); virtual ~foo();