t_pthread_once.sh revision 1.6 1 # $NetBSD: t_pthread_once.sh,v 1.6 2022/06/12 15:08:38 skrll Exp $
2 #
3 # Copyright (c) 2018 The NetBSD Foundation, Inc.
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 # POSSIBILITY OF SUCH DAMAGE.
26 #
27
28 atf_test_case pthread_once
29 pthread_once_head() {
30 atf_set "descr" "compile and run std::pthread_once"
31 atf_set "require.progs" "c++"
32 }
33
34 atf_test_case pthread_once_profile
35 pthread_once_profile_head() {
36 atf_set "descr" "compile and run std::pthread_once with profiling option"
37 atf_set "require.progs" "c++"
38 }
39
40 atf_test_case pthread_once_pic
41 pthread_once_pic_head() {
42 atf_set "descr" "compile and run PIC std::pthread_once"
43 atf_set "require.progs" "c++"
44 }
45
46 atf_test_case pthread_once_pic_32
47 pthread_once_pic_32_head() {
48 atf_set "descr" "compile and run 32-bit PIC std::pthread_once"
49 atf_set "require.progs" "c++"
50 }
51
52 atf_test_case pthread_once_pic_profile
53 pthread_once_pic_head() {
54 atf_set "descr" "compile and run PIC std::pthread_once with profiling &flag"
55 atf_set "require.progs" "c++"
56 }
57
58 atf_test_case pthread_once_pic_profile_32
59 pthread_once_pic_profile_32_head() {
60 atf_set "descr" "compile and run 32-bit PIC std::pthread_once with profiling &flag"
61 atf_set "require.progs" "c++"
62 }
63
64 atf_test_case pthread_once_profile_32
65 pthread_once_profile_32_head() {
66 atf_set "descr" "compile and run 32-bit std::pthread_once with profiling &flag"
67 atf_set "require.progs" "c++"
68 }
69
70 atf_test_case pthread_once_pie
71 pthread_once_pie_head() {
72 atf_set "descr" "compile and run position independent (PIE) std::pthread_once"
73 atf_set "require.progs" "c++"
74 }
75
76 atf_test_case pthread_once_32
77 pthread_once_32_head() {
78 atf_set "descr" "compile and run std::pthread_once for/in netbsd32 emulation"
79 atf_set "require.progs" "c++ file diff cat"
80 }
81
82 atf_test_case pthread_once_static
83 pthread_once_static_head() {
84 atf_set "descr" "compile and run std::pthread_once with static &flag"
85 atf_set "require.progs" "c++"
86 }
87
88 pthread_once_body() {
89 cat > test.cpp << EOF
90 #include <cstdio>
91 #include <thread>
92 int main(void) {
93 pthread_once_t flag = PTHREAD_ONCE_INIT;
94 pthread_once(&flag, [](){ printf("hello, world!\n"); });
95 return 0;
96 }
97 EOF
98 atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once test.cpp -pthread
99 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
100 }
101
102 pthread_once_profile_body() {
103 cat > test.cpp << EOF
104 #include <cstdio>
105 #include <thread>
106 int main(void) {
107 pthread_once_t flag = PTHREAD_ONCE_INIT;
108 pthread_once(&flag, [](){ printf("hello, world!\n"); });
109 return 0;
110 }
111 EOF
112 atf_check -s exit:0 -o ignore -e ignore c++ -static -pg -o pthread_once test.cpp -pthread
113 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
114 }
115
116 pthread_once_profile_32_body() {
117 # check whether this arch is 64bit
118 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
119 atf_skip "this is not a 64 bit architecture"
120 fi
121 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
122 atf_skip "c++ -m32 not supported on this architecture"
123 else
124 if fgrep -q _LP64 ./def32; then
125 atf_fail "c++ -m32 does not generate netbsd32 binaries"
126 fi
127 fi
128
129 cat > test.cpp << EOF
130 #include <cstdio>
131 #include <thread>
132 int main(void) {
133 pthread_once_t flag = PTHREAD_ONCE_INIT;
134 pthread_once(&flag, [](){ printf("hello, world!\n"); });
135 return 0;
136 }
137 EOF
138 atf_check -s exit:0 -o ignore -e ignore c++ -static -m32 -pg -o pthread_once test.cpp -pthread
139 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
140 }
141
142 pthread_once_pic_body() {
143 cat > test.cpp << EOF
144 #include <stdlib.h>
145 int callpic(void);
146 int main(void) {callpic();exit(0);}
147 EOF
148 cat > pic.cpp << EOF
149 #include <cstdio>
150 #include <thread>
151 int callpic(void) {
152 pthread_once_t flag = PTHREAD_ONCE_INIT;
153 pthread_once(&flag, [](){ printf("hello, world!\n"); });
154 return 0;
155 }
156 EOF
157
158 atf_check -s exit:0 -o ignore -e ignore \
159 c++ -fPIC -shared -o libtest.so pic.cpp
160 atf_check -s exit:0 -o ignore -e ignore \
161 c++ -o pthread_once test.cpp -L. -ltest -pthread
162
163 export LD_LIBRARY_PATH=.
164 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
165 }
166
167 pthread_once_pic_32_body() {
168 # check whether this arch is 64bit
169 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
170 atf_skip "this is not a 64 bit architecture"
171 fi
172 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
173 atf_skip "c++ -m32 not supported on this architecture"
174 else
175 if fgrep -q _LP64 ./def32; then
176 atf_fail "c++ -m32 does not generate netbsd32 binaries"
177 fi
178 fi
179
180 cat > test.cpp << EOF
181 #include <stdlib.h>
182 int callpic(void);
183 int main(void) {callpic();exit(0);}
184 EOF
185 cat > pic.cpp << EOF
186 #include <cstdio>
187 #include <thread>
188 int callpic(void) {
189 pthread_once_t flag = PTHREAD_ONCE_INIT;
190 pthread_once(&flag, [](){ printf("hello, world!\n"); });
191 return 0;
192 }
193 EOF
194
195 atf_check -s exit:0 -o ignore -e ignore \
196 c++ -m32 -fPIC -shared -o libtest.so pic.cpp
197 atf_check -s exit:0 -o ignore -e ignore \
198 c++ -m32 -o pthread_once test.cpp -L. -ltest -pthread
199
200 export LD_LIBRARY_PATH=.
201 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
202 }
203
204 pthread_once_pic_profile_body() {
205 cat > test.cpp << EOF
206 #include <stdlib.h>
207 int callpic(void);
208 int main(void) {callpic();exit(0);}
209 EOF
210 cat > pic.cpp << EOF
211 #include <cstdio>
212 #include <thread>
213 int callpic(void) {
214 pthread_once_t flag = PTHREAD_ONCE_INIT;
215 pthread_once(&flag, [](){ printf("hello, world!\n"); });
216 return 0;
217 }
218 EOF
219
220 atf_check -s exit:0 -o ignore -e ignore \
221 c++ -pg -fPIC -shared -o libtest.so pic.cpp
222 atf_check -s exit:0 -o ignore -e ignore \
223 c++ -pg -o pthread_once test.cpp -L. -ltest -pthread
224
225 export LD_LIBRARY_PATH=.
226 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
227 }
228
229 pthread_once_pic_profile_32_body() {
230 # check whether this arch is 64bit
231 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
232 atf_skip "this is not a 64 bit architecture"
233 fi
234 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
235 atf_skip "c++ -m32 not supported on this architecture"
236 else
237 if fgrep -q _LP64 ./def32; then
238 atf_fail "c++ -m32 does not generate netbsd32 binaries"
239 fi
240 fi
241
242 cat > test.cpp << EOF
243 #include <stdlib.h>
244 int callpic(void);
245 int main(void) {callpic();exit(0);}
246 EOF
247 cat > pic.cpp << EOF
248 #include <cstdio>
249 #include <thread>
250 int callpic(void) {
251 pthread_once_t flag = PTHREAD_ONCE_INIT;
252 pthread_once(&flag, [](){ printf("hello, world!\n"); });
253 return 0;
254 }
255 EOF
256
257 atf_check -s exit:0 -o ignore -e ignore \
258 c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp
259 atf_check -s exit:0 -o ignore -e ignore \
260 c++ -m32 -pg -o pthread_once test.cpp -L. -ltest -pthread
261
262 export LD_LIBRARY_PATH=.
263 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
264 }
265
266 pthread_once_pie_body() {
267 # check whether this arch supports -pie
268 if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then
269 atf_skip "c++ -pie not supported on this architecture"
270 fi
271 cat > test.cpp << EOF
272 #include <cstdio>
273 #include <thread>
274 int main(void) {
275 pthread_once_t flag = PTHREAD_ONCE_INIT;
276 pthread_once(&flag, [](){ printf("hello, world!\n"); });
277 return 0;
278 }
279 EOF
280 atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o pthread_once test.cpp -pthread
281 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
282 }
283
284 pthread_once_32_body() {
285 # check whether this arch is 64bit
286 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
287 atf_skip "this is not a 64 bit architecture"
288 fi
289 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
290 atf_skip "c++ -m32 not supported on this architecture"
291 else
292 if fgrep -q _LP64 ./def32; then
293 atf_fail "c++ -m32 does not generate netbsd32 binaries"
294 fi
295 fi
296
297 cat > test.cpp << EOF
298 #include <cstdio>
299 #include <thread>
300 int main(void) {
301 pthread_once_t flag = PTHREAD_ONCE_INIT;
302 pthread_once(&flag, [](){ printf("hello, world!\n"); });
303 return 0;
304 }
305 EOF
306 atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once_32 -m32 test.cpp -pthread
307 atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once_64 test.cpp -pthread
308 file -b ./pthread_once_32 > ./ftype32
309 file -b ./pthread_once_64 > ./ftype64
310 if diff ./ftype32 ./ftype64 >/dev/null; then
311 atf_fail "generated binaries do not differ"
312 fi
313 echo "32bit binaries on this platform are:"
314 cat ./ftype32
315 echo "While native (64bit) binaries are:"
316 cat ./ftype64
317 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once_32
318
319 # do another test with static 32bit binaries
320 cat > test.cpp << EOF
321 #include <cstdio>
322 #include <thread>
323 int main(void) {
324 pthread_once_t flag = PTHREAD_ONCE_INIT;
325 pthread_once(&flag, [](){ printf("hello, world!\n"); });
326 return 0;
327 }
328 EOF
329 atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once -m32 -pthread \
330 -static test.cpp
331 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
332 }
333
334 pthread_once_static_body() {
335 cat > test.cpp << EOF
336 #include <cstdio>
337 #include <thread>
338 int main(void) {
339 pthread_once_t flag = PTHREAD_ONCE_INIT;
340 pthread_once(&flag, [](){ printf("hello, world!\n"); });
341 return 0;
342 }
343 EOF
344 atf_check -s exit:0 -o ignore -e ignore c++ -static -o pthread_once test.cpp -pthread
345 atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
346 }
347
348 atf_init_test_cases()
349 {
350
351 atf_add_test_case pthread_once
352 atf_add_test_case pthread_once_profile
353 atf_add_test_case pthread_once_pic
354 atf_add_test_case pthread_once_pie
355 atf_add_test_case pthread_once_32
356 atf_add_test_case pthread_once_static
357 atf_add_test_case pthread_once_pic_32
358 atf_add_test_case pthread_once_pic_profile
359 atf_add_test_case pthread_once_pic_profile_32
360 atf_add_test_case pthread_once_profile_32
361 }
362