[PATCH] D147212: [ARM] Handle generating SEH unwind info for t2STR_PRE/t2LDR_POST

Martin Storsjö via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 30 03:36:15 PDT 2023


mstorsjo created this revision.
mstorsjo added a reviewer: efriedma.
Herald added subscribers: hiraditya, kristof.beyls.
Herald added a project: All.
mstorsjo requested review of this revision.
Herald added a project: LLVM.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D147212

Files:
  llvm/lib/Target/ARM/ARMFrameLowering.cpp
  llvm/test/CodeGen/ARM/Windows/wineh-save-single-reg.ll


Index: llvm/test/CodeGen/ARM/Windows/wineh-save-single-reg.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/ARM/Windows/wineh-save-single-reg.ll
@@ -0,0 +1,33 @@
+;; Check that this produces the expected assembly output
+; RUN: llc -mtriple=thumbv7-windows -o - %s -verify-machineinstrs | FileCheck %s
+;; Also try to write an object file, which verifies that the SEH opcodes
+;; match the actual prologue/epilogue length.
+; RUN: llc -mtriple=thumbv7-windows -filetype=obj -o %t.obj %s -verify-machineinstrs
+
+; CHECK-LABEL: _Z4funcv:
+; CHECK-NEXT: .seh_proc _Z4funcv
+; CHECK-NEXT: @ %bb.0:                                @ %entry
+; CHECK-NEXT:         str     r11, [sp, #-4]!
+; CHECK-NEXT:         .seh_save_regs_w        {r11}
+; CHECK-NEXT:         mov     r11, sp
+; CHECK-NEXT:         .seh_save_sp    r11
+; CHECK-NEXT:         .seh_endprologue
+
+; CHECK-NEXT:         mov     r0, r11
+
+; CHECK-NEXT:         .seh_startepilogue
+; CHECK-NEXT:         ldr     r11, [sp], #4
+; CHECK-NEXT:         .seh_save_regs_w        {r11}
+; CHECK-NEXT:         bx      lr
+; CHECK-NEXT:         .seh_nop
+; CHECK-NEXT:         .seh_endepilogue
+; CHECK-NEXT:         .seh_endproc
+
+define i32 @_Z4funcv() {
+entry:
+  %0 = tail call ptr @llvm.frameaddress.p0(i32 0)
+  %1 = ptrtoint ptr %0 to i32
+  ret i32 %1
+}
+
+declare ptr @llvm.frameaddress.p0(i32 immarg) #1
Index: llvm/lib/Target/ARM/ARMFrameLowering.cpp
===================================================================
--- llvm/lib/Target/ARM/ARMFrameLowering.cpp
+++ llvm/lib/Target/ARM/ARMFrameLowering.cpp
@@ -357,6 +357,34 @@
               .setMIFlags(Flags);
     break;
 
+  case ARM::t2STR_PRE:
+    if (MBBI->getOperand(0).getReg() == ARM::SP &&
+        MBBI->getOperand(2).getReg() == ARM::SP &&
+        MBBI->getOperand(3).getImm() == -4) {
+      unsigned Reg = RegInfo->getSEHRegNum(MBBI->getOperand(1).getReg());
+      MIB = BuildMI(MF, DL, TII.get(ARM::SEH_SaveRegs))
+                .addImm(1 << Reg)
+                .addImm(/*Wide=*/1)
+                .setMIFlags(Flags);
+    } else {
+      report_fatal_error("No matching SEH Opcode for t2STR_PRE");
+    }
+    break;
+
+  case ARM::t2LDR_POST:
+    if (MBBI->getOperand(1).getReg() == ARM::SP &&
+        MBBI->getOperand(2).getReg() == ARM::SP &&
+        MBBI->getOperand(3).getImm() == 4) {
+      unsigned Reg = RegInfo->getSEHRegNum(MBBI->getOperand(0).getReg());
+      MIB = BuildMI(MF, DL, TII.get(ARM::SEH_SaveRegs))
+                .addImm(1 << Reg)
+                .addImm(/*Wide=*/1)
+                .setMIFlags(Flags);
+    } else {
+      report_fatal_error("No matching SEH Opcode for t2LDR_POST");
+    }
+    break;
+
   case ARM::t2LDMIA_RET:
   case ARM::t2LDMIA_UPD:
   case ARM::t2STMDB_UPD: {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D147212.509595.patch
Type: text/x-patch
Size: 2820 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230330/8dc02e67/attachment.bin>


More information about the llvm-commits mailing list