1 1.7 riastrad # $NetBSD: t_call_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 call_once 29 1.1 kamil call_once_head() { 30 1.1 kamil atf_set "descr" "compile and run std::call_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 call_once_profile 35 1.1 kamil call_once_profile_head() { 36 1.1 kamil atf_set "descr" "compile and run std::call_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 call_once_pic 41 1.1 kamil call_once_pic_head() { 42 1.1 kamil atf_set "descr" "compile and run PIC std::call_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 call_once_pic_32 47 1.1 kamil call_once_pic_32_head() { 48 1.1 kamil atf_set "descr" "compile and run 32-bit PIC std::call_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 call_once_pic_profile 53 1.1 kamil call_once_pic_head() { 54 1.1 kamil atf_set "descr" "compile and run PIC std::call_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 call_once_pic_profile_32 59 1.1 kamil call_once_pic_profile_32_head() { 60 1.1 kamil atf_set "descr" "compile and run 32-bit PIC std::call_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 call_once_profile_32 65 1.1 kamil call_once_profile_32_head() { 66 1.1 kamil atf_set "descr" "compile and run 32-bit std::call_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 call_once_pie 71 1.1 kamil call_once_pie_head() { 72 1.1 kamil atf_set "descr" "compile and run position independent (PIE) std::call_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 call_once_32 77 1.1 kamil call_once_32_head() { 78 1.1 kamil atf_set "descr" "compile and run std::call_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 call_once_static 83 1.1 kamil call_once_static_head() { 84 1.1 kamil atf_set "descr" "compile and run std::call_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 call_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 #include <mutex> 93 1.1 kamil std::once_flag flag; 94 1.1 kamil int main(void) { 95 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 96 1.1 kamil return 0; 97 1.1 kamil } 98 1.1 kamil EOF 99 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -o call_once test.cpp -pthread 100 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once 101 1.1 kamil } 102 1.1 kamil 103 1.1 kamil call_once_profile_body() { 104 1.7 riastrad case `uname -m` in 105 1.7 riastrad riscv) atf_expect_fail "PR port-riscv/59301:" \ 106 1.7 riastrad " riscv: missing MKPROFILE=yes support" 107 1.7 riastrad ;; 108 1.7 riastrad esac 109 1.7 riastrad 110 1.1 kamil cat > test.cpp << EOF 111 1.1 kamil #include <cstdio> 112 1.1 kamil #include <thread> 113 1.1 kamil #include <mutex> 114 1.1 kamil std::once_flag flag; 115 1.1 kamil int main(void) { 116 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 117 1.1 kamil return 0; 118 1.1 kamil } 119 1.1 kamil EOF 120 1.6 skrll atf_check -s exit:0 -o ignore -e ignore c++ -static -pg -o call_once test.cpp -pthread 121 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once 122 1.1 kamil } 123 1.1 kamil 124 1.1 kamil call_once_profile_32_body() { 125 1.1 kamil # check whether this arch is 64bit 126 1.1 kamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 127 1.1 kamil atf_skip "this is not a 64 bit architecture" 128 1.1 kamil fi 129 1.1 kamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 130 1.1 kamil atf_skip "c++ -m32 not supported on this architecture" 131 1.1 kamil else 132 1.1 kamil if fgrep -q _LP64 ./def32; then 133 1.1 kamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 134 1.1 kamil fi 135 1.1 kamil fi 136 1.1 kamil 137 1.7 riastrad case `uname -m` in 138 1.7 riastrad riscv) atf_expect_fail "PR port-riscv/59301:" \ 139 1.7 riastrad " riscv: missing MKPROFILE=yes support" 140 1.7 riastrad ;; 141 1.7 riastrad esac 142 1.7 riastrad 143 1.1 kamil cat > test.cpp << EOF 144 1.1 kamil #include <cstdio> 145 1.1 kamil #include <thread> 146 1.1 kamil #include <mutex> 147 1.1 kamil std::once_flag flag; 148 1.1 kamil int main(void) { 149 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 150 1.1 kamil return 0; 151 1.1 kamil } 152 1.1 kamil EOF 153 1.6 skrll atf_check -s exit:0 -o ignore -e ignore c++ -static -m32 -pg -o call_once test.cpp -pthread 154 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once 155 1.1 kamil } 156 1.1 kamil 157 1.1 kamil call_once_pic_body() { 158 1.1 kamil cat > test.cpp << EOF 159 1.1 kamil #include <stdlib.h> 160 1.1 kamil int callpic(void); 161 1.1 kamil int main(void) {callpic();exit(0);} 162 1.1 kamil EOF 163 1.1 kamil cat > pic.cpp << EOF 164 1.1 kamil #include <cstdio> 165 1.1 kamil #include <thread> 166 1.1 kamil #include <mutex> 167 1.1 kamil std::once_flag flag; 168 1.1 kamil int callpic(void) { 169 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 170 1.1 kamil return 0; 171 1.1 kamil } 172 1.1 kamil EOF 173 1.1 kamil 174 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 175 1.1 kamil c++ -fPIC -shared -o libtest.so pic.cpp 176 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 177 1.1 kamil c++ -o call_once test.cpp -L. -ltest -pthread 178 1.1 kamil 179 1.1 kamil export LD_LIBRARY_PATH=. 180 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once 181 1.1 kamil } 182 1.1 kamil 183 1.1 kamil call_once_pic_32_body() { 184 1.1 kamil # check whether this arch is 64bit 185 1.1 kamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 186 1.1 kamil atf_skip "this is not a 64 bit architecture" 187 1.1 kamil fi 188 1.1 kamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 189 1.1 kamil atf_skip "c++ -m32 not supported on this architecture" 190 1.1 kamil else 191 1.1 kamil if fgrep -q _LP64 ./def32; then 192 1.1 kamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 193 1.1 kamil fi 194 1.1 kamil fi 195 1.1 kamil 196 1.1 kamil cat > test.cpp << EOF 197 1.1 kamil #include <stdlib.h> 198 1.1 kamil int callpic(void); 199 1.1 kamil int main(void) {callpic();exit(0);} 200 1.1 kamil EOF 201 1.1 kamil cat > pic.cpp << EOF 202 1.1 kamil #include <cstdio> 203 1.1 kamil #include <thread> 204 1.1 kamil #include <mutex> 205 1.1 kamil std::once_flag flag; 206 1.1 kamil int callpic(void) { 207 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 208 1.1 kamil return 0; 209 1.1 kamil } 210 1.1 kamil EOF 211 1.1 kamil 212 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 213 1.1 kamil c++ -m32 -fPIC -shared -o libtest.so pic.cpp 214 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 215 1.1 kamil c++ -m32 -o call_once test.cpp -L. -ltest -pthread 216 1.1 kamil 217 1.1 kamil export LD_LIBRARY_PATH=. 218 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once 219 1.1 kamil } 220 1.1 kamil 221 1.1 kamil call_once_pic_profile_body() { 222 1.7 riastrad case `uname -m` in 223 1.7 riastrad riscv) atf_expect_fail "PR port-riscv/59301:" \ 224 1.7 riastrad " riscv: missing MKPROFILE=yes support" 225 1.7 riastrad ;; 226 1.7 riastrad esac 227 1.7 riastrad 228 1.1 kamil cat > test.cpp << EOF 229 1.1 kamil #include <stdlib.h> 230 1.1 kamil int callpic(void); 231 1.1 kamil int main(void) {callpic();exit(0);} 232 1.1 kamil EOF 233 1.1 kamil cat > pic.cpp << EOF 234 1.1 kamil #include <cstdio> 235 1.1 kamil #include <thread> 236 1.1 kamil #include <mutex> 237 1.1 kamil std::once_flag flag; 238 1.1 kamil int callpic(void) { 239 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 240 1.1 kamil return 0; 241 1.1 kamil } 242 1.1 kamil EOF 243 1.1 kamil 244 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 245 1.1 kamil c++ -pg -fPIC -shared -o libtest.so pic.cpp 246 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 247 1.1 kamil c++ -pg -o call_once test.cpp -L. -ltest -pthread 248 1.1 kamil 249 1.1 kamil export LD_LIBRARY_PATH=. 250 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once 251 1.1 kamil } 252 1.1 kamil 253 1.1 kamil call_once_pic_profile_32_body() { 254 1.1 kamil # check whether this arch is 64bit 255 1.1 kamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 256 1.1 kamil atf_skip "this is not a 64 bit architecture" 257 1.1 kamil fi 258 1.1 kamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 259 1.1 kamil atf_skip "c++ -m32 not supported on this architecture" 260 1.1 kamil else 261 1.1 kamil if fgrep -q _LP64 ./def32; then 262 1.1 kamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 263 1.1 kamil fi 264 1.1 kamil fi 265 1.1 kamil 266 1.7 riastrad case `uname -m` in 267 1.7 riastrad riscv) atf_expect_fail "PR port-riscv/59301:" \ 268 1.7 riastrad " riscv: missing MKPROFILE=yes support" 269 1.7 riastrad ;; 270 1.7 riastrad esac 271 1.7 riastrad 272 1.1 kamil cat > test.cpp << EOF 273 1.1 kamil #include <stdlib.h> 274 1.1 kamil int callpic(void); 275 1.1 kamil int main(void) {callpic();exit(0);} 276 1.1 kamil EOF 277 1.1 kamil cat > pic.cpp << EOF 278 1.1 kamil #include <cstdio> 279 1.1 kamil #include <thread> 280 1.1 kamil #include <mutex> 281 1.1 kamil std::once_flag flag; 282 1.1 kamil int callpic(void) { 283 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 284 1.1 kamil return 0; 285 1.1 kamil } 286 1.1 kamil EOF 287 1.1 kamil 288 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 289 1.1 kamil c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp 290 1.1 kamil atf_check -s exit:0 -o ignore -e ignore \ 291 1.1 kamil c++ -m32 -pg -o call_once test.cpp -L. -ltest -pthread 292 1.1 kamil 293 1.1 kamil export LD_LIBRARY_PATH=. 294 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once 295 1.1 kamil } 296 1.1 kamil 297 1.1 kamil call_once_pie_body() { 298 1.1 kamil # check whether this arch supports -pie 299 1.1 kamil if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then 300 1.1 kamil atf_skip "c++ -pie not supported on this architecture" 301 1.1 kamil fi 302 1.1 kamil cat > test.cpp << EOF 303 1.1 kamil #include <cstdio> 304 1.1 kamil #include <thread> 305 1.1 kamil #include <mutex> 306 1.1 kamil std::once_flag flag; 307 1.1 kamil int main(void) { 308 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 309 1.1 kamil return 0; 310 1.1 kamil } 311 1.1 kamil EOF 312 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o call_once test.cpp -pthread 313 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once 314 1.1 kamil } 315 1.1 kamil 316 1.1 kamil call_once_32_body() { 317 1.1 kamil # check whether this arch is 64bit 318 1.1 kamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 319 1.1 kamil atf_skip "this is not a 64 bit architecture" 320 1.1 kamil fi 321 1.1 kamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 322 1.1 kamil atf_skip "c++ -m32 not supported on this architecture" 323 1.1 kamil else 324 1.1 kamil if fgrep -q _LP64 ./def32; then 325 1.1 kamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 326 1.1 kamil fi 327 1.1 kamil fi 328 1.1 kamil 329 1.1 kamil cat > test.cpp << EOF 330 1.1 kamil #include <cstdio> 331 1.1 kamil #include <thread> 332 1.1 kamil #include <mutex> 333 1.1 kamil std::once_flag flag; 334 1.1 kamil int main(void) { 335 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 336 1.1 kamil return 0; 337 1.1 kamil } 338 1.1 kamil EOF 339 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -o call_once_32 -m32 test.cpp -pthread 340 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -o call_once_64 test.cpp -pthread 341 1.1 kamil file -b ./call_once_32 > ./ftype32 342 1.1 kamil file -b ./call_once_64 > ./ftype64 343 1.1 kamil if diff ./ftype32 ./ftype64 >/dev/null; then 344 1.1 kamil atf_fail "generated binaries do not differ" 345 1.1 kamil fi 346 1.1 kamil echo "32bit binaries on this platform are:" 347 1.1 kamil cat ./ftype32 348 1.1 kamil echo "While native (64bit) binaries are:" 349 1.1 kamil cat ./ftype64 350 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once_32 351 1.1 kamil 352 1.1 kamil # do another test with static 32bit binaries 353 1.1 kamil cat > test.cpp << EOF 354 1.1 kamil #include <cstdio> 355 1.1 kamil #include <thread> 356 1.1 kamil #include <mutex> 357 1.1 kamil std::once_flag flag; 358 1.1 kamil int main(void) { 359 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 360 1.1 kamil return 0; 361 1.1 kamil } 362 1.1 kamil EOF 363 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -o call_once -m32 -pthread \ 364 1.1 kamil -static test.cpp 365 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once 366 1.1 kamil } 367 1.1 kamil 368 1.1 kamil call_once_static_body() { 369 1.1 kamil cat > test.cpp << EOF 370 1.1 kamil #include <cstdio> 371 1.1 kamil #include <thread> 372 1.1 kamil #include <mutex> 373 1.1 kamil std::once_flag flag; 374 1.1 kamil int main(void) { 375 1.1 kamil std::call_once(flag, [](){ printf("hello, world!\n"); }); 376 1.1 kamil return 0; 377 1.1 kamil } 378 1.1 kamil EOF 379 1.1 kamil atf_check -s exit:0 -o ignore -e ignore c++ -static -o call_once test.cpp -pthread 380 1.1 kamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once 381 1.1 kamil } 382 1.1 kamil 383 1.1 kamil atf_init_test_cases() 384 1.1 kamil { 385 1.1 kamil 386 1.1 kamil atf_add_test_case call_once 387 1.1 kamil atf_add_test_case call_once_profile 388 1.1 kamil atf_add_test_case call_once_pic 389 1.1 kamil atf_add_test_case call_once_pie 390 1.1 kamil atf_add_test_case call_once_32 391 1.1 kamil atf_add_test_case call_once_static 392 1.1 kamil atf_add_test_case call_once_pic_32 393 1.1 kamil atf_add_test_case call_once_pic_profile 394 1.1 kamil atf_add_test_case call_once_pic_profile_32 395 1.1 kamil atf_add_test_case call_once_profile_32 396 1.1 kamil } 397