From: Nico Weber Date: Wed, 10 Jul 2019 22:29:35 +0000 (+0000) Subject: driver: Don't warn about assembler flags being unused when not assembling X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8f1a15f9644c5817343442c3424c7459e6f4c7c6;p=clang driver: Don't warn about assembler flags being unused when not assembling clang currently warns when passing flags for the assembler (e.g. -Wa,-mbig-obj) to an invocation that doesn't run the assembler (e.g. -E). At first sight, that makes sense -- the flag really is unused. But many other flags don't have an effect if no assembler runs (e.g. -fno-integrated-as, -ffunction-sections, and many others), and those currently don't warn. So this seems more like a side effect of how CollectArgsForIntegratedAssembler() is implemented than like an intentional feature. Since it's a bit inconvenient when debugging builds and adding -E, always call CollectArgsForIntegratedAssembler() to make sure assembler args always get claimed. Currently, this affects only these flags: -mincremental-linker-compatible, -mimplicit-it= (on ARM), -Wa, -Xassembler It does have the side effect that assembler options now need to be valid even if -E is passed. Previously, `-Wa,-mbig-obj` would error for non-coff output only if the assembler ran, now it always errors. This too makes assembler flags more consistent with all the other flags and seems like a progression. Fixes PR42066. Differential Revision: https://reviews.llvm.org/D64527 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@365703 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/ToolChains/Clang.cpp b/lib/Driver/ToolChains/Clang.cpp index eb0df5221d..6e2f1f302c 100644 --- a/lib/Driver/ToolChains/Clang.cpp +++ b/lib/Driver/ToolChains/Clang.cpp @@ -3545,6 +3545,18 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // Select the appropriate action. RewriteKind rewriteKind = RK_None; + // If CollectArgsForIntegratedAssembler() isn't called below, call it here + // with a dummy args list to mark assembler flags as used even when not + // running an assembler. Otherwise, clang would emit "argument unused" + // warnings for assembler flags when e.g. adding "-E" to flags while debugging + // something. That'd be somewhat inconvenient, and it's also inconsistent with + // most other flags -- we don't warn on -ffunction-sections not being used + // in -E mode either for example, even though it's not really used either. + if (!isa(JA)) { + ArgStringList DummyArgs; + CollectArgsForIntegratedAssembler(C, Args, DummyArgs, D); + } + if (isa(JA)) { assert(JA.getType() == types::TY_Plist && "Invalid output type."); CmdArgs.push_back("-analyze"); diff --git a/test/Driver/as-options.s b/test/Driver/as-options.s index 405030fb37..e04c959b8b 100644 --- a/test/Driver/as-options.s +++ b/test/Driver/as-options.s @@ -35,3 +35,14 @@ // RUN: | FileCheck %s // CHECK: "-I" "foo_dir" + +// Test that assembler options don't cause warnings when there's no assembler +// stage. + +// RUN: %clang -mincremental-linker-compatible -E -o /dev/null %s 2>&1 \ +// RUN: | FileCheck --check-prefix=WARN --allow-empty %s +// RUN: %clang -mimplicit-it=always -target armv7-linux-gnueabihf -E %s \ +// RUN: | FileCheck --check-prefix=WARN --allow-empty %s +// RUN: %clang -Wa,-mbig-obj -target i386-pc-windows -E %s \ +// RUN: | FileCheck --check-prefix=WARN --allow-empty %s +// WARN-NOT: unused