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