X86: Explain why we cannot use a 'mov' in a Win64 epilogue
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 23 Feb 2015 21:50:25 +0000 (21:50 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 23 Feb 2015 21:50:25 +0000 (21:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230268 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86FrameLowering.cpp

index c3f8fddd844a5ba1f90caa8ad0ba986dd45dde2a..5657def8ce9449bfa69dfca1e282f754c0de9d48 100644 (file)
@@ -1048,6 +1048,12 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,
     if (RegInfo->needsStackRealignment(MF))
       MBBI = FirstCSPop;
     if (IsWinEH) {
+      // There are only two legal forms of epilogue:
+      // - add SEHAllocationSize, %rsp
+      // - lea SEHAllocationSize(%FramePtr), %rsp
+      //
+      // We are *not* permitted to use 'mov %FramePtr, %rsp' because the Win64
+      // unwinder will not recognize 'mov' as an epilogue instruction.
       unsigned SEHFrameOffset = calculateSetFPREG(SEHStackAllocAmt);
       addRegOffset(BuildMI(MBB, MBBI, DL, TII.get(X86::LEA64r), StackPtr),
                    FramePtr, false, SEHStackAllocAmt - SEHFrameOffset);