1 // RUN: %clang_cc1 -flto -flto-unit -triple x86_64-unknown-linux -emit-llvm -fvirtual-function-elimination -fwhole-program-vtables -o - %s | FileCheck %s 2 3 4 // Anonymous namespace. 5 namespace { 6 // CHECK: @_ZTVN12_GLOBAL__N_11AE = {{.*}} !vcall_visibility [[VIS_TU:![0-9]+]] 7 struct A { 8 A() {} 9 virtual int f() { return 1; } 10 }; 11 } 12 void *construct_A() { 13 return new A(); 14 } 15 16 17 // Hidden visibility. 18 // CHECK: @_ZTV1B = {{.*}} !vcall_visibility [[VIS_DSO:![0-9]+]] 19 struct __attribute__((visibility("hidden"))) B { 20 B() {} 21 virtual int f() { return 1; } 22 }; 23 B *construct_B() { 24 return new B(); 25 } 26 27 28 // Default visibility. 29 // CHECK-NOT: @_ZTV1C = {{.*}} !vcall_visibility 30 struct __attribute__((visibility("default"))) C { 31 C() {} 32 virtual int f() { return 1; } 33 }; 34 C *construct_C() { 35 return new C(); 36 } 37 38 39 // Hidden visibility, public LTO visibility. 40 // CHECK-NOT: @_ZTV1D = {{.*}} !vcall_visibility 41 struct __attribute__((visibility("hidden"))) [[clang::lto_visibility_public]] D { 42 D() {} 43 virtual int f() { return 1; } 44 }; 45 D *construct_D() { 46 return new D(); 47 } 48 49 50 // Hidden visibility, but inherits from class with default visibility. 51 // CHECK-NOT: @_ZTV1E = {{.*}} !vcall_visibility 52 struct __attribute__((visibility("hidden"))) E : C { 53 E() {} 54 virtual int f() { return 1; } 55 }; 56 E *construct_E() { 57 return new E(); 58 } 59 60 61 // Anonymous namespace, but inherits from class with default visibility. 62 // CHECK-NOT: @_ZTVN12_GLOBAL__N_11FE = {{.*}} !vcall_visibility 63 namespace { 64 struct __attribute__((visibility("hidden"))) F : C { 65 F() {} 66 virtual int f() { return 1; } 67 }; 68 } 69 void *construct_F() { 70 return new F(); 71 } 72 73 74 // Anonymous namespace, but inherits from class with hidden visibility. 75 // CHECK: @_ZTVN12_GLOBAL__N_11GE = {{.*}} !vcall_visibility [[VIS_DSO:![0-9]+]] 76 namespace { 77 struct __attribute__((visibility("hidden"))) G : B { 78 G() {} 79 virtual int f() { return 1; } 80 }; 81 } 82 void *construct_G() { 83 return new G(); 84 } 85 86 87 // CHECK-DAG: [[VIS_DSO]] = !{i64 1} 88 // CHECK-DAG: [[VIS_TU]] = !{i64 2} 89