diff options
Diffstat (limited to 'libmudflap/testsuite/lib/libmudflap.exp')
-rw-r--r-- | libmudflap/testsuite/lib/libmudflap.exp | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/libmudflap/testsuite/lib/libmudflap.exp b/libmudflap/testsuite/lib/libmudflap.exp new file mode 100644 index 00000000000..1d1e22ffb28 --- /dev/null +++ b/libmudflap/testsuite/lib/libmudflap.exp @@ -0,0 +1,237 @@ +# Copyright (C) 2001, 2002, 2003 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 libmudflap callbacks for dg.exp. +# This file is a copy of libstdc++-v3's dejagnu driver, with minor changes. + + +load_lib mfdg.exp +load_lib libgloss.exp + +proc libmudflap-init { compiler } { + global srcdir + global outdir + global blddir + global cxx + global includes + global libs + global cxxflags + global objdir + global gluefile wrap_flags + global ld_library_path + global tool_root_dir + + verbose "libmudflap-init $compiler" + + set blddir [lookfor_file [get_multilibs] libmudflap] + + # By default, we assume we want to run program images. + global dg-do-what-default + set dg-do-what-default run + + # set LD_LIBRARY_PATH so that libgcc_s, libstdc++ binaries can be found. + # locate libgcc.a so we don't need to account for different values of + # SHLIB_EXT on different platforms + set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] + if {$gccdir != ""} { + set gccdir [file dirname $gccdir] + } + + set ld_library_path "." + append ld_library_path ":${gccdir}" + append ld_library_path ":../../libstdc++-v3/src/.libs" + if {[is_remote host] == 0} { + foreach i "[exec ${gccdir}/xgcc --print-multi-lib]" { + set mldir "" + regexp -- "\[a-z0-9=/\.-\]*;" $i mldir + set mldir [string trimright $mldir "\;@"] + if { "$mldir" == "." } { + continue + } + if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] == 1 } { + append ld_library_path ":${gccdir}/${mldir}" + append ld_library_path ":../../libstdc++-v3/${mldir}/src/.libs" + } + } + } + append ld_library_path ":${blddir}/.libs" + set cxx $compiler + set libs "-L../.libs -L../../libstdc++-v3/src/.libs -L../../../gcc" + set cxxflags "-ggdb3 -DDEBUG_ASSERT" + set includes "-I${srcdir} -I.." + + verbose "ld_library_path=$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 + + if { [target_info needs_status_wrapper]!=""} { + file delete ${objdir}/testglue.o; + set gluefile ${objdir}/testglue.o; + set result [build_wrapper $gluefile]; + if { $result != "" } { + set gluefile [lindex $result 0]; + set wrap_flags [lindex $result 1]; + } else { + unset gluefile + } + } +} + +proc libmudflap-dg-test { prog do_what extra_tool_flags } { + # Set up the compiler flags, based on what we're going to do. + + 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" + } + "link" { + set compile_type "executable" + set output_file "./[file rootname [file tail $prog]].exe" + } + "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. + remote_file build delete $output_file; + } + default { + perror "$do_what: not a valid dg-do keyword" + return "" + } + } + set options "" + if { $extra_tool_flags != "" } { + lappend options "additional_flags=$extra_tool_flags" + } + + set comp_output [libmudflap_target_compile "$prog" "$output_file" "$compile_type" $options]; + set comp_output [prune_gcc_output $comp_output ]; + + return [list $comp_output $output_file] +} + + +proc libmudflap_target_compile { source dest type options } { + global gluefile + global wrap_flags + global cxx + global cxxflags + global includes + global libs + global blddir + + if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } { + lappend options "libs=${gluefile}" + lappend options "ldflags=${wrap_flags}" + } + + set cxx_final $cxx + set cxxlibglossflags [libgloss_link_flags] + set cxx_final [concat $cxx_final $cxxlibglossflags] + set cxx_final [concat $cxx_final $cxxflags] + set cxx_final [concat $cxx_final $includes] + set cxx_final [concat $cxx_final $libs] + + lappend options "compiler=$cxx_final" + + # Picks up the freshly-built testsuite library corresponding to the + # multilib under test. + lappend options "ldflags=-L${blddir}/testsuite" + + return [target_compile $source $dest $type $options] +} + + +# A bit sloppy... Returns a list of source files (full pathnames) to +# compile. We mimic the mkcheck script in that the first time this is run, +# all existing files are listed in "testsuite_files" in the output +# directory. Subsequent runs pull the list from that file, allowing users +# to trim the list down to problematic tests. +### This is supposed to be done via RUNTESTFLAGS, but that doesn't work. +proc libmudflap-list-sourcefiles { } { + global srcdir + global outdir + + set files_file "${outdir}/testsuite_files" + set sfiles "" + if { [file exists $files_file] } { + set f [open $files_file] + while { ! [eof $f] } { + set t [gets $f] + if { [string length "$t"] != 0 } { + lappend sfiles ${srcdir}/${t} + } + } + } else { + set f [open $files_file "w"] + set where_we_were [pwd] + cd $srcdir + foreach s [lsort [glob -nocomplain "*/*.cc" "*/*/*.cc" "{,*/}*/*/*/*.cc" ]] { + lappend sfiles ${srcdir}/${s} + puts $f $s + } + cd $where_we_were + } + close $f + + # Disable wchar_t tests if library not configured to support + # wchar_t testing. + set wchar_file "${outdir}/testsuite_wchar_t" + if { [file exists $wchar_file] } { + return $sfiles + } else { + # Remove wchar_t tests files from list. + set res {} + foreach w $sfiles { + if [regexp "wchar_t" $w] { + verbose "element out list is $w" + } else { + verbose "element in list is $w" + lappend res $w + } + } + return $res + } +} + + +proc prune_gcc_output { text } { + + regsub -all {(^|\n)[^\n]*ld: warning: libgcc_s[^\n]*not found[^\n]*try using[^\n]*} $text "" text + + regsub -all {(^|\n)[^\n]*In function.*pthread_create[^\n]*} $text "" text + + regsub -all {(^|\n)[^\n]*the use of .pthread.*is deprecated[^\n]*} $text "" text + + regsub -all {(^|\n)[^\n]*Dwarf Error:.*FORM value: 14[^\n]*} $text "" text + + return $text +} |