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