From 50ec1306d060e46e0d53c9f5d8a052e1b0d10d3b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Martin=20Storsj=C3=B6?= Date: Sat, 1 Jan 2022 15:54:29 +0200 Subject: [PATCH] [clang] Add --start-no-unused-arguments/--end-no-unused-arguments to silence some unused argument warnings When passing a set of flags to configure defaults for a specific target (similar to the cmake settings `CLANG_DEFAULT_RTLIB`, `CLANG_DEFAULT_UNWINDLIB`, `CLANG_DEFAULT_CXX_STDLIB` and `CLANG_DEFAULT_LINKER`, but without hardcoding them in the binary), some of the flags may cause warnings (e.g. `-stdlib=` when compiling C code). Allow requesting selectively ignoring unused arguments among some of the arguments on the command line, without needing to resort to `-Qunused-arguments` or `-Wno-unused-command-line-argument`. Fix up the existing diagnostics.c testcase. It was added in response to PR12181 to fix handling of `-Werror=unused-command-line-argument`, but the command line option in the test (`-fzyzzybalubah`) now triggers "error: unknown argument" instead of the intended warning. Change it into a linker input (`-lfoo`) which triggers the intended diagnostic. Extend the existing test case to check more cases and make sure that it keeps testing the intended case. Add testing of the new option to this existing test. Differential Revision: https://reviews.llvm.org/D116503 --- clang/docs/ClangCommandLineReference.rst | 8 +++++ clang/include/clang/Driver/Options.td | 4 +++ clang/lib/Driver/Driver.cpp | 13 ++++++++ clang/test/Driver/diagnostics.c | 56 ++++++++++++++++++++++++++++---- 4 files changed, 75 insertions(+), 6 deletions(-) diff --git a/clang/docs/ClangCommandLineReference.rst b/clang/docs/ClangCommandLineReference.rst index 72d571d..8ae7d7f 100644 --- a/clang/docs/ClangCommandLineReference.rst +++ b/clang/docs/ClangCommandLineReference.rst @@ -212,6 +212,10 @@ Enable linker job to emit a static library. Trivial automatic variable initialization to zero is only here for benchmarks, it'll eventually be removed, and I'm OK with that because I'm only using it to benchmark +.. option:: --end-no-unused-arguments + +Start emitting warnings for unused driver arguments + .. option:: -exported\_symbols\_list .. option:: -faligned-new= @@ -663,6 +667,10 @@ Dynamically link the sanitizer runtime .. option:: -single\_module +.. option:: --start-no-unused-arguments + +Don't emit warnings about unused arguments for the following arguments + .. option:: -static-libgcc .. option:: -static-libsan diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 6c56d97..4bcb7bd 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1076,6 +1076,8 @@ def emit_interface_stubs : Flag<["-"], "emit-interface-stubs">, Flags<[CC1Option def emit_merged_ifs : Flag<["-"], "emit-merged-ifs">, Flags<[CC1Option]>, Group, HelpText<"Generate Interface Stub Files, emit merged text not binary.">; +def end_no_unused_arguments : Flag<["--"], "end-no-unused-arguments">, Flags<[CoreOption]>, + HelpText<"Start emitting warnings for unused driver arguments">; def interface_stub_version_EQ : JoinedOrSeparate<["-"], "interface-stub-version=">, Flags<[CC1Option]>; def exported__symbols__list : Separate<["-"], "exported_symbols_list">; def e : JoinedOrSeparate<["-"], "e">, Flags<[LinkerInput]>, Group; @@ -3913,6 +3915,8 @@ def shared : Flag<["-", "--"], "shared">, Group; def single__module : Flag<["-"], "single_module">; def specs_EQ : Joined<["-", "--"], "specs=">, Group; def specs : Separate<["-", "--"], "specs">, Flags<[Unsupported]>; +def start_no_unused_arguments : Flag<["--"], "start-no-unused-arguments">, Flags<[CoreOption]>, + HelpText<"Don't emit warnings about unused arguments for the following arguments">; def static_libgcc : Flag<["-"], "static-libgcc">; def static_libstdcxx : Flag<["-"], "static-libstdc++">; def static : Flag<["-", "--"], "static">, Group, Flags<[NoArgumentUnused]>; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index ac8438b..2c3b137 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -367,7 +367,20 @@ DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const { bool HasNostdlib = Args.hasArg(options::OPT_nostdlib); bool HasNostdlibxx = Args.hasArg(options::OPT_nostdlibxx); bool HasNodefaultlib = Args.hasArg(options::OPT_nodefaultlibs); + bool IgnoreUnused = false; for (Arg *A : Args) { + if (IgnoreUnused) + A->claim(); + + if (A->getOption().matches(options::OPT_start_no_unused_arguments)) { + IgnoreUnused = true; + continue; + } + if (A->getOption().matches(options::OPT_end_no_unused_arguments)) { + IgnoreUnused = false; + continue; + } + // Unfortunately, we have to parse some forwarding options (-Xassembler, // -Xlinker, -Xpreprocessor) because we either integrate their functionality // (assembler and preprocessor), or bypass a previous driver ('collect2'). diff --git a/clang/test/Driver/diagnostics.c b/clang/test/Driver/diagnostics.c index 8500fad..16e0034 100644 --- a/clang/test/Driver/diagnostics.c +++ b/clang/test/Driver/diagnostics.c @@ -1,9 +1,53 @@ // Parse diagnostic arguments in the driver -// PR12181 -// RUN: not %clang -target x86_64-apple-darwin10 \ -// RUN: -fsyntax-only -fzyzzybalubah \ -// RUN: -Werror=unused-command-line-argument %s +// Exactly which arguments are warned about and which aren't differ based +// on what target is selected. -stdlib= and -fuse-ld= emit diagnostics when +// compiling C code, for e.g. *-linux-gnu. Linker inputs, like -lfoo, emit +// diagnostics when only compiling for all targets. -// RUN: not %clang -target x86_64-apple-darwin10 \ -// RUN: -fsyntax-only -fzyzzybalubah -Werror %s +// This is normally a non-fatal warning: +// RUN: %clang --target=x86_64-apple-darwin10 \ +// RUN: -fsyntax-only -lfoo %s 2>&1 | FileCheck %s + +// Either with a specific -Werror=unused.. or a blanket -Werror, this +// causes the command to fail. +// RUN: not %clang --target=x86_64-apple-darwin10 \ +// RUN: -fsyntax-only -lfoo \ +// RUN: -Werror=unused-command-line-argument %s 2>&1 | FileCheck %s + +// RUN: not %clang --target=x86_64-apple-darwin10 \ +// RUN: -fsyntax-only -lfoo -Werror %s 2>&1 | FileCheck %s + +// With a specific -Wno-..., no diagnostic should be printed. +// RUN: %clang --target=x86_64-apple-darwin10 \ +// RUN: -fsyntax-only -lfoo -Werror \ +// RUN: -Wno-unused-command-line-argument %s 2>&1 | count 0 + +// With -Qunused-arguments, no diagnostic should be printed. +// RUN: %clang --target=x86_64-apple-darwin10 \ +// RUN: -fsyntax-only -lfoo -Werror \ +// RUN: -Qunused-arguments %s 2>&1 | count 0 + +// With the argument enclosed in --{start,end}-no-unused-arguments, +// there's no diagnostic. +// RUN: %clang --target=x86_64-apple-darwin10 -fsyntax-only \ +// RUN: --start-no-unused-arguments -lfoo --end-no-unused-arguments \ +// RUN: -Werror %s 2>&1 | count 0 + +// With --{start,end}-no-unused-argument around a different argument, it +// still warns about the unused argument. +// RUN: not %clang --target=x86_64-apple-darwin10 \ +// RUN: --start-no-unused-arguments -fsyntax-only --end-no-unused-arguments \ +// RUN: -lfoo -Werror %s 2>&1 | FileCheck %s + +// Test clang-cl warning about unused linker options. +// RUN: not %clang_cl -fsyntax-only /WX %s \ +// RUN: -link 2>&1 | FileCheck %s --check-prefix=CL-WARNING + +// Test clang-cl ignoring the warning with --start-no-unused-arguments. +// RUN: %clang_cl -fsyntax-only /WX %s \ +// RUN: --start-no-unused-arguments -link --end-no-unused-arguments 2>&1 | count 0 + +// CHECK: -lfoo: 'linker' input unused + +// CL-WARNING: argument unused during compilation: '-link' -- 2.7.4