From e3bb359aacddb5e0266e219f33d27b642089fd53 Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Mon, 24 Oct 2022 12:21:12 -0700 Subject: [PATCH] [clang][Toolchains][Gnu] pass -g through to assembler We've been working around this for a long time in the Linux kernel; we bend over backwards to continue to support CC=clang (w/ -fno-integrated-as) for architectures where clang can't yet be used to assemble the kernel's assembler sources. Supporting debug info for the combination of CC=clang w/ GNU binutils as "GAS" has been painful. Fix this in clang so that we can work towards dropping complexity in the Linux kernel's build system, Kbuild, for supporting this combination of tools. GAS added support for -g in 2004 2.16 release via commit 329e276daf98 ("Add support for a -g switch to GAS") Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D136309 --- clang/lib/Driver/ToolChains/Gnu.cpp | 4 ++++ clang/test/Driver/as-options.s | 10 ++++++++++ clang/test/Driver/gcc_forward.c | 6 ------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index f717ca3..9a172db 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -969,6 +969,10 @@ void tools::gnutools::Assembler::ConstructJob(Compilation &C, for (const auto &II : Inputs) CmdArgs.push_back(II.getFilename()); + if (Arg *A = Args.getLastArg(options::OPT_g_Flag, options::OPT_gN_Group)) + if (!A->getOption().matches(options::OPT_g0)) + Args.AddLastArg(CmdArgs, options::OPT_g_Flag); + const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(DefaultAssembler)); C.addCommand(std::make_unique(JA, *this, diff --git a/clang/test/Driver/as-options.s b/clang/test/Driver/as-options.s index 6426968..f76b213 100644 --- a/clang/test/Driver/as-options.s +++ b/clang/test/Driver/as-options.s @@ -116,3 +116,13 @@ // RUN: %clang -mrelax-all -fno-integrated-as -x c++ %s -S -o /dev/null 2>&1 \ // RUN: | FileCheck --check-prefix=WARN --allow-empty %s // WARN: unused + +// Test that -g is passed through to GAS. +// RUN: %clang --target=aarch64-linux-gnu -fno-integrated-as -g %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// RUN: %clang --target=aarch64-linux-gnu -fno-integrated-as -g0 -g %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=DEBUG %s +// DEBUG: "-g" +// RUN: %clang --target=aarch64-linux-gnu -fno-integrated-as -g -g0 %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=NODEBUG %s +// NODEBUG-NOT: "-g" diff --git a/clang/test/Driver/gcc_forward.c b/clang/test/Driver/gcc_forward.c index 9e512d1..491750f5 100644 --- a/clang/test/Driver/gcc_forward.c +++ b/clang/test/Driver/gcc_forward.c @@ -34,9 +34,3 @@ // CHECK-NOT: "-Wall" // CHECK-NOT: "-Wdocumentation" // CHECK: "-o" "a.out" - -// Check that we're not forwarding -g options to the assembler -// RUN: %clang -g -target x86_64-unknown-linux-gnu -no-integrated-as -c %s -### 2>&1 \ -// RUN: | FileCheck --check-prefix=CHECK-ASM %s -// CHECK-ASM: as -// CHECK-ASM-NOT: "-g" -- 2.7.4