1 // REQUIRES: x86-registered-target 2 // RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \ 3 // RUN: -interface-stub-version=experimental-tapi-elf-v1 \ 4 // RUN: -DPARENT_CLASS_VISIBILITY="" -DCHILD_CLASS_VISIBILITY="" \ 5 // RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \ 6 // RUN: FileCheck -check-prefix=CHECK-X %s 7 // RUN: %clang -target x86_64-unknown-linux-gnu -o - -c \ 8 // RUN: -DPARENT_CLASS_VISIBILITY="" -DCHILD_CLASS_VISIBILITY="" \ 9 // RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \ 10 // RUN: llvm-readelf -s - 2>&1 | \ 11 // RUN: FileCheck -check-prefix=CHECK-X-RE %s 12 13 // RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \ 14 // RUN: -interface-stub-version=experimental-tapi-elf-v1 \ 15 // RUN: -DPARENT_CLASS_VISIBILITY=HIDDEN -DCHILD_CLASS_VISIBILITY="" \ 16 // RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \ 17 // RUN: FileCheck -check-prefix=CHECK-HP %s 18 // RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \ 19 // RUN: -interface-stub-version=experimental-tapi-elf-v1 \ 20 // RUN: -DPARENT_CLASS_VISIBILITY=HIDDEN -DCHILD_CLASS_VISIBILITY="" \ 21 // RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \ 22 // RUN: FileCheck -check-prefix=CHECK-HP2 %s 23 // RUN: %clang -target x86_64-unknown-linux-gnu -o - -c \ 24 // RUN: -DPARENT_CLASS_VISIBILITY=HIDDEN -DCHILD_CLASS_VISIBILITY="" \ 25 // RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \ 26 // RUN: llvm-readelf -s - 2>&1 | \ 27 // RUN: FileCheck -check-prefix=CHECK-HP-RE %s 28 29 // RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \ 30 // RUN: -interface-stub-version=experimental-tapi-elf-v1 \ 31 // RUN: -DPARENT_CLASS_VISIBILITY="" -DCHILD_CLASS_VISIBILITY=HIDDEN \ 32 // RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \ 33 // RUN: FileCheck -check-prefix=CHECK-HC %s 34 // RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \ 35 // RUN: -interface-stub-version=experimental-tapi-elf-v1 \ 36 // RUN: -DPARENT_CLASS_VISIBILITY="" -DCHILD_CLASS_VISIBILITY=HIDDEN \ 37 // RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \ 38 // RUN: FileCheck -check-prefix=CHECK-HC2 %s 39 // RUN: %clang -target x86_64-unknown-linux-gnu -o - -c \ 40 // RUN: -DPARENT_CLASS_VISIBILITY="" -DCHILD_CLASS_VISIBILITY=HIDDEN \ 41 // RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \ 42 // RUN: llvm-readelf -s - 2>&1 | \ 43 // RUN: FileCheck -check-prefix=CHECK-HC-RE %s 44 45 // RUN: %clang -target x86_64-unknown-linux-gnu -o - -emit-interface-stubs \ 46 // RUN: -interface-stub-version=experimental-tapi-elf-v1 \ 47 // RUN: -DPARENT_CLASS_VISIBILITY=HIDDEN -DCHILD_CLASS_VISIBILITY=HIDDEN \ 48 // RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \ 49 // RUN: FileCheck -check-prefix=CHECK-HP-HC %s 50 // RUN: %clang -target x86_64-unknown-linux-gnu -o - -c \ 51 // RUN: -DPARENT_CLASS_VISIBILITY=HIDDEN -DCHILD_CLASS_VISIBILITY=HIDDEN \ 52 // RUN: -DPARENT_METHOD_VISIBILITY="" -DCHILD_METHOD_VISIBILITY="" %s | \ 53 // RUN: llvm-readelf -s - 2>&1 | \ 54 // RUN: FileCheck -check-prefix=CHECK-HP-HC-RE %s 55 56 // CHECK-X-DAG: _ZN1CC2Ev 57 // CHECK-X-DAG: _ZN1CD0Ev 58 // CHECK-X-DAG: _ZN1CD2Ev 59 // CHECK-X-DAG: _ZN1SC2Ev 60 // CHECK-X-DAG: _ZN1SD0Ev 61 // CHECK-X-DAG: _ZN1SD2Ev 62 // CHECK-X-DAG: _ZN1C1mEv 63 // CHECK-X-DAG: _ZN1S1nEv 64 65 // CHECK-X-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1C1mEv 66 // CHECK-X-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1CC2Ev 67 // CHECK-X-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1CD0Ev 68 // CHECK-X-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1CD2Ev 69 // CHECK-X-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1S1nEv 70 // CHECK-X-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1SC2Ev 71 // CHECK-X-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1SD0Ev 72 // CHECK-X-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1SD2Ev 73 74 // CHECK-HP2-DAG: _ZN1CC2Ev 75 // CHECK-HP2-DAG: _ZN1CD0Ev 76 // CHECK-HP2-DAG: _ZN1CD2Ev 77 // CHECK-HP2-DAG: _ZN1C1mEv 78 79 // CHECK-HP-NOT: _ZN1S1nEv 80 // CHECK-HP-NOT: _ZN1SC2Ev 81 // CHECK-HP-NOT: _ZN1SD0Ev 82 // CHECK-HP-NOT: _ZN1SD2Ev 83 84 // CHECK-HP-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1C1mEv 85 // CHECK-HP-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1CC2Ev 86 // CHECK-HP-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1CD0Ev 87 // CHECK-HP-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1CD2Ev 88 // CHECK-HP-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1S1nEv 89 // CHECK-HP-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1SC2Ev 90 // CHECK-HP-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1SD0Ev 91 // CHECK-HP-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1SD2Ev 92 93 // CHECK-HC2-DAG: _ZN1SC2Ev 94 // CHECK-HC2-DAG: _ZN1SD0Ev 95 // CHECK-HC2-DAG: _ZN1SD2Ev 96 // CHECK-HC2-DAG: _ZN1S1nEv 97 98 // CHECK-HC-NOT: _ZN1C1mEv 99 // CHECK-HC-NOT: _ZN1CC2Ev 100 // CHECK-HC-NOT: _ZN1CD0Ev 101 // CHECK-HC-NOT: _ZN1CD2Ev 102 103 // CHECK-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1C1mEv 104 // CHECK-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1CC2Ev 105 // CHECK-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1CD0Ev 106 // CHECK-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1CD2Ev 107 // CHECK-HC-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1S1nEv 108 // CHECK-HC-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1SC2Ev 109 // CHECK-HC-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1SD0Ev 110 // CHECK-HC-RE: FUNC WEAK DEFAULT {{[0-9]+}} _ZN1SD2Ev 111 112 // CHECK-HP-HC-NOT: _ZN1CC2Ev 113 // CHECK-HP-HC-NOT: _ZN1CD0Ev 114 // CHECK-HP-HC-NOT: _ZN1CD2Ev 115 // CHECK-HP-HC-NOT: _ZN1SC2Ev 116 // CHECK-HP-HC-NOT: _ZN1SD0Ev 117 // CHECK-HP-HC-NOT: _ZN1SD2Ev 118 // CHECK-HP-HC-NOT: _ZN1C1mEv 119 // CHECK-HP-HC-NOT: _ZN1S1nEv 120 121 // CHECK-HP-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1C1mEv 122 // CHECK-HP-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1CC2Ev 123 // CHECK-HP-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1CD0Ev 124 // CHECK-HP-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1CD2Ev 125 // CHECK-HP-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1S1nEv 126 // CHECK-HP-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1SC2Ev 127 // CHECK-HP-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1SD0Ev 128 // CHECK-HP-HC-RE: FUNC WEAK HIDDEN {{[0-9]+}} _ZN1SD2Ev 129 130 // TODO: clang+llvm does not materialize complete ctors and dtors for the 131 // Itanium abi. Figure out why and add the check-not for these: 132 // _ZN1CC1Ev 133 // _ZN1CD1Ev 134 // _ZN1SC1Ev 135 // _ZN1SD1Ev 136 137 #define HIDDEN __attribute__((__visibility__("hidden"))) 138 #define DEFAULT __attribute__((__visibility__("default"))) 139 140 struct PARENT_CLASS_VISIBILITY S { 141 virtual ~S() {} 142 virtual PARENT_METHOD_VISIBILITY void n() {} 143 }; 144 145 class CHILD_CLASS_VISIBILITY C : public S { 146 public: 147 virtual CHILD_METHOD_VISIBILITY void m() {} 148 }; 149 150 void f() { 151 C c; 152 c.m(); 153 c.n(); 154 } 155