1#!/usr/bin/env perl
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;
8use warnings;
9
10$exitcode = 0;
11sub testfiles($$) {
12  my $suffix = shift;
13  my $language = shift;
14  my $passed = 0;
15  my $failed = 0;
16  my $skipped = 0;
17
18  @files = `ls test/*/*.$suffix`;
19  foreach $file (@files) {
20    chomp($file);
21    my $code = system("clang -fsyntax-only -x $language $file > /dev/null 2>&1");
22    if ($code == 0) {
23      print(".");
24      $code = system("clang -cc1 -emit-pch -x $language -o $file.pch $file > /dev/null 2>&1");
25      if ($code == 0) {
26        $code = system("clang -cc1 -include-pch $file.pch -x $language -ast-dump /dev/null > /dev/null 2>&1");
27        if ($code == 0) {
28          $passed++;
29        } elsif (($code & 0xFF) == SIGINT) {
30          exit($exitcode);
31        } else {
32          print("\n---Failed to dump AST file for \"$file\"---\n");
33          $exitcode = 1;
34          $failed++;
35        }
36        unlink "$file.pch";
37      } elsif (($code & 0xFF) == SIGINT) {
38        exit($exitcode);
39      } else {
40        print("\n---Failed to build PCH file for \"$file\"---\n");
41        $exitcode = 1;
42          $failed++;
43      }
44    } elsif (($code & 0xFF) == SIGINT) {
45      exit($exitcode);
46    } else {
47      print("x");
48      $skipped++;
49    }
50  }
51
52  print("\n\n$passed tests passed\n");
53  print("$failed tests failed\n");
54  print("$skipped tests skipped ('x')\n")
55}
56
57printf("-----Testing precompiled headers for C-----\n");
58testfiles("c", "c");
59printf("\n-----Testing precompiled headers for Objective-C-----\n");
60testfiles("m", "objective-c");
61print("\n");
62exit($exitcode);
63