Author: rnk Date: Tue Jun 21 14:51:52 2016 New Revision: 273305 URL: http://llvm.org/viewvc/llvm-project?rev=273305&view=rev Log: Revert "[MS] Don't expect vftables to be provided for extern template instantiations"
This reverts commit r273296, it broke the Windows self-host. Modified: cfe/trunk/lib/AST/VTableBuilder.cpp cfe/trunk/lib/CodeGen/CGVTables.cpp cfe/trunk/test/CodeGenCXX/microsoft-abi-vbtables.cpp cfe/trunk/test/CodeGenCXX/microsoft-abi-vftables.cpp Modified: cfe/trunk/lib/AST/VTableBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/VTableBuilder.cpp?rev=273305&r1=273304&r2=273305&view=diff ============================================================================== --- cfe/trunk/lib/AST/VTableBuilder.cpp (original) +++ cfe/trunk/lib/AST/VTableBuilder.cpp Tue Jun 21 14:51:52 2016 @@ -2545,13 +2545,14 @@ public: MostDerivedClassLayout(Context.getASTRecordLayout(MostDerivedClass)), WhichVFPtr(*Which), Overriders(MostDerivedClass, CharUnits(), MostDerivedClass) { - // Provide the RTTI component if RTTIData is enabled. If the vftable would - // be available externally, we should not provide the RTTI componenent. It - // is currently impossible to get available externally vftables with either - // dllimport or extern template instantiations, but eventually we may add a - // flag to support additional devirtualization that needs this. + // Only include the RTTI component if we know that we will provide a + // definition of the vftable. We always provide the definition of + // dllimported classes. if (Context.getLangOpts().RTTIData) - HasRTTIComponent = true; + if (MostDerivedClass->hasAttr<DLLImportAttr>() || + MostDerivedClass->getTemplateSpecializationKind() != + TSK_ExplicitInstantiationDeclaration) + HasRTTIComponent = true; LayoutVFTable(); Modified: cfe/trunk/lib/CodeGen/CGVTables.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVTables.cpp?rev=273305&r1=273304&r2=273305&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGVTables.cpp (original) +++ cfe/trunk/lib/CodeGen/CGVTables.cpp Tue Jun 21 14:51:52 2016 @@ -794,10 +794,6 @@ CodeGenModule::getVTableLinkage(const CX return DiscardableODRLinkage; case TSK_ExplicitInstantiationDeclaration: - // Explicit instantiations in MSVC do not provide vtables, so we must emit - // our own. - if (getTarget().getCXXABI().isMicrosoft()) - return DiscardableODRLinkage; return shouldEmitAvailableExternallyVTable(*this, RD) ? llvm::GlobalVariable::AvailableExternallyLinkage : llvm::GlobalVariable::ExternalLinkage; @@ -843,9 +839,9 @@ CodeGenVTables::GenerateClassData(const bool CodeGenVTables::isVTableExternal(const CXXRecordDecl *RD) { assert(RD->isDynamicClass() && "Non-dynamic classes have no VTable."); - // We always synthesize vtables if they are needed in the MS ABI. MSVC doesn't - // emit them even if there is an explicit template instantiation. - if (CGM.getTarget().getCXXABI().isMicrosoft()) + // We always synthesize vtables on the import side regardless of whether or + // not it is an explicit instantiation declaration. + if (CGM.getTarget().getCXXABI().isMicrosoft() && RD->hasAttr<DLLImportAttr>()) return false; // If we have an explicit instantiation declaration (and not a Modified: cfe/trunk/test/CodeGenCXX/microsoft-abi-vbtables.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-vbtables.cpp?rev=273305&r1=273304&r2=273305&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/microsoft-abi-vbtables.cpp (original) +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-vbtables.cpp Tue Jun 21 14:51:52 2016 @@ -537,5 +537,5 @@ template <class> struct B : virtual A { extern template class B<int>; template B<int>::B(); -// CHECK-DAG: @"\01??_8?$B@H@Test30@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 4], comdat +// CHECK-DAG: @"\01??_8?$B@H@Test30@@7B@" = external unnamed_addr constant [2 x i32]{{$}} } Modified: cfe/trunk/test/CodeGenCXX/microsoft-abi-vftables.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-vftables.cpp?rev=273305&r1=273304&r2=273305&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/microsoft-abi-vftables.cpp (original) +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-vftables.cpp Tue Jun 21 14:51:52 2016 @@ -33,7 +33,7 @@ struct __declspec(dllexport) V { namespace { struct W { - virtual ~W() {} + virtual ~W(); } w; } // RTTI-DAG: [[VTABLE_W:@.*]] = private unnamed_addr constant [2 x i8*] [i8* bitcast ({{.*}} @"\01??_R4W@?A@@6B@" to i8*), i8* bitcast ({{.*}} @"\01??_GW@?A@@UAEPAXI@Z" to i8*)] @@ -49,7 +49,5 @@ template <class> struct Y : virtual X { extern template class Y<int>; template Y<int>::Y(); -// RTTI-DAG: [[VTABLE_Y:@.*]] = private unnamed_addr constant [2 x i8*] [i8* bitcast (%rtti.CompleteObjectLocator* @"\01??_R4?$Y@H@@6B@" to i8*), i8* bitcast (i8* (%struct.Y*, i32)* @"\01??_G?$Y@H@@UAEPAXI@Z" to i8*)], comdat($"\01??_7?$Y@H@@6B@") -// RTTI-DAG: @"\01??_7?$Y@H@@6B@" = unnamed_addr alias i8*, getelementptr inbounds ([2 x i8*], [2 x i8*]* [[VTABLE_Y]], i32 0, i32 1) - -// NO-RTTI-DAG: @"\01??_7?$Y@H@@6B@" = linkonce_odr unnamed_addr constant [1 x i8*] [i8* bitcast (i8* (%struct.Y*, i32)* @"\01??_G?$Y@H@@UAEPAXI@Z" to i8*)], comdat +// RTTI-DAG: @"\01??_7?$Y@H@@6B@" = external unnamed_addr constant [1 x i8*] +// NO-RTTI-DAG: @"\01??_7?$Y@H@@6B@" = external unnamed_addr constant [1 x i8*] _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits