OSDN Git Service

bd9327d140831e527a1b3570ad48dfe02bac515c
[pf3gnuchains/gcc-fork.git] / libmudflap / testsuite / lib / libmudflap.exp
1 # Copyright (C) 2001, 2002, 2003, 2004, 2009, 2010, 2011
2 # Free Software Foundation, Inc.
3
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 3 of the License, or
7 # (at your option) any later version.
8
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13
14 # You should have received a copy of the GNU General Public License
15 # along with this program; see the file COPYING3.  If not see
16 # <http://www.gnu.org/licenses/>.
17
18 # Define libmudflap callbacks for dg.exp.
19 # This file is a copy of libstdc++-v3's dejagnu driver, with minor changes.
20
21 # Useful hook:  if ${hostname}_init exists, it will be called, almost
22 # the last thing before testing begins.  This can be defined in, e.g.,
23 # ~/.dejagnurc or $DEJAGNU.
24
25 proc load_gcc_lib { filename } {
26     global srcdir
27     load_file $srcdir/../../gcc/testsuite/lib/$filename
28 }
29
30 load_lib mfdg.exp
31 load_lib libgloss.exp
32 load_gcc_lib target-libpath.exp
33 load_gcc_lib target-supports.exp
34 load_gcc_lib timeout.exp
35 load_gcc_lib timeout-dg.exp
36
37 proc libmudflap-init { language } {
38     global env
39     global srcdir outdir blddir objdir tool_root_dir
40     global cxx cxxflags
41     global includes
42     global libs
43     global gluefile wrap_flags
44     global ld_library_path
45
46     switch $language {
47         "c" { set cxx [find_gcc] }
48         "c++" { set cxx [find_g++] }
49         default { error "bad language code $language"; return }
50     }
51
52     verbose -log "libmudflap-init $cxx"
53
54     set blddir [lookfor_file [get_multilibs] libmudflap]
55     set cxxblddir [lookfor_file [get_multilibs] libstdc++-v3]
56     set cxxflags_file "${cxxblddir}/scripts/testsuite_flags"
57
58     # By default, we assume we want to run program images.
59     global dg-do-what-default
60     set dg-do-what-default run
61
62     # set LD_LIBRARY_PATH so that libgcc_s, libstdc++ binaries can be found.
63     # locate libgcc.a so we don't need to account for different values of
64     # SHLIB_EXT on different platforms
65     set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
66     if {$gccdir != ""} {
67         set gccdir [file dirname $gccdir]
68     }
69
70     set ld_library_path "."
71     append ld_library_path ":${gccdir}"
72     append ld_library_path ":${cxxblddir}/src/.libs"
73     if {[is_remote host] == 0} {
74         foreach i "[exec ${gccdir}/xgcc --print-multi-lib]" {
75             set mldir ""
76             regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir
77             set mldir [string trimright $mldir "\;@"]
78             if { "$mldir" == "." } {
79                 continue
80             }
81             if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } {
82                 append ld_library_path ":${gccdir}/${mldir}"
83             }
84         }
85     }
86     append ld_library_path ":${blddir}/.libs"
87
88     set libs "-L${blddir}/.libs"
89     set cxxflags "-ggdb3 -DDEBUG_ASSERT"
90     set includes "-I${srcdir} -I${srcdir}/.. -I.."
91
92     if {$language == "c++"} {
93         if {[file exists $cxxflags_file]} then {
94             set includes "${includes} [exec sh $cxxflags_file --build-includes]"
95             set cxxflags "${cxxflags} [exec sh $cxxflags_file --cxxflags]"
96             # c++ libs are included by --build-cxx below
97             set cxx "[exec sh $cxxflags_file --build-cxx]"
98         } else {
99             lappend libs "-L${cxxblddir}src/.libs"
100             lappend includes "-I../../libstdc++-v3/include"
101         }
102     }
103
104     global mfconfig_libs
105     global add_flags
106     append add_flags " $mfconfig_libs"
107
108     set_ld_library_path_env_vars
109     if [info exists env(LD_LIBRARY_PATH)] {
110         verbose -log "LD_LIBRARY_PATH = $env(LD_LIBRARY_PATH)"
111     }
112
113     if { [target_info needs_status_wrapper]!=""} {
114       file delete ${objdir}/testglue.o;
115       set gluefile ${objdir}/testglue.o;
116       set result [build_wrapper $gluefile];
117       if { $result != "" } {
118           set gluefile [lindex $result 0];
119           set wrap_flags [lindex $result 1];
120       } else {
121           unset gluefile
122       }
123     }
124
125     # If there is no static library then don't run tests with -static.
126     global tool
127     set opts "additional_flags=-static"
128     lappend opts "additional_flags=-fmudflap"
129     lappend opts "additional_flags=-lmudflap"
130     set src stlm[pid].c
131     set exe stlm[pid].x
132
133     set f [open $src "w"]
134     puts $f "int main () { }"
135     close $f
136     set lines [${tool}_target_compile $src $exe executable "$opts"]
137     file delete $src
138     remote_file build delete $exe
139
140     if { ![string match "" $lines] } {
141         # Compilation failed; assume static library is not available.
142         global MUDFLAP_FLAGS
143         set i [lsearch $MUDFLAP_FLAGS "*static*"]
144         set MUDFLAP_FLAGS [lreplace $MUDFLAP_FLAGS $i $i]
145     }
146 }
147
148 proc libmudflap-dg-test { prog do_what extra_tool_flags } {
149     # Set up the compiler flags, based on what we're going to do.
150
151     switch $do_what {
152         "preprocess" {
153             set compile_type "preprocess"
154             set output_file "[file rootname [file tail $prog]].i"
155         }
156         "compile" {
157             set compile_type "assembly"
158             set output_file "[file rootname [file tail $prog]].s"
159         }
160         "assemble" {
161             set compile_type "object"
162             set output_file "[file rootname [file tail $prog]].o"
163         }
164         "link" {
165             set compile_type "executable"
166             set output_file "./[file rootname [file tail $prog]].exe"
167         }
168         "run" {
169             set compile_type "executable"
170             # FIXME: "./" is to cope with "." not being in $PATH.
171             # Should this be handled elsewhere?
172             # YES.
173             set output_file "./[file rootname [file tail $prog]].exe"
174             # This is the only place where we care if an executable was
175             # created or not.  If it was, dg.exp will try to run it.
176             remote_file build delete $output_file;
177         }
178         default {
179             perror "$do_what: not a valid dg-do keyword"
180             return ""
181         }
182     }
183     set options ""
184     if { $extra_tool_flags != "" } {
185         lappend options "additional_flags=$extra_tool_flags"
186     }
187
188     global mfconfig_libs
189     lappend options "libs=$mfconfig_libs"
190
191     set comp_output [libmudflap_target_compile "$prog" "$output_file" "$compile_type" $options];
192
193     return [list $comp_output $output_file]
194 }
195
196
197 proc libmudflap_target_compile { source dest type options } {
198     global gluefile 
199     global wrap_flags
200     global cxx
201     global cxxflags
202     global includes
203     global libs
204     global blddir
205
206     if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
207         lappend options "libs=${gluefile}"
208         lappend options "ldflags=${wrap_flags}"
209     }
210
211     set cxx_final $cxx
212     set cxxlibglossflags  [libgloss_link_flags]
213     set cxx_final [concat $cxx_final $cxxlibglossflags]
214     set cxx_final [concat $cxx_final $cxxflags]
215     set cxx_final [concat $cxx_final $includes]
216     set cxx_final [concat $cxx_final $libs]
217
218     lappend options "compiler=$cxx_final"
219     lappend options "timeout=[timeout_value]"
220
221     # Picks up the freshly-built testsuite library corresponding to the
222     # multilib under test.
223     lappend options "ldflags=-L${blddir}/testsuite"
224
225     return [target_compile $source $dest $type $options]
226 }
227
228
229 # A bit sloppy...  Returns a list of source files (full pathnames) to
230 # compile.  We mimic the mkcheck script in that the first time this is run,
231 # all existing files are listed in "testsuite_files" in the output
232 # directory.  Subsequent runs pull the list from that file, allowing users
233 # to trim the list down to problematic tests.
234 ### This is supposed to be done via RUNTESTFLAGS, but that doesn't work.
235 proc libmudflap-list-sourcefiles { } {
236     global srcdir
237     global outdir
238
239     set files_file "${outdir}/testsuite_files"
240     set sfiles ""
241     if { [file exists $files_file] } {
242         set f [open $files_file]
243         while { ! [eof $f] } {
244             set t [gets $f]
245             if { [string length "$t"] != 0 } {
246                 lappend sfiles ${srcdir}/${t}
247             }
248         }
249     } else {
250         set f [open $files_file "w"]
251         set where_we_were [pwd]
252         cd $srcdir
253         foreach s [lsort [glob -nocomplain "*/*.cc" "*/*/*.cc" "{,*/}*/*/*/*.cc" ]] {
254             lappend sfiles ${srcdir}/${s}
255             puts $f $s
256         }
257         cd $where_we_were
258     }
259     close $f
260
261     # Disable wchar_t tests if library not configured to support
262     # wchar_t testing. 
263     set wchar_file "${outdir}/testsuite_wchar_t"    
264     if { [file exists $wchar_file] } {
265         return $sfiles
266     } else {
267         # Remove wchar_t tests files from list.
268         set res {}
269         foreach w $sfiles {
270             if [regexp "wchar_t" $w] {
271                 verbose -log "element out list is $w"
272             } else {
273                 verbose -log "element in list is $w"
274                 lappend res $w
275             }
276         }
277         return $res
278     }
279 }
280
281
282 proc libmudflap-dg-prune { system text } {
283     global additional_prunes
284
285     set text [prune_gcc_output $text]
286
287     foreach p $additional_prunes {
288         if { [string length $p] > 0 } {
289             # Following regexp matches a complete line containing $p.
290             regsub -all "(^|\n)\[^\n\]*$p\[^\n\]*" $text "" text
291         }
292     }
293
294     return $text
295 }
296
297
298 proc prune_gcc_output { text } {
299     regsub -all {(^|\n)[^\n]*ld: warning: libgcc_s[^\n]*not found[^\n]*try using[^\n]*} $text "" text
300     regsub -all {(^|\n)[^\n]*In function.*pthread_create[^\n]*} $text "" text
301     regsub -all {(^|\n)[^\n]*the use of .pthread.*is deprecated[^\n]*} $text "" text
302     regsub -all {(^|\n)[^\n]*Dwarf Error:.*FORM value: 14[^\n]*} $text "" text
303     regsub -all {(^|\n)[^\n]*In function[^\n]*} $text "" text
304     regsub -all {(^|\n)[^\n]*Using.*in statically linked applications requires[^\n]*} $text "" text
305
306     return $text
307 }