t_static_destructor.sh revision 1.2
11.2Skamil# $NetBSD: t_static_destructor.sh,v 1.2 2018/03/24 00:26:51 kamil Exp $ 21.1Skamil# 31.1Skamil# Copyright (c) 2017 The NetBSD Foundation, Inc. 41.1Skamil# All rights reserved. 51.1Skamil# 61.1Skamil# This code is derived from software contributed to The NetBSD Foundation 71.1Skamil# by Kamil Rytarowski. 81.1Skamil# 91.1Skamil# Redistribution and use in source and binary forms, with or without 101.1Skamil# modification, are permitted provided that the following conditions 111.1Skamil# are met: 121.1Skamil# 1. Redistributions of source code must retain the above copyright 131.1Skamil# notice, this list of conditions and the following disclaimer. 141.1Skamil# 2. Redistributions in binary form must reproduce the above copyright 151.1Skamil# notice, this list of conditions and the following disclaimer in the 161.1Skamil# documentation and/or other materials provided with the distribution. 171.1Skamil# 181.1Skamil# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 191.1Skamil# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 201.1Skamil# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 211.1Skamil# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 221.1Skamil# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 231.1Skamil# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 241.1Skamil# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 251.1Skamil# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 261.1Skamil# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 271.1Skamil# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 281.1Skamil# POSSIBILITY OF SUCH DAMAGE. 291.1Skamil# 301.1Skamil 311.1Skamilatf_test_case static_destructor 321.1Skamilstatic_destructor_head() { 331.1Skamil atf_set "descr" "compile and run \"hello world\"" 341.1Skamil atf_set "require.progs" "c++" 351.1Skamil} 361.1Skamil 371.2Skamilatf_test_case static_destructor_profile 381.2Skamilstatic_destructor_profile_head() { 391.2Skamil atf_set "descr" "compile and run \"hello world\" with profiling option" 401.2Skamil atf_set "require.progs" "c++" 411.2Skamil} 421.2Skamil 431.2Skamilatf_test_case static_destructor_static 441.2Skamilstatic_destructor_static_head() { 451.2Skamil atf_set "descr" "compile and run \"hello world\" with static option" 461.2Skamil atf_set "require.progs" "c++" 471.2Skamil} 481.2Skamil 491.1Skamilatf_test_case static_destructor_pic 501.1Skamilstatic_destructor_pic_head() { 511.1Skamil atf_set "descr" "compile and run PIC \"hello world\"" 521.1Skamil atf_set "require.progs" "c++" 531.1Skamil} 541.1Skamil 551.2Skamilatf_test_case static_destructor_pic_32 561.2Skamilstatic_destructor_pic_32_head() { 571.2Skamil atf_set "descr" "compile and run 32-bit PIC \"hello world\"" 581.2Skamil atf_set "require.progs" "c++" 591.2Skamil} 601.2Skamil 611.2Skamilatf_test_case static_destructor_pic_profile 621.2Skamilstatic_destructor_pic_profile_head() { 631.2Skamil atf_set "descr" "compile and run PIC \"hello world\" with profiling option" 641.2Skamil atf_set "require.progs" "c++" 651.2Skamil} 661.2Skamil 671.2Skamilatf_test_case static_destructor_pic_profile_32 681.2Skamilstatic_destructor_pic_profile_32_head() { 691.2Skamil atf_set "descr" "compile and run 32-bit PIC \"hello world\" with profiling option" 701.2Skamil atf_set "require.progs" "c++" 711.2Skamil} 721.2Skamil 731.2Skamilatf_test_case static_destructor_profile_32 741.2Skamilstatic_destructor_profile_32_head() { 751.2Skamil atf_set "descr" "compile and run 32-bit \"hello world\" with profiling option" 761.2Skamil atf_set "require.progs" "c++" 771.2Skamil} 781.2Skamil 791.1Skamilatf_test_case static_destructor_pie 801.1Skamilstatic_destructor_pie_head() { 811.1Skamil atf_set "descr" "compile and run position independent (PIE) \"hello world\"" 821.1Skamil atf_set "require.progs" "c++" 831.1Skamil} 841.1Skamil 851.1Skamilatf_test_case static_destructor32 861.1Skamilstatic_destructor32_head() { 871.1Skamil atf_set "descr" "compile and run \"hello world\" for/in netbsd32 emulation" 881.1Skamil atf_set "require.progs" "c++ file diff cat" 891.1Skamil} 901.1Skamil 911.1Skamilstatic_destructor_body() { 921.1Skamil cat > test.cpp << EOF 931.1Skamil#include <iostream> 941.1Skamilstruct A { 951.1Skamil int i; 961.1Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 971.1Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 981.1Skamil}; 991.1Skamilstruct B { 1001.1Skamil A *m_a; 1011.1Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 1021.1Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 1031.1Skamil}; 1041.1Skamilint main(void) {struct B b;return 0;} 1051.1SkamilEOF 1061.1Skamil atf_check -s exit:0 -o ignore -e ignore c++ -o hello test.cpp 1071.1Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello 1081.1Skamil} 1091.1Skamil 1101.2Skamilstatic_destructor_profile_body() { 1111.2Skamil cat > test.cpp << EOF 1121.2Skamil#include <iostream> 1131.2Skamilstruct A { 1141.2Skamil int i; 1151.2Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 1161.2Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 1171.2Skamil}; 1181.2Skamilstruct B { 1191.2Skamil A *m_a; 1201.2Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 1211.2Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 1221.2Skamil}; 1231.2Skamilint main(void) {struct B b;return 0;} 1241.2SkamilEOF 1251.2Skamil atf_check -s exit:0 -o ignore -e ignore c++ -pg -o hello test.cpp 1261.2Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello 1271.2Skamil} 1281.2Skamil 1291.2Skamilstatic_destructor_profile_32_body() { 1301.2Skamil # check whether this arch is 64bit 1311.2Skamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 1321.2Skamil atf_skip "this is not a 64 bit architecture" 1331.2Skamil fi 1341.2Skamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 1351.2Skamil atf_skip "c++ -m32 not supported on this architecture" 1361.2Skamil else 1371.2Skamil if fgrep -q _LP64 ./def32; then 1381.2Skamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 1391.2Skamil fi 1401.2Skamil fi 1411.2Skamil 1421.2Skamil cat > test.cpp << EOF 1431.2Skamil#include <iostream> 1441.2Skamilstruct A { 1451.2Skamil int i; 1461.2Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 1471.2Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 1481.2Skamil}; 1491.2Skamilstruct B { 1501.2Skamil A *m_a; 1511.2Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 1521.2Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 1531.2Skamil}; 1541.2Skamilint main(void) {struct B b;return 0;} 1551.2SkamilEOF 1561.2Skamil atf_check -s exit:0 -o ignore -e ignore c++ -m32 -pg -o hello test.cpp 1571.2Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello 1581.2Skamil} 1591.2Skamil 1601.2Skamil 1611.2Skamilstatic_destructor_static_body() { 1621.2Skamil cat > test.cpp << EOF 1631.2Skamil#include <iostream> 1641.2Skamilstruct A { 1651.2Skamil int i; 1661.2Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 1671.2Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 1681.2Skamil}; 1691.2Skamilstruct B { 1701.2Skamil A *m_a; 1711.2Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 1721.2Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 1731.2Skamil}; 1741.2Skamilint main(void) {struct B b;return 0;} 1751.2SkamilEOF 1761.2Skamil atf_check -s exit:0 -o ignore -e ignore c++ -static -o hello test.cpp 1771.2Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello 1781.2Skamil} 1791.2Skamil 1801.1Skamilstatic_destructor_pic_body() { 1811.1Skamil cat > test.cpp << EOF 1821.1Skamil#include <cstdlib> 1831.1Skamilint callpic(void); 1841.1Skamilint main(void) {callpic();exit(0);} 1851.1SkamilEOF 1861.1Skamil cat > pic.cpp << EOF 1871.1Skamil#include <iostream> 1881.1Skamilstruct A { 1891.1Skamil int i; 1901.1Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 1911.1Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 1921.1Skamil}; 1931.1Skamilstruct B { 1941.1Skamil A *m_a; 1951.1Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 1961.1Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 1971.1Skamil}; 1981.1Skamilint callpic(void) {struct B b;} 1991.1SkamilEOF 2001.1Skamil 2011.1Skamil atf_check -s exit:0 -o ignore -e ignore \ 2021.1Skamil c++ -fPIC -shared -o libtest.so pic.cpp 2031.1Skamil atf_check -s exit:0 -o ignore -e ignore \ 2041.1Skamil c++ -o hello test.cpp -L. -ltest 2051.1Skamil 2061.1Skamil export LD_LIBRARY_PATH=. 2071.1Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello 2081.1Skamil} 2091.1Skamil 2101.2Skamilstatic_destructor_pic_32_body() { 2111.2Skamil # check whether this arch is 64bit 2121.2Skamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 2131.2Skamil atf_skip "this is not a 64 bit architecture" 2141.2Skamil fi 2151.2Skamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 2161.2Skamil atf_skip "c++ -m32 not supported on this architecture" 2171.2Skamil else 2181.2Skamil if fgrep -q _LP64 ./def32; then 2191.2Skamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 2201.2Skamil fi 2211.2Skamil fi 2221.2Skamil 2231.2Skamil cat > test.cpp << EOF 2241.2Skamil#include <cstdlib> 2251.2Skamilint callpic(void); 2261.2Skamilint main(void) {callpic();exit(0);} 2271.2SkamilEOF 2281.2Skamil cat > pic.cpp << EOF 2291.2Skamil#include <iostream> 2301.2Skamilstruct A { 2311.2Skamil int i; 2321.2Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 2331.2Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 2341.2Skamil}; 2351.2Skamilstruct B { 2361.2Skamil A *m_a; 2371.2Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 2381.2Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 2391.2Skamil}; 2401.2Skamilint callpic(void) {struct B b;} 2411.2SkamilEOF 2421.2Skamil 2431.2Skamil atf_check -s exit:0 -o ignore -e ignore \ 2441.2Skamil c++ -m32 -fPIC -shared -o libtest.so pic.cpp 2451.2Skamil atf_check -s exit:0 -o ignore -e ignore \ 2461.2Skamil c++ -m32 -o hello test.cpp -L. -ltest 2471.2Skamil 2481.2Skamil export LD_LIBRARY_PATH=. 2491.2Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello 2501.2Skamil} 2511.2Skamil 2521.2Skamilstatic_destructor_pic_profile_body() { 2531.2Skamil cat > test.cpp << EOF 2541.2Skamil#include <cstdlib> 2551.2Skamilint callpic(void); 2561.2Skamilint main(void) {callpic();exit(0);} 2571.2SkamilEOF 2581.2Skamil cat > pic.cpp << EOF 2591.2Skamil#include <iostream> 2601.2Skamilstruct A { 2611.2Skamil int i; 2621.2Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 2631.2Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 2641.2Skamil}; 2651.2Skamilstruct B { 2661.2Skamil A *m_a; 2671.2Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 2681.2Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 2691.2Skamil}; 2701.2Skamilint callpic(void) {struct B b;} 2711.2SkamilEOF 2721.2Skamil 2731.2Skamil atf_check -s exit:0 -o ignore -e ignore \ 2741.2Skamil c++ -pg -fPIC -shared -o libtest.so pic.cpp 2751.2Skamil atf_check -s exit:0 -o ignore -e ignore \ 2761.2Skamil c++ -pg -o hello test.cpp -L. -ltest 2771.2Skamil 2781.2Skamil export LD_LIBRARY_PATH=. 2791.2Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello 2801.2Skamil} 2811.2Skamil 2821.2Skamilstatic_destructor_pic_profile_32_body() { 2831.2Skamil # check whether this arch is 64bit 2841.2Skamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 2851.2Skamil atf_skip "this is not a 64 bit architecture" 2861.2Skamil fi 2871.2Skamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 2881.2Skamil atf_skip "c++ -m32 not supported on this architecture" 2891.2Skamil else 2901.2Skamil if fgrep -q _LP64 ./def32; then 2911.2Skamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 2921.2Skamil fi 2931.2Skamil fi 2941.2Skamil 2951.2Skamil cat > test.cpp << EOF 2961.2Skamil#include <cstdlib> 2971.2Skamilint callpic(void); 2981.2Skamilint main(void) {callpic();exit(0);} 2991.2SkamilEOF 3001.2Skamil cat > pic.cpp << EOF 3011.2Skamil#include <iostream> 3021.2Skamilstruct A { 3031.2Skamil int i; 3041.2Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 3051.2Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 3061.2Skamil}; 3071.2Skamilstruct B { 3081.2Skamil A *m_a; 3091.2Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 3101.2Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 3111.2Skamil}; 3121.2Skamilint callpic(void) {struct B b;} 3131.2SkamilEOF 3141.2Skamil 3151.2Skamil atf_check -s exit:0 -o ignore -e ignore \ 3161.2Skamil c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp 3171.2Skamil atf_check -s exit:0 -o ignore -e ignore \ 3181.2Skamil c++ -m32 -pg -o hello test.cpp -L. -ltest 3191.2Skamil 3201.2Skamil export LD_LIBRARY_PATH=. 3211.2Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello 3221.2Skamil} 3231.2Skamil 3241.1Skamilstatic_destructor_pie_body() { 3251.1Skamil # check whether this arch supports -pie 3261.1Skamil if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then 3271.1Skamil atf_skip "c++ -pie not supported on this architecture" 3281.1Skamil fi 3291.1Skamil cat > test.cpp << EOF 3301.1Skamil#include <iostream> 3311.1Skamilstruct A { 3321.1Skamil int i; 3331.1Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 3341.1Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 3351.1Skamil}; 3361.1Skamilstruct B { 3371.1Skamil A *m_a; 3381.1Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 3391.1Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 3401.1Skamil}; 3411.1Skamilint main(void) {struct B b;return 0;} 3421.1SkamilEOF 3431.1Skamil atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o hello test.cpp 3441.1Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello 3451.1Skamil} 3461.1Skamil 3471.1Skamilstatic_destructor32_body() { 3481.1Skamil # check whether this arch is 64bit 3491.1Skamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 3501.1Skamil atf_skip "this is not a 64 bit architecture" 3511.1Skamil fi 3521.1Skamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 3531.1Skamil atf_skip "c++ -m32 not supported on this architecture" 3541.1Skamil else 3551.1Skamil if fgrep -q _LP64 ./def32; then 3561.1Skamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 3571.1Skamil fi 3581.1Skamil fi 3591.1Skamil 3601.1Skamil cat > test.cpp << EOF 3611.1Skamil#include <iostream> 3621.1Skamilstruct A { 3631.1Skamil int i; 3641.1Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 3651.1Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 3661.1Skamil}; 3671.1Skamilstruct B { 3681.1Skamil A *m_a; 3691.1Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 3701.1Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 3711.1Skamil}; 3721.1Skamilint main(void) {struct B b;return 0;} 3731.1SkamilEOF 3741.1Skamil atf_check -s exit:0 -o ignore -e ignore c++ -o hello32 -m32 test.cpp 3751.1Skamil atf_check -s exit:0 -o ignore -e ignore c++ -o hello64 test.cpp 3761.1Skamil file -b ./hello32 > ./ftype32 3771.1Skamil file -b ./hello64 > ./ftype64 3781.1Skamil if diff ./ftype32 ./ftype64 >/dev/null; then 3791.1Skamil atf_fail "generated binaries do not differ" 3801.1Skamil fi 3811.1Skamil echo "32bit binaries on this platform are:" 3821.1Skamil cat ./ftype32 3831.1Skamil echo "While native (64bit) binaries are:" 3841.1Skamil cat ./ftype64 3851.1Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello32 3861.1Skamil 3871.1Skamil # do another test with static 32bit binaries 3881.1Skamil cat > test.cpp << EOF 3891.1Skamil#include <iostream> 3901.1Skamilstruct A { 3911.1Skamil int i; 3921.1Skamil A(int i):i(i){std::cout << "CTOR A" << std::endl;} 3931.1Skamil ~A() {std::cout << "DTOR A:" << i << std::endl;} 3941.1Skamil}; 3951.1Skamilstruct B { 3961.1Skamil A *m_a; 3971.1Skamil B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;} 3981.1Skamil ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;} 3991.1Skamil}; 4001.1Skamilint main(void) {struct B b;return 0;} 4011.1SkamilEOF 4021.1Skamil atf_check -s exit:0 -o ignore -e ignore c++ -o hello -m32 \ 4031.1Skamil -static test.cpp 4041.1Skamil atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello 4051.1Skamil} 4061.1Skamil 4071.1Skamilatf_init_test_cases() 4081.1Skamil{ 4091.1Skamil 4101.1Skamil atf_add_test_case static_destructor 4111.2Skamil atf_add_test_case static_destructor_profile 4121.1Skamil atf_add_test_case static_destructor_pic 4131.1Skamil atf_add_test_case static_destructor_pie 4141.1Skamil atf_add_test_case static_destructor32 4151.2Skamil atf_add_test_case static_destructor_static 4161.2Skamil atf_add_test_case static_destructor_pic_32 4171.2Skamil atf_add_test_case static_destructor_pic_profile 4181.2Skamil atf_add_test_case static_destructor_pic_profile_32 4191.2Skamil atf_add_test_case static_destructor_profile_32 4201.1Skamil} 421