Have scan-build/ccc-analyzer generate preprocessed .i/.mi files for sources that clang crashes on.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54552 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/utils/ccc-analyzer b/utils/ccc-analyzer
index 1659c53..fd24a8b 100755
--- a/utils/ccc-analyzer
+++ b/utils/ccc-analyzer
@@ -15,6 +15,33 @@
 use strict;
 use warnings;
 use Cwd;
+use File::Temp qw/ tempfile /;
+use File::Path qw / mkpath /;
+ 
+##----------------------------------------------------------------------------##
+#  Process Clang Crashes.
+##----------------------------------------------------------------------------##
+
+sub GetPPExt {
+  my $Lang = shift;
+  if ($Lang =~ /objective-c/) { return ".mi"; }
+  return ".i";
+}
+
+sub ProcessClangCrash {
+  my ($Clang, $Lang, $file, $Args, $HtmlDir) = @_;
+  my $Dir = "$HtmlDir/crashes";
+  mkpath $Dir;
+  my ($PPH, $PPFile) = tempfile("clang_crash_XXXXXX",
+                                  SUFFIX => GetPPExt($Lang),
+                                  DIR => $Dir);
+
+  system $Clang, @$Args, "-E", "-o", $PPFile;  
+  close ($PPH);
+  open (OUT, ">", "$PPFile.info") or die "Cannot open $PPFile.info\n";
+  print OUT "$file";
+  close OUT;
+}
 
 ##----------------------------------------------------------------------------##
 #  Running the analyzer.
@@ -29,6 +56,7 @@
   my $RunAnalyzer = 0;
   my $Cmd;
   my @CmdArgs;
+  my @CmdArgsSansAnalyses;
   
   if ($Lang =~ /header/) {
     exit 0 if (!defined ($Output));
@@ -37,12 +65,14 @@
     # Remove the PCH extension.
     $Output =~ s/[.]gch$//;
     push @CmdArgs,$Output;
+    @CmdArgsSansAnalyses = @CmdArgs;    
   }
   else {
     $Cmd = $Clang;
-    push @CmdArgs,(split /\s/,$Analyses);
     push @CmdArgs,'-DIBOutlet=__attribute__((iboutlet))';
     push @CmdArgs,@$Args;
+    @CmdArgsSansAnalyses = @CmdArgs;
+    push @CmdArgs,(split /\s/,$Analyses);
     $RunAnalyzer = 1;
   }
   
@@ -70,8 +100,13 @@
     push @CmdArgs,'-o';
     push @CmdArgs,$HtmlDir;
   }
-  
-  system $Cmd,@CmdArgs;
+
+   system $Cmd,@CmdArgs;
+
+   # Did the command die because of a signal?
+   if ($? & 127 and $Cmd eq $Clang and defined $HtmlDir) {
+     ProcessClangCrash($Clang, $Lang, $file, \@CmdArgsSansAnalyses, $HtmlDir);
+   }
 }
 
 ##----------------------------------------------------------------------------##