diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/X86FrameLowering.cpp | 17 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/win-catchpad-csrs.ll | 3 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/win-catchpad.ll | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/win32-seh-cleanupendpad.ll | 8 |
4 files changed, 24 insertions, 8 deletions
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index 032e003fe47..05ab69cb870 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -702,6 +702,11 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF, // Set up the FramePtr and BasePtr physical registers using the address // passed as EBP or RDX by the MSVC EH runtime. if (STI.is32Bit()) { + // PUSH32r %ebp + BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH32r)) + .addReg(MachineFramePtr, RegState::Kill) + .setMIFlag(MachineInstr::FrameSetup); + // Reset EBP / ESI to something good. MBBI = restoreWin32EHFrameAndBasePtr(MBB, MBBI, DL); } else { // FIXME: Add SEH directives. @@ -715,7 +720,7 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF, .addReg(RDX) .setMIFlag(MachineInstr::FrameSetup); // PUSH64r %rbp - BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::PUSH64r : X86::PUSH32r)) + BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH64r)) .addReg(MachineFramePtr, RegState::Kill) .setMIFlag(MachineInstr::FrameSetup); // MOV64rr %rdx, %rbp @@ -1066,13 +1071,11 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF, if (isFuncletReturnInstr(MBBI)) { NumBytes = MFI->getMaxCallFrameSize(); + assert(hasFP(MF) && "win64 EH funclets without FP not yet implemented"); - if (Is64Bit) { - assert(hasFP(MF) && "win64 EH funclets without FP not yet implemented"); - // POP64r %rbp - BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::POP64r : X86::POP32r), - MachineFramePtr); - } + // Pop EBP. + BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::POP64r : X86::POP32r), + MachineFramePtr); } else if (hasFP(MF)) { // Calculate required stack adjustment. uint64_t FrameSize = StackSize - SlotSize; diff --git a/llvm/test/CodeGen/X86/win-catchpad-csrs.ll b/llvm/test/CodeGen/X86/win-catchpad-csrs.ll index 6e72268432a..c4cc945fe7d 100644 --- a/llvm/test/CodeGen/X86/win-catchpad-csrs.ll +++ b/llvm/test/CodeGen/X86/win-catchpad-csrs.ll @@ -73,6 +73,7 @@ catchendblock: ; preds = %catch, ; X86: retl ; X86: [[catch1bb:LBB0_[0-9]+]]: # %catch{{$}} +; X86: pushl %ebp ; X86-NOT: pushl ; X86: addl $12, %ebp ; X86: subl $16, %esp @@ -81,7 +82,7 @@ catchendblock: ; preds = %catch, ; X86: calll _f ; X86: movl $[[contbb]], %eax ; X86-NEXT: addl $16, %esp -; X86-NOT: popl +; X86-NEXT: popl %ebp ; X86-NEXT: retl ; X86: L__ehtable$try_catch_catch: diff --git a/llvm/test/CodeGen/X86/win-catchpad.ll b/llvm/test/CodeGen/X86/win-catchpad.ll index c41087a4deb..a6600fb1f8a 100644 --- a/llvm/test/CodeGen/X86/win-catchpad.ll +++ b/llvm/test/CodeGen/X86/win-catchpad.ll @@ -76,6 +76,7 @@ catchendblock: ; preds = %catch, %catch.2, %c ; X86: retl ; X86: [[catch1bb:LBB0_[0-9]+]]: # %catch{{$}} +; X86: pushl %ebp ; X86: addl $12, %ebp ; X86: subl $8, %esp ; X86: movl $1, -{{[0-9]+}}(%ebp) @@ -85,9 +86,11 @@ catchendblock: ; preds = %catch, %catch.2, %c ; X86: calll _f ; X86: movl $[[contbb]], %eax ; X86-NEXT: addl $8, %esp +; X86-NEXT: popl %ebp ; X86-NEXT: retl ; X86: [[catch2bb:LBB0_[0-9]+]]: # %catch.2{{$}} +; X86: pushl %ebp ; X86: addl $12, %ebp ; X86: subl $8, %esp ; X86: movl $1, -{{[0-9]+}}(%ebp) @@ -97,6 +100,7 @@ catchendblock: ; preds = %catch, %catch.2, %c ; X86: calll _f ; X86: movl $[[contbb]], %eax ; X86-NEXT: addl $8, %esp +; X86-NEXT: popl %ebp ; X86-NEXT: retl ; X86: L__ehtable$try_catch_catch: diff --git a/llvm/test/CodeGen/X86/win32-seh-cleanupendpad.ll b/llvm/test/CodeGen/X86/win32-seh-cleanupendpad.ll index 7f1fc322d18..35d9bfeb66e 100644 --- a/llvm/test/CodeGen/X86/win32-seh-cleanupendpad.ll +++ b/llvm/test/CodeGen/X86/win32-seh-cleanupendpad.ll @@ -63,14 +63,22 @@ attributes #3 = { noinline } ; CHECK: retl ; CHECK: LBB0_[[inner:[0-9]+]]: # %ehcleanup +; CHECK: pushl %ebp +; CHECK: addl $12, %ebp ; CHECK: movl $0, -[[state]](%ebp) ; CHECK: movl $2, (%esp) ; CHECK: calll _f +; CHECK: popl %ebp +; CHECK: retl ; CHECK: LBB0_[[outer:[0-9]+]]: # %ehcleanup.3 +; CHECK: pushl %ebp +; CHECK: addl $12, %ebp ; CHECK: movl $-1, -[[state]](%ebp) ; CHECK: movl $3, (%esp) ; CHECK: calll _f +; CHECK: popl %ebp +; CHECK: retl ; CHECK: L__ehtable$nested_finally: ; CHECK: .long -1 |

