Add utils/TestUtils, and sink pch-test.pl there.

Also, add a test for generator a C file with a very deep call stack.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90468 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/utils/TestUtils/deep-stack.py b/utils/TestUtils/deep-stack.py
new file mode 100755
index 0000000..1750a5f
--- /dev/null
+++ b/utils/TestUtils/deep-stack.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+def pcall(f, N):
+    if N == 0:
+        print >>f, '    f(0)'
+        return
+
+    print >>f, '    f('
+    pcall(f, N - 1)
+    print >>f, '     )'
+
+def main():
+    f = open('t.c','w')
+    print >>f, 'int f(int n) { return n; }'
+    print >>f, 'int t() {'
+    print >>f, '  return'
+    pcall(f, 10000)
+    print >>f, '  ;'
+    print >>f, '}'
+
+if __name__ == "__main__":
+    import sys
+    sys.setrecursionlimit(100000)
+    main()
diff --git a/utils/TestUtils/pch-test.pl b/utils/TestUtils/pch-test.pl
new file mode 100755
index 0000000..2e17117
--- /dev/null
+++ b/utils/TestUtils/pch-test.pl
@@ -0,0 +1,61 @@
+#!/usr/bin/perl -w
+
+# This tiny little script, which should be run from the clang
+# directory (with clang-cc in your patch), tries to take each
+# compilable Clang test and build a PCH file from that test, then read
+# and dump the contents of the PCH file just created.
+use POSIX;
+
+$exitcode = 0;
+sub testfiles($$) {
+  my $suffix = shift;
+  my $language = shift;
+  my $passed = 0;
+  my $failed = 0;
+  my $skipped = 0;
+
+  @files = `ls test/*/*.$suffix`;
+  foreach $file (@files) {
+    chomp($file);
+    my $code = system("clang-cc -fsyntax-only -x $language $file > /dev/null 2>&1");
+    if ($code == 0) {
+      print(".");
+      $code = system("clang-cc -emit-pch -x $language -o $file.pch $file > /dev/null 2>&1");
+      if ($code == 0) {
+        $code = system("clang-cc -include-pch $file.pch -x $language -ast-dump /dev/null > /dev/null 2>&1");
+        if ($code == 0) {
+          $passed++;
+        } elsif (($code & 0xFF) == SIGINT) {
+          exit($exitcode);
+        } else {
+          print("\n---Failed to dump AST file for \"$file\"---\n");
+          $exitcode = 1;
+          $failed++;
+        }
+        unlink "$file.pch";
+      } elsif (($code & 0xFF) == SIGINT) {
+        exit($exitcode);
+      } else {
+        print("\n---Failed to build PCH file for \"$file\"---\n");
+        $exitcode = 1;
+          $failed++;
+      }
+    } elsif (($code & 0xFF) == SIGINT) {
+      exit($exitcode);
+    } else {
+      print("x");
+      $skipped++;
+    }
+  }
+
+  print("\n\n$passed tests passed\n");
+  print("$failed tests failed\n");
+  print("$skipped tests skipped ('x')\n")
+}
+
+printf("-----Testing precompiled headers for C-----\n");
+testfiles("c", "c");
+printf("\n-----Testing precompiled headers for Objective-C-----\n");
+testfiles("m", "objective-c");
+print("\n");
+exit($exitcode);