diff options
author | Bernd Schmidt <bernd.schmidt@analog.com> | 2006-02-06 16:36:35 +0000 |
---|---|---|
committer | Bernd Schmidt <bernd.schmidt@analog.com> | 2006-02-06 16:36:35 +0000 |
commit | b3d13cd7ae392041004db6b9bf5098372048c00e (patch) | |
tree | 2adf45987dc9f88c26eeb95b0071647ebb5c87ec /gcc/testsuite/lib | |
parent | 337db89251de80f8ff7a00b2d71bc333c630b6e4 (diff) |
Merge reload-branch up to revision 101000reload-branch
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/reload-branch@110651 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/lib')
-rw-r--r-- | gcc/testsuite/lib/gcc-dg.exp | 40 | ||||
-rw-r--r-- | gcc/testsuite/lib/gfortran.exp | 2 | ||||
-rw-r--r-- | gcc/testsuite/lib/obj-c++-dg.exp | 28 | ||||
-rw-r--r-- | gcc/testsuite/lib/obj-c++.exp | 366 | ||||
-rw-r--r-- | gcc/testsuite/lib/profopt.exp | 133 | ||||
-rw-r--r-- | gcc/testsuite/lib/target-supports.exp | 46 |
6 files changed, 594 insertions, 21 deletions
diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp index bcc803c57f5..ab2f18992af 100644 --- a/gcc/testsuite/lib/gcc-dg.exp +++ b/gcc/testsuite/lib/gcc-dg.exp @@ -307,8 +307,8 @@ proc remove-build-file { pat } { # Remove compiler-generated coverage files for the current test. proc cleanup-coverage-files { } { - # This assumes that we are two frames down from dg-test, and that - # it still stores the filename of the testcase in a local variable "name". + # This assumes that we are two frames down from dg-test or some other proc + # that stores the filename of the testcase in a local variable "name". # A cleaner solution would require a new DejaGnu release. upvar 2 name testcase remove-build-file "[file rootname [file tail $testcase]].gc??" @@ -323,8 +323,8 @@ proc cleanup-coverage-files { } { # Remove compiler-generated files from -repo for the current test. proc cleanup-repo-files { } { - # This assumes that we are two frames down from dg-test, and that - # it still stores the filename of the testcase in a local variable "name". + # This assumes that we are two frames down from dg-test or some other proc + # that stores the filename of the testcase in a local variable "name". # A cleaner solution would require a new DejaGnu release. upvar 2 name testcase remove-build-file "[file rootname [file tail $testcase]].o" @@ -343,8 +343,8 @@ proc cleanup-repo-files { } { # # SUFFIX is the filename suffix pattern. proc cleanup-rtl-dump { suffix } { - # This assumes that we are two frames down from dg-test, and that - # it still stores the filename of the testcase in a local variable "name". + # This assumes that we are two frames down from dg-test or some other proc + # that stores the filename of the testcase in a local variable "name". # A cleaner solution would require a new DejaGnu release. upvar 2 name testcase remove-build-file "[file tail $testcase].??.$suffix" @@ -361,9 +361,9 @@ proc cleanup-rtl-dump { suffix } { # # SUFFIX is the file suffix pattern. proc cleanup-tree-dump { suffix } { - # This assumes that we are two frames down from dg-test, and that - # it still stores the filename of the testcase in a local variable "name". - # A cleaner solution would require a new dejagnu release. + # This assumes that we are two frames down from dg-test or some other proc + # that stores the filename of the testcase in a local variable "name". + # A cleaner solution would require a new DejaGnu release. upvar 2 name testcase remove-build-file "[file tail $testcase].t??.$suffix" @@ -375,6 +375,24 @@ proc cleanup-tree-dump { suffix } { } } +# Remove a specific ipa dump file for the current test. +# +# SUFFIX is the file suffix pattern. +proc cleanup-ipa-dump { suffix } { + # This assumes that we are two frames down from dg-test or some other proc + # that stores the filename of the testcase in a local variable "name". + # A cleaner solution would require a new DejaGnu release. + upvar 2 name testcase + remove-build-file "[file tail $testcase].i??.$suffix" + + # Clean up dump files for additional source files. + if [info exists additional_sources] { + foreach srcfile $additional_sources { + remove-build-file "[file tail $srcfile].i??.$suffix" + } + } +} + # Remove files kept by --save-temps for the current test. # # Currently this is only .i files, but more can be added if there are @@ -382,8 +400,8 @@ proc cleanup-tree-dump { suffix } { proc cleanup-saved-temps { } { global additional_sources - # This assumes that we are two frames down from dg-test, and that - # it still stores the filename of the testcase in a local variable "name". + # This assumes that we are two frames down from dg-test or some other proc + # that stores the filename of the testcase in a local variable "name". # A cleaner solution would require a new DejaGnu release. upvar 2 name testcase remove-build-file "[file rootname [file tail $testcase]].ii" diff --git a/gcc/testsuite/lib/gfortran.exp b/gcc/testsuite/lib/gfortran.exp index 43a104e1f51..850df4f0f03 100644 --- a/gcc/testsuite/lib/gfortran.exp +++ b/gcc/testsuite/lib/gfortran.exp @@ -188,6 +188,6 @@ proc gfortran_target_compile { source dest type options } { lappend options "compiler=$GFORTRAN_UNDER_TEST" set options [concat "$ALWAYS_GFORTRANFLAGS" $options] - + set options [dg-additional-files-options $options $source] return [target_compile $source $dest $type $options] } diff --git a/gcc/testsuite/lib/obj-c++-dg.exp b/gcc/testsuite/lib/obj-c++-dg.exp new file mode 100644 index 00000000000..a6d14b72c1e --- /dev/null +++ b/gcc/testsuite/lib/obj-c++-dg.exp @@ -0,0 +1,28 @@ +# Copyright (C) 2004 Free Software Foundation, Inc. + +# This program 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 2 of the License, or +# (at your option) any later version. +# +# This program 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Define obj-c++ callbacks for dg.exp. + +load_lib gcc-dg.exp + +proc obj-c++-dg-test { prog do_what extra_tool_flags } { + return [gcc-dg-test-1 obj-c++_target_compile $prog $do_what $extra_tool_flags] +} + + +proc obj-c++-dg-prune { system text } { + return [gcc-dg-prune $system $text] +} diff --git a/gcc/testsuite/lib/obj-c++.exp b/gcc/testsuite/lib/obj-c++.exp new file mode 100644 index 00000000000..e88e011bb2c --- /dev/null +++ b/gcc/testsuite/lib/obj-c++.exp @@ -0,0 +1,366 @@ +# Copyright (C) 2004 Free Software Foundation, Inc. + +# This program 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 2 of the License, or +# (at your option) any later version. +# +# This program 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# This file was written by Rob Savoye (rob@cygnus.com) +# Many modifications by Jeffrey Wheat (cassidy@cygnus.com) +# With modifications by Mike Stump <mrs@cygnus.com>. + +# +# obj-c++ support library routines +# +load_lib prune.exp +load_lib gcc-defs.exp + +# +# OBJCXX_UNDER_TEST is the compiler under test. +# + + +set gpp_compile_options "" + +# +# obj-c++_version -- extract and print the version number of the compiler +# + +proc obj-c++_version { } { + global OBJCXX_UNDER_TEST + + obj-c++_init + + # ignore any arguments after the command + set compiler [lindex $OBJCXX_UNDER_TEST 0] + + # verify that the compiler exists + if { [is_remote host] || [which $compiler] != 0 } then { + set tmp [remote_exec host "$compiler -v"] + set status [lindex $tmp 0]; + set output [lindex $tmp 1]; + regexp " version \[^\n\r\]*" $output version + if { $status == 0 && [info exists version] } then { + if [is_remote host] { + clone_output "$compiler $version\n" + } else { + clone_output "[which $compiler] $version\n" + } + } else { + clone_output "Couldn't determine version of [which $compiler]\n" + } + } else { + # compiler does not exist (this should have already been detected) + warning "$compiler does not exist" + } +} + +# +# obj-c++_include_flags -- provide new version of obj-c++_include_flags +# (originally from libgloss.exp) which knows about the gcc tree structure +# +proc obj-c++_include_flags { paths } { + global srcdir + global HAVE_LIBSTDCXX_V3 + global TESTING_IN_BUILD_TREE + + set flags "" + + if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } { + return "${flags}" + } + + set gccpath ${paths} + + set odir [lookfor_file ${gccpath} libstdc++-v3] + if { ${odir} != "" } { + append flags [exec sh ${odir}/scripts/testsuite_flags --build-includes] + } + + return "$flags" +} + +# +# obj-c++_link_flags -- provide new version of obj-c++_link_flags +# (originally from libgloss.exp) which knows about the gcc tree structure +# + +proc obj-c++_link_flags { paths } { + global rootme + global srcdir + global ld_library_path + global OBJCXX_UNDER_TEST + + set gccpath ${paths} + set libio_dir "" + set flags "" + set ld_library_path "." + + if { $gccpath != "" } { + if [file exists "${gccpath}/lib/libstdc++.a"] { + append ld_library_path ":${gccpath}/lib" + } + if [file exists "${gccpath}/libg++/libg++.a"] { + append flags "-L${gccpath}/libg++ " + append ld_library_path ":${gccpath}/libg++" + } + if [file exists "${gccpath}/libstdc++/libstdc++.a"] { + append flags "-L${gccpath}/libstdc++ " + append ld_library_path ":${gccpath}/libstdc++" + } + if [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.a"] { + append flags " -L${gccpath}/libstdc++-v3/src/.libs " + append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs" + } + if [file exists "${gccpath}/libiberty/libiberty.a"] { + append flags "-L${gccpath}/libiberty " + } + if [file exists "${gccpath}/librx/librx.a"] { + append flags "-L${gccpath}/librx " + } + append ld_library_path ":${rootme}" + set compiler [lindex $OBJCXX_UNDER_TEST 0] + if { [is_remote host] == 0 && [which $compiler] != 0 } { + foreach i "[exec $compiler --print-multi-lib]" { + set mldir "" + regexp -- "\[a-z0-9=/\.-\]*;" $i mldir + set mldir [string trimright $mldir "\;@"] + if { "$mldir" == "." } { + continue + } + if { [llength [glob -nocomplain ${rootme}/${mldir}/libgcc_s*.so.*]] == 1 } { + append ld_library_path ":${rootme}/${mldir}" + } + } + } + } else { + global tool_root_dir; + + set libgpp [lookfor_file ${tool_root_dir} libg++]; + if { $libgpp != "" } { + append flags "-L${libgpp} "; + append ld_library_path ":${libgpp}" + } + set libstdcpp [lookfor_file ${tool_root_dir} libstdc++]; + if { $libstdcpp != "" } { + append flags "-L${libstdcpp} "; + append ld_library_path ":${libstdcpp}" + } + set libiberty [lookfor_file ${tool_root_dir} libiberty]; + if { $libiberty != "" } { + append flags "-L${libiberty} "; + } + set librx [lookfor_file ${tool_root_dir} librx]; + if { $librx != "" } { + append flags "-L${librx} "; + } + } + + # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but + # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH + # (for the 64-bit ABI). The right way to do this would be to modify + # unix.exp -- but that's not an option since it's part of DejaGNU + # proper, so we do it here. + # The same applies to Darwin (DYLD_LIBRARY_PATH), Solaris 32 bit + # (LD_LIBRARY_PATH_32), Solaris 64 bit (LD_LIBRARY_PATH_64), and HP-UX + # (SHLIB_PATH). + # Doing this does cause trouble when testing cross-compilers. + if {![is_remote target]} { + global env; + if [info exists env(LD_LIBRARY_PATH)] { + # If we've already added these directories once, keep the + # existing path. + if {$ld_library_path == $env(LD_LIBRARY_PATH) + || [string first $ld_library_path: \ + $env(LD_LIBRARY_PATH)] == 0} { + set ld_library_path $env(LD_LIBRARY_PATH) + } elseif { $env(LD_LIBRARY_PATH) != "" } { + append ld_library_path ":$env(LD_LIBRARY_PATH)" + } + } + setenv LD_LIBRARY_PATH $ld_library_path + setenv SHLIB_PATH $ld_library_path + setenv LD_LIBRARYN32_PATH $ld_library_path + setenv LD_LIBRARY64_PATH $ld_library_path + setenv LD_LIBRARY_PATH_32 $ld_library_path + setenv LD_LIBRARY_PATH_64 $ld_library_path + setenv DYLD_LIBRARY_PATH $ld_library_path + } + + return "$flags" +} + +# +# obj-c++_init -- called at the start of each subdir of tests +# + +proc obj-c++_init { args } { + global subdir + global gpp_initialized + global base_dir + global tmpdir + global libdir + global gluefile wrap_flags; + global objdir srcdir + global ALWAYS_OBJCXXFLAGS + global TOOL_EXECUTABLE TOOL_OPTIONS + global OBJCXX_UNDER_TEST + global TESTING_IN_BUILD_TREE + global target_triplet + + if ![info exists OBJCXX_UNDER_TEST] then { + if [info exists TOOL_EXECUTABLE] { + set OBJCXX_UNDER_TEST $TOOL_EXECUTABLE; + } else { + if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } { + set OBJCXX_UNDER_TEST [transform c++] + } else { + set OBJCXX_UNDER_TEST [findfile $base_dir/../g++ "$base_dir/../g++ -B$base_dir/../" [findfile $base_dir/g++ "$base_dir/g++ -B$base_dir/" [transform c++]]] + } + } + } + + # Bleah, nasty. Bad taste. + if [ishost "*-dos-*" ] { + regsub "c\\+\\+" "$OBJCXX_UNDER_TEST" "gcc" OBJCXX_UNDER_TEST + } + + if ![is_remote host] { + if { [which $OBJCXX_UNDER_TEST] == 0 } then { + perror "OBJCXX_UNDER_TEST ($OBJCXX_UNDER_TEST) does not exist" + exit 1 + } + } + if ![info exists tmpdir] { + set tmpdir "/tmp" + } + + if [info exists gluefile] { + unset gluefile + } + + obj-c++_maybe_build_wrapper "${tmpdir}/obj-c++-testglue.o" + + set ALWAYS_OBJCXXFLAGS "" + + if ![is_remote host] { + if [info exists TOOL_OPTIONS] { + lappend ALWAYS_OBJCXXFLAGS "additional_flags=[obj-c++_include_flags [get_multilibs ${TOOL_OPTIONS}] ]"; + lappend ALWAYS_OBJCXXFLAGS "ldflags=[obj-c++_link_flags [get_multilibs ${TOOL_OPTIONS}] ]"; + } else { + lappend ALWAYS_OBJCXXFLAGS "additional_flags=[obj-c++_include_flags [get_multilibs] ]"; + lappend ALWAYS_OBJCXXFLAGS "ldflags=[obj-c++_link_flags [get_multilibs] ]"; + } + } + + if [info exists TOOL_OPTIONS] { + lappend ALWAYS_OBJCXXFLAGS "additional_flags=$TOOL_OPTIONS"; + } + + # Make sure that lines are not wrapped. That can confuse the + # error-message parsing machinery. + lappend ALWAYS_OBJCXXFLAGS "additional_flags=-fmessage-length=0" + + if { [string match "powerpc-*-darwin*" $target_triplet] } { + lappend ALWAYS_OBJCXXFLAGS "ldflags=-multiply_defined suppress" + } + + verbose -log "ALWAYS_OBJCXXFLAGS set to $ALWAYS_OBJCXXFLAGS" + + verbose "obj-c++ is initialized" 3 +} + +# +# obj-c++_target_compile -- compile a source file +# + +proc obj-c++_target_compile { source dest type options } { + global tmpdir + global srcdir + global gpp_compile_options + global gluefile wrap_flags + global ALWAYS_OBJCXXFLAGS + global OBJCXX_UNDER_TEST + + lappend options "libs=-lobjc" + + if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } { + lappend options "libs=${gluefile}" + lappend options "ldflags=${wrap_flags}" + } + + # If we have built libobjc along with the compiler (which usually + # _is not_ the case on Mac OS X systems), point the test harness + # at it (and associated headers). + + set objcpath "[get_multilibs]" + + set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.a] + if { $libobjc_dir == ""} { + verbose "see if we have -fgnu-runtime in [target_info name]" + if [regexp ".*-fgnu-runtime.*" [target_info name]] { + set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a] + } + } + if { $libobjc_dir != "" } { + set objc_include_dir "${srcdir}/../../libobjc" + lappend options "additional_flags=-I${objc_include_dir}" + set libobjc_dir [file dirname ${libobjc_dir}] + set objc_link_flags "-L${libobjc_dir}" + lappend options "additional_flags=${objc_link_flags}" + append ld_library_path ":${libobjc_dir}" + } + + lappend options "additional_flags=[libio_include_flags]" + lappend options "compiler=$OBJCXX_UNDER_TEST"; + + set options [concat $gpp_compile_options $options] + + set options [concat "$ALWAYS_OBJCXXFLAGS" $options]; + + if { [regexp "(^| )-frepo( |$)" $options] && \ + [regexp "\.o(|bj)$" $dest] } then { + regsub "\.o(|bj)$" $dest ".rpo" rponame + exec rm -f $rponame + } + + set options [dg-additional-files-options $options $source] + + set result [target_compile $source $dest $type $options] + + return $result +} + +# +# ${tool}_option_help +# + +proc ${tool}_option_help { } { + send_user " --additional_options,OPTIONS\t\tUse OPTIONS to compile the testcase files. OPTIONS should be comma-separated.\n" +} + +# +# ${tool}_option_proc +# + +proc ${tool}_option_proc { option } { + if [regexp "^--additional_options," $option] { + global gpp_compile_options + regsub "--additional_options," $option "" option + foreach x [split $option ","] { + lappend gpp_compile_options "additional_flags=$x" + } + return 1; + } else { + return 0 + } +} diff --git a/gcc/testsuite/lib/profopt.exp b/gcc/testsuite/lib/profopt.exp index b24dfff74f0..b23a926c074 100644 --- a/gcc/testsuite/lib/profopt.exp +++ b/gcc/testsuite/lib/profopt.exp @@ -1,4 +1,4 @@ -# Copyright (C) 2001, 2004 Free Software Foundation, Inc. +# Copyright (C) 2001, 2004, 2005 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -30,6 +30,9 @@ # profile-directed test run is nonzero then the performance check will # be done. +load_lib dg.exp +load_lib gcc-dg.exp + global PROFOPT_OPTIONS perf_delta # The including .exp file must define these. @@ -116,6 +119,90 @@ proc profopt-perf-value { testcase perf_ext optstr } { } # +# dg-final-generate -- process code to run after the profile-generate step +# +# ARGS is the line number of the directive followed by the commands. +# +proc dg-final-generate { args } { + global generate_final_code + + if { [llength $args] > 2 } { + error "[lindex $args 0]: too many arguments" + return + } + append generate_final_code "[lindex $args 1]\n" +} + +# +# dg-final-use -- process code to run after the profile-use step +# +# ARGS is the line number of the directive followed by the commands. +# +proc dg-final-use { args } { + global use_final_code + + if { [llength $args] > 2 } { + error "[lindex $args 0]: too many arguments" + return + } + append use_final_code "[lindex $args 1]\n" +} + +# +# profopt-final-code -- run final code +# +# WHICH is "generate" or "use". +# FINAL_CODE is the TCL code to run. +# TESTCASE is the name of the test, for error messages. +# +proc profopt-final-code { which final_code name } { + # This is copied from dg-test in dg.exp of DejaGnu. + regsub -all "\\\\(\[{}\])" $final_code "\\1" final_code + proc profopt-final-proc { args } $final_code + if [catch "profopt-final-proc $name" errmsg] { + perror "$name: error executing dg-final-${which}: $errmsg" + unresolved "$name: Error executing dg-final-${which}: $errmsg" + } +} + +# +# profopt-get-options -- process test directives +# +# SRC is the full pathname of the testcase. +# +proc profopt-get-options { src } { + # dg-options sets a variable called dg-extra-tool-flags. + set dg-extra-tool-flags "" + + # dg-require-* sets dg-do-what. + upvar dg-do-what dg-do-what + + set tmp [dg-get-options $src] + foreach op $tmp { + set cmd [lindex $op 0] + if { ![string compare "dg-options" $cmd] \ + || ![string compare "dg-skip-if" $cmd] \ + || ![string compare "dg-final-generate" $cmd] \ + || ![string compare "dg-final-use" $cmd] \ + || [string match "dg-require-*" $cmd] } { + set status [catch "$op" errmsg] + if { $status != 0 } { + perror "src: $errmsg for \"$op\"\n" + unresolved "$src: $errmsg for \"$op\"" + return + } + } else { + # Ignore unrecognized dg- commands, but warn about them. + warning "compat.exp does not support $cmd" + } + } + + # Return flags to use for compiling the primary source file and for + # linking. + return ${dg-extra-tool-flags} +} + +# # c-prof-execute -- compile for profiling and then feedback, then normal # # SRC is the full pathname of the testcase. @@ -124,6 +211,7 @@ proc profopt-execute { src } { global srcdir tmpdir global prof_option_list global tool profile_option feedback_option prof_ext perf_ext perf_delta + global generate_final_code use_final_code global verbose if ![info exists profile_option] { @@ -162,10 +250,22 @@ proc profopt-execute { src } { profopt-cleanup $testcase $perf_ext } + # Process test directives. + + set generate_final_code "" + set use_final_code "" + set dg-do-what [list "run" "" P] + set extra_flags [profopt-get-options $src] + if { [lindex ${dg-do-what} 1 ] == "N" } { + unsupported "$src" + verbose "$src not supported on this target, skipping it" 3 + return + } + # Compile for profiling. set options "" - lappend options "additional_flags=$option $profile_option" + lappend options "additional_flags=$option $extra_flags $profile_option" set optstr "$option $profile_option" set comp_output [${tool}_target_compile "$src" "$execname1" executable $options] if ![${tool}_check_compile "$testcase compilation" $optstr $execname1 $comp_output] { @@ -179,6 +279,7 @@ proc profopt-execute { src } { set result [${tool}_load $execname1 "" ""] set status [lindex $result 0] + set missing_file 0 # Make sure the profile data was generated, and fail if not. if { $status == "pass" } { set basename [file tail $testcase] @@ -187,26 +288,34 @@ proc profopt-execute { src } { set files [glob -nocomplain $base.$ext] if { $files == "" } { set status "fail" + set missing_file 1 fail "$testcase execution: file $base.$ext does not exist, $option $profile_option" - } else { - $status "$testcase execution, $optstr" } } - } else { + } + if { $missing_file == 0 } { $status "$testcase execution, $optstr" } + + # If there is dg-final code to execute for the generate step, do it + # even if it failed; it might clean up temporary files. + if ![string match $generate_final_code ""] { + profopt-final-code "generate" $generate_final_code $testcase + } + + remote_file build delete $execname1 + # Quit for this round if it failed if { $status != "pass" } { unresolved "$testcase compilation, $option $feedback_option" unresolved "$testcase execution, $option $feedback_option" continue } - remote_file build delete $execname1 # Compile with feedback-directed optimizations. set options "" - lappend options "additional_flags=$option $feedback_option" + lappend options "additional_flags=$option $extra_flags $feedback_option" set optstr "$option $feedback_option" set comp_output [${tool}_target_compile "$src" "$execname2" "executable" $options] if ![${tool}_check_compile "$testcase compilation" $optstr $execname2 $comp_output] { @@ -219,13 +328,19 @@ proc profopt-execute { src } { set result [${tool}_load "$execname2" "" ""] set status [lindex $result 0] $status "$testcase execution, $optstr" - if { $status != "pass" } { - continue + + # If there is dg-final code to execute for the use step, do it. + if ![string match $use_final_code ""] { + profopt-final-code "use" $use_final_code $testcase } # Remove the profiling data files. profopt-cleanup $testcase $prof_ext + if { $status != "pass" } { + continue + } + # If the test is not expected to produce performance data then # we're done now. if ![info exists perf_ext] { diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index ac6dda5fd57..03781699775 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -725,6 +725,28 @@ proc check_effective_target_lp64 { } { return $et_lp64_saved } +# Return 1 if the target needs a command line argument to enable a SIMD +# instruction set. +# +# This won't change for different subtargets so cache the result. + +proc check_effective_target_vect_cmdline_needed { } { + global et_vect_cmdline_needed_saved + + if [info exists et_vect_cmdline_needed_saved] { + verbose "check_effective_target_vect_cmdline_needed: using cached result" 2 + } else { + set et_vect_cmdline_needed_saved 1 + if { [istarget ia64-*-*] + || [istarget x86_64-*-*] } { + set et_vect_cmdline_needed_saved 0 + } + } + + verbose "check_effective_target_vect_cmdline_needed: returning $et_vect_cmdline_needed_saved" 2 + return $et_vect_cmdline_needed_saved +} + # Return 1 if the target supports hardware vectors of int, 0 otherwise. # # This won't change for different subtargets so cache the result. @@ -981,6 +1003,7 @@ proc check_effective_target_sync_int_long { } { || [istarget i?86-*-*] || [istarget x86_64-*-*] || [istarget alpha*-*-*] + || [istarget s390*-*-*] || [istarget powerpc*-*-*] } { set et_sync_int_long_saved 1 } @@ -990,6 +1013,29 @@ proc check_effective_target_sync_int_long { } { return $et_sync_int_long_saved } +# Return 1 if the target supports atomic operations on "char" and "short". + +proc check_effective_target_sync_char_short { } { + global et_sync_char_short_saved + + if [info exists et_sync_char_short_saved] { + verbose "check_effective_target_sync_char_short: using cached result" 2 + } else { + set et_sync_char_short_saved 0 +# This is intentionally powerpc but not rs6000, rs6000 doesn't have the +# load-reserved/store-conditional instructions. + if { [istarget ia64-*-*] + || [istarget i?86-*-*] + || [istarget x86_64-*-*] + || [istarget powerpc*-*-*] } { + set et_sync_char_short_saved 1 + } + } + + verbose "check_effective_target_sync_char_short: returning $et_sync_char_short_saved" 2 + return $et_sync_char_short_saved +} + # Return 1 if the target matches the effective target 'arg', 0 otherwise. # This can be used with any check_* proc that takes no argument and # returns only 1 or 0. It could be used with check_* procs that take |