1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#! @PERL@ 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown##--------------------------------------------------------------------## 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown##--- Valgrind performance testing script vg_perf ---## 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown##--------------------------------------------------------------------## 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# This file is part of Valgrind, a dynamic binary instrumentation 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# framework. 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Copyright (C) 2005 Nicholas Nethercote 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# njn@valgrind.org 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# This program is free software; you can redistribute it and/or 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# modify it under the terms of the GNU General Public License as 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# published by the Free Software Foundation; either version 2 of the 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# License, or (at your option) any later version. 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# This program is distributed in the hope that it will be useful, but 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# WITHOUT ANY WARRANTY; without even the implied warranty of 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# General Public License for more details. 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# You should have received a copy of the GNU General Public License 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# along with this program; if not, write to the Free Software 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 02111-1307, USA. 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# The GNU General Public License is contained in the file COPYING. 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# usage: see usage message. 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# You can specify individual files to test, or whole directories, or both. 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Directories are traversed recursively, except for ones named, for example, 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# CVS/ or docs/. 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Each test is defined in a file <test>.vgperf, containing one or more of the 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# following lines, in any order: 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# - prog: <prog to run> (compulsory) 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# - args: <args for prog> (default: none) 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# - vgopts: <Valgrind options> (default: none) 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# - prereq: <prerequisite command> (default: none) 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# - cleanup: <post-test cleanup cmd to run> (default: none) 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# The prerequisite command, if present, must return 0 otherwise the test is 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# skipped. 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Sometimes it is useful to run all the tests at a high sanity check 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# level or with arbitrary other flags. To make this simple, extra 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# options, applied to all tests run, are read from $EXTRA_REGTEST_OPTS, 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# and handed to valgrind prior to any other flags specified by the 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# .vgperf file. Note: the env var is the same as vg_regtest. 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownuse warnings; 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownuse strict; 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Global vars 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy $usage = <<END 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownusage: vg_perf [options] [files or dirs] 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown options for the user, with defaults in [ ], are: 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown -h --help show this message 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown --reps=<n> number of repeats for each program [1] 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown --tools=<t1,t2,t3> tools to run [Nulgrind and Memcheck] 66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov --vg=<dir> top-level directory containing Valgrind to measure 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov [Valgrind in the current directory, i.e. --vg=.] 68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Can be specified multiple times. 69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov The "in-place" build is used. 70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov --outer-valgrind: run these Valgrind(s) under the given outer valgrind. 72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov These Valgrind(s) must be configured with --enable-inner. 73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov --outer-tool: tool to use by the outer valgrind (default cachegrind). 74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov --outer-args: use this as outer tool args. 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Any tools named in --tools must be present in all directories specified 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown with --vg. (This is not checked.) 78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Use EXTRA_REGTEST_OPTS to supply extra args for all tests 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownEND 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown; 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Test variables 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy $vgopts; # valgrind options 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy $prog; # test prog 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy $args; # test prog args 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy $prereq; # prerequisite test to satisfy before running test 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy $cleanup; # cleanup command to run 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Command line options 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy $n_reps = 1; # Run each test $n_reps times and choose the best one. 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy @vgdirs; # Dirs of the various Valgrinds being measured. 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy @tools = ("none", "memcheck"); # tools being measured 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# Outer valgrind to use, and args to use for it. 95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# If this is set, --valgrind should be set to the installed inner valgrind, 96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov# and --valgrind-lib will be ignore 97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovmy $outer_valgrind; 98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovmy $outer_tool = "cachegrind"; 99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovmy $outer_args; 100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy $num_tests_done = 0; 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy $num_timings_done = 0; 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Starting directory 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownchomp(my $tests_dir = `pwd`); 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Process command line, setup 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# If $prog is a relative path, it prepends $dir to it. Useful for two reasons: 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 1. Can prepend "." onto programs to avoid trouble with users who don't have 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# "." in their path (by making $dir = ".") 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 2. Can prepend the current dir to make the command absolute to avoid 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# subsequent trouble when we change directories. 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Also checks the program exists and is executable. 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsub validate_program ($$$$) 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my ($dir, $prog, $must_exist, $must_be_executable) = @_; 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # If absolute path, leave it alone. If relative, make it 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # absolute -- by prepending current dir -- so we can change 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # dirs and still use it. 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $prog = "$dir/$prog" if ($prog !~ /^\//); 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($must_exist) { 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (-f $prog) or die "vg_perf: '$prog' not found or not a file ($dir)\n"; 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($must_be_executable) { 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (-x $prog) or die "vg_perf: '$prog' not executable ($dir)\n"; 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return $prog; 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsub add_vgdir($) 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my ($vgdir) = @_; 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($vgdir !~ /^\//) { $vgdir = "$tests_dir/$vgdir"; } 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown push(@vgdirs, $vgdir); 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsub process_command_line() 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my @fs; 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for my $arg (@ARGV) { 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($arg =~ /^-/) { 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($arg =~ /^--reps=(\d+)$/) { 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $n_reps = $1; 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($n_reps < 1) { die "bad --reps value: $n_reps\n"; } 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } elsif ($arg =~ /^--vg=(.+)$/) { 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Make dir absolute if not already 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add_vgdir($1); 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } elsif ($arg =~ /^--tools=(.+)$/) { 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown @tools = split(/,/, $1); 159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } elsif ($arg =~ /^--outer-valgrind=(.*)$/) { 160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $outer_valgrind = $1; 161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } elsif ($arg =~ /^--outer-tool=(.*)$/) { 162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $outer_tool = $1; 163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } elsif ($arg =~ /^--outer-args=(.*)$/) { 164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $outer_args = $1; 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown die $usage; 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown push(@fs, $arg); 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # If no --vg options were specified, use the current tree. 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (0 == @vgdirs) { 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown add_vgdir($tests_dir); 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (0 != @fs) or die "No test files or directories specified\n"; 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return @fs; 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Read a .vgperf file 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsub read_vgperf_file($) 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my ($f) = @_; 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Defaults. 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ($vgopts, $prog, $args, $prereq, $cleanup) 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown = ("", undef, "", undef, undef, undef, undef); 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown open(INPUTFILE, "< $f") || die "File $f not openable\n"; 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown while (my $line = <INPUTFILE>) { 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($line =~ /^\s*#/ || $line =~ /^\s*$/) { 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown next; 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } elsif ($line =~ /^\s*vgopts:\s*(.*)$/) { 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $vgopts = $1; 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } elsif ($line =~ /^\s*prog:\s*(.*)$/) { 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $prog = validate_program(".", $1, 1, 1); 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } elsif ($line =~ /^\s*args:\s*(.*)$/) { 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $args = $1; 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } elsif ($line =~ /^\s*prereq:\s*(.*)$/) { 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $prereq = $1; 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } elsif ($line =~ /^\s*cleanup:\s*(.*)$/) { 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $cleanup = $1; 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown die "Bad line in $f: $line\n"; 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown close(INPUTFILE); 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (!defined $prog) { 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $prog = ""; # allow no prog for testing error and --help cases 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (0 == @tools) { 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown die "vg_perf: missing 'tools' line in $f\n"; 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Do one test 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Since most of the program time is spent in system() calls, need this to 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# propagate a Ctrl-C enabling us to quit. 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsub mysystem($) 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my ($cmd) = @_; 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $retval = system($cmd); 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($retval == 2) { 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit 1; 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return $retval; 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Run program N times, return the best user time. Use the POSIX 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# -p flag on /usr/bin/time so as to get something parseable on AIX. 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsub time_prog($$) 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my ($cmd, $n) = @_; 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $tmin = 999999; 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown for (my $i = 0; $i < $n; $i++) { 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mysystem("echo '$cmd' > perf.cmd"); 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $retval = mysystem("$cmd > perf.stdout 2> perf.stderr"); 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (0 == $retval) or 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown die "\n*** Command returned non-zero ($retval)" 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown . "\n*** See perf.{cmd,stdout,stderr} to determine what went wrong.\n"; 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $out = `cat perf.stderr`; 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ($out =~ /[Uu]ser +([\d\.]+)/) or 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown die "\n*** missing usertime in perf.stderr\n"; 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $tmin = $1 if ($1 < $tmin); 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov # Successful run; cleanup 258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov unlink("perf.cmd"); 259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov unlink("perf.stderr"); 260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov unlink("perf.stdout"); 261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Avoid divisions by zero! 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return (0 == $tmin ? 0.01 : $tmin); 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsub do_one_test($$) 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my ($dir, $vgperf) = @_; 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $vgperf =~ /^(.*)\.vgperf/; 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $name = $1; 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my %first_tTool; # For doing percentage speedups when comparing 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # multiple Valgrinds 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown read_vgperf_file($vgperf); 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (defined $prereq) { 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (system("$prereq") != 0) { 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("%-16s (skipping, prereq failed: $prereq)\n", "$name:"); 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return; 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $timecmd = "/usr/bin/time -p"; 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Do the native run(s). 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("-- $name --\n") if (@vgdirs > 1); 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $cmd = "$timecmd $prog $args"; 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $tNative = time_prog($cmd, $n_reps); 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (defined $outer_valgrind) { 291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $outer_valgrind = validate_program($tests_dir, $outer_valgrind, 1, 1); 292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $vgdir (@vgdirs) { 293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov validate_program($vgdir, "./coregrind/valgrind", 1, 1); 294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov foreach my $vgdir (@vgdirs) { 297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov validate_program($vgdir, "./coregrind/valgrind", 1, 1); 298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov # Pull any extra options (for example, --sanity-level=4) 302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov # from $EXTRA_REGTEST_OPTS. 303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $maybe_extraopts = $ENV{"EXTRA_REGTEST_OPTS"}; 304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $extraopts = $maybe_extraopts ? $maybe_extraopts : ""; 305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown foreach my $vgdir (@vgdirs) { 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Benchmark name 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("%-8s ", $name); 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Print the Valgrind version if we are measuring more than one. 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $vgdirname = $vgdir; 312ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown chomp($vgdirname = `basename $vgdir`); 313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("%-10s:", $vgdirname); 314ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Native execution time 316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("%4.2fs", $tNative); 317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 318ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown foreach my $tool (@tools) { 319ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # First two chars of toolname for abbreviation 320ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $tool_abbrev = $tool; 321ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $tool_abbrev =~ s/(..).*/$1/; 322ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf(" %s:", $tool_abbrev); 323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $run_outer_args = ""; 324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (not defined $outer_args) { 325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $run_outer_args = 326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov " -v --command-line-only=yes" 327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " --run-libc-freeres=no --sim-hints=enable-outer" 328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " --smc-check=all-non-file" 329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " --vgdb=no --trace-children=yes --read-var-info=no" 330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " --suppressions=../tests/outer_inner.supp" 331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " --memcheck:leak-check=full --memcheck:show-reachable=no" 332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " --cachegrind:cache-sim=yes --cachegrind:branch-sim=yes" 333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " --cachegrind:cachegrind-out-file=cachegrind.out.$vgdirname.$tool_abbrev.$name.%p" 334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " --callgrind:cache-sim=yes --callgrind:branch-sim=yes" 335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " --callgrind:dump-instr=yes --callgrind:collect-jumps=yes" 336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " --callgrind:callgrind-out-file=callgrind.out.$vgdirname.$tool_abbrev.$name.%p" 337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . " "; 338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $run_outer_args = $outer_args; 340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov my $vgsetup = ""; 343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $vgcmd = "$vgdir/coregrind/valgrind " 344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . "--command-line-only=yes --tool=$tool $extraopts -q " 345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown . "--memcheck:leak-check=no " 346ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown . "--trace-children=yes " 347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown . "$vgopts "; 348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov # Do the tool run(s). 349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (defined $outer_valgrind ) { 350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov # in an outer-inner setup, only set VALGRIND_LIB_INNER 351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $vgsetup = "VALGRIND_LIB_INNER=$vgdir/.in_place "; 352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $vgcmd = "$outer_valgrind " 353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . "--tool=" . $outer_tool . " " 354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . "$run_outer_args " 355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . "--log-file=" . "$outer_tool.outer.log.$vgdirname.$tool_abbrev.$name.%p " 356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . $vgcmd; 357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } else { 358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov # Set both VALGRIND_LIB and VALGRIND_LIB_INNER 359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov # in case this Valgrind was configured with --enable-inner. And 360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov # also VALGRINDLIB, which was the old name for the variable, to 361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov # allow comparison against old Valgrind versions (eg. 2.4.X). 362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov $vgsetup = "VALGRINDLIB=$vgdir/.in_place " 363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . "VALGRIND_LIB=$vgdir/.in_place " 364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov . "VALGRIND_LIB_INNER=$vgdir/.in_place "; 365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 366ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $cmd = "$vgsetup $timecmd $vgcmd $prog $args"; 367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $tTool = time_prog($cmd, $n_reps); 368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("%4.1fs (%4.1fx,", $tTool, $tTool/$tNative); 369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # If it's the first timing for this tool on this benchmark, 371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # record the time so we can get the percentage speedup of the 372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # subsequent Valgrinds. Otherwise, compute and print 373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # the speedup. 374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (not defined $first_tTool{$tool}) { 375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $first_tTool{$tool} = $tTool; 376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown print(" -----)"); 377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 378ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $speedup = 100 - (100 * $tTool / $first_tTool{$tool}); 379ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("%5.1f%%)", $speedup); 380ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 381ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 382ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $num_timings_done++; 383ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 384ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (defined $cleanup) { 385ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (system("$cleanup") == 0) or 386ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown print(" ($name cleanup operation failed: $cleanup)\n"); 387ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 388ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 389ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("\n"); 390ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 391ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 392ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $num_tests_done++; 393ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 394ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 395ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 396ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Test one directory (and any subdirs) 397ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 398ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsub test_one_dir($$); # forward declaration 399ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 400ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsub test_one_dir($$) 401ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 402ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my ($dir, $prev_dirs) = @_; 403ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $dir =~ s/\/$//; # trim a trailing '/' 404ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 405ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown chomp(my $initial_dir = `pwd`); # record where we started 406ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 407ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Ignore dirs into which we should not recurse. 408ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($dir =~ /^(BitKeeper|CVS|SCCS|docs|doc)$/) { return; } 409ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 410ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown chdir($dir) or die "Could not change into $dir\n"; 411ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 412ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Nb: Don't prepend a '/' to the base directory 413ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $full_dir = $prev_dirs . ($prev_dirs eq "" ? "" : "/") . $dir; 414ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $dashes = "-" x (50 - length $full_dir); 415ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 416ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my @fs = glob "*"; 417ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $found_tests = (0 != (grep { $_ =~ /\.vgperf$/ } @fs)); 418ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 419ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($found_tests) { 420ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown print "-- Running tests in $full_dir $dashes\n"; 421ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 422ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown foreach my $f (@fs) { 423ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (-d $f) { 424ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_one_dir($f, $full_dir); 425ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } elsif ($f =~ /\.vgperf$/) { 426ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do_one_test($full_dir, $f); 427ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 428ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 429ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($found_tests) { 430ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown print "-- Finished tests in $full_dir $dashes\n"; 431ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 432ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 433ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown chdir("$initial_dir"); 434ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 435ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 436ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 437ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# Summarise results 438ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 439ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsub summarise_results 440ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 441ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown printf("\n== %d programs, %d timings =================\n\n", 442ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $num_tests_done, $num_timings_done); 443ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 444ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 445ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 446ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# main() 447ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#---------------------------------------------------------------------------- 448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovsub warn_about_EXTRA_REGTEST_OPTS() 449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "WARNING: \$EXTRA_REGTEST_OPTS is set. You probably don't want\n"; 451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "to run the perf tests with it set, unless you are doing some\n"; 452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "strange experiment, and/or you really know what you are doing.\n"; 453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "\n"; 454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 455ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 456ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# nuke VALGRIND_OPTS 457ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown$ENV{"VALGRIND_OPTS"} = ""; 458ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovif ($ENV{"EXTRA_REGTEST_OPTS"}) { 460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov print "\n"; 461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov warn_about_EXTRA_REGTEST_OPTS(); 462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 464ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmy @fs = process_command_line(); 465ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownforeach my $f (@fs) { 466ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (-d $f) { 467ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown test_one_dir($f, ""); 468ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 469ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # Allow the .vgperf suffix to be given or omitted 470ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ($f =~ /.vgperf$/ && -r $f) { 471ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown # do nothing 472ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } elsif (-r "$f.vgperf") { 473ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown $f = "$f.vgperf"; 474ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } else { 475ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown die "`$f' neither a directory nor a readable test file/name\n" 476ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 477ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $dir = `dirname $f`; chomp $dir; 478ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown my $file = `basename $f`; chomp $file; 479ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown chdir($dir) or die "Could not change into $dir\n"; 480ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do_one_test($dir, $file); 481ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown chdir($tests_dir); 482ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 483ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 484ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownsummarise_results(); 485ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovif ($ENV{"EXTRA_REGTEST_OPTS"}) { 487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov warn_about_EXTRA_REGTEST_OPTS(); 488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 490ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown##--------------------------------------------------------------------## 491ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown##--- end ---## 492ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown##--------------------------------------------------------------------## 493