r371918 - [Driver] Fix multiple bugs related to dependency file options: -M -MM -MD -MMD -MT -MQ

Fāng-ruì Sòng via cfe-commits cfe-commits at lists.llvm.org
Sun Sep 15 19:47:54 PDT 2019


It was related to D67542 <https://reviews.llvm.org/D67542>  It tried to
solve some other problems.

On Sun, Sep 15, 2019 at 1:40 AM Nico Weber <thakis at chromium.org> wrote:

> 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/20190916/f629de44/attachment-0001.html>


More information about the cfe-commits mailing list