Ted Kremenek | 3a46530 | 2012-05-21 23:29:01 +0000 | [diff] [blame] | 1 | #!/usr/bin/perl -w |
| 2 | use strict; |
| 3 | use File::Temp qw/ tempdir /; |
| 4 | my $prog = "reducer"; |
| 5 | |
| 6 | die "$prog <code file> <error string> [optional command]\n" if ($#ARGV < 0); |
| 7 | my $file = shift @ARGV; |
| 8 | die "$prog: [error] cannot read file $file\n" if (! -r $file); |
| 9 | |
| 10 | my $magic = shift @ARGV; |
| 11 | die "$prog: [error] no error string specified\n" if (! defined $magic); |
| 12 | |
Ted Kremenek | 7c45163 | 2012-05-22 00:54:40 +0000 | [diff] [blame] | 13 | # Create a backup of the file. |
Ted Kremenek | 3a46530 | 2012-05-21 23:29:01 +0000 | [diff] [blame] | 14 | my $dir = tempdir( CLEANUP => 1 ); |
| 15 | print "$prog: created temporary directory '$dir'\n"; |
| 16 | my $srcFile = "$dir/$file"; |
| 17 | `cp $file $srcFile`; |
| 18 | |
| 19 | # Create the script. |
| 20 | my $scriptFile = "$dir/script"; |
| 21 | open(OUT, ">$scriptFile") or die "$prog: cannot create '$scriptFile'\n"; |
| 22 | my $reduceOut = "$dir/reduceOut"; |
| 23 | |
| 24 | my $command; |
| 25 | if (scalar(@ARGV) > 0) { $command = \@ARGV; } |
| 26 | else { |
Ted Kremenek | 86674ec | 2012-05-22 00:52:49 +0000 | [diff] [blame] | 27 | my $compiler = "clang"; |
Ted Kremenek | 3a46530 | 2012-05-21 23:29:01 +0000 | [diff] [blame] | 28 | $command = [$compiler, "-fsyntax-only", "-Wfatal-errors", "-Wno-deprecated-declarations", "-Wimplicit-function-declaration"]; |
| 29 | } |
| 30 | push @$command, $srcFile; |
| 31 | my $commandStr = "@$command"; |
| 32 | |
| 33 | print OUT <<ENDTEXT; |
| 34 | #!/usr/bin/perl -w |
| 35 | use strict; |
| 36 | my \$BAD = 1; |
| 37 | my \$GOOD = 0; |
| 38 | `rm -f $reduceOut`; |
| 39 | my \$command = "$commandStr > $reduceOut 2>&1"; |
| 40 | system(\$command); |
| 41 | open(IN, "$reduceOut") or exit(\$BAD); |
| 42 | my \$found = 0; |
| 43 | while(<IN>) { |
| 44 | if (/$magic/) { exit \$GOOD; } |
| 45 | } |
| 46 | exit \$BAD; |
| 47 | ENDTEXT |
| 48 | close(OUT); |
| 49 | `chmod +x $scriptFile`; |
| 50 | |
| 51 | print "$prog: starting reduction\n"; |
Ted Kremenek | 86674ec | 2012-05-22 00:52:49 +0000 | [diff] [blame] | 52 | sub multidelta($) { |
| 53 | my ($level) = @_; |
Ted Kremenek | 3a46530 | 2012-05-21 23:29:01 +0000 | [diff] [blame] | 54 | system("multidelta -level=$level $scriptFile $srcFile"); |
| 55 | } |
| 56 | |
| 57 | for (my $i = 1 ; $i <= 5; $i++) { |
| 58 | foreach my $level (0,0,1,1,2,2,10) { |
| 59 | multidelta($level); |
| 60 | } |
| 61 | } |
| 62 | |
| 63 | # Copy the final file. |
| 64 | `cp $srcFile $file.reduced`; |
| 65 | print "$prog: generated '$file.reduced"; |