xref: /netbsd-src/tests/usr.bin/c++/t_pthread_once.sh (revision ac615257a7f4243b5374551e57c46a4b929d81a3)
1*ac615257Sskrll#	$NetBSD: t_pthread_once.sh,v 1.6 2022/06/12 15:08:38 skrll Exp $
277dc83faSkamil#
377dc83faSkamil# Copyright (c) 2018 The NetBSD Foundation, Inc.
477dc83faSkamil# All rights reserved.
577dc83faSkamil#
677dc83faSkamil# Redistribution and use in source and binary forms, with or without
777dc83faSkamil# modification, are permitted provided that the following conditions
877dc83faSkamil# are met:
977dc83faSkamil# 1. Redistributions of source code must retain the above copyright
1077dc83faSkamil#    notice, this list of conditions and the following disclaimer.
1177dc83faSkamil# 2. Redistributions in binary form must reproduce the above copyright
1277dc83faSkamil#    notice, this list of conditions and the following disclaimer in the
1377dc83faSkamil#    documentation and/or other materials provided with the distribution.
1477dc83faSkamil#
1577dc83faSkamil# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1677dc83faSkamil# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1777dc83faSkamil# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1877dc83faSkamil# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
1977dc83faSkamil# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2077dc83faSkamil# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2177dc83faSkamil# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2277dc83faSkamil# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2377dc83faSkamil# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2477dc83faSkamil# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2577dc83faSkamil# POSSIBILITY OF SUCH DAMAGE.
2677dc83faSkamil#
2777dc83faSkamil
2877dc83faSkamilatf_test_case pthread_once
2977dc83faSkamilpthread_once_head() {
3077dc83faSkamil	atf_set "descr" "compile and run std::pthread_once"
3177dc83faSkamil	atf_set "require.progs" "c++"
3277dc83faSkamil}
3377dc83faSkamil
3477dc83faSkamilatf_test_case pthread_once_profile
3577dc83faSkamilpthread_once_profile_head() {
3677dc83faSkamil	atf_set "descr" "compile and run std::pthread_once with profiling option"
3777dc83faSkamil	atf_set "require.progs" "c++"
3877dc83faSkamil}
3977dc83faSkamil
4077dc83faSkamilatf_test_case pthread_once_pic
4177dc83faSkamilpthread_once_pic_head() {
4277dc83faSkamil	atf_set "descr" "compile and run PIC std::pthread_once"
4377dc83faSkamil	atf_set "require.progs" "c++"
4477dc83faSkamil}
4577dc83faSkamil
4677dc83faSkamilatf_test_case pthread_once_pic_32
4777dc83faSkamilpthread_once_pic_32_head() {
4877dc83faSkamil	atf_set "descr" "compile and run 32-bit PIC std::pthread_once"
4977dc83faSkamil	atf_set "require.progs" "c++"
5077dc83faSkamil}
5177dc83faSkamil
5277dc83faSkamilatf_test_case pthread_once_pic_profile
5377dc83faSkamilpthread_once_pic_head() {
5477dc83faSkamil	atf_set "descr" "compile and run PIC std::pthread_once with profiling &flag"
5577dc83faSkamil	atf_set "require.progs" "c++"
5677dc83faSkamil}
5777dc83faSkamil
5877dc83faSkamilatf_test_case pthread_once_pic_profile_32
5977dc83faSkamilpthread_once_pic_profile_32_head() {
6077dc83faSkamil	atf_set "descr" "compile and run 32-bit PIC std::pthread_once with profiling &flag"
6177dc83faSkamil	atf_set "require.progs" "c++"
6277dc83faSkamil}
6377dc83faSkamil
6477dc83faSkamilatf_test_case pthread_once_profile_32
6577dc83faSkamilpthread_once_profile_32_head() {
6677dc83faSkamil	atf_set "descr" "compile and run 32-bit std::pthread_once with profiling &flag"
6777dc83faSkamil	atf_set "require.progs" "c++"
6877dc83faSkamil}
6977dc83faSkamil
7077dc83faSkamilatf_test_case pthread_once_pie
7177dc83faSkamilpthread_once_pie_head() {
7277dc83faSkamil	atf_set "descr" "compile and run position independent (PIE) std::pthread_once"
7377dc83faSkamil	atf_set "require.progs" "c++"
7477dc83faSkamil}
7577dc83faSkamil
7677dc83faSkamilatf_test_case pthread_once_32
7777dc83faSkamilpthread_once_32_head() {
7877dc83faSkamil	atf_set "descr" "compile and run std::pthread_once for/in netbsd32 emulation"
7977dc83faSkamil	atf_set "require.progs" "c++ file diff cat"
8077dc83faSkamil}
8177dc83faSkamil
8277dc83faSkamilatf_test_case pthread_once_static
8377dc83faSkamilpthread_once_static_head() {
8477dc83faSkamil	atf_set "descr" "compile and run std::pthread_once with static &flag"
8577dc83faSkamil	atf_set "require.progs" "c++"
8677dc83faSkamil}
8777dc83faSkamil
8877dc83faSkamilpthread_once_body() {
8977dc83faSkamil	cat > test.cpp << EOF
9077dc83faSkamil#include <cstdio>
9177dc83faSkamil#include <thread>
9277dc83faSkamilint main(void) {
9377dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
9477dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
9577dc83faSkamil        return 0;
9677dc83faSkamil}
9777dc83faSkamilEOF
9877dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once test.cpp -pthread
9977dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
10077dc83faSkamil}
10177dc83faSkamil
10277dc83faSkamilpthread_once_profile_body() {
10377dc83faSkamil	cat > test.cpp << EOF
10477dc83faSkamil#include <cstdio>
10577dc83faSkamil#include <thread>
10677dc83faSkamilint main(void) {
10777dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
10877dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
10977dc83faSkamil        return 0;
11077dc83faSkamil}
11177dc83faSkamilEOF
112*ac615257Sskrll	atf_check -s exit:0 -o ignore -e ignore c++ -static -pg -o pthread_once test.cpp -pthread
11377dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
11477dc83faSkamil}
11577dc83faSkamil
11677dc83faSkamilpthread_once_profile_32_body() {
11777dc83faSkamil	# check whether this arch is 64bit
11877dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
11977dc83faSkamil		atf_skip "this is not a 64 bit architecture"
12077dc83faSkamil	fi
12177dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
12277dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
12377dc83faSkamil	else
12477dc83faSkamil		if fgrep -q _LP64 ./def32; then
12577dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
12677dc83faSkamil		fi
12777dc83faSkamil	fi
12877dc83faSkamil
12977dc83faSkamil	cat > test.cpp << EOF
13077dc83faSkamil#include <cstdio>
13177dc83faSkamil#include <thread>
13277dc83faSkamilint main(void) {
13377dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
13477dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
13577dc83faSkamil        return 0;
13677dc83faSkamil}
13777dc83faSkamilEOF
138*ac615257Sskrll	atf_check -s exit:0 -o ignore -e ignore c++ -static -m32 -pg -o pthread_once test.cpp -pthread
13977dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
14077dc83faSkamil}
14177dc83faSkamil
14277dc83faSkamilpthread_once_pic_body() {
14377dc83faSkamil	cat > test.cpp << EOF
14477dc83faSkamil#include <stdlib.h>
14577dc83faSkamilint callpic(void);
14677dc83faSkamilint main(void) {callpic();exit(0);}
14777dc83faSkamilEOF
14877dc83faSkamil	cat > pic.cpp << EOF
14977dc83faSkamil#include <cstdio>
15077dc83faSkamil#include <thread>
15177dc83faSkamilint callpic(void) {
15277dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
15377dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
15477dc83faSkamil        return 0;
15577dc83faSkamil}
15677dc83faSkamilEOF
15777dc83faSkamil
15877dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
15977dc83faSkamil	    c++ -fPIC -shared -o libtest.so pic.cpp
16077dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
16177dc83faSkamil	    c++ -o pthread_once test.cpp -L. -ltest -pthread
16277dc83faSkamil
16377dc83faSkamil	export LD_LIBRARY_PATH=.
16477dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
16577dc83faSkamil}
16677dc83faSkamil
16777dc83faSkamilpthread_once_pic_32_body() {
16877dc83faSkamil	# check whether this arch is 64bit
16977dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
17077dc83faSkamil		atf_skip "this is not a 64 bit architecture"
17177dc83faSkamil	fi
17277dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
17377dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
17477dc83faSkamil	else
17577dc83faSkamil		if fgrep -q _LP64 ./def32; then
17677dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
17777dc83faSkamil		fi
17877dc83faSkamil	fi
17977dc83faSkamil
18077dc83faSkamil	cat > test.cpp << EOF
18177dc83faSkamil#include <stdlib.h>
18277dc83faSkamilint callpic(void);
18377dc83faSkamilint main(void) {callpic();exit(0);}
18477dc83faSkamilEOF
18577dc83faSkamil	cat > pic.cpp << EOF
18677dc83faSkamil#include <cstdio>
18777dc83faSkamil#include <thread>
18877dc83faSkamilint callpic(void) {
18977dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
19077dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
19177dc83faSkamil        return 0;
19277dc83faSkamil}
19377dc83faSkamilEOF
19477dc83faSkamil
19577dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
19677dc83faSkamil	    c++ -m32 -fPIC -shared -o libtest.so pic.cpp
19777dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
19877dc83faSkamil	    c++ -m32 -o pthread_once test.cpp -L. -ltest -pthread
19977dc83faSkamil
20077dc83faSkamil	export LD_LIBRARY_PATH=.
20177dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
20277dc83faSkamil}
20377dc83faSkamil
20477dc83faSkamilpthread_once_pic_profile_body() {
20577dc83faSkamil	cat > test.cpp << EOF
20677dc83faSkamil#include <stdlib.h>
20777dc83faSkamilint callpic(void);
20877dc83faSkamilint main(void) {callpic();exit(0);}
20977dc83faSkamilEOF
21077dc83faSkamil	cat > pic.cpp << EOF
21177dc83faSkamil#include <cstdio>
21277dc83faSkamil#include <thread>
21377dc83faSkamilint callpic(void) {
21477dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
21577dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
21677dc83faSkamil        return 0;
21777dc83faSkamil}
21877dc83faSkamilEOF
21977dc83faSkamil
22077dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
22177dc83faSkamil	    c++ -pg -fPIC -shared -o libtest.so pic.cpp
22277dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
22377dc83faSkamil	    c++ -pg -o pthread_once test.cpp -L. -ltest -pthread
22477dc83faSkamil
22577dc83faSkamil	export LD_LIBRARY_PATH=.
22677dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
22777dc83faSkamil}
22877dc83faSkamil
22977dc83faSkamilpthread_once_pic_profile_32_body() {
23077dc83faSkamil	# check whether this arch is 64bit
23177dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
23277dc83faSkamil		atf_skip "this is not a 64 bit architecture"
23377dc83faSkamil	fi
23477dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
23577dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
23677dc83faSkamil	else
23777dc83faSkamil		if fgrep -q _LP64 ./def32; then
23877dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
23977dc83faSkamil		fi
24077dc83faSkamil	fi
24177dc83faSkamil
24277dc83faSkamil	cat > test.cpp << EOF
24377dc83faSkamil#include <stdlib.h>
24477dc83faSkamilint callpic(void);
24577dc83faSkamilint main(void) {callpic();exit(0);}
24677dc83faSkamilEOF
24777dc83faSkamil	cat > pic.cpp << EOF
24877dc83faSkamil#include <cstdio>
24977dc83faSkamil#include <thread>
25077dc83faSkamilint callpic(void) {
25177dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
25277dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
25377dc83faSkamil        return 0;
25477dc83faSkamil}
25577dc83faSkamilEOF
25677dc83faSkamil
25777dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
25877dc83faSkamil	    c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp
25977dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
26077dc83faSkamil	    c++ -m32 -pg -o pthread_once test.cpp -L. -ltest -pthread
26177dc83faSkamil
26277dc83faSkamil	export LD_LIBRARY_PATH=.
26377dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
26477dc83faSkamil}
26577dc83faSkamil
26677dc83faSkamilpthread_once_pie_body() {
26777dc83faSkamil	# check whether this arch supports -pie
26877dc83faSkamil	if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then
26977dc83faSkamil		atf_skip "c++ -pie not supported on this architecture"
27077dc83faSkamil	fi
27177dc83faSkamil	cat > test.cpp << EOF
27277dc83faSkamil#include <cstdio>
27377dc83faSkamil#include <thread>
27477dc83faSkamilint main(void) {
27577dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
27677dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
27777dc83faSkamil        return 0;
27877dc83faSkamil}
27977dc83faSkamilEOF
28077dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o pthread_once test.cpp -pthread
28177dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
28277dc83faSkamil}
28377dc83faSkamil
28477dc83faSkamilpthread_once_32_body() {
28577dc83faSkamil	# check whether this arch is 64bit
28677dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
28777dc83faSkamil		atf_skip "this is not a 64 bit architecture"
28877dc83faSkamil	fi
28977dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
29077dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
29177dc83faSkamil	else
29277dc83faSkamil		if fgrep -q _LP64 ./def32; then
29377dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
29477dc83faSkamil		fi
29577dc83faSkamil	fi
29677dc83faSkamil
29777dc83faSkamil	cat > test.cpp << EOF
29877dc83faSkamil#include <cstdio>
29977dc83faSkamil#include <thread>
30077dc83faSkamilint main(void) {
30177dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
30277dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
30377dc83faSkamil        return 0;
30477dc83faSkamil}
30577dc83faSkamilEOF
30677dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once_32 -m32 test.cpp -pthread
30777dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once_64 test.cpp -pthread
30877dc83faSkamil	file -b ./pthread_once_32 > ./ftype32
30977dc83faSkamil	file -b ./pthread_once_64 > ./ftype64
31077dc83faSkamil	if diff ./ftype32 ./ftype64 >/dev/null; then
31177dc83faSkamil		atf_fail "generated binaries do not differ"
31277dc83faSkamil	fi
31377dc83faSkamil	echo "32bit binaries on this platform are:"
31477dc83faSkamil	cat ./ftype32
31577dc83faSkamil	echo "While native (64bit) binaries are:"
31677dc83faSkamil	cat ./ftype64
31777dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once_32
31877dc83faSkamil
31977dc83faSkamil	# do another test with static 32bit binaries
32077dc83faSkamil	cat > test.cpp << EOF
32177dc83faSkamil#include <cstdio>
32277dc83faSkamil#include <thread>
32377dc83faSkamilint main(void) {
32477dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
32577dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
32677dc83faSkamil        return 0;
32777dc83faSkamil}
32877dc83faSkamilEOF
32977dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once -m32 -pthread \
33077dc83faSkamil	    -static test.cpp
33177dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
33277dc83faSkamil}
33377dc83faSkamil
33477dc83faSkamilpthread_once_static_body() {
33577dc83faSkamil	cat > test.cpp << EOF
33677dc83faSkamil#include <cstdio>
33777dc83faSkamil#include <thread>
33877dc83faSkamilint main(void) {
33977dc83faSkamil        pthread_once_t flag = PTHREAD_ONCE_INIT;
34077dc83faSkamil        pthread_once(&flag, [](){ printf("hello, world!\n"); });
34177dc83faSkamil        return 0;
34277dc83faSkamil}
34377dc83faSkamilEOF
34477dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -static -o pthread_once test.cpp -pthread
34577dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once
34677dc83faSkamil}
34777dc83faSkamil
34877dc83faSkamilatf_init_test_cases()
34977dc83faSkamil{
35077dc83faSkamil
35177dc83faSkamil	atf_add_test_case pthread_once
35277dc83faSkamil	atf_add_test_case pthread_once_profile
35377dc83faSkamil	atf_add_test_case pthread_once_pic
35477dc83faSkamil	atf_add_test_case pthread_once_pie
35577dc83faSkamil	atf_add_test_case pthread_once_32
35677dc83faSkamil	atf_add_test_case pthread_once_static
35777dc83faSkamil	atf_add_test_case pthread_once_pic_32
35877dc83faSkamil	atf_add_test_case pthread_once_pic_profile
35977dc83faSkamil	atf_add_test_case pthread_once_pic_profile_32
36077dc83faSkamil	atf_add_test_case pthread_once_profile_32
36177dc83faSkamil}
362