📄 gcc-dg.exp
字号:
# Copyright (C) 1997, 1999, 2000, 2003, 2004, 2005, 2006, 2007# 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 3 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 GCC; see the file COPYING3. If not see# <http://www.gnu.org/licenses/>.load_lib dg.expload_lib file-format.expload_lib target-supports.expload_lib target-supports-dg.expload_lib scanasm.expload_lib scanrtl.expload_lib scantree.expload_lib scanipa.expload_lib prune.expload_lib libgloss.expload_lib target-libpath.exp# We set LC_ALL and LANG to C so that we get the same error messages as expected.setenv LC_ALL Csetenv LANG Cif ![info exists TORTURE_OPTIONS] { # It is theoretically beneficial to group all of the O2/O3 options together, # as in many cases the compiler will generate identical executables for # all of them--and the c-torture testsuite will skip testing identical # executables multiple times. # Also note that -finline-functions is explicitly included in one of the # items below, even though -O3 is also specified, because some ports may # choose to disable inlining functions by default, even when optimizing. set TORTURE_OPTIONS [list \ { -O0 } \ { -O1 } \ { -O2 } \ { -O3 -fomit-frame-pointer } \ { -O3 -fomit-frame-pointer -funroll-loops } \ { -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions } \ { -O3 -g } \ { -Os } ]}global GCC_UNDER_TESTif ![info exists GCC_UNDER_TEST] { set GCC_UNDER_TEST "[find_gcc]"}global orig_environment_saved# This file may be sourced, so don't override environment settings# that have been previously setup.if { $orig_environment_saved == 0 } { append ld_library_path [gcc-set-multilib-library-path $GCC_UNDER_TEST] set_ld_library_path_env_vars}# Split TORTURE_OPTIONS into two choices: one for testcases with loops and# one for testcases without loops.set torture_with_loops $TORTURE_OPTIONSset torture_without_loops ""foreach option $TORTURE_OPTIONS { if ![string match "*loop*" $option] { lappend torture_without_loops $option }}# Define gcc callbacks for dg.exp.proc gcc-dg-test-1 { target_compile prog do_what extra_tool_flags } { # Set up the compiler flags, based on what we're going to do. set options [list] # Tests should be able to use "dg-do repo". However, the dg test # driver checks the argument to dg-do against a list of acceptable # options, and "repo" is not among them. Therefore, we resort to # this ugly approach. if [string match "*-frepo*" $extra_tool_flags] then { set do_what "repo" } switch $do_what { "preprocess" { set compile_type "preprocess" set output_file "[file rootname [file tail $prog]].i" } "compile" { set compile_type "assembly" set output_file "[file rootname [file tail $prog]].s" } "assemble" { set compile_type "object" set output_file "[file rootname [file tail $prog]].o" } "precompile" { set compile_type "precompiled_header" set output_file "[file tail $prog].gch" } "link" { set compile_type "executable" set output_file "[file rootname [file tail $prog]].exe" # The following line is needed for targets like the i960 where # the default output file is b.out. Sigh. } "repo" { set compile_type "object" set output_file "[file rootname [file tail $prog]].o" } "run" { set compile_type "executable" # FIXME: "./" is to cope with "." not being in $PATH. # Should this be handled elsewhere? # YES. set output_file "./[file rootname [file tail $prog]].exe" # This is the only place where we care if an executable was # created or not. If it was, dg.exp will try to run it. catch { remote_file build delete $output_file } } default { perror "$do_what: not a valid dg-do keyword" return "" } } if { $extra_tool_flags != "" } { lappend options "additional_flags=$extra_tool_flags" } set comp_output [$target_compile "$prog" "$output_file" "$compile_type" $options] # Look for an internal compiler error, which sometimes masks the fact # that we didn't get an expected error message. An ICE always fails, # there's no way to XFAIL it. if [string match "*internal compiler error*" $comp_output] { upvar 2 name name fail "$name (internal compiler error)" } if { $do_what == "repo" } { set object_file "$output_file" set output_file "[file rootname [file tail $prog]].exe" set comp_output \ [ concat $comp_output \ [$target_compile "$object_file" "$output_file" \ "executable" $options] ] } return [list $comp_output $output_file]}proc gcc-dg-test { prog do_what extra_tool_flags } { return [gcc-dg-test-1 gcc_target_compile $prog $do_what $extra_tool_flags]}proc gcc-dg-prune { system text } { global additional_prunes set text [prune_gcc_output $text] foreach p $additional_prunes { if { [string length $p] > 0 } { # Following regexp matches a complete line containing $p. regsub -all "(^|\n)\[^\n\]*$p\[^\n\]*" $text "" text } } # If we see "region xxx is full" then the testcase is too big for ram. # This is tricky to deal with in a large testsuite like c-torture so # deal with it here. Just mark the testcase as unsupported. if [regexp "(^|\n)\[^\n\]*: region \[^\n\]* is full" $text] { # The format here is important. See dg.exp. return "::unsupported::memory full" } # Likewise, if we see ".text exceeds local store range" or # similar. if {[string match "spu-*" $system] && \ [string match "*exceeds local store range*" $text]} { # The format here is important. See dg.exp. return "::unsupported::memory full" } return $text}# Replace ${tool}_load with a wrapper to provide for an expected nonzero# exit status. Multiple languages include this file so this handles them# all, not just gcc.if { [info procs ${tool}_load] != [list] \ && [info procs saved_${tool}_load] == [list] } { rename ${tool}_load saved_${tool}_load proc ${tool}_load { program args } { global tool global shouldfail set result [eval [list saved_${tool}_load $program] $args] if { $shouldfail != 0 } { switch [lindex $result 0] { "pass" { set status "fail" } "fail" { set status "pass" } } set result [list $status [lindex $result 1]] } return $result }}# Utility routines.## search_for -- looks for a string match in a file#proc search_for { file pattern } { set fd [open $file r] while { [gets $fd cur_line]>=0 } { if [string match "*$pattern*" $cur_line] then { close $fd return 1 } } close $fd return 0}# Modified dg-runtest that can cycle through a list of optimization options# as c-torture does.proc gcc-dg-runtest { testcases default-extra-flags } { global runtests foreach test $testcases { # If we're only testing specific files and this isn't one of # them, skip it. if ![runtest_file_p $runtests $test] { continue } # Look for a loop within the source code - if we don't find one, # don't pass -funroll[-all]-loops. global torture_with_loops torture_without_loops if [expr [search_for $test "for*("]+[search_for $test "while*("]] { set option_list $torture_with_loops } else { set option_list $torture_without_loops } set nshort [file tail [file dirname $test]]/[file tail $test] foreach flags $option_list { verbose "Testing $nshort, $flags" 1 dg-test $test $flags ${default-extra-flags} } }}proc gcc-dg-debug-runtest { target_compile trivial opt_opts testcases } { global srcdir subdir if ![info exists DEBUG_TORTURE_OPTIONS] { set DEBUG_TORTURE_OPTIONS "" foreach type {-gdwarf-2 -gstabs -gstabs+ -gxcoff -gxcoff+ -gcoff} { set comp_output [$target_compile \ "$srcdir/$subdir/$trivial" "trivial.S" assembly \ "additional_flags=$type"] if { ! [string match "*: target system does not support the * debug format*" \ $comp_output] } { remove-build-file "trivial.S" foreach level {1 "" 3} { lappend DEBUG_TORTURE_OPTIONS [list "${type}${level}"] foreach opt $opt_opts { lappend DEBUG_TORTURE_OPTIONS \ [list "${type}${level}" "$opt" ] } } } } } verbose -log "Using options $DEBUG_TORTURE_OPTIONS" global runtests foreach test $testcases { # If we're only testing specific files and this isn't one of # them, skip it. if ![runtest_file_p $runtests $test] { continue } set nshort [file tail [file dirname $test]]/[file tail $test] foreach flags $DEBUG_TORTURE_OPTIONS { set doit 1 # These tests check for information which may be deliberately # suppressed at -g1. if { ([string match {*/debug-[126].c} "$nshort"] \ || [string match {*/enum-1.c} "$nshort"] \ || [string match {*/enum-[12].C} "$nshort"]) \ && [string match "*1" [lindex "$flags" 0] ] } { set doit 0 } # High optimization can remove the variable whose existence is tested. # Dwarf debugging with commentary (-dA) preserves the symbol name in the # assembler output, but stabs debugging does not.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -