Skip to content

Commit 79e743f

Browse files
mstorsjotstellar
authored andcommitted
[ARM] Handle generating SEH unwind info for t2STR_PRE/t2LDR_POST
This fixes compiling some uncommon cases. Differential Revision: https://reviews.llvm.org/D147212 (cherry picked from commit c538353)
1 parent c163d43 commit 79e743f

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

llvm/lib/Target/ARM/ARMFrameLowering.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,34 @@ static MachineBasicBlock::iterator insertSEH(MachineBasicBlock::iterator MBBI,
357357
.setMIFlags(Flags);
358358
break;
359359

360+
case ARM::t2STR_PRE:
361+
if (MBBI->getOperand(0).getReg() == ARM::SP &&
362+
MBBI->getOperand(2).getReg() == ARM::SP &&
363+
MBBI->getOperand(3).getImm() == -4) {
364+
unsigned Reg = RegInfo->getSEHRegNum(MBBI->getOperand(1).getReg());
365+
MIB = BuildMI(MF, DL, TII.get(ARM::SEH_SaveRegs))
366+
.addImm(1 << Reg)
367+
.addImm(/*Wide=*/1)
368+
.setMIFlags(Flags);
369+
} else {
370+
report_fatal_error("No matching SEH Opcode for t2STR_PRE");
371+
}
372+
break;
373+
374+
case ARM::t2LDR_POST:
375+
if (MBBI->getOperand(1).getReg() == ARM::SP &&
376+
MBBI->getOperand(2).getReg() == ARM::SP &&
377+
MBBI->getOperand(3).getImm() == 4) {
378+
unsigned Reg = RegInfo->getSEHRegNum(MBBI->getOperand(0).getReg());
379+
MIB = BuildMI(MF, DL, TII.get(ARM::SEH_SaveRegs))
380+
.addImm(1 << Reg)
381+
.addImm(/*Wide=*/1)
382+
.setMIFlags(Flags);
383+
} else {
384+
report_fatal_error("No matching SEH Opcode for t2LDR_POST");
385+
}
386+
break;
387+
360388
case ARM::t2LDMIA_RET:
361389
case ARM::t2LDMIA_UPD:
362390
case ARM::t2STMDB_UPD: {

llvm/test/CodeGen/ARM/Windows/wineh-opcodes.ll

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,3 +311,31 @@ entry:
311311
}
312312

313313
declare arm_aapcs_vfpcc void @useptr(ptr noundef)
314+
315+
; CHECK-LABEL: func_fp:
316+
; CHECK-NEXT: .seh_proc func_fp
317+
; CHECK-NEXT: @ %bb.0: @ %entry
318+
; CHECK-NEXT: str r11, [sp, #-4]!
319+
; CHECK-NEXT: .seh_save_regs_w {r11}
320+
; CHECK-NEXT: mov r11, sp
321+
; CHECK-NEXT: .seh_save_sp r11
322+
; CHECK-NEXT: .seh_endprologue
323+
324+
; CHECK-NEXT: mov r0, r11
325+
326+
; CHECK-NEXT: .seh_startepilogue
327+
; CHECK-NEXT: ldr r11, [sp], #4
328+
; CHECK-NEXT: .seh_save_regs_w {r11}
329+
; CHECK-NEXT: bx lr
330+
; CHECK-NEXT: .seh_nop
331+
; CHECK-NEXT: .seh_endepilogue
332+
; CHECK-NEXT: .seh_endproc
333+
334+
define arm_aapcs_vfpcc i32 @func_fp() {
335+
entry:
336+
%0 = tail call ptr @llvm.frameaddress.p0(i32 0)
337+
%1 = ptrtoint ptr %0 to i32
338+
ret i32 %1
339+
}
340+
341+
declare ptr @llvm.frameaddress.p0(i32 immarg)

0 commit comments

Comments
 (0)