⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gcc-dg.exp

📁 用于进行gcc测试
💻 EXP
📖 第 1 页 / 共 2 页
字号:
#   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 + -