diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -666,6 +666,9 @@ "invalid profile : %0">; def err_drv_dxc_missing_target_profile : Error< "target profile option (-T) is missing">; +def warn_drv_dxc_ignore_output_for_preprocess : Warning< + "'%0' ignored when not compiling">, + InGroup; def err_drv_invalid_range_dxil_validator_version : Error< "invalid validator version : %0\n" diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -6381,6 +6381,9 @@ class CLFlag : Option<["/", "-"], name, KIND_FLAG>, Group, Flags<[CLOption, NoXarchOption]>; +class CLDXCFlag : Option<["/", "-"], name, KIND_FLAG>, + Group, Flags<[CLDXCOption, NoXarchOption]>; + class CLCompileFlag : Option<["/", "-"], name, KIND_FLAG>, Group, Flags<[CLOption, NoXarchOption]>; @@ -6393,6 +6396,9 @@ class CLCompileJoined : Option<["/", "-"], name, KIND_JOINED>, Group, Flags<[CLOption, NoXarchOption]>; +class CLDXCCompileJoined : Option<["/", "-"], name, KIND_JOINED>, + Group, Flags<[CLDXCOption, NoXarchOption]>; + class CLIgnoredJoined : Option<["/", "-"], name, KIND_JOINED>, Group, Flags<[CLOption, NoXarchOption, HelpHidden]>; @@ -6662,7 +6668,7 @@ HelpText<"Set output executable file name">, MetaVarName<"">; def _SLASH_Fe_COLON : CLJoined<"Fe:">, Alias<_SLASH_Fe>; -def _SLASH_Fi : CLCompileJoined<"Fi">, +def _SLASH_Fi : CLDXCCompileJoined<"Fi">, HelpText<"Set preprocess output file name (with /P)">, MetaVarName<"">; def _SLASH_Fo : CLCompileJoined<"Fo">, @@ -6697,7 +6703,7 @@ def _SLASH_o : CLJoinedOrSeparate<"o">, HelpText<"Deprecated (set output file name); use /Fe or /Fe">, MetaVarName<"">; -def _SLASH_P : CLFlag<"P">, HelpText<"Preprocess to file">; +def _SLASH_P : CLDXCFlag<"P">, HelpText<"Preprocess to file">; def _SLASH_permissive : CLFlag<"permissive">, HelpText<"Enable some non conforming code to compile">; def _SLASH_permissive_ : CLFlag<"permissive-">, diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5455,7 +5455,8 @@ llvm::PrettyStackTraceString CrashInfo("Computing output path"); // Output to a user requested destination? - if (AtTopLevel && !isa(JA) && !isa(JA)) { + if (AtTopLevel && !isa(JA) && !isa(JA) && + !(IsDXCMode() && C.getArgs().hasArg(options::OPT__SLASH_P))) { if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) return C.addResultFile(FinalOutput->getValue(), &JA); } diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -177,6 +177,9 @@ } if (DAL->hasArg(options::OPT_o)) { + if (DAL->hasArg(options::OPT__SLASH_P)) + getDriver().Diag(diag::warn_drv_dxc_ignore_output_for_preprocess) << "Fo"; + // When run the whole pipeline. if (!DAL->hasArg(options::OPT_emit_llvm)) // Emit obj if write to file. diff --git a/clang/test/Driver/dxc_P.hlsl b/clang/test/Driver/dxc_P.hlsl new file mode 100644 --- /dev/null +++ b/clang/test/Driver/dxc_P.hlsl @@ -0,0 +1,16 @@ +// RUN: %clang_dxc -Tlib_6_7 -P -### %s 2>&1 | FileCheck %s +// RUN: %clang_dxc -Tlib_6_7 -P -Fi"a.txt" -### %s 2>&1 | FileCheck %s --check-prefix=FI +// RUN: %clang_dxc -Tlib_6_7 -Fo b.txt -P -Fi"a.txt" -### %s 2>&1 | FileCheck %s --check-prefix=WARNING + +// Make sure -P option flag which translated into "-E" + "-o" "dxc_P.i". +// CHECK:"-E" +// CHECK-SAME: "-o" "dxc_P.i" + +// Make sure -Fi updated -o. +// FI:"-E" +// FI-SAME:"-o" "a.txt" + +// Make sure got warning when -Fo and -P at same time. +// WARNING: warning: 'Fo' ignored when not compiling [-Woption-ignored] +// WARNING:"-E" +// WARNING-SAME:"-o" "a.txt"