1*1fd5a2e1SPrashanth Swaminathan# Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011, 2014, 2019 Free Software Foundation, Inc. 2*1fd5a2e1SPrashanth Swaminathan 3*1fd5a2e1SPrashanth Swaminathan# This program is free software; you can redistribute it and/or modify 4*1fd5a2e1SPrashanth Swaminathan# it under the terms of the GNU General Public License as published by 5*1fd5a2e1SPrashanth Swaminathan# the Free Software Foundation; either version 3 of the License, or 6*1fd5a2e1SPrashanth Swaminathan# (at your option) any later version. 7*1fd5a2e1SPrashanth Swaminathan# 8*1fd5a2e1SPrashanth Swaminathan# This program is distributed in the hope that it will be useful, 9*1fd5a2e1SPrashanth Swaminathan# but WITHOUT ANY WARRANTY; without even the implied warranty of 10*1fd5a2e1SPrashanth Swaminathan# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11*1fd5a2e1SPrashanth Swaminathan# GNU General Public License for more details. 12*1fd5a2e1SPrashanth Swaminathan# 13*1fd5a2e1SPrashanth Swaminathan# You should have received a copy of the GNU General Public License 14*1fd5a2e1SPrashanth Swaminathan# along with this program; see the file COPYING3. If not see 15*1fd5a2e1SPrashanth Swaminathan# <http://www.gnu.org/licenses/>. 16*1fd5a2e1SPrashanth Swaminathan 17*1fd5a2e1SPrashanth Swaminathanproc load_gcc_lib { filename } { 18*1fd5a2e1SPrashanth Swaminathan global srcdir 19*1fd5a2e1SPrashanth Swaminathan load_file $srcdir/lib/$filename 20*1fd5a2e1SPrashanth Swaminathan} 21*1fd5a2e1SPrashanth Swaminathan 22*1fd5a2e1SPrashanth Swaminathanload_lib dg.exp 23*1fd5a2e1SPrashanth Swaminathanload_lib libgloss.exp 24*1fd5a2e1SPrashanth Swaminathanload_gcc_lib target-libpath.exp 25*1fd5a2e1SPrashanth Swaminathanload_gcc_lib wrapper.exp 26*1fd5a2e1SPrashanth Swaminathan 27*1fd5a2e1SPrashanth Swaminathan# Return 1 if the target matches the effective target 'arg', 0 otherwise. 28*1fd5a2e1SPrashanth Swaminathan# This can be used with any check_* proc that takes no argument and 29*1fd5a2e1SPrashanth Swaminathan# returns only 1 or 0. It could be used with check_* procs that take 30*1fd5a2e1SPrashanth Swaminathan# arguments with keywords that pass particular arguments. 31*1fd5a2e1SPrashanth Swaminathan 32*1fd5a2e1SPrashanth Swaminathanproc is-effective-target { arg } { 33*1fd5a2e1SPrashanth Swaminathan global et_index 34*1fd5a2e1SPrashanth Swaminathan set selected 0 35*1fd5a2e1SPrashanth Swaminathan if { ![info exists et_index] } { 36*1fd5a2e1SPrashanth Swaminathan # Initialize the effective target index that is used in some 37*1fd5a2e1SPrashanth Swaminathan # check_effective_target_* procs. 38*1fd5a2e1SPrashanth Swaminathan set et_index 0 39*1fd5a2e1SPrashanth Swaminathan } 40*1fd5a2e1SPrashanth Swaminathan if { [info procs check_effective_target_${arg}] != [list] } { 41*1fd5a2e1SPrashanth Swaminathan set selected [check_effective_target_${arg}] 42*1fd5a2e1SPrashanth Swaminathan } else { 43*1fd5a2e1SPrashanth Swaminathan error "unknown effective target keyword `$arg'" 44*1fd5a2e1SPrashanth Swaminathan } 45*1fd5a2e1SPrashanth Swaminathan verbose "is-effective-target: $arg $selected" 2 46*1fd5a2e1SPrashanth Swaminathan return $selected 47*1fd5a2e1SPrashanth Swaminathan} 48*1fd5a2e1SPrashanth Swaminathan 49*1fd5a2e1SPrashanth Swaminathanproc is-effective-target-keyword { arg } { 50*1fd5a2e1SPrashanth Swaminathan if { [info procs check_effective_target_${arg}] != [list] } { 51*1fd5a2e1SPrashanth Swaminathan return 1 52*1fd5a2e1SPrashanth Swaminathan } else { 53*1fd5a2e1SPrashanth Swaminathan return 0 54*1fd5a2e1SPrashanth Swaminathan } 55*1fd5a2e1SPrashanth Swaminathan} 56*1fd5a2e1SPrashanth Swaminathan 57*1fd5a2e1SPrashanth Swaminathan# Intercept the call to the DejaGnu version of dg-process-target to 58*1fd5a2e1SPrashanth Swaminathan# support use of an effective-target keyword in place of a list of 59*1fd5a2e1SPrashanth Swaminathan# target triplets to xfail or skip a test. 60*1fd5a2e1SPrashanth Swaminathan# 61*1fd5a2e1SPrashanth Swaminathan# The argument to dg-process-target is the keyword "target" or "xfail" 62*1fd5a2e1SPrashanth Swaminathan# followed by a selector: 63*1fd5a2e1SPrashanth Swaminathan# target-triplet-1 ... 64*1fd5a2e1SPrashanth Swaminathan# effective-target-keyword 65*1fd5a2e1SPrashanth Swaminathan# selector-expression 66*1fd5a2e1SPrashanth Swaminathan# 67*1fd5a2e1SPrashanth Swaminathan# For a target list the result is "S" if the target is selected, "N" otherwise. 68*1fd5a2e1SPrashanth Swaminathan# For an xfail list the result is "F" if the target is affected, "P" otherwise. 69*1fd5a2e1SPrashanth Swaminathan 70*1fd5a2e1SPrashanth Swaminathan# In contexts that allow either "target" or "xfail" the argument can be 71*1fd5a2e1SPrashanth Swaminathan# target selector1 xfail selector2 72*1fd5a2e1SPrashanth Swaminathan# which returns "N" if selector1 is not selected, otherwise the result of 73*1fd5a2e1SPrashanth Swaminathan# "xfail selector2". 74*1fd5a2e1SPrashanth Swaminathan# 75*1fd5a2e1SPrashanth Swaminathan# A selector expression appears within curly braces and uses a single logical 76*1fd5a2e1SPrashanth Swaminathan# operator: !, &&, or ||. An operand is another selector expression, an 77*1fd5a2e1SPrashanth Swaminathan# effective-target keyword, or a list of target triplets within quotes or 78*1fd5a2e1SPrashanth Swaminathan# curly braces. 79*1fd5a2e1SPrashanth Swaminathan 80*1fd5a2e1SPrashanth Swaminathanif { [info procs saved-dg-process-target] == [list] } { 81*1fd5a2e1SPrashanth Swaminathan rename dg-process-target saved-dg-process-target 82*1fd5a2e1SPrashanth Swaminathan 83*1fd5a2e1SPrashanth Swaminathan # Evaluate an operand within a selector expression. 84*1fd5a2e1SPrashanth Swaminathan proc selector_opd { op } { 85*1fd5a2e1SPrashanth Swaminathan set selector "target" 86*1fd5a2e1SPrashanth Swaminathan lappend selector $op 87*1fd5a2e1SPrashanth Swaminathan set answer [ expr { [dg-process-target $selector] == "S" } ] 88*1fd5a2e1SPrashanth Swaminathan verbose "selector_opd: `$op' $answer" 2 89*1fd5a2e1SPrashanth Swaminathan return $answer 90*1fd5a2e1SPrashanth Swaminathan } 91*1fd5a2e1SPrashanth Swaminathan 92*1fd5a2e1SPrashanth Swaminathan # Evaluate a target triplet list within a selector expression. 93*1fd5a2e1SPrashanth Swaminathan # Unlike other operands, this needs to be expanded from a list to 94*1fd5a2e1SPrashanth Swaminathan # the same string as "target". 95*1fd5a2e1SPrashanth Swaminathan proc selector_list { op } { 96*1fd5a2e1SPrashanth Swaminathan set selector "target [join $op]" 97*1fd5a2e1SPrashanth Swaminathan set answer [ expr { [dg-process-target $selector] == "S" } ] 98*1fd5a2e1SPrashanth Swaminathan verbose "selector_list: `$op' $answer" 2 99*1fd5a2e1SPrashanth Swaminathan return $answer 100*1fd5a2e1SPrashanth Swaminathan } 101*1fd5a2e1SPrashanth Swaminathan 102*1fd5a2e1SPrashanth Swaminathan # Evaluate a selector expression. 103*1fd5a2e1SPrashanth Swaminathan proc selector_expression { exp } { 104*1fd5a2e1SPrashanth Swaminathan if { [llength $exp] == 2 } { 105*1fd5a2e1SPrashanth Swaminathan if [string match "!" [lindex $exp 0]] { 106*1fd5a2e1SPrashanth Swaminathan set op1 [lindex $exp 1] 107*1fd5a2e1SPrashanth Swaminathan set answer [expr { ! [selector_opd $op1] }] 108*1fd5a2e1SPrashanth Swaminathan } else { 109*1fd5a2e1SPrashanth Swaminathan # Assume it's a list of target triplets. 110*1fd5a2e1SPrashanth Swaminathan set answer [selector_list $exp] 111*1fd5a2e1SPrashanth Swaminathan } 112*1fd5a2e1SPrashanth Swaminathan } elseif { [llength $exp] == 3 } { 113*1fd5a2e1SPrashanth Swaminathan set op1 [lindex $exp 0] 114*1fd5a2e1SPrashanth Swaminathan set opr [lindex $exp 1] 115*1fd5a2e1SPrashanth Swaminathan set op2 [lindex $exp 2] 116*1fd5a2e1SPrashanth Swaminathan if [string match "&&" $opr] { 117*1fd5a2e1SPrashanth Swaminathan set answer [expr { [selector_opd $op1] && [selector_opd $op2] }] 118*1fd5a2e1SPrashanth Swaminathan } elseif [string match "||" $opr] { 119*1fd5a2e1SPrashanth Swaminathan set answer [expr { [selector_opd $op1] || [selector_opd $op2] }] 120*1fd5a2e1SPrashanth Swaminathan } else { 121*1fd5a2e1SPrashanth Swaminathan # Assume it's a list of target triplets. 122*1fd5a2e1SPrashanth Swaminathan set answer [selector_list $exp] 123*1fd5a2e1SPrashanth Swaminathan } 124*1fd5a2e1SPrashanth Swaminathan } else { 125*1fd5a2e1SPrashanth Swaminathan # Assume it's a list of target triplets. 126*1fd5a2e1SPrashanth Swaminathan set answer [selector_list $exp] 127*1fd5a2e1SPrashanth Swaminathan } 128*1fd5a2e1SPrashanth Swaminathan 129*1fd5a2e1SPrashanth Swaminathan verbose "selector_expression: `$exp' $answer" 2 130*1fd5a2e1SPrashanth Swaminathan return $answer 131*1fd5a2e1SPrashanth Swaminathan } 132*1fd5a2e1SPrashanth Swaminathan 133*1fd5a2e1SPrashanth Swaminathan # Evaluate "target selector" or "xfail selector". 134*1fd5a2e1SPrashanth Swaminathan 135*1fd5a2e1SPrashanth Swaminathan proc dg-process-target-1 { args } { 136*1fd5a2e1SPrashanth Swaminathan verbose "dg-process-target-1: `$args'" 2 137*1fd5a2e1SPrashanth Swaminathan 138*1fd5a2e1SPrashanth Swaminathan # Extract the 'what' keyword from the argument list. 139*1fd5a2e1SPrashanth Swaminathan set selector [string trim [lindex $args 0]] 140*1fd5a2e1SPrashanth Swaminathan if [regexp "^xfail " $selector] { 141*1fd5a2e1SPrashanth Swaminathan set what "xfail" 142*1fd5a2e1SPrashanth Swaminathan } elseif [regexp "^target " $selector] { 143*1fd5a2e1SPrashanth Swaminathan set what "target" 144*1fd5a2e1SPrashanth Swaminathan } else { 145*1fd5a2e1SPrashanth Swaminathan error "syntax error in target selector \"$selector\"" 146*1fd5a2e1SPrashanth Swaminathan } 147*1fd5a2e1SPrashanth Swaminathan 148*1fd5a2e1SPrashanth Swaminathan # Extract the rest of the list, which might be a keyword. 149*1fd5a2e1SPrashanth Swaminathan regsub "^${what}" $selector "" rest 150*1fd5a2e1SPrashanth Swaminathan set rest [string trim $rest] 151*1fd5a2e1SPrashanth Swaminathan 152*1fd5a2e1SPrashanth Swaminathan if [is-effective-target-keyword $rest] { 153*1fd5a2e1SPrashanth Swaminathan # The selector is an effective target keyword. 154*1fd5a2e1SPrashanth Swaminathan if [is-effective-target $rest] { 155*1fd5a2e1SPrashanth Swaminathan return [expr { $what == "xfail" ? "F" : "S" }] 156*1fd5a2e1SPrashanth Swaminathan } else { 157*1fd5a2e1SPrashanth Swaminathan return [expr { $what == "xfail" ? "P" : "N" }] 158*1fd5a2e1SPrashanth Swaminathan } 159*1fd5a2e1SPrashanth Swaminathan } 160*1fd5a2e1SPrashanth Swaminathan 161*1fd5a2e1SPrashanth Swaminathan if [string match "{*}" $rest] { 162*1fd5a2e1SPrashanth Swaminathan if [selector_expression [lindex $rest 0]] { 163*1fd5a2e1SPrashanth Swaminathan return [expr { $what == "xfail" ? "F" : "S" }] 164*1fd5a2e1SPrashanth Swaminathan } else { 165*1fd5a2e1SPrashanth Swaminathan return [expr { $what == "xfail" ? "P" : "N" }] 166*1fd5a2e1SPrashanth Swaminathan } 167*1fd5a2e1SPrashanth Swaminathan } 168*1fd5a2e1SPrashanth Swaminathan 169*1fd5a2e1SPrashanth Swaminathan # The selector is not an effective-target keyword, so process 170*1fd5a2e1SPrashanth Swaminathan # the list of target triplets. 171*1fd5a2e1SPrashanth Swaminathan return [saved-dg-process-target $selector] 172*1fd5a2e1SPrashanth Swaminathan } 173*1fd5a2e1SPrashanth Swaminathan 174*1fd5a2e1SPrashanth Swaminathan # Intercept calls to the DejaGnu function. In addition to 175*1fd5a2e1SPrashanth Swaminathan # processing "target selector" or "xfail selector", handle 176*1fd5a2e1SPrashanth Swaminathan # "target selector1 xfail selector2". 177*1fd5a2e1SPrashanth Swaminathan 178*1fd5a2e1SPrashanth Swaminathan proc dg-process-target { args } { 179*1fd5a2e1SPrashanth Swaminathan verbose "replacement dg-process-target: `$args'" 2 180*1fd5a2e1SPrashanth Swaminathan 181*1fd5a2e1SPrashanth Swaminathan set selector [string trim [lindex $args 0]] 182*1fd5a2e1SPrashanth Swaminathan 183*1fd5a2e1SPrashanth Swaminathan # If the argument list contains both 'target' and 'xfail', 184*1fd5a2e1SPrashanth Swaminathan # process 'target' and, if that succeeds, process 'xfail'. 185*1fd5a2e1SPrashanth Swaminathan if [regexp "^target .* xfail .*" $selector] { 186*1fd5a2e1SPrashanth Swaminathan set xfail_index [string first "xfail" $selector] 187*1fd5a2e1SPrashanth Swaminathan set xfail_selector [string range $selector $xfail_index end] 188*1fd5a2e1SPrashanth Swaminathan set target_selector [string range $selector 0 [expr $xfail_index-1]] 189*1fd5a2e1SPrashanth Swaminathan set target_selector [string trim $target_selector] 190*1fd5a2e1SPrashanth Swaminathan if { [dg-process-target-1 $target_selector] == "N" } { 191*1fd5a2e1SPrashanth Swaminathan return "N" 192*1fd5a2e1SPrashanth Swaminathan } 193*1fd5a2e1SPrashanth Swaminathan return [dg-process-target-1 $xfail_selector] 194*1fd5a2e1SPrashanth Swaminathan 195*1fd5a2e1SPrashanth Swaminathan } 196*1fd5a2e1SPrashanth Swaminathan return [dg-process-target-1 $selector] 197*1fd5a2e1SPrashanth Swaminathan } 198*1fd5a2e1SPrashanth Swaminathan} 199*1fd5a2e1SPrashanth Swaminathan 200*1fd5a2e1SPrashanth Swaminathan# Define libffi callbacks for dg.exp. 201*1fd5a2e1SPrashanth Swaminathan 202*1fd5a2e1SPrashanth Swaminathanproc libffi-dg-test-1 { target_compile prog do_what extra_tool_flags } { 203*1fd5a2e1SPrashanth Swaminathan 204*1fd5a2e1SPrashanth Swaminathan # To get all \n in dg-output test strings to match printf output 205*1fd5a2e1SPrashanth Swaminathan # in a system that outputs it as \015\012 (i.e. not just \012), we 206*1fd5a2e1SPrashanth Swaminathan # need to change all \n into \r?\n. As there is no dejagnu flag 207*1fd5a2e1SPrashanth Swaminathan # or hook to do that, we simply change the text being tested. 208*1fd5a2e1SPrashanth Swaminathan # Unfortunately, we have to know that the variable is called 209*1fd5a2e1SPrashanth Swaminathan # dg-output-text and lives in the caller of libffi-dg-test, which 210*1fd5a2e1SPrashanth Swaminathan # is two calls up. Overriding proc dg-output would be longer and 211*1fd5a2e1SPrashanth Swaminathan # would necessarily have the same assumption. 212*1fd5a2e1SPrashanth Swaminathan upvar 2 dg-output-text output_match 213*1fd5a2e1SPrashanth Swaminathan 214*1fd5a2e1SPrashanth Swaminathan if { [llength $output_match] > 1 } { 215*1fd5a2e1SPrashanth Swaminathan regsub -all "\n" [lindex $output_match 1] "\r?\n" x 216*1fd5a2e1SPrashanth Swaminathan set output_match [lreplace $output_match 1 1 $x] 217*1fd5a2e1SPrashanth Swaminathan } 218*1fd5a2e1SPrashanth Swaminathan 219*1fd5a2e1SPrashanth Swaminathan # Set up the compiler flags, based on what we're going to do. 220*1fd5a2e1SPrashanth Swaminathan 221*1fd5a2e1SPrashanth Swaminathan set options [list] 222*1fd5a2e1SPrashanth Swaminathan switch $do_what { 223*1fd5a2e1SPrashanth Swaminathan "compile" { 224*1fd5a2e1SPrashanth Swaminathan set compile_type "assembly" 225*1fd5a2e1SPrashanth Swaminathan set output_file "[file rootname [file tail $prog]].s" 226*1fd5a2e1SPrashanth Swaminathan } 227*1fd5a2e1SPrashanth Swaminathan "link" { 228*1fd5a2e1SPrashanth Swaminathan set compile_type "executable" 229*1fd5a2e1SPrashanth Swaminathan set output_file "[file rootname [file tail $prog]].exe" 230*1fd5a2e1SPrashanth Swaminathan # The following line is needed for targets like the i960 where 231*1fd5a2e1SPrashanth Swaminathan # the default output file is b.out. Sigh. 232*1fd5a2e1SPrashanth Swaminathan } 233*1fd5a2e1SPrashanth Swaminathan "run" { 234*1fd5a2e1SPrashanth Swaminathan set compile_type "executable" 235*1fd5a2e1SPrashanth Swaminathan # FIXME: "./" is to cope with "." not being in $PATH. 236*1fd5a2e1SPrashanth Swaminathan # Should this be handled elsewhere? 237*1fd5a2e1SPrashanth Swaminathan # YES. 238*1fd5a2e1SPrashanth Swaminathan set output_file "./[file rootname [file tail $prog]].exe" 239*1fd5a2e1SPrashanth Swaminathan # This is the only place where we care if an executable was 240*1fd5a2e1SPrashanth Swaminathan # created or not. If it was, dg.exp will try to run it. 241*1fd5a2e1SPrashanth Swaminathan remote_file build delete $output_file; 242*1fd5a2e1SPrashanth Swaminathan } 243*1fd5a2e1SPrashanth Swaminathan default { 244*1fd5a2e1SPrashanth Swaminathan perror "$do_what: not a valid dg-do keyword" 245*1fd5a2e1SPrashanth Swaminathan return "" 246*1fd5a2e1SPrashanth Swaminathan } 247*1fd5a2e1SPrashanth Swaminathan } 248*1fd5a2e1SPrashanth Swaminathan 249*1fd5a2e1SPrashanth Swaminathan if { $extra_tool_flags != "" } { 250*1fd5a2e1SPrashanth Swaminathan lappend options "additional_flags=$extra_tool_flags" 251*1fd5a2e1SPrashanth Swaminathan } 252*1fd5a2e1SPrashanth Swaminathan 253*1fd5a2e1SPrashanth Swaminathan set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options]; 254*1fd5a2e1SPrashanth Swaminathan 255*1fd5a2e1SPrashanth Swaminathan 256*1fd5a2e1SPrashanth Swaminathan return [list $comp_output $output_file] 257*1fd5a2e1SPrashanth Swaminathan} 258*1fd5a2e1SPrashanth Swaminathan 259*1fd5a2e1SPrashanth Swaminathan 260*1fd5a2e1SPrashanth Swaminathanproc libffi-dg-test { prog do_what extra_tool_flags } { 261*1fd5a2e1SPrashanth Swaminathan return [libffi-dg-test-1 target_compile $prog $do_what $extra_tool_flags] 262*1fd5a2e1SPrashanth Swaminathan} 263*1fd5a2e1SPrashanth Swaminathan 264*1fd5a2e1SPrashanth Swaminathanproc libffi-dg-prune { target_triplet text } { 265*1fd5a2e1SPrashanth Swaminathan # We get this with some qemu emulated systems (eg. ppc64le-linux-gnu) 266*1fd5a2e1SPrashanth Swaminathan regsub -all "(^|\n)\[^\n\]*unable to perform all requested operations" $text "" text 267*1fd5a2e1SPrashanth Swaminathan return $text 268*1fd5a2e1SPrashanth Swaminathan} 269*1fd5a2e1SPrashanth Swaminathan 270*1fd5a2e1SPrashanth Swaminathanproc libffi-init { args } { 271*1fd5a2e1SPrashanth Swaminathan global gluefile wrap_flags; 272*1fd5a2e1SPrashanth Swaminathan global srcdir 273*1fd5a2e1SPrashanth Swaminathan global blddirffi 274*1fd5a2e1SPrashanth Swaminathan global objdir 275*1fd5a2e1SPrashanth Swaminathan global TOOL_OPTIONS 276*1fd5a2e1SPrashanth Swaminathan global tool 277*1fd5a2e1SPrashanth Swaminathan global libffi_include 278*1fd5a2e1SPrashanth Swaminathan global libffi_link_flags 279*1fd5a2e1SPrashanth Swaminathan global tool_root_dir 280*1fd5a2e1SPrashanth Swaminathan global ld_library_path 281*1fd5a2e1SPrashanth Swaminathan global compiler_vendor 282*1fd5a2e1SPrashanth Swaminathan 283*1fd5a2e1SPrashanth Swaminathan if ![info exists blddirffi] { 284*1fd5a2e1SPrashanth Swaminathan set blddirffi [pwd]/.. 285*1fd5a2e1SPrashanth Swaminathan } 286*1fd5a2e1SPrashanth Swaminathan 287*1fd5a2e1SPrashanth Swaminathan verbose "libffi $blddirffi" 288*1fd5a2e1SPrashanth Swaminathan 289*1fd5a2e1SPrashanth Swaminathan # Which compiler are we building with? 290*1fd5a2e1SPrashanth Swaminathan set tmp [grep "$blddirffi/config.log" "^ax_cv_c_compiler_vendor.*$"] 291*1fd5a2e1SPrashanth Swaminathan regexp -- {^[^=]*=(.*)$} $tmp nil compiler_vendor 292*1fd5a2e1SPrashanth Swaminathan 293*1fd5a2e1SPrashanth Swaminathan if { [string match $compiler_vendor "gnu"] } { 294*1fd5a2e1SPrashanth Swaminathan set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] 295*1fd5a2e1SPrashanth Swaminathan if {$gccdir != ""} { 296*1fd5a2e1SPrashanth Swaminathan set gccdir [file dirname $gccdir] 297*1fd5a2e1SPrashanth Swaminathan } 298*1fd5a2e1SPrashanth Swaminathan verbose "gccdir $gccdir" 299*1fd5a2e1SPrashanth Swaminathan 300*1fd5a2e1SPrashanth Swaminathan set ld_library_path "." 301*1fd5a2e1SPrashanth Swaminathan append ld_library_path ":${gccdir}" 302*1fd5a2e1SPrashanth Swaminathan 303*1fd5a2e1SPrashanth Swaminathan set compiler "${gccdir}/xgcc" 304*1fd5a2e1SPrashanth Swaminathan if { [is_remote host] == 0 && [which $compiler] != 0 } { 305*1fd5a2e1SPrashanth Swaminathan foreach i "[exec $compiler --print-multi-lib]" { 306*1fd5a2e1SPrashanth Swaminathan set mldir "" 307*1fd5a2e1SPrashanth Swaminathan regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir 308*1fd5a2e1SPrashanth Swaminathan set mldir [string trimright $mldir "\;@"] 309*1fd5a2e1SPrashanth Swaminathan if { "$mldir" == "." } { 310*1fd5a2e1SPrashanth Swaminathan continue 311*1fd5a2e1SPrashanth Swaminathan } 312*1fd5a2e1SPrashanth Swaminathan if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } { 313*1fd5a2e1SPrashanth Swaminathan append ld_library_path ":${gccdir}/${mldir}" 314*1fd5a2e1SPrashanth Swaminathan } 315*1fd5a2e1SPrashanth Swaminathan } 316*1fd5a2e1SPrashanth Swaminathan } 317*1fd5a2e1SPrashanth Swaminathan } 318*1fd5a2e1SPrashanth Swaminathan 319*1fd5a2e1SPrashanth Swaminathan # add the library path for libffi. 320*1fd5a2e1SPrashanth Swaminathan append ld_library_path ":${blddirffi}/.libs" 321*1fd5a2e1SPrashanth Swaminathan 322*1fd5a2e1SPrashanth Swaminathan verbose "ld_library_path: $ld_library_path" 323*1fd5a2e1SPrashanth Swaminathan 324*1fd5a2e1SPrashanth Swaminathan # Point to the Libffi headers in libffi. 325*1fd5a2e1SPrashanth Swaminathan set libffi_include "${blddirffi}/include" 326*1fd5a2e1SPrashanth Swaminathan verbose "libffi_include $libffi_include" 327*1fd5a2e1SPrashanth Swaminathan 328*1fd5a2e1SPrashanth Swaminathan set libffi_dir "${blddirffi}/.libs" 329*1fd5a2e1SPrashanth Swaminathan verbose "libffi_dir $libffi_dir" 330*1fd5a2e1SPrashanth Swaminathan if { $libffi_dir != "" } { 331*1fd5a2e1SPrashanth Swaminathan set libffi_dir [file dirname ${libffi_dir}] 332*1fd5a2e1SPrashanth Swaminathan set libffi_link_flags "-L${libffi_dir}/.libs" 333*1fd5a2e1SPrashanth Swaminathan } 334*1fd5a2e1SPrashanth Swaminathan 335*1fd5a2e1SPrashanth Swaminathan set_ld_library_path_env_vars 336*1fd5a2e1SPrashanth Swaminathan libffi_maybe_build_wrapper "${objdir}/testglue.o" 337*1fd5a2e1SPrashanth Swaminathan} 338*1fd5a2e1SPrashanth Swaminathan 339*1fd5a2e1SPrashanth Swaminathanproc libffi_exit { } { 340*1fd5a2e1SPrashanth Swaminathan global gluefile; 341*1fd5a2e1SPrashanth Swaminathan 342*1fd5a2e1SPrashanth Swaminathan if [info exists gluefile] { 343*1fd5a2e1SPrashanth Swaminathan file_on_build delete $gluefile; 344*1fd5a2e1SPrashanth Swaminathan unset gluefile; 345*1fd5a2e1SPrashanth Swaminathan } 346*1fd5a2e1SPrashanth Swaminathan} 347*1fd5a2e1SPrashanth Swaminathan 348*1fd5a2e1SPrashanth Swaminathanproc libffi_target_compile { source dest type options } { 349*1fd5a2e1SPrashanth Swaminathan global gluefile wrap_flags; 350*1fd5a2e1SPrashanth Swaminathan global srcdir 351*1fd5a2e1SPrashanth Swaminathan global blddirffi 352*1fd5a2e1SPrashanth Swaminathan global TOOL_OPTIONS 353*1fd5a2e1SPrashanth Swaminathan global libffi_link_flags 354*1fd5a2e1SPrashanth Swaminathan global libffi_include 355*1fd5a2e1SPrashanth Swaminathan global target_triplet 356*1fd5a2e1SPrashanth Swaminathan global compiler_vendor 357*1fd5a2e1SPrashanth Swaminathan 358*1fd5a2e1SPrashanth Swaminathan if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } { 359*1fd5a2e1SPrashanth Swaminathan lappend options "libs=${gluefile}" 360*1fd5a2e1SPrashanth Swaminathan lappend options "ldflags=$wrap_flags" 361*1fd5a2e1SPrashanth Swaminathan } 362*1fd5a2e1SPrashanth Swaminathan 363*1fd5a2e1SPrashanth Swaminathan # TOOL_OPTIONS must come first, so that it doesn't override testcase 364*1fd5a2e1SPrashanth Swaminathan # specific options. 365*1fd5a2e1SPrashanth Swaminathan if [info exists TOOL_OPTIONS] { 366*1fd5a2e1SPrashanth Swaminathan lappend options "additional_flags=$TOOL_OPTIONS" 367*1fd5a2e1SPrashanth Swaminathan } 368*1fd5a2e1SPrashanth Swaminathan 369*1fd5a2e1SPrashanth Swaminathan # search for ffi_mips.h in srcdir, too 370*1fd5a2e1SPrashanth Swaminathan lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include -I${libffi_include}/.." 371*1fd5a2e1SPrashanth Swaminathan lappend options "additional_flags=${libffi_link_flags}" 372*1fd5a2e1SPrashanth Swaminathan 373*1fd5a2e1SPrashanth Swaminathan # Darwin needs a stack execution allowed flag. 374*1fd5a2e1SPrashanth Swaminathan 375*1fd5a2e1SPrashanth Swaminathan if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"] 376*1fd5a2e1SPrashanth Swaminathan || [istarget "*-*-darwin2*"] } { 377*1fd5a2e1SPrashanth Swaminathan lappend options "additional_flags=-Wl,-allow_stack_execute" 378*1fd5a2e1SPrashanth Swaminathan } 379*1fd5a2e1SPrashanth Swaminathan 380*1fd5a2e1SPrashanth Swaminathan # If you're building the compiler with --prefix set to a place 381*1fd5a2e1SPrashanth Swaminathan # where it's not yet installed, then the linker won't be able to 382*1fd5a2e1SPrashanth Swaminathan # find the libgcc used by libffi.dylib. We could pass the 383*1fd5a2e1SPrashanth Swaminathan # -dylib_file option, but that's complicated, and it's much easier 384*1fd5a2e1SPrashanth Swaminathan # to just make the linker find libgcc using -L options. 385*1fd5a2e1SPrashanth Swaminathan if { [string match "*-*-darwin*" $target_triplet] } { 386*1fd5a2e1SPrashanth Swaminathan lappend options "libs= -shared-libgcc" 387*1fd5a2e1SPrashanth Swaminathan } 388*1fd5a2e1SPrashanth Swaminathan 389*1fd5a2e1SPrashanth Swaminathan if { [string match "*-*-openbsd*" $target_triplet] } { 390*1fd5a2e1SPrashanth Swaminathan lappend options "libs= -lpthread" 391*1fd5a2e1SPrashanth Swaminathan } 392*1fd5a2e1SPrashanth Swaminathan 393*1fd5a2e1SPrashanth Swaminathan lappend options "libs= -lffi" 394*1fd5a2e1SPrashanth Swaminathan 395*1fd5a2e1SPrashanth Swaminathan if { [string match "aarch64*-*-linux*" $target_triplet] } { 396*1fd5a2e1SPrashanth Swaminathan lappend options "libs= -lpthread" 397*1fd5a2e1SPrashanth Swaminathan } 398*1fd5a2e1SPrashanth Swaminathan 399*1fd5a2e1SPrashanth Swaminathan # this may be required for g++, but just confused clang. 400*1fd5a2e1SPrashanth Swaminathan if { [string match "*.cc" $source] } { 401*1fd5a2e1SPrashanth Swaminathan lappend options "c++" 402*1fd5a2e1SPrashanth Swaminathan } 403*1fd5a2e1SPrashanth Swaminathan 404*1fd5a2e1SPrashanth Swaminathan if { [string match "arc*-*-linux*" $target_triplet] } { 405*1fd5a2e1SPrashanth Swaminathan lappend options "libs= -lpthread" 406*1fd5a2e1SPrashanth Swaminathan } 407*1fd5a2e1SPrashanth Swaminathan 408*1fd5a2e1SPrashanth Swaminathan verbose "options: $options" 409*1fd5a2e1SPrashanth Swaminathan return [target_compile $source $dest $type $options] 410*1fd5a2e1SPrashanth Swaminathan} 411*1fd5a2e1SPrashanth Swaminathan 412*1fd5a2e1SPrashanth Swaminathan# TEST should be a preprocessor condition. Returns true if it holds. 413*1fd5a2e1SPrashanth Swaminathanproc libffi_feature_test { test } { 414*1fd5a2e1SPrashanth Swaminathan set src "ffitest[pid].c" 415*1fd5a2e1SPrashanth Swaminathan 416*1fd5a2e1SPrashanth Swaminathan set f [open $src "w"] 417*1fd5a2e1SPrashanth Swaminathan puts $f "#include <ffi.h>" 418*1fd5a2e1SPrashanth Swaminathan puts $f $test 419*1fd5a2e1SPrashanth Swaminathan puts $f "/* OK */" 420*1fd5a2e1SPrashanth Swaminathan puts $f "#else" 421*1fd5a2e1SPrashanth Swaminathan puts $f "# error Failed $test" 422*1fd5a2e1SPrashanth Swaminathan puts $f "#endif" 423*1fd5a2e1SPrashanth Swaminathan close $f 424*1fd5a2e1SPrashanth Swaminathan 425*1fd5a2e1SPrashanth Swaminathan set lines [libffi_target_compile $src /dev/null assembly ""] 426*1fd5a2e1SPrashanth Swaminathan file delete $src 427*1fd5a2e1SPrashanth Swaminathan 428*1fd5a2e1SPrashanth Swaminathan return [string match "" $lines] 429*1fd5a2e1SPrashanth Swaminathan} 430*1fd5a2e1SPrashanth Swaminathan 431*1fd5a2e1SPrashanth Swaminathan# Utility routines. 432*1fd5a2e1SPrashanth Swaminathan 433*1fd5a2e1SPrashanth Swaminathan# 434*1fd5a2e1SPrashanth Swaminathan# search_for -- looks for a string match in a file 435*1fd5a2e1SPrashanth Swaminathan# 436*1fd5a2e1SPrashanth Swaminathanproc search_for { file pattern } { 437*1fd5a2e1SPrashanth Swaminathan set fd [open $file r] 438*1fd5a2e1SPrashanth Swaminathan while { [gets $fd cur_line]>=0 } { 439*1fd5a2e1SPrashanth Swaminathan if [string match "*$pattern*" $cur_line] then { 440*1fd5a2e1SPrashanth Swaminathan close $fd 441*1fd5a2e1SPrashanth Swaminathan return 1 442*1fd5a2e1SPrashanth Swaminathan } 443*1fd5a2e1SPrashanth Swaminathan } 444*1fd5a2e1SPrashanth Swaminathan close $fd 445*1fd5a2e1SPrashanth Swaminathan return 0 446*1fd5a2e1SPrashanth Swaminathan} 447*1fd5a2e1SPrashanth Swaminathan 448*1fd5a2e1SPrashanth Swaminathan# Modified dg-runtest that can cycle through a list of optimization options 449*1fd5a2e1SPrashanth Swaminathan# as c-torture does. 450*1fd5a2e1SPrashanth Swaminathanproc libffi-dg-runtest { testcases default-extra-flags } { 451*1fd5a2e1SPrashanth Swaminathan global runtests 452*1fd5a2e1SPrashanth Swaminathan 453*1fd5a2e1SPrashanth Swaminathan foreach test $testcases { 454*1fd5a2e1SPrashanth Swaminathan # If we're only testing specific files and this isn't one of 455*1fd5a2e1SPrashanth Swaminathan # them, skip it. 456*1fd5a2e1SPrashanth Swaminathan if ![runtest_file_p $runtests $test] { 457*1fd5a2e1SPrashanth Swaminathan continue 458*1fd5a2e1SPrashanth Swaminathan } 459*1fd5a2e1SPrashanth Swaminathan 460*1fd5a2e1SPrashanth Swaminathan # Look for a loop within the source code - if we don't find one, 461*1fd5a2e1SPrashanth Swaminathan # don't pass -funroll[-all]-loops. 462*1fd5a2e1SPrashanth Swaminathan global torture_with_loops torture_without_loops 463*1fd5a2e1SPrashanth Swaminathan if [expr [search_for $test "for*("]+[search_for $test "while*("]] { 464*1fd5a2e1SPrashanth Swaminathan set option_list $torture_with_loops 465*1fd5a2e1SPrashanth Swaminathan } else { 466*1fd5a2e1SPrashanth Swaminathan set option_list $torture_without_loops 467*1fd5a2e1SPrashanth Swaminathan } 468*1fd5a2e1SPrashanth Swaminathan 469*1fd5a2e1SPrashanth Swaminathan set nshort [file tail [file dirname $test]]/[file tail $test] 470*1fd5a2e1SPrashanth Swaminathan 471*1fd5a2e1SPrashanth Swaminathan foreach flags $option_list { 472*1fd5a2e1SPrashanth Swaminathan verbose "Testing $nshort, $flags" 1 473*1fd5a2e1SPrashanth Swaminathan dg-test $test $flags ${default-extra-flags} 474*1fd5a2e1SPrashanth Swaminathan } 475*1fd5a2e1SPrashanth Swaminathan } 476*1fd5a2e1SPrashanth Swaminathan} 477*1fd5a2e1SPrashanth Swaminathan 478*1fd5a2e1SPrashanth Swaminathanproc run-many-tests { testcases extra_flags } { 479*1fd5a2e1SPrashanth Swaminathan global compiler_vendor 480*1fd5a2e1SPrashanth Swaminathan global env 481*1fd5a2e1SPrashanth Swaminathan switch $compiler_vendor { 482*1fd5a2e1SPrashanth Swaminathan "clang" { 483*1fd5a2e1SPrashanth Swaminathan set common "-W -Wall" 484*1fd5a2e1SPrashanth Swaminathan if [info exists env(LIBFFI_TEST_OPTIMIZATION)] { 485*1fd5a2e1SPrashanth Swaminathan set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ] 486*1fd5a2e1SPrashanth Swaminathan } else { 487*1fd5a2e1SPrashanth Swaminathan set optimizations { "-O0" "-O2" } 488*1fd5a2e1SPrashanth Swaminathan } 489*1fd5a2e1SPrashanth Swaminathan } 490*1fd5a2e1SPrashanth Swaminathan "gnu" { 491*1fd5a2e1SPrashanth Swaminathan set common "-W -Wall -Wno-psabi" 492*1fd5a2e1SPrashanth Swaminathan if [info exists env(LIBFFI_TEST_OPTIMIZATION)] { 493*1fd5a2e1SPrashanth Swaminathan set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ] 494*1fd5a2e1SPrashanth Swaminathan } else { 495*1fd5a2e1SPrashanth Swaminathan set optimizations { "-O0" "-O2" } 496*1fd5a2e1SPrashanth Swaminathan } 497*1fd5a2e1SPrashanth Swaminathan } 498*1fd5a2e1SPrashanth Swaminathan default { 499*1fd5a2e1SPrashanth Swaminathan # Assume we are using the vendor compiler. 500*1fd5a2e1SPrashanth Swaminathan set common "" 501*1fd5a2e1SPrashanth Swaminathan if [info exists env(LIBFFI_TEST_OPTIMIZATION)] { 502*1fd5a2e1SPrashanth Swaminathan set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ] 503*1fd5a2e1SPrashanth Swaminathan } else { 504*1fd5a2e1SPrashanth Swaminathan set optimizations { "" } 505*1fd5a2e1SPrashanth Swaminathan } 506*1fd5a2e1SPrashanth Swaminathan } 507*1fd5a2e1SPrashanth Swaminathan } 508*1fd5a2e1SPrashanth Swaminathan 509*1fd5a2e1SPrashanth Swaminathan info exists env(LD_LIBRARY_PATH) 510*1fd5a2e1SPrashanth Swaminathan 511*1fd5a2e1SPrashanth Swaminathan set targetabis { "" } 512*1fd5a2e1SPrashanth Swaminathan if [string match $compiler_vendor "gnu"] { 513*1fd5a2e1SPrashanth Swaminathan if [libffi_feature_test "#ifdef __i386__"] { 514*1fd5a2e1SPrashanth Swaminathan set targetabis { 515*1fd5a2e1SPrashanth Swaminathan "" 516*1fd5a2e1SPrashanth Swaminathan "-DABI_NUM=FFI_STDCALL -DABI_ATTR=__STDCALL__" 517*1fd5a2e1SPrashanth Swaminathan "-DABI_NUM=FFI_THISCALL -DABI_ATTR=__THISCALL__" 518*1fd5a2e1SPrashanth Swaminathan "-DABI_NUM=FFI_FASTCALL -DABI_ATTR=__FASTCALL__" 519*1fd5a2e1SPrashanth Swaminathan } 520*1fd5a2e1SPrashanth Swaminathan } elseif { [istarget "x86_64-*-*"] \ 521*1fd5a2e1SPrashanth Swaminathan && [libffi_feature_test "#if !defined __ILP32__ \ 522*1fd5a2e1SPrashanth Swaminathan && !defined __i386__"] } { 523*1fd5a2e1SPrashanth Swaminathan set targetabis { 524*1fd5a2e1SPrashanth Swaminathan "" 525*1fd5a2e1SPrashanth Swaminathan "-DABI_NUM=FFI_GNUW64 -DABI_ATTR=__MSABI__" 526*1fd5a2e1SPrashanth Swaminathan } 527*1fd5a2e1SPrashanth Swaminathan } 528*1fd5a2e1SPrashanth Swaminathan } 529*1fd5a2e1SPrashanth Swaminathan 530*1fd5a2e1SPrashanth Swaminathan set common [ concat $common $extra_flags ] 531*1fd5a2e1SPrashanth Swaminathan foreach test $testcases { 532*1fd5a2e1SPrashanth Swaminathan set testname [file tail $test] 533*1fd5a2e1SPrashanth Swaminathan if [search_for $test "ABI_NUM"] { 534*1fd5a2e1SPrashanth Swaminathan set abis $targetabis 535*1fd5a2e1SPrashanth Swaminathan } else { 536*1fd5a2e1SPrashanth Swaminathan set abis { "" } 537*1fd5a2e1SPrashanth Swaminathan } 538*1fd5a2e1SPrashanth Swaminathan foreach opt $optimizations { 539*1fd5a2e1SPrashanth Swaminathan foreach abi $abis { 540*1fd5a2e1SPrashanth Swaminathan set options [concat $common $opt $abi] 541*1fd5a2e1SPrashanth Swaminathan verbose "Testing $testname, $options" 1 542*1fd5a2e1SPrashanth Swaminathan dg-test $test $options "" 543*1fd5a2e1SPrashanth Swaminathan } 544*1fd5a2e1SPrashanth Swaminathan } 545*1fd5a2e1SPrashanth Swaminathan } 546*1fd5a2e1SPrashanth Swaminathan} 547*1fd5a2e1SPrashanth Swaminathan 548*1fd5a2e1SPrashanth Swaminathan# Like check_conditional_xfail, but callable from a dg test. 549*1fd5a2e1SPrashanth Swaminathan 550*1fd5a2e1SPrashanth Swaminathanproc dg-xfail-if { args } { 551*1fd5a2e1SPrashanth Swaminathan set args [lreplace $args 0 0] 552*1fd5a2e1SPrashanth Swaminathan set selector "target [join [lindex $args 1]]" 553*1fd5a2e1SPrashanth Swaminathan if { [dg-process-target $selector] == "S" } { 554*1fd5a2e1SPrashanth Swaminathan global compiler_conditional_xfail_data 555*1fd5a2e1SPrashanth Swaminathan set compiler_conditional_xfail_data $args 556*1fd5a2e1SPrashanth Swaminathan } 557*1fd5a2e1SPrashanth Swaminathan} 558*1fd5a2e1SPrashanth Swaminathan 559*1fd5a2e1SPrashanth Swaminathanproc check-flags { args } { 560*1fd5a2e1SPrashanth Swaminathan 561*1fd5a2e1SPrashanth Swaminathan # The args are within another list; pull them out. 562*1fd5a2e1SPrashanth Swaminathan set args [lindex $args 0] 563*1fd5a2e1SPrashanth Swaminathan 564*1fd5a2e1SPrashanth Swaminathan # The next two arguments are optional. If they were not specified, 565*1fd5a2e1SPrashanth Swaminathan # use the defaults. 566*1fd5a2e1SPrashanth Swaminathan if { [llength $args] == 2 } { 567*1fd5a2e1SPrashanth Swaminathan lappend $args [list "*"] 568*1fd5a2e1SPrashanth Swaminathan } 569*1fd5a2e1SPrashanth Swaminathan if { [llength $args] == 3 } { 570*1fd5a2e1SPrashanth Swaminathan lappend $args [list ""] 571*1fd5a2e1SPrashanth Swaminathan } 572*1fd5a2e1SPrashanth Swaminathan 573*1fd5a2e1SPrashanth Swaminathan # If the option strings are the defaults, or the same as the 574*1fd5a2e1SPrashanth Swaminathan # defaults, there is no need to call check_conditional_xfail to 575*1fd5a2e1SPrashanth Swaminathan # compare them to the actual options. 576*1fd5a2e1SPrashanth Swaminathan if { [string compare [lindex $args 2] "*"] == 0 577*1fd5a2e1SPrashanth Swaminathan && [string compare [lindex $args 3] "" ] == 0 } { 578*1fd5a2e1SPrashanth Swaminathan set result 1 579*1fd5a2e1SPrashanth Swaminathan } else { 580*1fd5a2e1SPrashanth Swaminathan # The target list might be an effective-target keyword, so replace 581*1fd5a2e1SPrashanth Swaminathan # the original list with "*-*-*", since we already know it matches. 582*1fd5a2e1SPrashanth Swaminathan set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]] 583*1fd5a2e1SPrashanth Swaminathan } 584*1fd5a2e1SPrashanth Swaminathan 585*1fd5a2e1SPrashanth Swaminathan return $result 586*1fd5a2e1SPrashanth Swaminathan} 587*1fd5a2e1SPrashanth Swaminathan 588*1fd5a2e1SPrashanth Swaminathanproc dg-skip-if { args } { 589*1fd5a2e1SPrashanth Swaminathan # Verify the number of arguments. The last two are optional. 590*1fd5a2e1SPrashanth Swaminathan set args [lreplace $args 0 0] 591*1fd5a2e1SPrashanth Swaminathan if { [llength $args] < 2 || [llength $args] > 4 } { 592*1fd5a2e1SPrashanth Swaminathan error "dg-skip-if 2: need 2, 3, or 4 arguments" 593*1fd5a2e1SPrashanth Swaminathan } 594*1fd5a2e1SPrashanth Swaminathan 595*1fd5a2e1SPrashanth Swaminathan # Don't bother if we're already skipping the test. 596*1fd5a2e1SPrashanth Swaminathan upvar dg-do-what dg-do-what 597*1fd5a2e1SPrashanth Swaminathan if { [lindex ${dg-do-what} 1] == "N" } { 598*1fd5a2e1SPrashanth Swaminathan return 599*1fd5a2e1SPrashanth Swaminathan } 600*1fd5a2e1SPrashanth Swaminathan 601*1fd5a2e1SPrashanth Swaminathan set selector [list target [lindex $args 1]] 602*1fd5a2e1SPrashanth Swaminathan if { [dg-process-target $selector] == "S" } { 603*1fd5a2e1SPrashanth Swaminathan if [check-flags $args] { 604*1fd5a2e1SPrashanth Swaminathan upvar dg-do-what dg-do-what 605*1fd5a2e1SPrashanth Swaminathan set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"] 606*1fd5a2e1SPrashanth Swaminathan } 607*1fd5a2e1SPrashanth Swaminathan } 608*1fd5a2e1SPrashanth Swaminathan} 609*1fd5a2e1SPrashanth Swaminathan 610*1fd5a2e1SPrashanth Swaminathan# We need to make sure that additional_files and additional_sources 611*1fd5a2e1SPrashanth Swaminathan# are both cleared out after every test. It is not enough to clear 612*1fd5a2e1SPrashanth Swaminathan# them out *before* the next test run because gcc-target-compile gets 613*1fd5a2e1SPrashanth Swaminathan# run directly from some .exp files (outside of any test). (Those 614*1fd5a2e1SPrashanth Swaminathan# uses should eventually be eliminated.) 615*1fd5a2e1SPrashanth Swaminathan 616*1fd5a2e1SPrashanth Swaminathan# Because the DG framework doesn't provide a hook that is run at the 617*1fd5a2e1SPrashanth Swaminathan# end of a test, we must replace dg-test with a wrapper. 618*1fd5a2e1SPrashanth Swaminathan 619*1fd5a2e1SPrashanth Swaminathanif { [info procs saved-dg-test] == [list] } { 620*1fd5a2e1SPrashanth Swaminathan rename dg-test saved-dg-test 621*1fd5a2e1SPrashanth Swaminathan 622*1fd5a2e1SPrashanth Swaminathan proc dg-test { args } { 623*1fd5a2e1SPrashanth Swaminathan global additional_files 624*1fd5a2e1SPrashanth Swaminathan global additional_sources 625*1fd5a2e1SPrashanth Swaminathan global errorInfo 626*1fd5a2e1SPrashanth Swaminathan 627*1fd5a2e1SPrashanth Swaminathan if { [ catch { eval saved-dg-test $args } errmsg ] } { 628*1fd5a2e1SPrashanth Swaminathan set saved_info $errorInfo 629*1fd5a2e1SPrashanth Swaminathan set additional_files "" 630*1fd5a2e1SPrashanth Swaminathan set additional_sources "" 631*1fd5a2e1SPrashanth Swaminathan error $errmsg $saved_info 632*1fd5a2e1SPrashanth Swaminathan } 633*1fd5a2e1SPrashanth Swaminathan set additional_files "" 634*1fd5a2e1SPrashanth Swaminathan set additional_sources "" 635*1fd5a2e1SPrashanth Swaminathan } 636*1fd5a2e1SPrashanth Swaminathan} 637*1fd5a2e1SPrashanth Swaminathan 638*1fd5a2e1SPrashanth Swaminathan# Local Variables: 639*1fd5a2e1SPrashanth Swaminathan# tcl-indent-level:4 640*1fd5a2e1SPrashanth Swaminathan# End: 641