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