# Support routines for display-testing machinery in gprofng testsuite. # Copyright (C) 1994-2021 Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # # This file 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 this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, # MA 02110-1301, USA. # Run the COMMAND on the host and return a list of the form # { exit-status OUTPUT }. proc run_native_host_cmd { command } { global link_output global ld verbose -log "$command" set run_output "" try { set run_output [exec "sh" "-c" "$command" "2>@1"] set status 0 } trap CHILDSTATUS {results options} { set status [lindex [dict get $options -errorcode] 2] set run_output $results } regsub "\n$" $run_output "" run_output if { [lindex $status 0] != 0 && [string match "" $run_output] } then { append run_output "child process exited abnormally" } if [string match "" $run_output] then { return "" } return [list [lindex $status 0] $run_output] } # Run a display test in DIR. # Unanswered questions: do we want to cycle through compilation flags, # display options, collect flags, app options? Do we want these to be # set on a per-app basis? (If so, they should probably be driven by a # file in the test dir.) proc run_display_test { dir cflags gprofflags } { global srcdir MAKE CC CFLAGS LDFLAGS LIBS BUILDDIR set stripped [string map {" " ""} $dir] set testdir [string map {" " ""} "$dir.$cflags,$gprofflags"] set sdir "$srcdir/gprofng.display/$dir" set tdir "tmpdir/$testdir" send_log "create dir: $tdir\n" set output [run_native_host_cmd "mkdir -p $tdir"] set gprofng [exec find $BUILDDIR/tmpdir -type f -name gprofng -perm -u+x | head -1] set fd [open "$tdir/rules.txt" "w"] switch -regexp -- $testdir { {-p,on.*-h,on} { set DISPLAY_FLAGS "-metrics i.totalcpu:i.cycles -func" puts $fd "Cpu, 2, 0\n" puts $fd "Cycles, 2, 1\n" } {-h,on} { set DISPLAY_FLAGS "-metrics i.cycles -func" puts $fd "Cycles, 2, 0\n" } default { set DISPLAY_FLAGS "-metrics i.totalcpu -func" puts $fd "Cpu, 2, 0\n" } } close $fd set make_args "-f $sdir/Makefile srcdir=\"$sdir\" builddir=\"$BUILDDIR\" \ VPATH=\"$dir\" CC=\"$CC\" CFLAGS=\"$cflags\" LDFLAGS=\"$LDFLAGS\" \ DISPLAY_FLAGS=\"$DISPLAY_FLAGS\" \ COLLECT_FLAGS=\"$gprofflags\" GPROFNG=\"$gprofng\" MAKE=\"$MAKE\"" set output [run_native_host_cmd "cd $tdir && $MAKE $make_args all"] # send_log "run_native_host_cmd output:\n$output\n" if { [lindex $output 0] != 0 } then { set out [lindex $output 1] if {[file exists "$tdir/diff.out"]} then { send_log "comparison of results in $dir failed:\n$out\n" set pltf [exec uname -i] if { $pltf == "aarch64" } { xfail $dir return 0 } perror "comparison of results in $dir failed" } else { send_log "compilation of test program in $dir failed:\n$out\n" perror "compilation of test program in $dir failed" } fail $dir return 0 } pass $dir }