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