[llvm] AArch64: Base exception type on binary format before OS (PR #147875)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 9 19:31:35 PDT 2025
https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/147875
Fixes asserting with windows-elf triples. Should fix regression
reported in https://github.com/llvm/llvm-project/pull/147225#issuecomment-3054190938
I'm not sure this is a valid triple, but I'm guessing the MCJIT usage
is an accident. This does change the behavior from trying to use WinEH
to DwarfCFI; however the backend crashes with WinEH so I'm assuming following
ELF is the more correct option.
>From 7be95d4965a63e1324d0c239ae31bd7616d4e82e Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Thu, 10 Jul 2025 11:16:42 +0900
Subject: [PATCH] AArch64: Base exception type on binary format before OS
Fixes asserting with windows-elf triples. Should fix regression
reported in https://github.com/llvm/llvm-project/pull/147225#issuecomment-3054190938
I'm not sure this is a valid triple, but I'm guessing the MCJIT usage
is an accident. This does change the behavior from trying to use WinEH
to DwarfCFI; however the backend crashes with WinEH so I'm assuming following
ELF is the more correct option.
---
.../MCTargetDesc/AArch64MCTargetDesc.cpp | 8 ++--
.../AArch64/exception-handling-windows-elf.ll | 42 +++++++++++++++++++
llvm/unittests/TargetParser/TripleTest.cpp | 4 ++
3 files changed, 50 insertions(+), 4 deletions(-)
create mode 100644 llvm/test/CodeGen/AArch64/exception-handling-windows-elf.ll
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp
index efc13589bab63..f918e3cbc7b80 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp
@@ -349,14 +349,14 @@ static MCAsmInfo *createAArch64MCAsmInfo(const MCRegisterInfo &MRI,
MCAsmInfo *MAI;
if (TheTriple.isOSBinFormatMachO())
MAI = new AArch64MCAsmInfoDarwin(TheTriple.getArch() == Triple::aarch64_32);
+ else if (TheTriple.isOSBinFormatELF())
+ MAI = new AArch64MCAsmInfoELF(TheTriple);
else if (TheTriple.isWindowsMSVCEnvironment())
MAI = new AArch64MCAsmInfoMicrosoftCOFF();
else if (TheTriple.isOSBinFormatCOFF())
MAI = new AArch64MCAsmInfoGNUCOFF();
- else {
- assert(TheTriple.isOSBinFormatELF() && "Invalid target");
- MAI = new AArch64MCAsmInfoELF(TheTriple);
- }
+ else
+ llvm_unreachable("Invalid target"); // FIXME: This is not unreachable
// Initial state of the frame pointer is SP.
unsigned Reg = MRI.getDwarfRegNum(AArch64::SP, true);
diff --git a/llvm/test/CodeGen/AArch64/exception-handling-windows-elf.ll b/llvm/test/CodeGen/AArch64/exception-handling-windows-elf.ll
new file mode 100644
index 0000000000000..f7ddda9815c99
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/exception-handling-windows-elf.ll
@@ -0,0 +1,42 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=aarch64-pc-windows-elf < %s | FileCheck %s
+; Make sure windows elf does not assert with exceptions
+
+ at _ZTIi = external global ptr
+
+declare i32 @foo(i32)
+declare i32 @__gxx_personality_v0(...)
+
+define void @bar() personality ptr @__gxx_personality_v0 {
+; CHECK-LABEL: bar:
+; CHECK: // %bb.0: // %continue
+; CHECK-NEXT: sub sp, sp, #32
+; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
+; CHECK-NEXT: .cfi_def_cfa_offset 32
+; CHECK-NEXT: .cfi_offset w30, -16
+; CHECK-NEXT: adrp x8, :got:foo
+; CHECK-NEXT: mov w0, #42 // =0x2a
+; CHECK-NEXT: ldr x8, [x8, :got_lo12:foo]
+; CHECK-NEXT: blr x8
+; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
+; CHECK-NEXT: add sp, sp, #32
+; CHECK-NEXT: ret
+ %exn.slot = alloca ptr
+ %ehselector.slot = alloca i32
+ %1 = invoke i32 @foo(i32 42) to label %continue unwind label %cleanup
+
+cleanup:
+ %lp = landingpad { ptr, i32 } cleanup
+ %lp.0 = extractvalue { ptr, i32 } %lp, 0
+ store ptr %lp.0, ptr %exn.slot, align 8
+ %lp.1 = extractvalue { ptr, i32 } %lp, 1
+ store i32 %lp.1, ptr %ehselector.slot, align 4
+ br label %eh.resume
+
+continue:
+ ret void
+
+eh.resume:
+ %exn = load ptr, ptr %exn.slot, align 8
+ unreachable
+}
diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp
index ca48e77cf7caa..36408de7802cc 100644
--- a/llvm/unittests/TargetParser/TripleTest.cpp
+++ b/llvm/unittests/TargetParser/TripleTest.cpp
@@ -2909,6 +2909,10 @@ TEST(TripleTest, DefaultExceptionHandling) {
EXPECT_EQ(ExceptionHandling::DwarfCFI,
Triple("x86_64-scei-ps4").getDefaultExceptionHandling());
+ EXPECT_EQ(ExceptionHandling::WinEH,
+ Triple("aarch64-pc-windows-msvc").getDefaultExceptionHandling());
+ EXPECT_EQ(ExceptionHandling::DwarfCFI,
+ Triple("aarch64-pc-windows-elf").getDefaultExceptionHandling());
}
TEST(TripleTest, NormalizeWindows) {
More information about the llvm-commits
mailing list