https://github.com/alexrp updated 
https://github.com/llvm/llvm-project/pull/100714

From f4c0dc8c6214ea913254362f36935add3414811c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= <a...@alexrp.com>
Date: Fri, 26 Jul 2024 09:40:42 +0200
Subject: [PATCH] [clang][Driver] Support passing arbitrary args to -cc1as with
 -Xclangas.

Unlike the -Xassembler idea mentioned in #97517, this one comes with no GCC
compatibility concerns, and simply mirrors what -Xclang does for -cc1.

This is useful for mostly the same reasons that -Xclang is. The motivating use
case is zig cc, however, where we use -Xclang -target-feature to pass the
exhaustive list of target features to Clang for C-family files. Before this
commit, there was no way to do the same for assembly files.

For context, Zig bases all of its target feature info directly on the info in
LLVM's backends, including all the dependency relationships therein. So it just
makes more sense for Zig to be able to directly pass all this info to the
assembler, rather than having to manually reconstruct the corresponding frontend
command line flags for every target.

Closes #97517.
---
 clang/docs/UsersManual.rst            | 1 +
 clang/include/clang/Driver/Options.td | 8 ++++++++
 clang/lib/Driver/ToolChains/Clang.cpp | 6 ++++++
 clang/test/Driver/Xclangas.s          | 6 ++++++
 4 files changed, 21 insertions(+)
 create mode 100644 clang/test/Driver/Xclangas.s

diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index 69256527f40c9..6c2053e01da8b 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -5146,6 +5146,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 830d3459a1320..919c1c643d080 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -958,10 +958,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 67a800a643cbe..f2f5231933c88 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -8895,6 +8895,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())
diff --git a/clang/test/Driver/Xclangas.s b/clang/test/Driver/Xclangas.s
new file mode 100644
index 0000000000000..0b198a3b70d1f
--- /dev/null
+++ b/clang/test/Driver/Xclangas.s
@@ -0,0 +1,6 @@
+/// Check that -Xclangas/-Xclangas= are passed to -cc1as.
+// RUN: %clang -### -Xclangas -target-feature -Xclangas=+v5t %s 2>&1 | \
+// RUN:   FileCheck -check-prefix=ARGS %s
+// ARGS: -cc1as
+// ARGS: -target-feature
+// ARGS: +v5t

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to