# Tests for ms_abi to sysv_abi calls. # Copyright (C) 2016-2021 Free Software Foundation, Inc. # Contributed by Daniel Santos # # This file is part of GCC. # # GCC is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # GCC is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # Under Section 7 of GPL version 3, you are granted additional # permissions described in the GCC Runtime Library Exception, version # 3.1, as published by the Free Software Foundation. # # You should have received a copy of the GNU General Public License and # a copy of the GCC Runtime Library Exception along with this program; # see the files COPYING3 and COPYING.RUNTIME respectively. If not, see # . load_lib gcc-dg.exp proc host_supports_c++11 {} { global HOSTCXX HOSTCXXFLAGS set pidstr [pid] set src "host_supports_c++11_$pidstr.C" set asm "host_supports_c++11_$pidstr.s" set f [open $src "w"] puts $f "" close $f set cxx "$HOSTCXX $HOSTCXXFLAGS" # Temporarily switch to the environment for the host compiler. restore_ld_library_path_env_vars set status [remote_exec host "$cxx -S $src -std=c++11 -o $asm"] # And switch back. set_ld_library_path_env_vars file delete $src $asm set status [lindex $status 0] if { $status != 0 } { return 0 } return 1 } # Exit immediately if this isn't a native x86_64 target. if { (![istarget x86_64-*-*] && ![istarget i?86-*-*]) || ![is-effective-target lp64] || ![isnative] || ![host_supports_c++11] } then { # Gate "unsupported" message return value of first runtest_file_p call. if [runtest_file_p $runtests "$srcdir/$subdir/ms-sysv.c"] { unsupported "$subdir" } return } proc runtest_ms_sysv { cflags generator_args } { global GCC_UNDER_TEST HOSTCXX HOSTCXXFLAGS tmpdir srcdir subdir \ TEST_ALWAYS_FLAGS runtests set objdir "$tmpdir/ms-sysv" set generator "$tmpdir/ms-sysv-generate.exe" set generated_header "$objdir/ms-sysv-generated.h" set status 0 set warn_flags "-Wall" # Detect when hard frame pointers are enabled (or required) so we know not # to generate bp clobbers. if { [regexp "(^| )-(O0|fno-omit-frame-pointer|p|pg)( |$)" \ "$TEST_ALWAYS_FLAGS $cflags" match] || [istarget *-*-solaris*] } then { set generator_args "$generator_args --omit-rbp-clobbers" } # Add all other flags set escaped_generator_args [regsub -all " " $generator_args "\\ "] set cflags "$cflags\"-DGEN_ARGS=$escaped_generator_args\"" gcc_parallel_test_enable 1 if ![runtest_file_p $runtests "$srcdir/$subdir/ms-sysv.c"] then { return } #verbose "runtest_ms_sysv $cflags" 0 # Make sure there's no previous header file so that we can't accidentally # pass if generation fails. file delete -force $generated_header # Cleanup any previous test in objdir file delete -force $objdir file mkdir $objdir # Build the generator (only needs to be done once). set src "$srcdir/$subdir/gen.cc" if { (![file exists "$generator"]) || ([file mtime "$generator"] < [file mtime "$src"]) } { # Temporarily switch to the environment for the host compiler. restore_ld_library_path_env_vars set cxx "$HOSTCXX $HOSTCXXFLAGS $warn_flags -std=c++11" set status [remote_exec host "$cxx -o $generator $src"] set status [lindex $status 0] set_ld_library_path_env_vars if { $status != 0 } then { warning "Could not build $subdir generator" } } # Generate header if { $status == 0 } then { set status [remote_exec host "$generator $generator_args $generated_header"] set status [lindex $status 0] if { $status != 0 } then { warning "Could not generate $generated_header" } } gcc_parallel_test_enable 0 dg-runtest $srcdir/$subdir/ms-sysv.c "$cflags" "-I$objdir -I$srcdir/$subdir $warn_flags" gcc_parallel_test_enable 1 } dg-init # Standard test parameters. set gen_pcount_opts [list "-p0" "-p1" "-p5"] set base_cflags_arr [list " -O2 " " -O0 -g3 "] foreach gen_opts $gen_pcount_opts { foreach cflags $base_cflags_arr { # Run without -mcall-ms2sysv-xlogues always runtest_ms_sysv "$cflags" "$gen_opts" # Skip unsupported -mcall-ms2sysv-xlogues on Windows if { ![istarget *-*-cygwin*] && ![istarget *-*-mingw*] } { runtest_ms_sysv "-mcall-ms2sysv-xlogues$cflags" "$gen_opts" } } } dg-finish