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