diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/X86/X86FrameLowering.cpp | 17 |
1 files changed, 10 insertions, 7 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; |