xref: /netbsd-src/tests/usr.bin/c++/t_call_once.sh (revision ac615257a7f4243b5374551e57c46a4b929d81a3)
1*ac615257Sskrll#	$NetBSD: t_call_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 call_once
2977dc83faSkamilcall_once_head() {
3077dc83faSkamil	atf_set "descr" "compile and run std::call_once"
3177dc83faSkamil	atf_set "require.progs" "c++"
3277dc83faSkamil}
3377dc83faSkamil
3477dc83faSkamilatf_test_case call_once_profile
3577dc83faSkamilcall_once_profile_head() {
3677dc83faSkamil	atf_set "descr" "compile and run std::call_once with profiling option"
3777dc83faSkamil	atf_set "require.progs" "c++"
3877dc83faSkamil}
3977dc83faSkamil
4077dc83faSkamilatf_test_case call_once_pic
4177dc83faSkamilcall_once_pic_head() {
4277dc83faSkamil	atf_set "descr" "compile and run PIC std::call_once"
4377dc83faSkamil	atf_set "require.progs" "c++"
4477dc83faSkamil}
4577dc83faSkamil
4677dc83faSkamilatf_test_case call_once_pic_32
4777dc83faSkamilcall_once_pic_32_head() {
4877dc83faSkamil	atf_set "descr" "compile and run 32-bit PIC std::call_once"
4977dc83faSkamil	atf_set "require.progs" "c++"
5077dc83faSkamil}
5177dc83faSkamil
5277dc83faSkamilatf_test_case call_once_pic_profile
5377dc83faSkamilcall_once_pic_head() {
5477dc83faSkamil	atf_set "descr" "compile and run PIC std::call_once with profiling flag"
5577dc83faSkamil	atf_set "require.progs" "c++"
5677dc83faSkamil}
5777dc83faSkamil
5877dc83faSkamilatf_test_case call_once_pic_profile_32
5977dc83faSkamilcall_once_pic_profile_32_head() {
6077dc83faSkamil	atf_set "descr" "compile and run 32-bit PIC std::call_once with profiling flag"
6177dc83faSkamil	atf_set "require.progs" "c++"
6277dc83faSkamil}
6377dc83faSkamil
6477dc83faSkamilatf_test_case call_once_profile_32
6577dc83faSkamilcall_once_profile_32_head() {
6677dc83faSkamil	atf_set "descr" "compile and run 32-bit std::call_once with profiling flag"
6777dc83faSkamil	atf_set "require.progs" "c++"
6877dc83faSkamil}
6977dc83faSkamil
7077dc83faSkamilatf_test_case call_once_pie
7177dc83faSkamilcall_once_pie_head() {
7277dc83faSkamil	atf_set "descr" "compile and run position independent (PIE) std::call_once"
7377dc83faSkamil	atf_set "require.progs" "c++"
7477dc83faSkamil}
7577dc83faSkamil
7677dc83faSkamilatf_test_case call_once_32
7777dc83faSkamilcall_once_32_head() {
7877dc83faSkamil	atf_set "descr" "compile and run std::call_once for/in netbsd32 emulation"
7977dc83faSkamil	atf_set "require.progs" "c++ file diff cat"
8077dc83faSkamil}
8177dc83faSkamil
8277dc83faSkamilatf_test_case call_once_static
8377dc83faSkamilcall_once_static_head() {
8477dc83faSkamil	atf_set "descr" "compile and run std::call_once with static flag"
8577dc83faSkamil	atf_set "require.progs" "c++"
8677dc83faSkamil}
8777dc83faSkamil
8877dc83faSkamilcall_once_body() {
8977dc83faSkamil	cat > test.cpp << EOF
9077dc83faSkamil#include <cstdio>
9177dc83faSkamil#include <thread>
9277dc83faSkamil#include <mutex>
9377dc83faSkamilstd::once_flag flag;
9477dc83faSkamilint main(void) {
9577dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
9677dc83faSkamil        return 0;
9777dc83faSkamil}
9877dc83faSkamilEOF
9977dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o call_once test.cpp -pthread
10077dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
10177dc83faSkamil}
10277dc83faSkamil
10377dc83faSkamilcall_once_profile_body() {
10477dc83faSkamil	cat > test.cpp << EOF
10577dc83faSkamil#include <cstdio>
10677dc83faSkamil#include <thread>
10777dc83faSkamil#include <mutex>
10877dc83faSkamilstd::once_flag flag;
10977dc83faSkamilint main(void) {
11077dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
11177dc83faSkamil        return 0;
11277dc83faSkamil}
11377dc83faSkamilEOF
114*ac615257Sskrll	atf_check -s exit:0 -o ignore -e ignore c++ -static -pg -o call_once test.cpp -pthread
11577dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
11677dc83faSkamil}
11777dc83faSkamil
11877dc83faSkamilcall_once_profile_32_body() {
11977dc83faSkamil	# check whether this arch is 64bit
12077dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
12177dc83faSkamil		atf_skip "this is not a 64 bit architecture"
12277dc83faSkamil	fi
12377dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
12477dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
12577dc83faSkamil	else
12677dc83faSkamil		if fgrep -q _LP64 ./def32; then
12777dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
12877dc83faSkamil		fi
12977dc83faSkamil	fi
13077dc83faSkamil
13177dc83faSkamil	cat > test.cpp << EOF
13277dc83faSkamil#include <cstdio>
13377dc83faSkamil#include <thread>
13477dc83faSkamil#include <mutex>
13577dc83faSkamilstd::once_flag flag;
13677dc83faSkamilint main(void) {
13777dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
13877dc83faSkamil        return 0;
13977dc83faSkamil}
14077dc83faSkamilEOF
141*ac615257Sskrll	atf_check -s exit:0 -o ignore -e ignore c++ -static -m32 -pg -o call_once test.cpp -pthread
14277dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
14377dc83faSkamil}
14477dc83faSkamil
14577dc83faSkamilcall_once_pic_body() {
14677dc83faSkamil	cat > test.cpp << EOF
14777dc83faSkamil#include <stdlib.h>
14877dc83faSkamilint callpic(void);
14977dc83faSkamilint main(void) {callpic();exit(0);}
15077dc83faSkamilEOF
15177dc83faSkamil	cat > pic.cpp << EOF
15277dc83faSkamil#include <cstdio>
15377dc83faSkamil#include <thread>
15477dc83faSkamil#include <mutex>
15577dc83faSkamilstd::once_flag flag;
15677dc83faSkamilint callpic(void) {
15777dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
15877dc83faSkamil        return 0;
15977dc83faSkamil}
16077dc83faSkamilEOF
16177dc83faSkamil
16277dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
16377dc83faSkamil	    c++ -fPIC -shared -o libtest.so pic.cpp
16477dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
16577dc83faSkamil	    c++ -o call_once test.cpp -L. -ltest -pthread
16677dc83faSkamil
16777dc83faSkamil	export LD_LIBRARY_PATH=.
16877dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
16977dc83faSkamil}
17077dc83faSkamil
17177dc83faSkamilcall_once_pic_32_body() {
17277dc83faSkamil	# check whether this arch is 64bit
17377dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
17477dc83faSkamil		atf_skip "this is not a 64 bit architecture"
17577dc83faSkamil	fi
17677dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
17777dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
17877dc83faSkamil	else
17977dc83faSkamil		if fgrep -q _LP64 ./def32; then
18077dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
18177dc83faSkamil		fi
18277dc83faSkamil	fi
18377dc83faSkamil
18477dc83faSkamil	cat > test.cpp << EOF
18577dc83faSkamil#include <stdlib.h>
18677dc83faSkamilint callpic(void);
18777dc83faSkamilint main(void) {callpic();exit(0);}
18877dc83faSkamilEOF
18977dc83faSkamil	cat > pic.cpp << EOF
19077dc83faSkamil#include <cstdio>
19177dc83faSkamil#include <thread>
19277dc83faSkamil#include <mutex>
19377dc83faSkamilstd::once_flag flag;
19477dc83faSkamilint callpic(void) {
19577dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
19677dc83faSkamil        return 0;
19777dc83faSkamil}
19877dc83faSkamilEOF
19977dc83faSkamil
20077dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
20177dc83faSkamil	    c++ -m32 -fPIC -shared -o libtest.so pic.cpp
20277dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
20377dc83faSkamil	    c++ -m32 -o call_once test.cpp -L. -ltest -pthread
20477dc83faSkamil
20577dc83faSkamil	export LD_LIBRARY_PATH=.
20677dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
20777dc83faSkamil}
20877dc83faSkamil
20977dc83faSkamilcall_once_pic_profile_body() {
21077dc83faSkamil	cat > test.cpp << EOF
21177dc83faSkamil#include <stdlib.h>
21277dc83faSkamilint callpic(void);
21377dc83faSkamilint main(void) {callpic();exit(0);}
21477dc83faSkamilEOF
21577dc83faSkamil	cat > pic.cpp << EOF
21677dc83faSkamil#include <cstdio>
21777dc83faSkamil#include <thread>
21877dc83faSkamil#include <mutex>
21977dc83faSkamilstd::once_flag flag;
22077dc83faSkamilint callpic(void) {
22177dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
22277dc83faSkamil        return 0;
22377dc83faSkamil}
22477dc83faSkamilEOF
22577dc83faSkamil
22677dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
22777dc83faSkamil	    c++ -pg -fPIC -shared -o libtest.so pic.cpp
22877dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
22977dc83faSkamil	    c++ -pg -o call_once test.cpp -L. -ltest -pthread
23077dc83faSkamil
23177dc83faSkamil	export LD_LIBRARY_PATH=.
23277dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
23377dc83faSkamil}
23477dc83faSkamil
23577dc83faSkamilcall_once_pic_profile_32_body() {
23677dc83faSkamil	# check whether this arch is 64bit
23777dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
23877dc83faSkamil		atf_skip "this is not a 64 bit architecture"
23977dc83faSkamil	fi
24077dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
24177dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
24277dc83faSkamil	else
24377dc83faSkamil		if fgrep -q _LP64 ./def32; then
24477dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
24577dc83faSkamil		fi
24677dc83faSkamil	fi
24777dc83faSkamil
24877dc83faSkamil	cat > test.cpp << EOF
24977dc83faSkamil#include <stdlib.h>
25077dc83faSkamilint callpic(void);
25177dc83faSkamilint main(void) {callpic();exit(0);}
25277dc83faSkamilEOF
25377dc83faSkamil	cat > pic.cpp << EOF
25477dc83faSkamil#include <cstdio>
25577dc83faSkamil#include <thread>
25677dc83faSkamil#include <mutex>
25777dc83faSkamilstd::once_flag flag;
25877dc83faSkamilint callpic(void) {
25977dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
26077dc83faSkamil        return 0;
26177dc83faSkamil}
26277dc83faSkamilEOF
26377dc83faSkamil
26477dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
26577dc83faSkamil	    c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp
26677dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
26777dc83faSkamil	    c++ -m32 -pg -o call_once test.cpp -L. -ltest -pthread
26877dc83faSkamil
26977dc83faSkamil	export LD_LIBRARY_PATH=.
27077dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
27177dc83faSkamil}
27277dc83faSkamil
27377dc83faSkamilcall_once_pie_body() {
27477dc83faSkamil	# check whether this arch supports -pie
27577dc83faSkamil	if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then
27677dc83faSkamil		atf_skip "c++ -pie not supported on this architecture"
27777dc83faSkamil	fi
27877dc83faSkamil	cat > test.cpp << EOF
27977dc83faSkamil#include <cstdio>
28077dc83faSkamil#include <thread>
28177dc83faSkamil#include <mutex>
28277dc83faSkamilstd::once_flag flag;
28377dc83faSkamilint main(void) {
28477dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
28577dc83faSkamil        return 0;
28677dc83faSkamil}
28777dc83faSkamilEOF
28877dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o call_once test.cpp -pthread
28977dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
29077dc83faSkamil}
29177dc83faSkamil
29277dc83faSkamilcall_once_32_body() {
29377dc83faSkamil	# check whether this arch is 64bit
29477dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
29577dc83faSkamil		atf_skip "this is not a 64 bit architecture"
29677dc83faSkamil	fi
29777dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
29877dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
29977dc83faSkamil	else
30077dc83faSkamil		if fgrep -q _LP64 ./def32; then
30177dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
30277dc83faSkamil		fi
30377dc83faSkamil	fi
30477dc83faSkamil
30577dc83faSkamil	cat > test.cpp << EOF
30677dc83faSkamil#include <cstdio>
30777dc83faSkamil#include <thread>
30877dc83faSkamil#include <mutex>
30977dc83faSkamilstd::once_flag flag;
31077dc83faSkamilint main(void) {
31177dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
31277dc83faSkamil        return 0;
31377dc83faSkamil}
31477dc83faSkamilEOF
31577dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o call_once_32 -m32 test.cpp -pthread
31677dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o call_once_64 test.cpp -pthread
31777dc83faSkamil	file -b ./call_once_32 > ./ftype32
31877dc83faSkamil	file -b ./call_once_64 > ./ftype64
31977dc83faSkamil	if diff ./ftype32 ./ftype64 >/dev/null; then
32077dc83faSkamil		atf_fail "generated binaries do not differ"
32177dc83faSkamil	fi
32277dc83faSkamil	echo "32bit binaries on this platform are:"
32377dc83faSkamil	cat ./ftype32
32477dc83faSkamil	echo "While native (64bit) binaries are:"
32577dc83faSkamil	cat ./ftype64
32677dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once_32
32777dc83faSkamil
32877dc83faSkamil	# do another test with static 32bit binaries
32977dc83faSkamil	cat > test.cpp << EOF
33077dc83faSkamil#include <cstdio>
33177dc83faSkamil#include <thread>
33277dc83faSkamil#include <mutex>
33377dc83faSkamilstd::once_flag flag;
33477dc83faSkamilint main(void) {
33577dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
33677dc83faSkamil        return 0;
33777dc83faSkamil}
33877dc83faSkamilEOF
33977dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o call_once -m32 -pthread \
34077dc83faSkamil	    -static test.cpp
34177dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
34277dc83faSkamil}
34377dc83faSkamil
34477dc83faSkamilcall_once_static_body() {
34577dc83faSkamil	cat > test.cpp << EOF
34677dc83faSkamil#include <cstdio>
34777dc83faSkamil#include <thread>
34877dc83faSkamil#include <mutex>
34977dc83faSkamilstd::once_flag flag;
35077dc83faSkamilint main(void) {
35177dc83faSkamil        std::call_once(flag, [](){ printf("hello, world!\n"); });
35277dc83faSkamil        return 0;
35377dc83faSkamil}
35477dc83faSkamilEOF
35577dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -static -o call_once test.cpp -pthread
35677dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
35777dc83faSkamil}
35877dc83faSkamil
35977dc83faSkamilatf_init_test_cases()
36077dc83faSkamil{
36177dc83faSkamil
36277dc83faSkamil	atf_add_test_case call_once
36377dc83faSkamil	atf_add_test_case call_once_profile
36477dc83faSkamil	atf_add_test_case call_once_pic
36577dc83faSkamil	atf_add_test_case call_once_pie
36677dc83faSkamil	atf_add_test_case call_once_32
36777dc83faSkamil	atf_add_test_case call_once_static
36877dc83faSkamil	atf_add_test_case call_once_pic_32
36977dc83faSkamil	atf_add_test_case call_once_pic_profile
37077dc83faSkamil	atf_add_test_case call_once_pic_profile_32
37177dc83faSkamil	atf_add_test_case call_once_profile_32
37277dc83faSkamil}
373