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