From: Argyrios Kyrtzidis Date: Fri, 15 Oct 2010 18:49:01 +0000 (+0000) Subject: Add '-include-pch' option to the driver, so it can get passed to the cc1 driver. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=721f38c7f866259e1472af775239a83d8f06f6a8;p=clang Add '-include-pch' option to the driver, so it can get passed to the cc1 driver. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116605 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticDriverKinds.td b/include/clang/Basic/DiagnosticDriverKinds.td index 19011ace7f..a7c30a744d 100644 --- a/include/clang/Basic/DiagnosticDriverKinds.td +++ b/include/clang/Basic/DiagnosticDriverKinds.td @@ -102,5 +102,7 @@ def warn_drv_objc_gc_unsupported : Warning< "Objective-C garbage collection is not supported on this platform, ignoring '%0'">; def warn_drv_pch_not_first_include : Warning< "precompiled header '%0' was ignored because '%1' is not first '-include'">; +def warn_drv_pch_missing_language : Warning< + "ignoring argument '%0' due to missing precompiled header '%1' for language '%2'">; } diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index cfb9c81b57..ab87d57d43 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -426,6 +426,7 @@ def iframework : JoinedOrSeparate<"-iframework">, Group; def imacros : JoinedOrSeparate<"-imacros">, Group; def image__base : Separate<"-image_base">; def include_ : JoinedOrSeparate<"-include">, Group, EnumName<"include">; +def include_pch : Separate<"-include-pch">, Group; def init : Separate<"-init">; def install__name : Separate<"-install_name">; def integrated_as : Flag<"-integrated-as">, Flags<[DriverOption]>; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 229cf608f3..fd57cffbc5 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -256,6 +256,16 @@ void Clang::AddPreprocessingOptions(const Driver &D, if (FoundPCH || FoundPTH) { if (IsFirstImplicitInclude) { A->claim(); + if (P.isDirectory()) { + // Expect to find a precompiled header matching the current input type + P.appendComponent(types::getTypeName(Inputs[0].getType())); + if (!P.exists()) { + D.Diag(clang::diag::warn_drv_pch_missing_language) + << A->getAsString(Args) << P.str() + << types::getTypeName(Inputs[0].getType()); + continue; + } + } if (UsePCH) CmdArgs.push_back("-include-pch"); else diff --git a/test/Driver/pth.c b/test/Driver/pth.c index 9c47c55993..d6ed90423b 100644 --- a/test/Driver/pth.c +++ b/test/Driver/pth.c @@ -10,3 +10,24 @@ // RUN: FileCheck -check-prefix CHECK2 -input-file %t.log %s // CHECK2: "{{.*}}/clang{{.*}}" "-cc1" {{.*}}"-include-pth" "{{.*}}.h.pth" {{.*}}"-x" "c" "{{.*}}pth.c" + +// RUN: mkdir -p %t.pth +// RUN: %clang -ccc-pch-is-pth -x c-header %s -o %t.pth/c -### 2> %t.log +// RUN: FileCheck -check-prefix CHECK3 -input-file %t.log %s + +// CHECK3: "{{.*}}/clang{{.*}}" "-cc1" {{.*}} "-o" "{{.*}}.pth/c" "-x" "c-header" "{{.*}}pth.c" + +// RUN: rm -f %t.pth/c +// RUN: %clang -ccc-pch-is-pth -E -include %t %s -### 2> %t.log +// RUN: echo "DONE" >> %t.log +// RUN: FileCheck -check-prefix CHECK4 -input-file %t.log %s + +// CHECK4: {{.*}} ignoring argument '-include {{.*}}' due to missing precompiled header '{{.*}}.pth/c' for language 'c' +// CHECK4-NOT: -include-pth +// CHECK4: DONE + +// RUN: touch %t.pth/c +// RUN: %clang -ccc-pch-is-pth -E -include %t %s -### 2> %t.log +// RUN: FileCheck -check-prefix CHECK5 -input-file %t.log %s + +// CHECK5: "{{.*}}/clang{{.*}}" "-cc1" {{.*}}"-include-pth" "{{.*}}.pth/c" {{.*}}"-x" "c" "{{.*}}pth.c"