+my $AddedFilesList = AddPreTag join "\n", sort keys %AddedFiles;
+my $ModifiedFilesList = AddPreTag join "\n", sort keys %ModifiedFiles;
+my $RemovedFilesList = AddPreTag join "\n", sort keys %RemovedFiles;
+
+my $TestError = 1;
+my $SingleSourceProgramsTable;
+my $MultiSourceProgramsTable;
+my $ExternalProgramsTable;
+
+
+sub TestDirectory {
+ my $SubDir = shift;
+
+ chdir "test/Programs/$SubDir" or
+ die "Could not change into test/Programs/$SubDir testdir!";
+
+ # Run the programs tests... creating a report.nightly.html file
+ if (!$NOTEST) {
+ system "gmake -k $MAKEOPTS $ENABLELINEARSCAN report.nightly.html "
+ . "TEST=nightly > $Prefix-$SubDir-ProgramTest.txt 2>&1";
+ } else {
+ system "gunzip $Prefix-$SubDir-ProgramTest.txt.gz";
+ }
+
+ my $ProgramsTable;
+ if (`grep '^gmake[^:]: .*Error' $Prefix-$SubDir-ProgramTest.txt | wc -l` + 0){
+ $TestError = 1;
+ $ProgramsTable = "<font color=white><h2>Error running tests!</h2></font>";
+ print "ERROR TESTING\n";
+ } elsif (`grep '^gmake[^:]: .*No rule to make target' $Prefix-$SubDir-ProgramTest.txt | wc -l` + 0) {
+ $TestError = 1;
+ $ProgramsTable =
+ "<font color=white><h2>Makefile error running tests!</h2></font>";
+ print "ERROR TESTING\n";
+ } else {
+ $TestError = 0;
+ $ProgramsTable = ReadFile "report.nightly.html";
+
+ #
+ # Create a list of the tests which were run...
+ #
+ system "egrep 'TEST-(PASS|FAIL)' < $Prefix-$SubDir-ProgramTest.txt "
+ . "| sort > $Prefix-$SubDir-Tests.txt";
+ }
+
+ # Compress the test output
+ system "gzip -f $Prefix-$SubDir-ProgramTest.txt";
+ chdir "../../.." or die "Cannot return to parent directory!";
+ return $ProgramsTable;
+}
+
+# If we build the tree successfully, run the nightly programs tests...
+if ($BuildError eq "") {
+ $SingleSourceProgramsTable = TestDirectory("SingleSource");
+ $MultiSourceProgramsTable = TestDirectory("MultiSource");
+ $ExternalProgramsTable = TestDirectory("External");
+ system "cat $Prefix-SingleSource-Tests.txt $Prefix-MultiSource-Tests.txt ".
+ " $Prefix-External-Tests.txt | sort > $Prefix-Tests.txt";
+}
+
+my ($TestsAdded, $TestsRemoved, $TestsFixed, $TestsBroken) = ("","","","");
+
+if ($TestError) {
+ $TestsAdded = "<b>error testing</b><br>";
+ $TestsRemoved = "<b>error testing</b><br>";
+ $TestsFixed = "<b>error testing</b><br>";
+ $TestsBroken = "<b>error testing</b><br>";
+} else {
+ my ($RTestsAdded, $RTestsRemoved) = DiffFiles "-Tests.txt";
+
+ my @RawTestsAddedArray = split '\n', $RTestsAdded;
+ my @RawTestsRemovedArray = split '\n', $RTestsRemoved;
+
+ my %OldTests = map {GetRegex('TEST-....: (.+)', $_)=>$_}
+ @RawTestsRemovedArray;
+ my %NewTests = map {GetRegex('TEST-....: (.+)', $_)=>$_}
+ @RawTestsAddedArray;
+
+ foreach $Test (keys %NewTests) {
+ if (!exists $OldTests{$Test}) { # TestAdded if in New but not old
+ $TestsAdded = "$TestsAdded$Test\n";
+ } else {
+ if ($OldTests{$Test} =~ /TEST-PASS/) { # Was the old one a pass?
+ $TestsBroken = "$TestsBroken$Test\n"; # New one must be a failure
+ } else {
+ $TestsFixed = "$TestsFixed$Test\n"; # No, new one is a pass.
+ }
+ }
+ }
+ foreach $Test (keys %OldTests) { # TestRemoved if in Old but not New
+ $TestsRemoved = "$TestsRemoved$Test\n" if (!exists $NewTests{$Test});
+ }
+
+ print "\nTESTS ADDED: \n\n$TestsAdded\n\n" if (length $TestsAdded);
+ print "\nTESTS REMOVED:\n\n$TestsRemoved\n\n" if (length $TestsRemoved);
+ print "\nTESTS FIXED: \n\n$TestsFixed\n\n" if (length $TestsFixed);
+ print "\nTESTS BROKEN: \n\n$TestsBroken\n\n" if (length $TestsBroken);
+
+ $TestsAdded = AddPreTag $TestsAdded;
+ $TestsRemoved = AddPreTag $TestsRemoved;
+ $TestsFixed = AddPreTag $TestsFixed;
+ $TestsBroken = AddPreTag $TestsBroken;
+}
+
+
+# If we built the tree successfully, runs of the Olden suite with
+# LARGE_PROBLEM_SIZE on so that we can get some "running" statistics.
+if ($BuildError eq "") {
+ my ($NATTime, $CBETime, $LLCTime, $JITTime, $OptTime, $BytecodeSize,
+ $MachCodeSize) = ("","","","","","","");
+ if (!$NORUNNINGTESTS) {
+ chdir "test/Programs/MultiSource/Benchmarks/Olden" or die "Olden tests moved?";
+
+ # Clean out previous results...
+ system "gmake $MAKEOPTS clean > /dev/null 2>&1";
+
+ # Run the nightly test in this directory, with LARGE_PROBLEM_SIZE enabled!
+ system "gmake -k $MAKEOPTS report.nightly.raw.out TEST=nightly " .
+ " LARGE_PROBLEM_SIZE=1 > /dev/null 2>&1";
+ system "cp report.nightly.raw.out $Prefix-Olden-tests.txt";
+ } else {
+ system "gunzip $Prefix-Olden-tests.txt.gz";
+ }
+
+ # Now we know we have $Prefix-Olden-tests.txt as the raw output file. Split
+ # it up into records and read the useful information.
+ my @Records = split />>> ========= /, ReadFile "$Prefix-Olden-tests.txt";
+ shift @Records; # Delete the first (garbage) record
+
+ # Loop over all of the records, summarizing them into rows for the running
+ # totals file.
+ my $WallTimeRE = "[A-Za-z0-9.: ]+\\(([0-9.]+) wall clock";
+ foreach $Rec (@Records) {
+ my $rNATTime = GetRegex 'TEST-RESULT-nat-time: real\s*([.0-9m]+)', $Rec;
+ my $rCBETime = GetRegex 'TEST-RESULT-cbe-time: real\s*([.0-9m]+)', $Rec;
+ my $rLLCTime = GetRegex 'TEST-RESULT-llc-time: real\s*([.0-9m]+)', $Rec;
+ my $rJITTime = GetRegex 'TEST-RESULT-jit-time: real\s*([.0-9m]+)', $Rec;
+ my $rOptTime = GetRegex "TEST-RESULT-compile: $WallTimeRE", $Rec;
+ my $rBytecodeSize = GetRegex 'TEST-RESULT-compile: *([0-9]+)', $Rec;
+ my $rMachCodeSize = GetRegex 'TEST-RESULT-jit-machcode: *([0-9]+).*bytes of machine code', $Rec;
+
+ $NATTime .= " " . FormatTime($rNATTime);
+ $CBETime .= " " . FormatTime($rCBETime);
+ $LLCTime .= " " . FormatTime($rLLCTime);
+ $JITTime .= " " . FormatTime($rJITTime);
+ $OptTime .= " $rOptTime";
+ $BytecodeSize .= " $rBytecodeSize";
+ $MachCodeSize .= " $rMachCodeSize";
+ }
+
+ # Now that we have all of the numbers we want, add them to the running totals
+ # files.
+ AddRecord($NATTime, "running_Olden_nat_time.txt");
+ AddRecord($CBETime, "running_Olden_cbe_time.txt");
+ AddRecord($LLCTime, "running_Olden_llc_time.txt");
+ AddRecord($JITTime, "running_Olden_jit_time.txt");
+ AddRecord($OptTime, "running_Olden_opt_time.txt");
+ AddRecord($BytecodeSize, "running_Olden_bytecode.txt");
+ AddRecord($MachCodeSize, "running_Olden_machcode.txt");
+
+ system "gzip -f $Prefix-Olden-tests.txt";
+}