phosek created this revision. phosek added a reviewer: rsmith. Herald added a project: clang. Herald added a subscriber: cfe-commits.
We must only set the construction vtable visibility after we create the vtable initializer, otherwise the global value will be treated as declaration rather than definition and the visibility won't be set. Repository: rC Clang https://reviews.llvm.org/D58010 Files: clang/lib/CodeGen/CGVTables.cpp clang/test/CodeGen/construction-vtable-visibility.cpp Index: clang/test/CodeGen/construction-vtable-visibility.cpp =================================================================== --- /dev/null +++ clang/test/CodeGen/construction-vtable-visibility.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -triple x86_64-linux-unknown -fvisibility hidden -emit-llvm %s -o - | FileCheck %s + +struct Base {}; + +class Parent1 : virtual public Base {}; + +class Parent2 : virtual public Base {}; + +class Child : public Parent1, public Parent2 {}; + +void test() { + Child x; +} + +// CHECK: @_ZTC5Child0_7Parent1 = linkonce_odr hidden unnamed_addr constant +// CHECK: @_ZTC5Child8_7Parent2 = linkonce_odr hidden unnamed_addr constant Index: clang/lib/CodeGen/CGVTables.cpp =================================================================== --- clang/lib/CodeGen/CGVTables.cpp +++ clang/lib/CodeGen/CGVTables.cpp @@ -761,7 +761,6 @@ // Create the variable that will hold the construction vtable. llvm::GlobalVariable *VTable = CGM.CreateOrReplaceCXXRuntimeVariable(Name, VTType, Linkage, Align); - CGM.setGVProperties(VTable, RD); // V-tables are always unnamed_addr. VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); @@ -775,6 +774,8 @@ createVTableInitializer(components, *VTLayout, RTTI); components.finishAndSetAsInitializer(VTable); + CGM.setGVProperties(VTable, RD); + CGM.EmitVTableTypeMetadata(VTable, *VTLayout.get()); return VTable;
Index: clang/test/CodeGen/construction-vtable-visibility.cpp =================================================================== --- /dev/null +++ clang/test/CodeGen/construction-vtable-visibility.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -triple x86_64-linux-unknown -fvisibility hidden -emit-llvm %s -o - | FileCheck %s + +struct Base {}; + +class Parent1 : virtual public Base {}; + +class Parent2 : virtual public Base {}; + +class Child : public Parent1, public Parent2 {}; + +void test() { + Child x; +} + +// CHECK: @_ZTC5Child0_7Parent1 = linkonce_odr hidden unnamed_addr constant +// CHECK: @_ZTC5Child8_7Parent2 = linkonce_odr hidden unnamed_addr constant Index: clang/lib/CodeGen/CGVTables.cpp =================================================================== --- clang/lib/CodeGen/CGVTables.cpp +++ clang/lib/CodeGen/CGVTables.cpp @@ -761,7 +761,6 @@ // Create the variable that will hold the construction vtable. llvm::GlobalVariable *VTable = CGM.CreateOrReplaceCXXRuntimeVariable(Name, VTType, Linkage, Align); - CGM.setGVProperties(VTable, RD); // V-tables are always unnamed_addr. VTable->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); @@ -775,6 +774,8 @@ createVTableInitializer(components, *VTLayout, RTTI); components.finishAndSetAsInitializer(VTable); + CGM.setGVProperties(VTable, RD); + CGM.EmitVTableTypeMetadata(VTable, *VTLayout.get()); return VTable;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits