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