r371918 - [Driver] Fix multiple bugs related to dependency file options: -M -MM -MD -MMD -MT -MQ
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Sat Sep 14 10:40:03 PDT 2019
This looks similar to https://reviews.llvm.org/D67542
On Sat, Sep 14, 2019 at 1:59 AM Fangrui Song via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: maskray
> Date: Fri Sep 13 23:01:22 2019
> New Revision: 371918
>
> URL: http://llvm.org/viewvc/llvm-project?rev=371918&view=rev
> Log:
> [Driver] Fix multiple bugs related to dependency file options: -M -MM -MD
> -MMD -MT -MQ
>
> -M -o test.i => dependency file is test.d, not test.i
> -MM -o test.i => dependency file is test.d, not test.i
> -M -MMD => bogus warning -Wunused-command-line-argument
> -M MT dummy => -w not rendered
>
> Modified:
> cfe/trunk/lib/Driver/Driver.cpp
> cfe/trunk/lib/Driver/ToolChains/Clang.cpp
> cfe/trunk/test/Driver/m-and-mm.c
>
> Modified: cfe/trunk/lib/Driver/Driver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=371918&r1=371917&r2=371918&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/Driver.cpp (original)
> +++ cfe/trunk/lib/Driver/Driver.cpp Fri Sep 13 23:01:22 2019
> @@ -3450,8 +3450,10 @@ Action *Driver::ConstructPhaseAction(
> llvm_unreachable("link action invalid here.");
> case phases::Preprocess: {
> types::ID OutputTy;
> - // -{M, MM} alter the output type.
> - if (Args.hasArg(options::OPT_M, options::OPT_MM)) {
> + // -M and -MM specify the dependency file name by altering the output
> type,
> + // -if -MD and -MMD are not specified.
> + if (Args.hasArg(options::OPT_M, options::OPT_MM) &&
> + !Args.hasArg(options::OPT_MD, options::OPT_MMD)) {
> OutputTy = types::TY_Dependencies;
> } else {
> OutputTy = Input->getType();
>
> Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=371918&r1=371917&r2=371918&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
> +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Fri Sep 13 23:01:22 2019
> @@ -1061,7 +1061,6 @@ void Clang::AddPreprocessingOptions(Comp
> ArgStringList &CmdArgs,
> const InputInfo &Output,
> const InputInfoList &Inputs) const {
> - Arg *A;
> const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU();
>
> CheckPreprocessingOptions(D, Args);
> @@ -1070,9 +1069,20 @@ void Clang::AddPreprocessingOptions(Comp
> Args.AddLastArg(CmdArgs, options::OPT_CC);
>
> // Handle dependency file generation.
> - if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
> - (A = Args.getLastArg(options::OPT_MD)) ||
> - (A = Args.getLastArg(options::OPT_MMD))) {
> + Arg *ArgM = Args.getLastArg(options::OPT_MM);
> + if (!ArgM)
> + ArgM = Args.getLastArg(options::OPT_M);
> + Arg *ArgMD = Args.getLastArg(options::OPT_MMD);
> + if (!ArgMD)
> + ArgMD = Args.getLastArg(options::OPT_MD);
> +
> + // -M and -MM imply -w.
> + if (ArgM)
> + CmdArgs.push_back("-w");
> + else
> + ArgM = ArgMD;
> +
> + if (ArgM) {
> // Determine the output location.
> const char *DepFile;
> if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
> @@ -1080,8 +1090,7 @@ void Clang::AddPreprocessingOptions(Comp
> C.addFailureResultFile(DepFile, &JA);
> } else if (Output.getType() == types::TY_Dependencies) {
> DepFile = Output.getFilename();
> - } else if (A->getOption().matches(options::OPT_M) ||
> - A->getOption().matches(options::OPT_MM)) {
> + } else if (!ArgMD) {
> DepFile = "-";
> } else {
> DepFile = getDependencyFileName(Args, Inputs);
> @@ -1090,8 +1099,22 @@ void Clang::AddPreprocessingOptions(Comp
> CmdArgs.push_back("-dependency-file");
> CmdArgs.push_back(DepFile);
>
> + bool HasTarget = false;
> + for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
> + HasTarget = true;
> + A->claim();
> + if (A->getOption().matches(options::OPT_MT)) {
> + A->render(Args, CmdArgs);
> + } else {
> + CmdArgs.push_back("-MT");
> + SmallString<128> Quoted;
> + QuoteTarget(A->getValue(), Quoted);
> + CmdArgs.push_back(Args.MakeArgString(Quoted));
> + }
> + }
> +
> // Add a default target if one wasn't specified.
> - if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
> + if (!HasTarget) {
> const char *DepTarget;
>
> // If user provided -o, that is the dependency target, except
> @@ -1108,17 +1131,14 @@ void Clang::AddPreprocessingOptions(Comp
> DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
> }
>
> - if (!A->getOption().matches(options::OPT_MD) &&
> !A->getOption().matches(options::OPT_MMD)) {
> - CmdArgs.push_back("-w");
> - }
> CmdArgs.push_back("-MT");
> SmallString<128> Quoted;
> QuoteTarget(DepTarget, Quoted);
> CmdArgs.push_back(Args.MakeArgString(Quoted));
> }
>
> - if (A->getOption().matches(options::OPT_M) ||
> - A->getOption().matches(options::OPT_MD))
> + if (ArgM->getOption().matches(options::OPT_M) ||
> + ArgM->getOption().matches(options::OPT_MD))
> CmdArgs.push_back("-sys-header-deps");
> if ((isa<PrecompileJobAction>(JA) &&
> !Args.hasArg(options::OPT_fno_module_file_deps)) ||
> @@ -1127,8 +1147,8 @@ void Clang::AddPreprocessingOptions(Comp
> }
>
> if (Args.hasArg(options::OPT_MG)) {
> - if (!A || A->getOption().matches(options::OPT_MD) ||
> - A->getOption().matches(options::OPT_MMD))
> + if (!ArgM || ArgM->getOption().matches(options::OPT_MD) ||
> + ArgM->getOption().matches(options::OPT_MMD))
> D.Diag(diag::err_drv_mg_requires_m_or_mm);
> CmdArgs.push_back("-MG");
> }
> @@ -1136,22 +1156,6 @@ void Clang::AddPreprocessingOptions(Comp
> Args.AddLastArg(CmdArgs, options::OPT_MP);
> Args.AddLastArg(CmdArgs, options::OPT_MV);
>
> - // Convert all -MQ <target> args to -MT <quoted target>
> - for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
> - A->claim();
> -
> - if (A->getOption().matches(options::OPT_MQ)) {
> - CmdArgs.push_back("-MT");
> - SmallString<128> Quoted;
> - QuoteTarget(A->getValue(), Quoted);
> - CmdArgs.push_back(Args.MakeArgString(Quoted));
> -
> - // -MT flag - no change
> - } else {
> - A->render(Args, CmdArgs);
> - }
> - }
> -
> // Add offload include arguments specific for CUDA. This must happen
> before
> // we -I or -include anything else, because we must pick up the CUDA
> headers
> // from the particular CUDA installation, rather than from e.g.
>
> Modified: cfe/trunk/test/Driver/m-and-mm.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/m-and-mm.c?rev=371918&r1=371917&r2=371918&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Driver/m-and-mm.c (original)
> +++ cfe/trunk/test/Driver/m-and-mm.c Fri Sep 13 23:01:22 2019
> @@ -1,16 +1,34 @@
> -// RUN: %clang -M -MM %s 2>&1 | FileCheck /dev/null
> --implicit-check-not=warning
> +// RUN: %clang -M %s 2>&1 | FileCheck %s --implicit-check-not=warning
> +// RUN: %clang -MM %s 2>&1 | FileCheck %s --implicit-check-not=warning
> +
> +// CHECK: m-and-mm.o:
> +// TEST-I: {{.*}}test.i:
> +// TEST: {{.*}}test:
>
> // RUN: mkdir -p %t.dir
> +
> +/// if -MD and -MMD are not specified, -o specifies the dependency file
> name.
> +// RUN: rm -f %t.dir/test.i
> +// RUN: %clang -M %s -o %t.dir/test.i
> +// RUN: FileCheck %s < %t.dir/test.i
> +// RUN: rm -f %t.dir/test.i
> +// RUN: %clang -MM %s -o %t.dir/test.i
> +// RUN: FileCheck %s < %t.dir/test.i
> +
> // RUN: rm -f %t.dir/test.d
> // RUN: %clang -fsyntax-only -MD %s -o %t.dir/test.i
> -// RUN: test -f %t.dir/test.d
> +// RUN: FileCheck --check-prefix=TEST-I %s < %t.dir/test.d
> +
> +// RUN: rm -f %t.dir/test.d
> +// RUN: %clang -M -MD %s -o %t.dir/test.i
> +// RUN: FileCheck --check-prefix=TEST-I %s < %t.dir/test.d
>
> /// If the output file name does not have a suffix, just append `.d`.
> // RUN: rm -f %t.dir/test.d
> // RUN: %clang -fsyntax-only -MD %s -o %t.dir/test
> -// RUN: test -f %t.dir/test.d
> +// RUN: FileCheck --check-prefix=TEST %s < %t.dir/test.d
>
> -#warning "-M and -MM suppresses preprocessing, thus this warning
> shouldn't show up"
> +#warning "-M and -MM suppresses warnings, thus this warning shouldn't
> show up"
> int main(void)
> {
> return 0;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190914/c4aa6cb3/attachment-0001.html>
More information about the cfe-commits
mailing list