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