From 7be95d4965a63e1324d0c239ae31bd7616d4e82e Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 10 Jul 2025 11:16:42 +0900 Subject: [PATCH 1/2] 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 + +@_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) { From f4aab0b0be2eca2b62ce9be8658a4e386d424ff9 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 10 Jul 2025 12:51:09 +0900 Subject: [PATCH 2/2] comment test --- llvm/test/CodeGen/AArch64/exception-handling-windows-elf.ll | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/llvm/test/CodeGen/AArch64/exception-handling-windows-elf.ll b/llvm/test/CodeGen/AArch64/exception-handling-windows-elf.ll index f7ddda9815c99..f38bb8613b7b0 100644 --- a/llvm/test/CodeGen/AArch64/exception-handling-windows-elf.ll +++ b/llvm/test/CodeGen/AArch64/exception-handling-windows-elf.ll @@ -1,6 +1,8 @@ ; 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 + +; Make sure windows elf does not assert with exceptions. This is a +; hack for MCJIT that could be treated as an error when it is removed. @_ZTIi = external global ptr