[llvm] [AArch64] Null check TargetStreamer before emitting .variant_pcs (PR #138924)

Benjamin Maxwell via llvm-commits llvm-commits at lists.llvm.org
Thu May 8 02:12:30 PDT 2025


https://github.com/MacDue updated https://github.com/llvm/llvm-project/pull/138924

>From 899c9515f00fc955b7a73be906652558da695a23 Mon Sep 17 00:00:00 2001
From: Benjamin Maxwell <benjamin.maxwell at arm.com>
Date: Wed, 7 May 2025 17:00:22 +0000
Subject: [PATCH 1/3] [AArch64] Null check TargetStreamer before emitting
 .variant_pcs

This was causing crashes on Mach-O targets as we don't construct a
TargetStreamer for that object format. Other uses of the TargetStreamer
(TS) appear to be limited to ELF and COFF platforms (where it is none
null, so don't need changing).
---
 llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp | 3 ++-
 llvm/test/CodeGen/AArch64/variant-pcs.ll      | 3 +++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
index 870df4c387ca4..1166a78bf1088 100644
--- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
+++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
@@ -1372,7 +1372,8 @@ void AArch64AsmPrinter::emitFunctionEntryLabel() {
       MF->getInfo<AArch64FunctionInfo>()->isSVECC()) {
     auto *TS =
         static_cast<AArch64TargetStreamer *>(OutStreamer->getTargetStreamer());
-    TS->emitDirectiveVariantPCS(CurrentFnSym);
+    if (TS)
+      TS->emitDirectiveVariantPCS(CurrentFnSym);
   }
 
   AsmPrinter::emitFunctionEntryLabel();
diff --git a/llvm/test/CodeGen/AArch64/variant-pcs.ll b/llvm/test/CodeGen/AArch64/variant-pcs.ll
index 49c504177358e..0c995b5b0e8ef 100644
--- a/llvm/test/CodeGen/AArch64/variant-pcs.ll
+++ b/llvm/test/CodeGen/AArch64/variant-pcs.ll
@@ -2,6 +2,9 @@
 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -filetype=obj -o - %s \
 ; RUN:   | llvm-readobj --symbols - | FileCheck %s --check-prefix=CHECK-OBJ
 
+; Check we don't crash when using a Mach-O object format.
+; RUN: llc -mtriple=arm64-apple-macosx15.0.0 -mattr=+sve -filetype=obj -o /dev/null %s
+
 define i32 @base_pcs() {
 ; CHECK-ASM-LABEL: base_pcs:
 ; CHECK-ASM-NOT: .variant_pcs

>From 89495f925cdb4affccce93266107d38f77a78e75 Mon Sep 17 00:00:00 2001
From: Benjamin Maxwell <benjamin.maxwell at arm.com>
Date: Thu, 8 May 2025 09:08:04 +0000
Subject: [PATCH 2/3] Fixup

---
 llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
index 1166a78bf1088..c5a12a4648f84 100644
--- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
+++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
@@ -1370,9 +1370,8 @@ void AArch64AsmPrinter::emitFunctionEntryLabel() {
       MF->getFunction().getCallingConv() ==
           CallingConv::AArch64_SVE_VectorCall ||
       MF->getInfo<AArch64FunctionInfo>()->isSVECC()) {
-    auto *TS =
-        static_cast<AArch64TargetStreamer *>(OutStreamer->getTargetStreamer());
-    if (TS)
+    if (auto *TS =
+      static_cast<AArch64TargetStreamer *>(OutStreamer->getTargetStreamer()))
       TS->emitDirectiveVariantPCS(CurrentFnSym);
   }
 

>From 4d96cd7d3598361ce2b2e8ae48e32eca662382a5 Mon Sep 17 00:00:00 2001
From: Benjamin Maxwell <benjamin.maxwell at arm.com>
Date: Thu, 8 May 2025 09:12:19 +0000
Subject: [PATCH 3/3] Format

---
 llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
index c5a12a4648f84..70f5985a50e49 100644
--- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
+++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
@@ -1370,8 +1370,8 @@ void AArch64AsmPrinter::emitFunctionEntryLabel() {
       MF->getFunction().getCallingConv() ==
           CallingConv::AArch64_SVE_VectorCall ||
       MF->getInfo<AArch64FunctionInfo>()->isSVECC()) {
-    if (auto *TS =
-      static_cast<AArch64TargetStreamer *>(OutStreamer->getTargetStreamer()))
+    if (auto *TS = static_cast<AArch64TargetStreamer *>(
+            OutStreamer->getTargetStreamer()))
       TS->emitDirectiveVariantPCS(CurrentFnSym);
   }
 



More information about the llvm-commits mailing list