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 @@ -678,6 +678,9 @@ def err_drv_invalid_empty_dxil_validator_version : Error< "invalid validator version : %0\n" "If validator major version is 0, minor version must also be 0.">; +def warn_drv_dxc_ignore_output_for_preprocess : Warning< + "output compiler options like -Fo ignored with Preprocess">, + InGroup; def warn_drv_sarif_format_unstable : Warning< "diagnostic formatting in SARIF mode is currently unstable">, 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 @@ -6918,3 +6918,6 @@ Group, Flags<[DXCOption, NoXarchOption]>, HelpText<"Entry point name">; +def dxc_P : Option<["--", "/", "-"], "P", KIND_SEPARATE>, + Group, Flags<[DXCOption, NoXarchOption]>, + HelpText<"Preprocess to file, cannot used with other output options like -Fo.">; 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 @@ -5636,6 +5636,12 @@ } llvm::PrettyStackTraceString CrashInfo("Computing output path"); + + // For dxc_P,Output to user requested destination. + // When dxc_P is set, -Fo (which is aliased to OPT_o) will be ignored. + if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_dxc_P)) + return C.addResultFile(FinalOutput->getValue(), &JA); + // Output to a user requested destination? if (AtTopLevel && !isa(JA) && !isa(JA)) { if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3515,7 +3515,9 @@ options::OPT_emit_llvm, options::OPT_disable_llvm_passes, options::OPT_fnative_half_type, - options::OPT_hlsl_entrypoint}; + options::OPT_hlsl_entrypoint, + options::OPT_E, + options::OPT_dxc_P}; for (const auto &Arg : ForwardedArguments) if (const auto *A = Args.getLastArg(Arg)) 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 @@ -154,7 +154,6 @@ for (Arg *A : Args) { if (A->getOption().getID() == options::OPT_dxil_validator_version) { StringRef ValVerStr = A->getValue(); - std::string ErrorMsg; if (!isLegalValidatorVersion(ValVerStr, getDriver())) continue; } @@ -173,6 +172,15 @@ A->claim(); continue; } + if (A->getOption().getID() == options::OPT_dxc_P) { + // Translate dxc_P into -E and -o. + DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_E)); + // The -o part is done at clang::driver::Driver::GetNamedOutputPath. + A->claim(); + if (Args.getLastArg(options::OPT_o)) + getDriver().Diag(diag::warn_drv_dxc_ignore_output_for_preprocess); + continue; + } DAL->append(A); } // Add default validator version if not set. 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,11 @@ +// RUN: %clang_dxc -Tlib_6_7 -P a.txt -### %s 2>&1 | FileCheck %s +// RUN: %clang_dxc -Tlib_6_7 -Fo b.txt -P a.txt -### %s 2>&1 | FileCheck %s --check-prefix=WARNING + +// Make sure -P option flag which translated into "-E" + "-o" "a.txt". +// CHECK:"-E" {{.*}} "-o" "a.txt" + +// Make sure got warning when -Fo and -P at same time. +// WARNING: warning: output compiler options like -Fo ignored with Preprocess [-Woption-ignored] +// WARNING:"-E" {{.*}} "-o" "a.txt" + +