1 1.7 riastrad # $NetBSD: t_pthread_once.sh,v 1.7 2025/04/16 01:52:42 riastradh Exp $ 2 1.1 kamil # 3 1.1 kamil # Copyright (c) 2018 The NetBSD Foundation, Inc. 4 1.1 kamil # All rights reserved. 5 1.1 kamil # 6 1.1 kamil # Redistribution and use in source and binary forms, with or without 7 1.1 kamil # modification, are permitted provided that the following conditions 8 1.1 kamil # are met: 9 1.1 kamil # 1. Redistributions of source code must retain the above copyright 10 1.1 kamil # notice, this list of conditions and the following disclaimer. 11 1.1 kamil # 2. Redistributions in binary form must reproduce the above copyright 12 1.1 kamil # notice, this list of conditions and the following disclaimer in the 13 1.1 kamil # documentation and/or other materials provided with the distribution. 14 1.1 kamil # 15 1.1 kamil # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16 1.1 kamil # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17 1.1 kamil # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 1.1 kamil # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 1.1 kamil # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 1.1 kamil # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 1.1 kamil # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 1.1 kamil # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 1.1 kamil # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 1.1 kamil # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 1.1 kamil # POSSIBILITY OF SUCH DAMAGE. 26 1.1 kamil # 27 1.1 kamil 28 1.1 kamil atf_test_case pthread_once 29 1.1 kamil pthread_once_head() { 30 1.1 kamil atf_set "descr" "compile and run std::pthread_once" 31 1.1 kamil atf_set "require.progs" "c++" 32 1.1 kamil } 33 1.1 kamil 34 1.1 kamil atf_test_case pthread_once_profile 35 1.1 kamil pthread_once_profile_head() { 36 1.1 kamil atf_set "descr" "compile and run std::pthread_once with profiling option" 37 1.1 kamil atf_set "require.progs" "c++" 38 1.1 kamil } 39 1.1 kamil 40 1.1 kamil atf_test_case pthread_once_pic 41 1.1 kamil pthread_once_pic_head() { 42 1.1 kamil atf_set "descr" "compile and run PIC std::pthread_once" 43 1.1 kamil atf_set "require.progs" "c++" 44 1.1 kamil } 45 1.1 kamil 46 1.1 kamil atf_test_case pthread_once_pic_32 47 1.1 kamil pthread_once_pic_32_head() { 48 1.1 kamil atf_set "descr" "compile and run 32-bit PIC std::pthread_once" 49 1.1 kamil atf_set "require.progs" "c++" 50 1.1 kamil } 51 1.1 kamil 52 1.1 kamil atf_test_case pthread_once_pic_profile 53 1.1 kamil pthread_once_pic_head() { 54 1.1 kamil atf_set "descr" "compile and run PIC std::pthread_once with profiling &flag" 55 1.1 kamil atf_set "require.progs" "c++" 56 1.1 kamil } 57 1.1 kamil 58 1.1 kamil atf_test_case pthread_once_pic_profile_32 59 1.1 kamil pthread_once_pic_profile_32_head() { 60 1.1 kamil atf_set "descr" "compile and run 32-bit PIC std::pthread_once with profiling &flag" 61 1.1 kamil atf_set "require.progs" "c++" 62 1.1 kamil } 63 1.1 kamil 64 1.1 kamil atf_test_case pthread_once_profile_32 65 1.1 kamil pthread_once_profile_32_head() { 66 1.1 kamil atf_set "descr" "compile and run 32-bit std::pthread_once with profiling &flag" 67 1.1 kamil atf_set "require.progs" "c++" 68 1.1 kamil } 69 1.1 kamil 70 1.1 kamil atf_test_case pthread_once_pie 71 1.1 kamil pthread_once_pie_head() { 72 1.1 kamil atf_set "descr" "compile and run position independent (PIE) std::pthread_once" 73 1.1 kamil atf_set "require.progs" "c++" 74 1.1 kamil } 75 1.1 kamil 76 1.1 kamil atf_test_case pthread_once_32 77 1.1 kamil pthread_once_32_head() { 78 1.1 kamil atf_set "descr" "compile and run std::pthread_once for/in netbsd32 emulation" 79 1.1 kamil atf_set "require.progs" "c++ file diff cat" 80 1.1 kamil } 81 1.1 kamil 82 1.1 kamil atf_test_case pthread_once_static 83 1.1 kamil pthread_once_static_head() { 84 1.1 kamil atf_set "descr" "compile and run std::pthread_once with static &flag" 85 1.1 kamil atf_set "require.progs" "c++" 86 1.1 kamil } 87 1.1 kamil 88 1.1 kamil pthread_once_body() { 89 1.1 kamil cat > test.cpp << EOF 90 1.1 kamil #include <cstdio> 91 1.1 kamil #include <thread> 92 1.1 kamil int main(void) { 93 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 94 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 95 1.1 kamil return 0; 96 1.1 kamil } 97 1.1 kamil EOF 98 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once test.cpp -pthread 99 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once 100 1.1 kamil } 101 1.1 kamil 102 1.1 kamil pthread_once_profile_body() { 103 1.7 riastrad case `uname -m` in 104 1.7 riastrad riscv) atf_expect_fail "PR port-riscv/59301:" \ 105 1.7 riastrad " riscv: missing MKPROFILE=yes support" 106 1.7 riastrad ;; 107 1.7 riastrad esac 108 1.7 riastrad 109 1.1 kamil cat > test.cpp << EOF 110 1.1 kamil #include <cstdio> 111 1.1 kamil #include <thread> 112 1.1 kamil int main(void) { 113 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 114 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 115 1.1 kamil return 0; 116 1.1 kamil } 117 1.1 kamil EOF 118 1.6 skrll atf_check -s exit:0 -o ignore -e ignore c++ -static -pg -o pthread_once test.cpp -pthread 119 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once 120 1.1 kamil } 121 1.1 kamil 122 1.1 kamil pthread_once_profile_32_body() { 123 1.1 kamil # check whether this arch is 64bit 124 1.1 kamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 125 1.1 kamil atf_skip "this is not a 64 bit architecture" 126 1.1 kamil fi 127 1.1 kamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 128 1.1 kamil atf_skip "c++ -m32 not supported on this architecture" 129 1.1 kamil else 130 1.1 kamil if fgrep -q _LP64 ./def32; then 131 1.1 kamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 132 1.1 kamil fi 133 1.1 kamil fi 134 1.1 kamil 135 1.7 riastrad case `uname -m` in 136 1.7 riastrad riscv) atf_expect_fail "PR port-riscv/59301:" \ 137 1.7 riastrad " riscv: missing MKPROFILE=yes support" 138 1.7 riastrad ;; 139 1.7 riastrad esac 140 1.7 riastrad 141 1.1 kamil cat > test.cpp << EOF 142 1.1 kamil #include <cstdio> 143 1.1 kamil #include <thread> 144 1.1 kamil int main(void) { 145 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 146 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 147 1.1 kamil return 0; 148 1.1 kamil } 149 1.1 kamil EOF 150 1.6 skrll atf_check -s exit:0 -o ignore -e ignore c++ -static -m32 -pg -o pthread_once test.cpp -pthread 151 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once 152 1.1 kamil } 153 1.1 kamil 154 1.1 kamil pthread_once_pic_body() { 155 1.1 kamil cat > test.cpp << EOF 156 1.1 kamil #include <stdlib.h> 157 1.1 kamil int callpic(void); 158 1.1 kamil int main(void) {callpic();exit(0);} 159 1.1 kamil EOF 160 1.1 kamil cat > pic.cpp << EOF 161 1.1 kamil #include <cstdio> 162 1.1 kamil #include <thread> 163 1.1 kamil int callpic(void) { 164 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 165 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 166 1.1 kamil return 0; 167 1.1 kamil } 168 1.1 kamil EOF 169 1.1 kamil 170 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 171 1.1 kamil c++ -fPIC -shared -o libtest.so pic.cpp 172 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 173 1.1 kamil c++ -o pthread_once test.cpp -L. -ltest -pthread 174 1.1 kamil 175 1.1 kamil export LD_LIBRARY_PATH=. 176 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once 177 1.1 kamil } 178 1.1 kamil 179 1.1 kamil pthread_once_pic_32_body() { 180 1.1 kamil # check whether this arch is 64bit 181 1.1 kamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 182 1.1 kamil atf_skip "this is not a 64 bit architecture" 183 1.1 kamil fi 184 1.1 kamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 185 1.1 kamil atf_skip "c++ -m32 not supported on this architecture" 186 1.1 kamil else 187 1.1 kamil if fgrep -q _LP64 ./def32; then 188 1.1 kamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 189 1.1 kamil fi 190 1.1 kamil fi 191 1.1 kamil 192 1.1 kamil cat > test.cpp << EOF 193 1.1 kamil #include <stdlib.h> 194 1.1 kamil int callpic(void); 195 1.1 kamil int main(void) {callpic();exit(0);} 196 1.1 kamil EOF 197 1.1 kamil cat > pic.cpp << EOF 198 1.1 kamil #include <cstdio> 199 1.1 kamil #include <thread> 200 1.1 kamil int callpic(void) { 201 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 202 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 203 1.1 kamil return 0; 204 1.1 kamil } 205 1.1 kamil EOF 206 1.1 kamil 207 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 208 1.1 kamil c++ -m32 -fPIC -shared -o libtest.so pic.cpp 209 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 210 1.1 kamil c++ -m32 -o pthread_once test.cpp -L. -ltest -pthread 211 1.1 kamil 212 1.1 kamil export LD_LIBRARY_PATH=. 213 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once 214 1.1 kamil } 215 1.1 kamil 216 1.1 kamil pthread_once_pic_profile_body() { 217 1.7 riastrad case `uname -m` in 218 1.7 riastrad riscv) atf_expect_fail "PR port-riscv/59301:" \ 219 1.7 riastrad " riscv: missing MKPROFILE=yes support" 220 1.7 riastrad ;; 221 1.7 riastrad esac 222 1.7 riastrad 223 1.1 kamil cat > test.cpp << EOF 224 1.1 kamil #include <stdlib.h> 225 1.1 kamil int callpic(void); 226 1.1 kamil int main(void) {callpic();exit(0);} 227 1.1 kamil EOF 228 1.1 kamil cat > pic.cpp << EOF 229 1.1 kamil #include <cstdio> 230 1.1 kamil #include <thread> 231 1.1 kamil int callpic(void) { 232 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 233 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 234 1.1 kamil return 0; 235 1.1 kamil } 236 1.1 kamil EOF 237 1.1 kamil 238 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 239 1.1 kamil c++ -pg -fPIC -shared -o libtest.so pic.cpp 240 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 241 1.1 kamil c++ -pg -o pthread_once test.cpp -L. -ltest -pthread 242 1.1 kamil 243 1.1 kamil export LD_LIBRARY_PATH=. 244 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once 245 1.1 kamil } 246 1.1 kamil 247 1.1 kamil pthread_once_pic_profile_32_body() { 248 1.1 kamil # check whether this arch is 64bit 249 1.1 kamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 250 1.1 kamil atf_skip "this is not a 64 bit architecture" 251 1.1 kamil fi 252 1.1 kamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 253 1.1 kamil atf_skip "c++ -m32 not supported on this architecture" 254 1.1 kamil else 255 1.1 kamil if fgrep -q _LP64 ./def32; then 256 1.1 kamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 257 1.1 kamil fi 258 1.1 kamil fi 259 1.1 kamil 260 1.7 riastrad case `uname -m` in 261 1.7 riastrad riscv) atf_expect_fail "PR port-riscv/59301:" \ 262 1.7 riastrad " riscv: missing MKPROFILE=yes support" 263 1.7 riastrad ;; 264 1.7 riastrad esac 265 1.7 riastrad 266 1.1 kamil cat > test.cpp << EOF 267 1.1 kamil #include <stdlib.h> 268 1.1 kamil int callpic(void); 269 1.1 kamil int main(void) {callpic();exit(0);} 270 1.1 kamil EOF 271 1.1 kamil cat > pic.cpp << EOF 272 1.1 kamil #include <cstdio> 273 1.1 kamil #include <thread> 274 1.1 kamil int callpic(void) { 275 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 276 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 277 1.1 kamil return 0; 278 1.1 kamil } 279 1.1 kamil EOF 280 1.1 kamil 281 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 282 1.1 kamil c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp 283 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 284 1.1 kamil c++ -m32 -pg -o pthread_once test.cpp -L. -ltest -pthread 285 1.1 kamil 286 1.1 kamil export LD_LIBRARY_PATH=. 287 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once 288 1.1 kamil } 289 1.1 kamil 290 1.1 kamil pthread_once_pie_body() { 291 1.1 kamil # check whether this arch supports -pie 292 1.1 kamil if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then 293 1.1 kamil atf_skip "c++ -pie not supported on this architecture" 294 1.1 kamil fi 295 1.1 kamil cat > test.cpp << EOF 296 1.1 kamil #include <cstdio> 297 1.1 kamil #include <thread> 298 1.1 kamil int main(void) { 299 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 300 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 301 1.1 kamil return 0; 302 1.1 kamil } 303 1.1 kamil EOF 304 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o pthread_once test.cpp -pthread 305 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once 306 1.1 kamil } 307 1.1 kamil 308 1.1 kamil pthread_once_32_body() { 309 1.1 kamil # check whether this arch is 64bit 310 1.1 kamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 311 1.1 kamil atf_skip "this is not a 64 bit architecture" 312 1.1 kamil fi 313 1.1 kamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 314 1.1 kamil atf_skip "c++ -m32 not supported on this architecture" 315 1.1 kamil else 316 1.1 kamil if fgrep -q _LP64 ./def32; then 317 1.1 kamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 318 1.1 kamil fi 319 1.1 kamil fi 320 1.1 kamil 321 1.1 kamil cat > test.cpp << EOF 322 1.1 kamil #include <cstdio> 323 1.1 kamil #include <thread> 324 1.1 kamil int main(void) { 325 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 326 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 327 1.1 kamil return 0; 328 1.1 kamil } 329 1.1 kamil EOF 330 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once_32 -m32 test.cpp -pthread 331 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once_64 test.cpp -pthread 332 1.1 kamil file -b ./pthread_once_32 > ./ftype32 333 1.1 kamil file -b ./pthread_once_64 > ./ftype64 334 1.1 kamil if diff ./ftype32 ./ftype64 >/dev/null; then 335 1.1 kamil atf_fail "generated binaries do not differ" 336 1.1 kamil fi 337 1.1 kamil echo "32bit binaries on this platform are:" 338 1.1 kamil cat ./ftype32 339 1.1 kamil echo "While native (64bit) binaries are:" 340 1.1 kamil cat ./ftype64 341 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once_32 342 1.1 kamil 343 1.1 kamil # do another test with static 32bit binaries 344 1.1 kamil cat > test.cpp << EOF 345 1.1 kamil #include <cstdio> 346 1.1 kamil #include <thread> 347 1.1 kamil int main(void) { 348 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 349 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 350 1.1 kamil return 0; 351 1.1 kamil } 352 1.1 kamil EOF 353 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -o pthread_once -m32 -pthread \ 354 1.1 kamil -static test.cpp 355 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once 356 1.1 kamil } 357 1.1 kamil 358 1.1 kamil pthread_once_static_body() { 359 1.1 kamil cat > test.cpp << EOF 360 1.1 kamil #include <cstdio> 361 1.1 kamil #include <thread> 362 1.1 kamil int main(void) { 363 1.1 kamil pthread_once_t flag = PTHREAD_ONCE_INIT; 364 1.1 kamil pthread_once(&flag, [](){ printf("hello, world!\n"); }); 365 1.1 kamil return 0; 366 1.1 kamil } 367 1.1 kamil EOF 368 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -static -o pthread_once test.cpp -pthread 369 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./pthread_once 370 1.1 kamil } 371 1.1 kamil 372 1.1 kamil atf_init_test_cases() 373 1.1 kamil { 374 1.1 kamil 375 1.1 kamil atf_add_test_case pthread_once 376 1.1 kamil atf_add_test_case pthread_once_profile 377 1.1 kamil atf_add_test_case pthread_once_pic 378 1.1 kamil atf_add_test_case pthread_once_pie 379 1.1 kamil atf_add_test_case pthread_once_32 380 1.1 kamil atf_add_test_case pthread_once_static 381 1.1 kamil atf_add_test_case pthread_once_pic_32 382 1.1 kamil atf_add_test_case pthread_once_pic_profile 383 1.1 kamil atf_add_test_case pthread_once_pic_profile_32 384 1.1 kamil atf_add_test_case pthread_once_profile_32 385 1.1 kamil } 386