https://github.com/Ris-Bali created 
https://github.com/llvm/llvm-project/pull/212474

The external assembler path (-fno-integrated-as, which invokes llvm-mc) only 
forwarded -mcpu and -mhvx-ieee-fp, so target features such as HVX, HVX length, 
HVX qfloat, and long-calls never reached the assembler. As a result, HVX-using 
code that compiled fine with the integrated assembler failed to assemble with 
the external one.

Compute the features with hexagon::getHexagonTargetFeatures(); the same helper 
used by the compiler and integrated assembler and forward them to llvm-mc via 
-mattr=, bringing the external assembler path to parity so behavior is 
consistent regardless of which assembler is selected.

Fixes #212471 

>From f0ded42ae23684d1d2e0bedbe1f8b35aad747e3b Mon Sep 17 00:00:00 2001
From: Rishabh Bali <[email protected]>
Date: Tue, 28 Jul 2026 17:08:35 +0530
Subject: [PATCH] [Hexagon] Forward target features to the external assembler

The external assembler path (-fno-integrated-as, which invokes llvm-mc)
only forwarded -mcpu and -mhvx-ieee-fp, so target features such as HVX,
HVX length, HVX qfloat, and long-calls never reached the assembler. As a
result, HVX-using code that compiled fine with the integrated assembler
failed to assemble with the external one.

Compute the features with hexagon::getHexagonTargetFeatures(); the same
helper used by the compiler and integrated assembler and forward them to
llvm-mc via -mattr=, bringing the external assembler path to parity so
behavior is consistent regardless of which assembler is selected.

Signed-off-by: Rishabh Bali <[email protected]>
---
 clang/lib/Driver/ToolChains/Hexagon.cpp       | 16 +++++--
 .../Driver/hexagon-external-as-features.c     | 46 +++++++++++++++++++
 2 files changed, 57 insertions(+), 5 deletions(-)
 create mode 100644 clang/test/Driver/hexagon-external-as-features.c

diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp 
b/clang/lib/Driver/ToolChains/Hexagon.cpp
index 2ddc15ddbd818..41e5972361c14 100644
--- a/clang/lib/Driver/ToolChains/Hexagon.cpp
+++ b/clang/lib/Driver/ToolChains/Hexagon.cpp
@@ -14,6 +14,7 @@
 #include "clang/Driver/MultilibBuilder.h"
 #include "clang/Driver/SanitizerArgs.h"
 #include "clang/Options/Options.h"
+#include "llvm/ADT/StringExtras.h"
 #include "llvm/Option/ArgList.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Path.h"
@@ -228,11 +229,16 @@ void hexagon::Assembler::ConstructJob(Compilation &C, 
const JobAction &JA,
     CmdArgs.push_back("-fsyntax-only");
   }
 
-  if (Arg *A = Args.getLastArg(options::OPT_mhexagon_hvx_ieee_fp,
-                               options::OPT_mno_hexagon_hvx_ieee_fp)) {
-    if (A->getOption().matches(options::OPT_mhexagon_hvx_ieee_fp))
-      CmdArgs.push_back("-mhvx-ieee-fp");
-  }
+  // Forward the target features (e.g. HVX, HVX length, HVX qfloat/ieee-fp) to
+  // the external assembler so that its behavior matches the integrated
+  // assembler. getHexagonTargetFeatures() computes the same feature list that
+  // the compiler and integrated assembler use, and llvm-mc consumes it via
+  // -mattr=.
+  std::vector<StringRef> Features;
+  hexagon::getHexagonTargetFeatures(D, HTC.getTriple(), Args, Features);
+  if (!Features.empty())
+    CmdArgs.push_back(
+        Args.MakeArgString("-mattr=" + llvm::join(Features, ",")));
 
   if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
     CmdArgs.push_back(Args.MakeArgString("-gpsize=" + Twine(*G)));
diff --git a/clang/test/Driver/hexagon-external-as-features.c 
b/clang/test/Driver/hexagon-external-as-features.c
new file mode 100644
index 0000000000000..1bc78ef011473
--- /dev/null
+++ b/clang/test/Driver/hexagon-external-as-features.c
@@ -0,0 +1,46 @@
+// 
-----------------------------------------------------------------------------
+// Tests that target features are forwarded to the external assembler
+// (llvm-mc) via -mattr= when -fno-integrated-as is used, so that the
+// external assembler path is on par with the integrated assembler.
+// 
-----------------------------------------------------------------------------
+
+// Baseline: no HVX means no HVX features in -mattr=.
+// RUN: %clang -### -c %s --target=hexagon-unknown-elf -fno-integrated-as \
+// RUN:   -mcpu=hexagonv79 2>&1 | FileCheck -check-prefix=CHECK-NOHVX %s
+// CHECK-NOHVX: llvm-mc
+// CHECK-NOHVX-SAME: "-mcpu=hexagonv79"
+// CHECK-NOHVX-NOT: "+hvx
+
+// -mhvx enables HVX for the external assembler.
+// RUN: %clang -### -c %s --target=hexagon-unknown-elf -fno-integrated-as \
+// RUN:   -mcpu=hexagonv79 -mhvx 2>&1 | FileCheck -check-prefix=CHECK-HVX %s
+// CHECK-HVX: llvm-mc
+// CHECK-HVX-SAME: "-mcpu=hexagonv79"
+// CHECK-HVX-SAME: "-mattr={{[^"]*}}+hvxv79
+
+// -mhvx= selects an explicit HVX version.
+// RUN: %clang -### -c %s --target=hexagon-unknown-elf -fno-integrated-as \
+// RUN:   -mcpu=hexagonv79 -mhvx=v68 2>&1 | FileCheck 
-check-prefix=CHECK-HVXV68 %s
+// CHECK-HVXV68: llvm-mc
+// CHECK-HVXV68-SAME: "-mattr={{[^"]*}}+hvxv68
+
+// -mhvx-length= is forwarded.
+// RUN: %clang -### -c %s --target=hexagon-unknown-elf -fno-integrated-as \
+// RUN:   -mcpu=hexagonv79 -mhvx -mhvx-length=128b 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-HVXLEN %s
+// CHECK-HVXLEN: llvm-mc
+// CHECK-HVXLEN-SAME: "-mattr={{[^"]*}}+hvx-length128b
+
+// -mhvx-qfloat is forwarded.
+// RUN: %clang -### -c %s --target=hexagon-unknown-elf -fno-integrated-as \
+// RUN:   -mcpu=hexagonv79 -mhvx -mhvx-qfloat 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-HVXQFLOAT %s
+// CHECK-HVXQFLOAT: llvm-mc
+// CHECK-HVXQFLOAT-SAME: "-mattr={{[^"]*}}+hvx-qfloat
+
+// -mhvx-ieee-fp is forwarded (previously the only HVX flag handled here).
+// RUN: %clang -### -c %s --target=hexagon-unknown-elf -fno-integrated-as \
+// RUN:   -mcpu=hexagonv73 -mhvx -mhvx-ieee-fp 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHECK-HVXIEEE %s
+// CHECK-HVXIEEE: llvm-mc
+// CHECK-HVXIEEE-SAME: "-mattr={{[^"]*}}+hvx-ieee-fp

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to