if (found_pch || found_fpch_preprocess) {
using_precompiled_header = true;
- if (!(conf->sloppiness & SLOPPY_PCH_DEFINES)
- || !(conf->sloppiness & SLOPPY_TIME_MACROS)) {
- if (!(sloppiness & SLOPPY_TIME_MACROS)) {
- cc_log("You have to specify \"pch_defines,time_macros\" sloppiness when"
- " using precompiled headers to get direct hits");
++ if (!(conf->sloppiness & SLOPPY_TIME_MACROS)) {
+ cc_log("You have to specify \"time_macros\" sloppiness when using"
+ " precompiled headers to get direct hits");
cc_log("Disabling direct mode");
stats_update(STATS_CANTUSEPCH);
result = false;
}
output_is_precompiled_header =
- actual_language && strstr(actual_language, "-header") != NULL;
+ actual_language && strstr(actual_language, "-header");
- if (output_is_precompiled_header && !(sloppiness & SLOPPY_PCH_DEFINES)) {
++ if (output_is_precompiled_header && !(conf->sloppiness & SLOPPY_PCH_DEFINES)) {
+ cc_log("You have to specify \"pch_defines,time_macros\" sloppiness when"
+ " creating precompiled headers");
+ stats_update(STATS_CANTUSEPCH);
+ result = false;
+ goto out;
+ }
+
if (!found_c_opt) {
if (output_is_precompiled_header) {
args_add(stripped_args, "-c");
return
fi
+ # clang and gcc handle precompiled headers similarly, but gcc is much more
+ # forgiving with precompiled headers. Both gcc and clang keep an absolute
+ # path reference to the original file except that clang uses that reference
+ # to validate the pch and gcc ignores the reference. Also, clang has an
+ # additional feature: pre-tokenized headers. For these reasons clang should
+ # be tested separately than gcc. clang can only use pch or pth headers on
+ # the command line and not as an #include statement inside a source file.
+
+ if [ $COMPILER_TYPE_CLANG -eq 1 ]; then
+ clang_pch_suite
+ else
+ gcc_pch_suite
+ fi
+}
+
+gcc_pch_suite() {
##################################################################
- # Tests for creating a .gch.
+ # Tests for creating a .gch without opt-in.
backdate pch.h
- testname="create .gch, -c, no -o"
+ testname="create .gch, -c, no -o, without opt-in"
$CCACHE -zC >/dev/null
- $CCACHE $COMPILER -c pch.h
+ $CCACHE $COMPILER $SYSROOT -c pch.h
checkstat 'cache hit (direct)' 0
checkstat 'cache hit (preprocessed)' 0
- CCACHE_SLOPPINESS=pch_defines,time_macros $CCACHE $COMPILER -c pch.h
+ checkstat 'cache miss' 0
+ checkstat "can't use precompiled header" 1
+
+ testname="create .gch, no -c, -o, without opt-in"
+ $CCACHE -Cz >/dev/null
+ $CCACHE $COMPILER pch.h -o pch.gch
+ checkstat 'cache hit (direct)' 0
+ checkstat 'cache hit (preprocessed)' 0
+ checkstat 'cache miss' 0
+ checkstat "can't use precompiled header" 1
+
+ ##################################################################
+ # Tests for creating a .gch with opt-in.
+
+ backdate pch.h
+
+ testname="create .gch, -c, no -o, with opt-in"
+ $CCACHE -zC >/dev/null
++ CCACHE_SLOPPINESS=pch_defines,time_macros $CCACHE $COMPILER $SYSROOT -c pch.h
+ checkstat 'cache hit (direct)' 0
+ checkstat 'cache hit (preprocessed)' 0
checkstat 'cache miss' 1
rm -f pch.h.gch
- $CCACHE $COMPILER $SYSROOT -c pch.h
- CCACHE_SLOPPINESS=pch_defines,time_macros $CCACHE $COMPILER -c pch.h
++ CCACHE_SLOPPINESS=pch_defines,time_macros $CCACHE $COMPILER $SYSROOT -c pch.h
checkstat 'cache hit (direct)' 1
checkstat 'cache hit (preprocessed)' 0
checkstat 'cache miss' 1
test_failed "pch.h.gch missing"
fi
- testname="create .gch, no -c, -o"
+ testname="create .gch, no -c, -o, with opt-in"
$CCACHE -Cz >/dev/null
- $CCACHE $COMPILER $SYSROOT pch.h -o pch.gch
- CCACHE_SLOPPINESS=pch_defines,time_macros $CCACHE $COMPILER pch.h -o pch.gch
++ CCACHE_SLOPPINESS=pch_defines,time_macros $CCACHE $COMPILER $SYSROOT pch.h -o pch.gch
checkstat 'cache hit (direct)' 0
checkstat 'cache hit (preprocessed)' 0
checkstat 'cache miss' 1
- $CCACHE $COMPILER $SYSROOT pch.h -o pch.gch
- CCACHE_SLOPPINESS=pch_defines,time_macros $CCACHE $COMPILER pch.h -o pch.gch
++ CCACHE_SLOPPINESS=pch_defines,time_macros $CCACHE $COMPILER $SYSROOT pch.h -o pch.gch
checkstat 'cache hit (direct)' 1
checkstat 'cache hit (preprocessed)' 0
checkstat 'cache miss' 1