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