#!/usr/bin/perl
use POSIX qw(strftime);
use File::Copy;
+use File::Find;
use Socket;
#
# regressions and performance changes. Submits this information
# to llvm.org where it is placed into the nightlytestresults database.
#
-# Modified heavily by Patrick Jenkins, July 2006
-#
# Syntax: NightlyTest.pl [OPTIONS] [CVSROOT BUILDDIR WEBDIR]
# where
# OPTIONS may include one or more of the following:
# -noremoveresults Do not remove the WEBDIR after it has been built.
# -nobuild Do not build llvm. If tests are enabled perform them
# on the llvm build specified in the build directory
-# -notest Do not even attempt to run the test programs. Implies
-# -norunningtests.
-# -norunningtests Do not run the Olden benchmark suite with
-# LARGE_PROBLEM_SIZE enabled.
+# -notest Do not even attempt to run the test programs.
# -nodejagnu Do not run feature or regression tests
-# -parallel Run two parallel jobs with GNU Make.
+# -parallel Run parallel jobs with GNU Make (see -parallel-jobs).
+# -parallel-jobs The number of parallel Make jobs to use (default is two).
+# -with-clang Checkout Clang source into tools/clang.
# -release Build an LLVM Release version
# -release-asserts Build an LLVM ReleaseAsserts version
# -enable-llcbeta Enable testing of beta features in llc.
# -enable-lli Enable testing of lli (interpreter) features, default is off
+# -disable-pic Disable building with Position Independent Code.
# -disable-llc Disable LLC tests in the nightly tester.
# -disable-jit Disable JIT tests in the nightly tester.
# -disable-cbe Disable C backend tests in the nightly tester.
# this option is not specified it defaults to
# /nightlytest/NightlyTestAccept.php. This is basically
# everything after the www.yourserver.org.
+# -submit-aux If specified, an auxiliary script to run in addition to the
+# normal submit script. The script will be passed the path to
+# the "sentdata.txt" file as its sole argument.
# -nosubmit Do not report the test results back to a submit server.
#
# CVSROOT is the CVS repository from which the tree will be checked out,
##############################################################
my $HOME = $ENV{'HOME'};
my $SVNURL = $ENV{"SVNURL"};
-$SVNURL = 'https://llvm.org/svn/llvm-project' unless $SVNURL;
+$SVNURL = 'http://llvm.org/svn/llvm-project' unless $SVNURL;
+my $TestSVNURL = $ENV{"TestSVNURL"};
+$TestSVNURL = 'https://llvm.org/svn/llvm-project' unless $TestSVNURL;
my $CVSRootDir = $ENV{'CVSROOT'};
$CVSRootDir = "/home/vadve/shared/PublicCVS" unless $CVSRootDir;
my $BuildDir = $ENV{'BUILDDIR'};
$nickname="";
$NOTEST=0;
$USESVN=1;
-$NORUNNINGTESTS=0;
$MAKECMD="make";
$SUBMITSERVER = "llvm.org";
$SUBMITSCRIPT = "/nightlytest/NightlyTestAccept.php";
+$SUBMITAUX="";
$SUBMIT = 1;
+$PARALLELJOBS = "2";
while (scalar(@ARGV) and ($_ = $ARGV[0], /^[-+]/)) {
shift;
if (/^-nocvsstats$/) { $NOCVSSTATS = 1; next; }
if (/^-noremove$/) { $NOREMOVE = 1; next; }
if (/^-noremoveresults$/){ $NOREMOVERESULTS = 1; next; }
- if (/^-notest$/) { $NOTEST = 1; $NORUNNINGTESTS = 1; next; }
- if (/^-norunningtests$/) { $NORUNNINGTESTS = 1; next; }
- if (/^-parallel$/) { $MAKEOPTS = "$MAKEOPTS -j2 -l3.0"; next; }
+ if (/^-notest$/) { $NOTEST = 1; next; }
+ if (/^-norunningtests$/) { next; } # Backward compatibility, ignored.
+ if (/^-parallel-jobs$/) { $PARALLELJOBS = "$ARGV[0]"; shift; next;}
+ if (/^-parallel$/) { $MAKEOPTS = "$MAKEOPTS -j$PARALLELJOBS -l3.0"; next; }
+ if (/^-with-clang$/) { $WITHCLANG = 1; next; }
if (/^-release$/) { $MAKEOPTS = "$MAKEOPTS ENABLE_OPTIMIZED=1 ".
"OPTIMIZE_OPTION=-O2"; $BUILDTYPE="release"; next;}
if (/^-release-asserts$/){ $MAKEOPTS = "$MAKEOPTS ENABLE_OPTIMIZED=1 ".
"OPTIMIZE_OPTION=-O2";
$BUILDTYPE="release-asserts"; next;}
if (/^-enable-llcbeta$/) { $PROGTESTOPTS .= " ENABLE_LLCBETA=1"; next; }
+ if (/^-disable-pic$/) { $CONFIGUREARGS .= " --enable-pic=no"; next; }
if (/^-enable-lli$/) { $PROGTESTOPTS .= " ENABLE_LLI=1";
$CONFIGUREARGS .= " --enable-lli"; next; }
if (/^-disable-llc$/) { $PROGTESTOPTS .= " DISABLE_LLC=1";
shift; next; }
if (/^-submit-server/) { $SUBMITSERVER = "$ARGV[0]"; shift; next; }
if (/^-submit-script/) { $SUBMITSCRIPT = "$ARGV[0]"; shift; next; }
+ if (/^-submit-aux/) { $SUBMITAUX = "$ARGV[0]"; shift; next; }
if (/^-nosubmit$/) { $SUBMIT = 0; next; }
if (/^-nickname$/) { $nickname = "$ARGV[0]"; shift; next; }
if (/^-gccpath/) { $CONFIGUREARGS .=
if ($ENV{'LLVMGCCDIR'}) {
$CONFIGUREARGS .= " --with-llvmgccdir=" . $ENV{'LLVMGCCDIR'};
- $LLVMGCCPATH = $ENV{'LLVMGCCDIR'};
+ $LLVMGCCPATH = $ENV{'LLVMGCCDIR'} . '/bin';
}
else {
$LLVMGCCPATH = "";
my $Prefix = "$WebDir/$DATE";
my $BuildLog = "$Prefix-Build-Log.txt";
my $COLog = "$Prefix-CVS-Log.txt";
-my $OldenTestsLog = "$Prefix-Olden-tests.txt";
my $SingleSourceLog = "$Prefix-SingleSource-ProgramTest.txt.gz";
my $MultiSourceLog = "$Prefix-MultiSource-ProgramTest.txt.gz";
my $ExternalLog = "$Prefix-External-ProgramTest.txt.gz";
$file = $_[1];
$variables=$_[2];
- $port=80;
- $socketaddr= sockaddr_in $port, inet_aton $host or die "Bad hostname\n";
- socket SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp') or
- die "Bad socket\n";
- connect SOCK, $socketaddr or die "Bad connection\n";
- select((select(SOCK), $| = 1)[0]);
+ # Write out the "...-sentdata.txt" file.
+
+ my $sentdata="";
+ foreach $x (keys (%$variables)){
+ $value = $variables->{$x};
+ $sentdata.= "$x => $value\n";
+ }
+ WriteFile "$Prefix-sentdata.txt", $sentdata;
+
+ if (!($SUBMITAUX eq "")) {
+ system "$SUBMITAUX \"$Prefix-sentdata.txt\"";
+ }
+
+ # Create the content to send to the server.
- #creating content here
my $content;
foreach $key (keys (%$variables)){
$value = $variables->{$key};
$content .= "$key=$value&";
}
+ # Send the data to the server.
+ #
+ # FIXME: This code should be more robust?
+
+ $port=80;
+ $socketaddr= sockaddr_in $port, inet_aton $host or die "Bad hostname\n";
+ socket SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp') or
+ die "Bad socket\n";
+ connect SOCK, $socketaddr or die "Bad connection\n";
+ select((select(SOCK), $| = 1)[0]);
+
$length = length($content);
my $send= "POST $file HTTP/1.0\n";
}
close(SOCK);
- my $sentdata="";
- foreach $x (keys (%$variables)){
- $value = $variables->{$x};
- $sentdata.= "$x => $value\n";
- }
- WriteFile "$Prefix-sentdata.txt", $sentdata;
-
-
return $result;
}
if (!$NOCHECKOUT) {
if ( $VERBOSE ) { print "CHECKOUT STAGE:\n"; }
if ($USESVN) {
- my $SVNCMD = "$NICE svn co $SVNURL";
- if ($VERBOSE) {
- print "( time -p $SVNCMD/llvm/trunk llvm; cd llvm/projects ; " .
- "$SVNCMD/test-suite/trunk llvm-test ) > $COLog 2>&1\n";
- }
- system "( time -p $SVNCMD/llvm/trunk llvm; cd llvm/projects ; " .
- "$SVNCMD/test-suite/trunk llvm-test ) > $COLog 2>&1\n";
+ my $SVNCMD = "$NICE svn co --non-interactive $SVNURL";
+ my $SVNCMD2 = "$NICE svn co --non-interactive $TestSVNURL";
+ if ($VERBOSE) {
+ print "( time -p $SVNCMD/llvm/trunk llvm; cd llvm/projects ; " .
+ "$SVNCMD2/test-suite/trunk llvm-test ) > $COLog 2>&1\n";
+ }
+ system "( time -p $SVNCMD/llvm/trunk llvm; cd llvm/projects ; " .
+ "$SVNCMD2/test-suite/trunk llvm-test ) > $COLog 2>&1\n";
+ if ($WITHCLANG) {
+ my $SVNCMD = "$NICE svn co --non-interactive $SVNURL/cfe/trunk";
+ if ($VERBOSE) {
+ print "( time -p cd llvm/tools ; $SVNCMD clang ) > $COLog 2>&1\n";
+ }
+ system "( time -p cd llvm/tools ; $SVNCMD clang ) > $COLog 2>&1\n";
+ }
} else {
my $CVSOPT = "";
$CVSOPT = "-z3" # Use compression if going over ssh.
if ($VERBOSE) { print "CHANGE HISTORY ANALYSIS STAGE\n"; }
if ($USESVN) {
- @SVNHistory = split /<logentry/, `svn log --xml --verbose -r{$DATE}:HEAD`;
+ @SVNHistory = split /<logentry/, `svn log --non-interactive --xml --verbose -r{$DATE}:HEAD`;
# Skip very first entry because it is the XML header cruft
shift @SVNHistory;
my $Now = time();
"> $BuildLog 2>&1";
if ( $VERBOSE ) {
print "BUILD STAGE:\n";
+ print "(time -p $NICE $MAKECMD clean) >> $BuildLog 2>&1\n";
print "(time -p $NICE $MAKECMD $MAKEOPTS) >> $BuildLog 2>&1\n";
}
# Build the entire tree, capturing the output into $BuildLog
+ system "(time -p $NICE $MAKECMD clean) >> $BuildLog 2>&1";
system "(time -p $NICE $MAKECMD $MAKEOPTS) >> $BuildLog 2>&1";
}
print "Organizing size of .o and .a files\n"
if ( $VERBOSE );
ChangeDir( "$BuildDir/llvm", "Build Directory" );
- $afiles.= `find utils/ -iname '*.a' -ls`;
- $afiles.= `find lib/ -iname '*.a' -ls`;
- $afiles.= `find tools/ -iname '*.a' -ls`;
- if($BUILDTYPE eq "release"){
- $afiles.= `find Release/ -iname '*.a' -ls`;
- } elsif($BUILDTYPE eq "release-asserts") {
- $afiles.= `find Release-Asserts/ -iname '*.a' -ls`;
- } else {
- $afiles.= `find Debug/ -iname '*.a' -ls`;
- }
- $ofiles.= `find utils/ -iname '*.o' -ls`;
- $ofiles.= `find lib/ -iname '*.o' -ls`;
- $ofiles.= `find tools/ -iname '*.o' -ls`;
+ my @dirs = ('utils', 'lib', 'tools');
if($BUILDTYPE eq "release"){
- $ofiles.= `find Release/ -iname '*.o' -ls`;
+ push @dirs, 'Release';
} elsif($BUILDTYPE eq "release-asserts") {
- $ofiles.= `find Release-Asserts/ -iname '*.o' -ls`;
+ push @dirs, 'Release-Asserts';
} else {
- $ofiles.= `find Debug/ -iname '*.o' -ls`;
+ push @dirs, 'Debug';
}
- @AFILES = split "\n", $afiles;
- $a_file_sizes="";
- foreach $x (@AFILES){
- $x =~ m/.+\s+.+\s+.+\s+.+\s+.+\s+.+\s+(.+)\s+.+\s+.+\s+.+\s+(.+)/;
- $a_file_sizes.="$1 $2 $BUILDTYPE\n";
- }
- @OFILES = split "\n", $ofiles;
- $o_file_sizes="";
- foreach $x (@OFILES){
- $x =~ m/.+\s+.+\s+.+\s+.+\s+.+\s+.+\s+(.+)\s+.+\s+.+\s+.+\s+(.+)/;
- $o_file_sizes.="$1 $2 $BUILDTYPE\n";
- }
+ find(sub {
+ $a_file_sizes .= (-s $_)." $File::Find::name $BUILDTYPE\n" if /\.a$/i;
+ $o_file_sizes .= (-s $_)." $File::Find::name $BUILDTYPE\n" if /\.o$/i;
+ }, @dirs);
} else {
$a_file_sizes="No data due to a bad build.";
$o_file_sizes="No data due to a bad build.";
} #end if !$BuildError
-
-##############################################################
-#
-# 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) {
- if ( $VERBOSE ) { print "OLDEN TEST SUITE STAGE\n"; }
- my ($NATTime, $CBETime, $LLCTime, $JITTime, $OptTime, $BytecodeSize,
- $MachCodeSize) = ("","","","","","","");
- if (!$NORUNNINGTESTS) {
- ChangeDir( "$BuildDir/llvm/projects/llvm-test/MultiSource/Benchmarks/Olden",
- "Olden Test Directory");
-
- # Clean out previous results...
- system "$NICE $MAKECMD $MAKEOPTS clean > /dev/null 2>&1";
-
- # Run the nightly test in this directory, with LARGE_PROBLEM_SIZE and
- # GET_STABLE_NUMBERS enabled!
- if( $VERBOSE ) {
- print "$MAKECMD -k $MAKEOPTS $PROGTESTOPTS report.nightly.csv.out " .
- "TEST=nightly LARGE_PROBLEM_SIZE=1 GET_STABLE_NUMBERS=1 " .
- "> /dev/null 2>&1\n";
- }
- system "$MAKECMD -k $MAKEOPTS $PROGTESTOPTS report.nightly.csv.out " .
- "TEST=nightly LARGE_PROBLEM_SIZE=1 GET_STABLE_NUMBERS=1 " .
- "> /dev/null 2>&1";
- system "cp report.nightly.csv $OldenTestsLog";
- }
-}
-
##############################################################
#
# Getting end timestamp