$TmpPrefix ="$DEFAULT_TMPDIR";
$ENV{'TMPDIR'} = "$DEFAULT_TMPDIR"; # set the env var as well
}
+# If this is Cygwin, ignore eol and CR characters.
+# Perhaps required for MSYS too, although the cygpath
+# bit is hopefully unnecessary.
+if ( `uname | grep CYGWIN` ) {
+ $CONTEXT_DIFF=$CONTEXT_DIFF . " --strip-trailing-cr" ;
+ $TmpPrefix = `cygpath -m $TmpPrefix | tr -d \\\\n`;
+}
$ScriptFile = "$TmpPrefix/run_me$$";
$DefaultStdoutFile = "$TmpPrefix/no_stdout$$"; # can't use /dev/null (e.g. Alphas)
$DefaultStderrFile = "$TmpPrefix/no_stderr$$";
$PreScript = '';
$PostScript = '';
$TimeCmd = '';
-$Heimdall = 0;
-$HeimdallPrefix = '';
-$HeimdallStats = "heimdall.summary";
$StatsFile = "$TmpPrefix/stats$$";
-$CacheProfStats = "cacheprof.out.summary";
+$CachegrindStats = "cachegrind.out.summary";
$SysSpecificTiming = '';
-$CacheProf = 'no';
+$Cachegrind = 'no';
die "$Pgm: program to run not given as first argument\n" if $#ARGV < 0;
$ToRun = $ARGV[0]; shift(@ARGV);
next arg; };
/^-(ghc|hbc)-timing$/ && do { $SysSpecificTiming = $1;
next arg; };
- /^-cacheprof$/ && do { $SysSpecificTiming = 'ghc-instrs';
- $CacheProf = 'yes';
- next arg };
- /^-heimdall$/ && do { $HeimdallPrefix = 'heimdall_cp '; # must have trailing space!
- $SysSpecificTiming = 'ghc-instrs';
- $Heimdall = 1;
- next arg; };
+ /^-cachegrind$/ && do { $SysSpecificTiming = 'ghc-instrs';
+ $Cachegrind = 'yes';
+ next arg };
/^-t(.*)/ && do { $TimeCmd = &grab_arg_arg('-t', $1); next arg; };
# anything else is taken to be a pgm arg
if ($PreScript ne '') {
local($to_do);
$PreScriptLines = `cat $PreScript`;
+ $PreScriptLines =~ s/\r//g;
} else {
$PreScriptLines = '';
}
if ($PostScript ne '') {
local($to_do);
$PostScriptLines = `cat $PostScript`;
+ $PostScriptLines =~ s/\r//g;
$* = 1;
$PostScriptLines =~ s#\$o1#$TmpPrefix/runtest$$.1#g;
$PostScriptLines =~ s#\$o2#$TmpPrefix/runtest$$.2#g;
# OK, so we're gonna do the normal thing...
+if ($Cachegrind eq 'yes') {
+ $CachegrindPrefix = "valgrind --skin=cachegrind --logfile-fd=99 99>$CachegrindStats";
+} else {
+ $CachegrindPrefix = '';
+}
+
$Script = <<EOSCRIPT;
#! /bin/sh
myexit=0
cat /dev/null > $DefaultStderrFile
$PreScriptLines
$SpixifyLine1
-$TimeCmd /bin/sh -c \'$HeimdallPrefix$ToRun $TimingMagic @PgmArgs < $PgmStdinFile 1> $TmpPrefix/runtest$$.1 2> $TmpPrefix/runtest$$.2 3> $TmpPrefix/runtest$$.3\'
+echo $TimeCmd /bin/sh -c \'$CachegrindPrefix $ToRun $TimingMagic @PgmArgs < $PgmStdinFile 1> $TmpPrefix/runtest$$.1 2> $TmpPrefix/runtest$$.2 3> $TmpPrefix/runtest$$.3\'
+$TimeCmd /bin/sh -c \'$CachegrindPrefix $ToRun $TimingMagic @PgmArgs < $PgmStdinFile 1> $TmpPrefix/runtest$$.1 2> $TmpPrefix/runtest$$.2 3> $TmpPrefix/runtest$$.3\'
progexit=\$?
if [ \$progexit -eq 0 ] && [ $PgmFail -ne 0 ]; then
echo $ToRun @PgmArgs \\< $PgmStdinFile
cp $TmpPrefix/runtest$$.1 $PgmStdoutFile[0]
fi
fi
-if [ "$Heimdall" = "1" ]; then
- egrep '^=== HEIMDALL: ' < $TmpPrefix/runtest$$.2 > $HeimdallStats
-fi
-egrep -v '^=== HEIMDALL: ' < $TmpPrefix/runtest$$.2 > $TmpPrefix/runtest$$.2b
-mv -f $TmpPrefix/runtest$$.2b $TmpPrefix/runtest$$.2
hit='NO'
for out_file in @PgmStderrFile ; do
}
&process_stats_file();
-&process_cacheprof_files() if $CacheProf eq 'yes';
-&process_heimdall_file() if $Heimdall;
+&process_cachegrind_files() if $Cachegrind eq 'yes';
# print out what we found
print STDERR "<<$SysSpecificTiming: ";
-if ( $CacheProf ne 'yes' && !$Heimdall) {
+if ( $Cachegrind ne 'yes') {
print STDERR "$BytesAlloc bytes, $GCs GCs, $AvgResidency/$MaxResidency avg/max bytes residency ($ResidencySamples samples), $GCWork bytes GC work, ${TotMem}M in use, $InitTime INIT ($InitElapsed elapsed), $MutTime MUT ($MutElapsed elapsed), $GcTime GC ($GcElapsed elapsed)";
} else {
- print STDERR "$BytesAlloc bytes, $GCs GCs, $AvgResidency/$MaxResidency avg/max bytes residency ($ResidencySamples samples), $GCWork bytes GC work, ${TotMem}M in use, $InitTime INIT ($InitElapsed elapsed), $MutTime MUT ($MutElapsed elapsed), $GcTime GC ($GcElapsed elapsed), $TotInstrs instructions, $TotReads memory reads, $TotWrites memory writes";
+ print STDERR "$BytesAlloc bytes, $GCs GCs, $AvgResidency/$MaxResidency avg/max bytes residency ($ResidencySamples samples), $GCWork bytes GC work, ${TotMem}M in use, $InitTime INIT ($InitElapsed elapsed), $MutTime MUT ($MutElapsed elapsed), $GcTime GC ($GcElapsed elapsed), $TotInstrs instructions, $TotReads memory reads, $TotWrites memory writes, $TotMisses L2 cache misses";
};
print STDERR " :$SysSpecificTiming>>\n";
sub grab_arg_arg {
local($option, $rest_of_arg) = @_;
- if ($rest_of_arg) {
+ if ($rest_of_arg ne "") {
return($rest_of_arg);
} elsif ($#ARGV >= 0) {
local($temp) = $ARGV[0]; shift(@ARGV);
$GcElapsed =~ s/,//g;
}
-sub process_cacheprof_files {
-
- open(STATS, "< $CacheProfStats") || die("Can't open $CacheProfStats\n");
-
- # the format of the info in this file is:
- # OTHER(intrs,reads,writes,read-misses,write-misses)
- # where read-misses and write-misses will both be zero if we're
- # just counting instructions.
- while (<STATS>) {
- /OTHER\(\s*([0-9]+),\s*([0-9]+),\s*([0-9]+),\s*([0-9]+),\s*([0-9]+)\)/ && do {
- $TotInstrs = $1;
- $TotReads = $2;
- $TotWrites = $3;
- }
- }
- close(STATS);
-}
-
-sub process_heimdall_file {
+sub process_cachegrind_files {
- open(STATS, "< $HeimdallStats") || die("Can't open $HeimdallStats\n");
+ open(STATS, "< $CachegrindStats") || die("Can't open $CachegrindStats\n");
- # instruction counts from Julian Seward's HEIMDALL:
- #
- # === HEIMDALL: instruction counts: 815000 instrs, 230040 reads, 138692 writes
while (<STATS>) {
- /^=== HEIMDALL: instruction counts: ([0-9]+) instrs, ([0-9]+) reads, ([0-9]+) writes/
- && do {
+ /^==\d+==\s+I\s+refs:\s+([0-9,]*)/ && do {
$TotInstrs = $1;
- $TotReads = $2;
- $TotWrites = $3;
- }
- }
- close(STATS);
+ $TotInstrs =~ s/,//g;
+ };
+
+ /^==\d+==\s+D\s+refs:\s+[0-9,]+\s+\(([0-9,]+)\s+rd\s+\+\s+([0-9,]+)\s+wr/ && do {
+ $TotReads = $1;
+ $TotWrites = $2;
+ $TotReads =~ s/,//g;
+ $TotWrites =~ s/,//g;
+ };
+
+ /^==\d+==\s+L2d\s+misses:\s+([0-9,]+)/ && do {
+ $TotMisses = $1;
+ $TotMisses =~ s/,//g;
+ };
+ }
+ close(STATS);
}