[clang] [clang][Driver] Support passing arbitrary args to -cc1as with -Xclangas. (PR #100714)
Alex Rønne Petersen via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 26 00:48:10 PDT 2024
https://github.com/alexrp created https://github.com/llvm/llvm-project/pull/100714
This is one of the ideas I gave in #97517. I opted to propose this one first as introducing a new `-Xclangas` option comes with no concerns about GCC compatibility as with `-Xassembler`.
I am not sure where would be an appropriate place to test this, or how it would make sense to do so. I would appreciate any guidance on this. I tested manually like this:
```console
❯ ./bin/clang -target arm-linux-gnueabi -c test.s
test.s:1:1: error: instruction requires: armv5t
blx lr
^
❯ make -j
❯ ./bin/clang -target arm-linux-gnueabi -c test.s -Xclangas -target-feature -Xclangas +v5t
❯ file test.o
test.o: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
```
>From c1da400d71a9b479e012362cb581b5fd7c95bfbe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= <alex at alexrp.com>
Date: Fri, 26 Jul 2024 09:40:42 +0200
Subject: [PATCH] [clang][Driver] Support passing arbitrary args to -cc1as with
-Xclangas.
Closes #97517.
---
clang/docs/UsersManual.rst | 1 +
clang/include/clang/Driver/Options.td | 8 ++++++++
clang/lib/Driver/ToolChains/Clang.cpp | 6 ++++++
3 files changed, 15 insertions(+)
diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index e9b95739ea2ab..7f55080321fea 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -4876,6 +4876,7 @@ Execute ``clang-cl /?`` to see a list of supported options:
-v Show commands to run and use verbose output
-W<warning> Enable the specified warning
-Xclang <arg> Pass <arg> to the clang compiler
+ -Xclangas <arg> Pass <arg> to the clang assembler
The /clang: Option
^^^^^^^^^^^^^^^^^^
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 26811bf948ae5..c7839c3941eb9 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1028,10 +1028,18 @@ def Xclang : Separate<["-"], "Xclang">,
HelpText<"Pass <arg> to clang -cc1">, MetaVarName<"<arg>">,
Flags<[NoXarchOption]>, Visibility<[ClangOption, CLOption, DXCOption]>,
Group<CompileOnly_Group>;
+def Xclangas : Separate<["-"], "Xclangas">,
+ HelpText<"Pass <arg> to clang -cc1as">, MetaVarName<"<arg>">,
+ Flags<[NoXarchOption]>, Visibility<[ClangOption, CLOption, DXCOption]>,
+ Group<CompileOnly_Group>;
def : Joined<["-"], "Xclang=">, Group<CompileOnly_Group>,
Flags<[NoXarchOption]>, Visibility<[ClangOption, CLOption, DXCOption]>,
Alias<Xclang>,
HelpText<"Alias for -Xclang">, MetaVarName<"<arg>">;
+def : Joined<["-"], "Xclangas=">, Group<CompileOnly_Group>,
+ Flags<[NoXarchOption]>, Visibility<[ClangOption, CLOption, DXCOption]>,
+ Alias<Xclangas>,
+ HelpText<"Alias for -Xclangas">, MetaVarName<"<arg>">;
def Xcuda_fatbinary : Separate<["-"], "Xcuda-fatbinary">,
HelpText<"Pass <arg> to fatbinary invocation">, MetaVarName<"<arg>">;
def Xcuda_ptxas : Separate<["-"], "Xcuda-ptxas">,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 4a94df7d5f42e..90b8db11c46c6 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -8711,6 +8711,12 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
getToolChain().getDriver());
+ // Forward -Xclangas arguments to -cc1as
+ for (auto Arg : Args.filtered(options::OPT_Xclangas)) {
+ Arg->claim();
+ CmdArgs.push_back(Arg->getValue());
+ }
+
Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
if (DebugInfoKind > llvm::codegenoptions::NoDebugInfo && Output.isFilename())
More information about the cfe-commits
mailing list