xref: /netbsd-src/tests/usr.bin/c++/t_call_once2.sh (revision d5bc748e3ee1787d9d962862cb4ea7e74fd3954a)
1*d5bc748eSskrll#	$NetBSD: t_call_once2.sh,v 1.8 2022/09/29 07:22:49 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_once2
2977dc83faSkamilcall_once2_head() {
3077dc83faSkamil	atf_set "descr" "compile and run std::call_once"
3177dc83faSkamil	atf_set "require.progs" "c++"
32b73d7fb6Srin	atf_set "timeout" "600"
3377dc83faSkamil}
3477dc83faSkamil
3577dc83faSkamilatf_test_case call_once2_profile
3677dc83faSkamilcall_once2_profile_head() {
3777dc83faSkamil	atf_set "descr" "compile and run std::call_once with profiling option"
3877dc83faSkamil	atf_set "require.progs" "c++"
39b73d7fb6Srin	atf_set "timeout" "600"
4077dc83faSkamil}
4177dc83faSkamil
4277dc83faSkamilatf_test_case call_once2_pic
4377dc83faSkamilcall_once2_pic_head() {
4477dc83faSkamil	atf_set "descr" "compile and run PIC std::call_once"
4577dc83faSkamil	atf_set "require.progs" "c++"
46b73d7fb6Srin	atf_set "timeout" "600"
4777dc83faSkamil}
4877dc83faSkamil
4977dc83faSkamilatf_test_case call_once2_pic_32
5077dc83faSkamilcall_once2_pic_32_head() {
5177dc83faSkamil	atf_set "descr" "compile and run 32-bit PIC std::call_once"
5277dc83faSkamil	atf_set "require.progs" "c++"
53b73d7fb6Srin	atf_set "timeout" "600"
5477dc83faSkamil}
5577dc83faSkamil
5677dc83faSkamilatf_test_case call_once2_pic_profile
577a28717eSrincall_once2_pic_profile_head() {
5877dc83faSkamil	atf_set "descr" "compile and run PIC std::call_once with profiling flag"
5977dc83faSkamil	atf_set "require.progs" "c++"
60b73d7fb6Srin	atf_set "timeout" "600"
6177dc83faSkamil}
6277dc83faSkamil
6377dc83faSkamilatf_test_case call_once2_pic_profile_32
6477dc83faSkamilcall_once2_pic_profile_32_head() {
6577dc83faSkamil	atf_set "descr" "compile and run 32-bit PIC std::call_once with profiling flag"
6677dc83faSkamil	atf_set "require.progs" "c++"
67b73d7fb6Srin	atf_set "timeout" "600"
6877dc83faSkamil}
6977dc83faSkamil
7077dc83faSkamilatf_test_case call_once2_profile_32
7177dc83faSkamilcall_once2_profile_32_head() {
7277dc83faSkamil	atf_set "descr" "compile and run 32-bit std::call_once with profiling flag"
7377dc83faSkamil	atf_set "require.progs" "c++"
74b73d7fb6Srin	atf_set "timeout" "600"
7577dc83faSkamil}
7677dc83faSkamil
7777dc83faSkamilatf_test_case call_once2_pie
7877dc83faSkamilcall_once2_pie_head() {
7977dc83faSkamil	atf_set "descr" "compile and run position independent (PIE) std::call_once"
8077dc83faSkamil	atf_set "require.progs" "c++"
81b73d7fb6Srin	atf_set "timeout" "600"
8277dc83faSkamil}
8377dc83faSkamil
8477dc83faSkamilatf_test_case call_once2_32
8577dc83faSkamilcall_once2_32_head() {
8677dc83faSkamil	atf_set "descr" "compile and run std::call_once for/in netbsd32 emulation"
8777dc83faSkamil	atf_set "require.progs" "c++ file diff cat"
88b73d7fb6Srin	atf_set "timeout" "600"
8977dc83faSkamil}
9077dc83faSkamil
9177dc83faSkamilatf_test_case call_once2_static
9277dc83faSkamilcall_once2_static_head() {
9377dc83faSkamil	atf_set "descr" "compile and run std::call_once with static flag"
9477dc83faSkamil	atf_set "require.progs" "c++"
95b73d7fb6Srin	atf_set "timeout" "600"
9677dc83faSkamil}
9777dc83faSkamil
9877dc83faSkamilcall_once2_body() {
9977dc83faSkamil	cat > test.cpp << EOF
10077dc83faSkamil#include <mutex>
10177dc83faSkamil#include <thread>
10277dc83faSkamil#include <iostream>
10377dc83faSkamilstd::once_flag flag, flag_throw;
10477dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
10577dc83faSkamilvoid throw_once(void) { throw std::exception(); }
10677dc83faSkamilint main(void) {
10777dc83faSkamil        static const int nr_threads(4);
10877dc83faSkamil        std::thread threads[nr_threads];
10977dc83faSkamil
11077dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
11177dc83faSkamil                threads[i] = std::thread(print_once);
11277dc83faSkamil        }
11377dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
11477dc83faSkamil                threads[i].join();
11577dc83faSkamil        }
11677dc83faSkamil
11777dc83faSkamil        try {
11877dc83faSkamil                std::call_once(flag_throw, throw_once);
11977dc83faSkamil        } catch (...) {
12077dc83faSkamil                std::cout << "world!" << std::endl;
12177dc83faSkamil        }
12277dc83faSkamil        return 0;
12377dc83faSkamil}
12477dc83faSkamilEOF
12577dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o call_once2 test.cpp -pthread
12677dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2
12777dc83faSkamil}
12877dc83faSkamil
12977dc83faSkamilcall_once2_profile_body() {
130af540225Schristos	atf_expect_fail "profiling option doesn't work with shared libraries"
13177dc83faSkamil	cat > test.cpp << EOF
13277dc83faSkamil#include <mutex>
13377dc83faSkamil#include <thread>
13477dc83faSkamil#include <iostream>
13577dc83faSkamilstd::once_flag flag, flag_throw;
13677dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
13777dc83faSkamilvoid throw_once(void) { throw std::exception(); }
13877dc83faSkamilint main(void) {
13977dc83faSkamil        static const int nr_threads(4);
14077dc83faSkamil        std::thread threads[nr_threads];
14177dc83faSkamil
14277dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
14377dc83faSkamil                threads[i] = std::thread(print_once);
14477dc83faSkamil        }
14577dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
14677dc83faSkamil                threads[i].join();
14777dc83faSkamil        }
14877dc83faSkamil
14977dc83faSkamil        try {
15077dc83faSkamil                std::call_once(flag_throw, throw_once);
15177dc83faSkamil        } catch (...) {
15277dc83faSkamil                std::cout << "world!" << std::endl;
15377dc83faSkamil        }
15477dc83faSkamil        return 0;
15577dc83faSkamil}
15677dc83faSkamilEOF
157*d5bc748eSskrll	atf_check -s exit:0 -o ignore -e ignore c++ -pg -o call_once2 test.cpp -pthread
15877dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2
15977dc83faSkamil}
16077dc83faSkamil
16177dc83faSkamilcall_once2_profile_32_body() {
16277dc83faSkamil	atf_expect_fail "profiling option doesn't work now"
16377dc83faSkamil	# check whether this arch is 64bit
16477dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
16577dc83faSkamil		atf_skip "this is not a 64 bit architecture"
16677dc83faSkamil	fi
16777dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
16877dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
16977dc83faSkamil	else
17077dc83faSkamil		if fgrep -q _LP64 ./def32; then
17177dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
17277dc83faSkamil		fi
17377dc83faSkamil	fi
17477dc83faSkamil
17577dc83faSkamil	cat > test.cpp << EOF
17677dc83faSkamil#include <mutex>
17777dc83faSkamil#include <thread>
17877dc83faSkamil#include <iostream>
17977dc83faSkamilstd::once_flag flag, flag_throw;
18077dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
18177dc83faSkamilvoid throw_once(void) { throw std::exception(); }
18277dc83faSkamilint main(void) {
18377dc83faSkamil        static const int nr_threads(4);
18477dc83faSkamil        std::thread threads[nr_threads];
18577dc83faSkamil
18677dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
18777dc83faSkamil                threads[i] = std::thread(print_once);
18877dc83faSkamil        }
18977dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
19077dc83faSkamil                threads[i].join();
19177dc83faSkamil        }
19277dc83faSkamil
19377dc83faSkamil        try {
19477dc83faSkamil                std::call_once(flag_throw, throw_once);
19577dc83faSkamil        } catch (...) {
19677dc83faSkamil                std::cout << "world!" << std::endl;
19777dc83faSkamil        }
19877dc83faSkamil        return 0;
19977dc83faSkamil}
20077dc83faSkamilEOF
201*d5bc748eSskrll	atf_check -s exit:0 -o ignore -e ignore c++ -m32 -pg -o call_once2 test.cpp -pthread
20277dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2
20377dc83faSkamil	atf_expect_fail "The combination of 32-bit and profiling should be fail"
20477dc83faSkamil}
20577dc83faSkamil
20677dc83faSkamilcall_once2_pic_body() {
20777dc83faSkamil	cat > test.cpp << EOF
20877dc83faSkamil#include <stdlib.h>
20977dc83faSkamilint callpic(void);
21077dc83faSkamilint main(void) {callpic();exit(0);}
21177dc83faSkamilEOF
21277dc83faSkamil	cat > pic.cpp << EOF
21377dc83faSkamil#include <mutex>
21477dc83faSkamil#include <thread>
21577dc83faSkamil#include <iostream>
21677dc83faSkamilstd::once_flag flag, flag_throw;
21777dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
21877dc83faSkamilvoid throw_once(void) { throw std::exception(); }
21977dc83faSkamilint callpic(void) {
22077dc83faSkamil        static const int nr_threads(4);
22177dc83faSkamil        std::thread threads[nr_threads];
22277dc83faSkamil
22377dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
22477dc83faSkamil                threads[i] = std::thread(print_once);
22577dc83faSkamil        }
22677dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
22777dc83faSkamil                threads[i].join();
22877dc83faSkamil        }
22977dc83faSkamil
23077dc83faSkamil        try {
23177dc83faSkamil                std::call_once(flag_throw, throw_once);
23277dc83faSkamil        } catch (...) {
23377dc83faSkamil                std::cout << "world!" << std::endl;
23477dc83faSkamil        }
23577dc83faSkamil        return 0;
23677dc83faSkamil}
23777dc83faSkamilEOF
23877dc83faSkamil
23977dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
24077dc83faSkamil	    c++ -fPIC -shared -o libtest.so pic.cpp
24177dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
24277dc83faSkamil	    c++ -o call_once2 test.cpp -L. -ltest -pthread
24377dc83faSkamil
24477dc83faSkamil	export LD_LIBRARY_PATH=.
24577dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2
24677dc83faSkamil}
24777dc83faSkamil
24877dc83faSkamilcall_once2_pic_32_body() {
24977dc83faSkamil	# check whether this arch is 64bit
25077dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
25177dc83faSkamil		atf_skip "this is not a 64 bit architecture"
25277dc83faSkamil	fi
25377dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
25477dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
25577dc83faSkamil	else
25677dc83faSkamil		if fgrep -q _LP64 ./def32; then
25777dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
25877dc83faSkamil		fi
25977dc83faSkamil	fi
26077dc83faSkamil
26177dc83faSkamil	cat > test.cpp << EOF
26277dc83faSkamil#include <stdlib.h>
26377dc83faSkamilint callpic(void);
26477dc83faSkamilint main(void) {callpic();exit(0);}
26577dc83faSkamilEOF
26677dc83faSkamil	cat > pic.cpp << EOF
26777dc83faSkamil#include <mutex>
26877dc83faSkamil#include <thread>
26977dc83faSkamil#include <iostream>
27077dc83faSkamilstd::once_flag flag, flag_throw;
27177dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
27277dc83faSkamilvoid throw_once(void) { throw std::exception(); }
27377dc83faSkamilint callpic(void) {
27477dc83faSkamil        static const int nr_threads(4);
27577dc83faSkamil        std::thread threads[nr_threads];
27677dc83faSkamil
27777dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
27877dc83faSkamil                threads[i] = std::thread(print_once);
27977dc83faSkamil        }
28077dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
28177dc83faSkamil                threads[i].join();
28277dc83faSkamil        }
28377dc83faSkamil
28477dc83faSkamil        try {
28577dc83faSkamil                std::call_once(flag_throw, throw_once);
28677dc83faSkamil        } catch (...) {
28777dc83faSkamil                std::cout << "world!" << std::endl;
28877dc83faSkamil        }
28977dc83faSkamil        return 0;
29077dc83faSkamil}
29177dc83faSkamilEOF
29277dc83faSkamil
29377dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
29477dc83faSkamil	    c++ -m32 -fPIC -shared -o libtest.so pic.cpp
29577dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
29677dc83faSkamil	    c++ -m32 -o call_once2 test.cpp -L. -ltest -pthread
29777dc83faSkamil
29877dc83faSkamil	export LD_LIBRARY_PATH=.
29977dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2
30077dc83faSkamil}
30177dc83faSkamil
30277dc83faSkamilcall_once2_pic_profile_body() {
303af540225Schristos	atf_expect_fail "profiling option doesn't work with pic"
30477dc83faSkamil	cat > test.cpp << EOF
30577dc83faSkamil#include <stdlib.h>
30677dc83faSkamilint callpic(void);
30777dc83faSkamilint main(void) {callpic();exit(0);}
30877dc83faSkamilEOF
30977dc83faSkamil	cat > pic.cpp << EOF
31077dc83faSkamil#include <mutex>
31177dc83faSkamil#include <thread>
31277dc83faSkamil#include <iostream>
31377dc83faSkamilstd::once_flag flag, flag_throw;
31477dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
31577dc83faSkamilvoid throw_once(void) { throw std::exception(); }
31677dc83faSkamilint callpic(void) {
31777dc83faSkamil        static const int nr_threads(4);
31877dc83faSkamil        std::thread threads[nr_threads];
31977dc83faSkamil
32077dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
32177dc83faSkamil                threads[i] = std::thread(print_once);
32277dc83faSkamil        }
32377dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
32477dc83faSkamil                threads[i].join();
32577dc83faSkamil        }
32677dc83faSkamil
32777dc83faSkamil        try {
32877dc83faSkamil                std::call_once(flag_throw, throw_once);
32977dc83faSkamil        } catch (...) {
33077dc83faSkamil                std::cout << "world!" << std::endl;
33177dc83faSkamil        }
33277dc83faSkamil        return 0;
33377dc83faSkamil}
33477dc83faSkamilEOF
33577dc83faSkamil
33677dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
33777dc83faSkamil	    c++ -pg -fPIC -shared -o libtest.so pic.cpp
33877dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
33977dc83faSkamil	    c++ -pg -o call_once2 test.cpp -L. -ltest -pthread
34077dc83faSkamil
34177dc83faSkamil	export LD_LIBRARY_PATH=.
34277dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2
34377dc83faSkamil}
34477dc83faSkamil
34577dc83faSkamilcall_once2_pic_profile_32_body() {
346af540225Schristos	atf_expect_fail "profiling option doesn't work with shared libraries"
34777dc83faSkamil	# check whether this arch is 64bit
34877dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
34977dc83faSkamil		atf_skip "this is not a 64 bit architecture"
35077dc83faSkamil	fi
35177dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
35277dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
35377dc83faSkamil	else
35477dc83faSkamil		if fgrep -q _LP64 ./def32; then
35577dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
35677dc83faSkamil		fi
35777dc83faSkamil	fi
35877dc83faSkamil
35977dc83faSkamil	cat > test.cpp << EOF
36077dc83faSkamil#include <stdlib.h>
36177dc83faSkamilint callpic(void);
36277dc83faSkamilint main(void) {callpic();exit(0);}
36377dc83faSkamilEOF
36477dc83faSkamil	cat > pic.cpp << EOF
36577dc83faSkamil#include <mutex>
36677dc83faSkamil#include <thread>
36777dc83faSkamil#include <iostream>
36877dc83faSkamilstd::once_flag flag, flag_throw;
36977dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
37077dc83faSkamilvoid throw_once(void) { throw std::exception(); }
37177dc83faSkamilint callpic(void) {
37277dc83faSkamil        static const int nr_threads(4);
37377dc83faSkamil        std::thread threads[nr_threads];
37477dc83faSkamil
37577dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
37677dc83faSkamil                threads[i] = std::thread(print_once);
37777dc83faSkamil        }
37877dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
37977dc83faSkamil                threads[i].join();
38077dc83faSkamil        }
38177dc83faSkamil
38277dc83faSkamil        try {
38377dc83faSkamil                std::call_once(flag_throw, throw_once);
38477dc83faSkamil        } catch (...) {
38577dc83faSkamil                std::cout << "world!" << std::endl;
38677dc83faSkamil        }
38777dc83faSkamil        return 0;
38877dc83faSkamil}
38977dc83faSkamilEOF
39077dc83faSkamil
39177dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
39277dc83faSkamil	    c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp
39377dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore \
39477dc83faSkamil	    c++ -m32 -pg -o call_once2 test.cpp -L. -ltest -pthread
39577dc83faSkamil
39677dc83faSkamil	export LD_LIBRARY_PATH=.
39777dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2
39877dc83faSkamil}
39977dc83faSkamil
40077dc83faSkamilcall_once2_pie_body() {
40177dc83faSkamil	# check whether this arch supports -pie
40277dc83faSkamil	if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then
40377dc83faSkamil		atf_skip "c++ -pie not supported on this architecture"
40477dc83faSkamil	fi
40577dc83faSkamil	cat > test.cpp << EOF
40677dc83faSkamil#include <mutex>
40777dc83faSkamil#include <thread>
40877dc83faSkamil#include <iostream>
40977dc83faSkamilstd::once_flag flag, flag_throw;
41077dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
41177dc83faSkamilvoid throw_once(void) { throw std::exception(); }
41277dc83faSkamilint main(void) {
41377dc83faSkamil        static const int nr_threads(4);
41477dc83faSkamil        std::thread threads[nr_threads];
41577dc83faSkamil
41677dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
41777dc83faSkamil                threads[i] = std::thread(print_once);
41877dc83faSkamil        }
41977dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
42077dc83faSkamil                threads[i].join();
42177dc83faSkamil        }
42277dc83faSkamil
42377dc83faSkamil        try {
42477dc83faSkamil                std::call_once(flag_throw, throw_once);
42577dc83faSkamil        } catch (...) {
42677dc83faSkamil                std::cout << "world!" << std::endl;
42777dc83faSkamil        }
42877dc83faSkamil        return 0;
42977dc83faSkamil}
43077dc83faSkamilEOF
43177dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o call_once2 test.cpp -pthread
43277dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2
43377dc83faSkamil}
43477dc83faSkamil
43577dc83faSkamilcall_once2_32_body() {
43677dc83faSkamil	# check whether this arch is 64bit
43777dc83faSkamil	if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
43877dc83faSkamil		atf_skip "this is not a 64 bit architecture"
43977dc83faSkamil	fi
44077dc83faSkamil	if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
44177dc83faSkamil		atf_skip "c++ -m32 not supported on this architecture"
44277dc83faSkamil	else
44377dc83faSkamil		if fgrep -q _LP64 ./def32; then
44477dc83faSkamil			atf_fail "c++ -m32 does not generate netbsd32 binaries"
44577dc83faSkamil		fi
44677dc83faSkamil	fi
44777dc83faSkamil
44877dc83faSkamil	cat > test.cpp << EOF
44977dc83faSkamil#include <mutex>
45077dc83faSkamil#include <thread>
45177dc83faSkamil#include <iostream>
45277dc83faSkamilstd::once_flag flag, flag_throw;
45377dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
45477dc83faSkamilvoid throw_once(void) { throw std::exception(); }
45577dc83faSkamilint main(void) {
45677dc83faSkamil        static const int nr_threads(4);
45777dc83faSkamil        std::thread threads[nr_threads];
45877dc83faSkamil
45977dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
46077dc83faSkamil                threads[i] = std::thread(print_once);
46177dc83faSkamil        }
46277dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
46377dc83faSkamil                threads[i].join();
46477dc83faSkamil        }
46577dc83faSkamil
46677dc83faSkamil        try {
46777dc83faSkamil                std::call_once(flag_throw, throw_once);
46877dc83faSkamil        } catch (...) {
46977dc83faSkamil                std::cout << "world!" << std::endl;
47077dc83faSkamil        }
47177dc83faSkamil        return 0;
47277dc83faSkamil}
47377dc83faSkamilEOF
47477dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o call_once2_32 -m32 test.cpp -pthread
47577dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o call_once2_64 test.cpp -pthread
47677dc83faSkamil	file -b ./call_once2_32 > ./ftype32
47777dc83faSkamil	file -b ./call_once2_64 > ./ftype64
47877dc83faSkamil	if diff ./ftype32 ./ftype64 >/dev/null; then
47977dc83faSkamil		atf_fail "generated binaries do not differ"
48077dc83faSkamil	fi
48177dc83faSkamil	echo "32bit binaries on this platform are:"
48277dc83faSkamil	cat ./ftype32
48377dc83faSkamil	echo "While native (64bit) binaries are:"
48477dc83faSkamil	cat ./ftype64
48577dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2_32
48677dc83faSkamil
48777dc83faSkamil	# do another test with static 32bit binaries
48877dc83faSkamil	cat > test.cpp << EOF
48977dc83faSkamil#include <mutex>
49077dc83faSkamil#include <thread>
49177dc83faSkamil#include <iostream>
49277dc83faSkamilstd::once_flag flag, flag_throw;
49377dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
49477dc83faSkamilvoid throw_once(void) { throw std::exception(); }
49577dc83faSkamilint main(void) {
49677dc83faSkamil        static const int nr_threads(4);
49777dc83faSkamil        std::thread threads[nr_threads];
49877dc83faSkamil
49977dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
50077dc83faSkamil                threads[i] = std::thread(print_once);
50177dc83faSkamil        }
50277dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
50377dc83faSkamil                threads[i].join();
50477dc83faSkamil        }
50577dc83faSkamil
50677dc83faSkamil        try {
50777dc83faSkamil                std::call_once(flag_throw, throw_once);
50877dc83faSkamil        } catch (...) {
50977dc83faSkamil                std::cout << "world!" << std::endl;
51077dc83faSkamil        }
51177dc83faSkamil        return 0;
51277dc83faSkamil}
51377dc83faSkamilEOF
51477dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -o call_once2 -m32 -pthread \
51577dc83faSkamil	    -static test.cpp
51677dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2
51777dc83faSkamil}
51877dc83faSkamil
51977dc83faSkamilcall_once2_static_body() {
52077dc83faSkamil	cat > test.cpp << EOF
52177dc83faSkamil#include <mutex>
52277dc83faSkamil#include <thread>
52377dc83faSkamil#include <iostream>
52477dc83faSkamilstd::once_flag flag, flag_throw;
52577dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); }
52677dc83faSkamilvoid throw_once(void) { throw std::exception(); }
52777dc83faSkamilint main(void) {
52877dc83faSkamil        static const int nr_threads(4);
52977dc83faSkamil        std::thread threads[nr_threads];
53077dc83faSkamil
53177dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
53277dc83faSkamil                threads[i] = std::thread(print_once);
53377dc83faSkamil        }
53477dc83faSkamil        for (int i = 0; i < nr_threads; ++i) {
53577dc83faSkamil                threads[i].join();
53677dc83faSkamil        }
53777dc83faSkamil
53877dc83faSkamil        try {
53977dc83faSkamil                std::call_once(flag_throw, throw_once);
54077dc83faSkamil        } catch (...) {
54177dc83faSkamil                std::cout << "world!" << std::endl;
54277dc83faSkamil        }
54377dc83faSkamil        return 0;
54477dc83faSkamil}
54577dc83faSkamilEOF
54677dc83faSkamil	atf_check -s exit:0 -o ignore -e ignore c++ -static -o call_once2 test.cpp -pthread
54777dc83faSkamil	atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2
54877dc83faSkamil}
54977dc83faSkamil
55077dc83faSkamilatf_init_test_cases()
55177dc83faSkamil{
55277dc83faSkamil
55377dc83faSkamil	atf_add_test_case call_once2
55477dc83faSkamil	atf_add_test_case call_once2_profile
55577dc83faSkamil	atf_add_test_case call_once2_pic
55677dc83faSkamil	atf_add_test_case call_once2_pie
55777dc83faSkamil	atf_add_test_case call_once2_32
55877dc83faSkamil	atf_add_test_case call_once2_static
55977dc83faSkamil	atf_add_test_case call_once2_pic_32
56077dc83faSkamil	atf_add_test_case call_once2_pic_profile
56177dc83faSkamil	atf_add_test_case call_once2_pic_profile_32
56277dc83faSkamil	atf_add_test_case call_once2_profile_32
56377dc83faSkamil}
564