Author: hans Date: Wed Feb 10 16:18:37 2016 New Revision: 260449 URL: http://llvm.org/viewvc/llvm-project?rev=260449&view=rev Log: Revert r260388 "[MS ABI] Never reference dllimport'd vtables"
This caused the compiler to fail with "invalid linkage type for global declaration" (PR26569). Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp cfe/trunk/lib/AST/VTableBuilder.cpp cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp cfe/trunk/test/CodeGenCXX/dllimport.cpp cfe/trunk/test/CodeGenCXX/microsoft-abi-vftables.cpp Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=260449&r1=260448&r2=260449&view=diff ============================================================================== --- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original) +++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Wed Feb 10 16:18:37 2016 @@ -2599,10 +2599,7 @@ void MicrosoftMangleContextImpl::mangleC // NOTE: <cvr-qualifiers> here is always 'B' (const). <storage-class> // is always '6' for vftables. MicrosoftCXXNameMangler Mangler(*this, Out); - if (Derived->hasAttr<DLLImportAttr>()) - Mangler.getStream() << "\01??_S"; - else - Mangler.getStream() << "\01??_7"; + Mangler.getStream() << "\01??_7"; Mangler.mangleName(Derived); Mangler.getStream() << "6B"; // '6' for vftable, 'B' for const. for (const CXXRecordDecl *RD : BasePath) Modified: cfe/trunk/lib/AST/VTableBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/VTableBuilder.cpp?rev=260449&r1=260448&r2=260449&view=diff ============================================================================== --- cfe/trunk/lib/AST/VTableBuilder.cpp (original) +++ cfe/trunk/lib/AST/VTableBuilder.cpp Wed Feb 10 16:18:37 2016 @@ -2548,6 +2548,7 @@ public: // Only include the RTTI component if we know that we will provide a // definition of the vftable. HasRTTIComponent = Context.getLangOpts().RTTIData && + !MostDerivedClass->hasAttr<DLLImportAttr>() && MostDerivedClass->getTemplateSpecializationKind() != TSK_ExplicitInstantiationDeclaration; Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp?rev=260449&r1=260448&r2=260449&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original) +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Wed Feb 10 16:18:37 2016 @@ -1673,16 +1673,7 @@ llvm::GlobalVariable *MicrosoftCXXABI::g SmallString<256> VFTableName; mangleVFTableName(getMangleContext(), RD, VFPtr, VFTableName); - // Classes marked __declspec(dllimport) need vftables generated on the - // import-side in order to support features like constexpr. No other - // translation unit relies on the emission of the local vftable, translation - // units are expected to generate them as needed. - // - // Because of this unique behavior, we maintain this logic here instead of - // getVTableLinkage. - llvm::GlobalValue::LinkageTypes VFTableLinkage = - RD->hasAttr<DLLImportAttr>() ? llvm::GlobalValue::LinkOnceODRLinkage - : CGM.getVTableLinkage(RD); + llvm::GlobalValue::LinkageTypes VFTableLinkage = CGM.getVTableLinkage(RD); bool VFTableComesFromAnotherTU = llvm::GlobalValue::isAvailableExternallyLinkage(VFTableLinkage) || llvm::GlobalValue::isExternalLinkage(VFTableLinkage); @@ -1755,7 +1746,9 @@ llvm::GlobalVariable *MicrosoftCXXABI::g if (C) VTable->setComdat(C); - if (RD->hasAttr<DLLExportAttr>()) + if (RD->hasAttr<DLLImportAttr>()) + VFTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); + else if (RD->hasAttr<DLLExportAttr>()) VFTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); VFTablesMap[ID] = VFTable; Modified: cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp?rev=260449&r1=260448&r2=260449&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp (original) +++ cfe/trunk/test/CodeGenCXX/dllimport-rtti.cpp Wed Feb 10 16:18:37 2016 @@ -4,8 +4,7 @@ struct __declspec(dllimport) S { virtual void f() {} } s; -// MSVC: [[VF_S:.*]] = private unnamed_addr constant [2 x i8*] -// MSVC-DAG: @"\01??_SS@@6B@" = unnamed_addr alias i8*, getelementptr inbounds ([2 x i8*], [2 x i8*]* [[VF_S]], i32 0, i32 1) +// MSVC-DAG: @"\01??_7S@@6B@" = available_externally dllimport // MSVC-DAG: @"\01??_R0?AUS@@@8" = linkonce_odr // MSVC-DAG: @"\01??_R1A@?0A@EA@S@@8" = linkonce_odr // MSVC-DAG: @"\01??_R2S@@8" = linkonce_odr Modified: cfe/trunk/test/CodeGenCXX/dllimport.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dllimport.cpp?rev=260449&r1=260448&r2=260449&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/dllimport.cpp (original) +++ cfe/trunk/test/CodeGenCXX/dllimport.cpp Wed Feb 10 16:18:37 2016 @@ -614,7 +614,7 @@ USEMEMFUNC(V, foo) struct __declspec(dllimport) W { virtual void foo() {} }; USECLASS(W) // vftable: -// MO1-DAG: @"\01??_SW@@6B@" = linkonce_odr unnamed_addr constant [1 x i8*] [i8* bitcast (void (%struct.W*)* @"\01?foo@W@@UAEXXZ" to i8*)] +// MO1-DAG: @"\01??_7W@@6B@" = available_externally dllimport unnamed_addr constant [1 x i8*] [i8* bitcast (void (%struct.W*)* @"\01?foo@W@@UAEXXZ" to i8*)] // GO1-DAG: @_ZTV1W = available_externally dllimport unnamed_addr constant [3 x i8*] [i8* null, i8* null, i8* bitcast (void (%struct.W*)* @_ZN1W3fooEv to i8*)] struct __declspec(dllimport) KeyFuncClass { 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=260449&r1=260448&r2=260449&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/microsoft-abi-vftables.cpp (original) +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-vftables.cpp Wed Feb 10 16:18:37 2016 @@ -4,6 +4,8 @@ // RTTI-DAG: $"\01??_7S@@6B@" = comdat largest // RTTI-DAG: $"\01??_7V@@6B@" = comdat largest +// RTTI-NOT: @"\01??_R4U@@6B@" + struct S { virtual ~S(); } s; @@ -17,10 +19,9 @@ struct __declspec(dllimport) U { virtual ~U(); } u; -// RTTI-DAG: [[VTABLE_U:@.*]] = private unnamed_addr constant [2 x i8*] [i8* bitcast ({{.*}} @"\01??_R4U@@6B@" to i8*), i8* bitcast ({{.*}} @"\01??_GU@@UAEPAXI@Z" to i8*)] -// RTTI-DAG: @"\01??_SU@@6B@" = unnamed_addr alias i8*, getelementptr inbounds ([2 x i8*], [2 x i8*]* [[VTABLE_U]], i32 0, i32 1) +// RTTI-DAG: @"\01??_7U@@6B@" = available_externally dllimport unnamed_addr constant [1 x i8*] [i8* bitcast ({{.*}} @"\01??_GU@@UAEPAXI@Z" to i8*)] -// NO-RTTI-DAG: @"\01??_SU@@6B@" = linkonce_odr unnamed_addr constant [1 x i8*] [i8* bitcast ({{.*}} @"\01??_GU@@UAEPAXI@Z" to i8*)] +// NO-RTTI-DAG: @"\01??_7U@@6B@" = available_externally dllimport unnamed_addr constant [1 x i8*] [i8* bitcast ({{.*}} @"\01??_GU@@UAEPAXI@Z" to i8*)] struct __declspec(dllexport) V { virtual ~V(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits