1cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor#!/usr/bin/perl -w
2cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor
3cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor# This tiny little script, which should be run from the clang
445331ad5d7bec63a995a5ecd7e27fdc3f3aee6ffDaniel Dunbar# directory (with clang in your patch), tries to take each
5cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor# compilable Clang test and build a PCH file from that test, then read
6cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor# and dump the contents of the PCH file just created.
7cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregoruse POSIX;
8cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor
9cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor$exitcode = 0;
10cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregorsub testfiles($$) {
11cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor  my $suffix = shift;
12cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor  my $language = shift;
13ce066715485bcbaef75127726123466f334ae488Douglas Gregor  my $passed = 0;
14ce066715485bcbaef75127726123466f334ae488Douglas Gregor  my $failed = 0;
15ce066715485bcbaef75127726123466f334ae488Douglas Gregor  my $skipped = 0;
16cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor
17cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor  @files = `ls test/*/*.$suffix`;
18cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor  foreach $file (@files) {
19cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor    chomp($file);
20d4381b1b731fa284acf8d4ed8f64dc3fa02be676Douglas Gregor    my $code = system("clang -fsyntax-only -x $language $file > /dev/null 2>&1");
21cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor    if ($code == 0) {
22ce066715485bcbaef75127726123466f334ae488Douglas Gregor      print(".");
2345331ad5d7bec63a995a5ecd7e27fdc3f3aee6ffDaniel Dunbar      $code = system("clang -cc1 -emit-pch -x $language -o $file.pch $file > /dev/null 2>&1");
24cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor      if ($code == 0) {
2545331ad5d7bec63a995a5ecd7e27fdc3f3aee6ffDaniel Dunbar        $code = system("clang -cc1 -include-pch $file.pch -x $language -ast-dump /dev/null > /dev/null 2>&1");
26cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor        if ($code == 0) {
27ce066715485bcbaef75127726123466f334ae488Douglas Gregor          $passed++;
28cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor        } elsif (($code & 0xFF) == SIGINT) {
29cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor          exit($exitcode);
30cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor        } else {
31cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor          print("\n---Failed to dump AST file for \"$file\"---\n");
32cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor          $exitcode = 1;
33ce066715485bcbaef75127726123466f334ae488Douglas Gregor          $failed++;
34cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor        }
35cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor        unlink "$file.pch";
36cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor      } elsif (($code & 0xFF) == SIGINT) {
37cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor        exit($exitcode);
38cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor      } else {
39cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor        print("\n---Failed to build PCH file for \"$file\"---\n");
40cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor        $exitcode = 1;
41ce066715485bcbaef75127726123466f334ae488Douglas Gregor          $failed++;
42cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor      }
43cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor    } elsif (($code & 0xFF) == SIGINT) {
44cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor      exit($exitcode);
45ce066715485bcbaef75127726123466f334ae488Douglas Gregor    } else {
46ce066715485bcbaef75127726123466f334ae488Douglas Gregor      print("x");
47ce066715485bcbaef75127726123466f334ae488Douglas Gregor      $skipped++;
48cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor    }
49cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor  }
50ce066715485bcbaef75127726123466f334ae488Douglas Gregor
51ce066715485bcbaef75127726123466f334ae488Douglas Gregor  print("\n\n$passed tests passed\n");
52ce066715485bcbaef75127726123466f334ae488Douglas Gregor  print("$failed tests failed\n");
53ce066715485bcbaef75127726123466f334ae488Douglas Gregor  print("$skipped tests skipped ('x')\n")
54cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor}
55cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregor
56cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregorprintf("-----Testing precompiled headers for C-----\n");
57cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregortestfiles("c", "c");
58cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregorprintf("\n-----Testing precompiled headers for Objective-C-----\n");
59cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregortestfiles("m", "objective-c");
60cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregorprint("\n");
61cf18ae15f144a756dfa0495c6735f403212d7891Douglas Gregorexit($exitcode);
62