OLD | NEW |
1 //===-- X86FrameLowering.cpp - X86 Frame Information ----------------------===// | 1 //===-- X86FrameLowering.cpp - X86 Frame Information ----------------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file contains the X86 implementation of TargetFrameLowering class. | 10 // This file contains the X86 implementation of TargetFrameLowering class. |
11 // | 11 // |
12 //===----------------------------------------------------------------------===// | 12 //===----------------------------------------------------------------------===// |
13 | 13 |
14 #include "X86FrameLowering.h" | 14 #include "X86FrameLowering.h" |
15 #include "X86InstrBuilder.h" | 15 #include "X86InstrBuilder.h" |
16 #include "X86InstrInfo.h" | 16 #include "X86InstrInfo.h" |
17 #include "X86MachineFunctionInfo.h" | 17 #include "X86MachineFunctionInfo.h" |
| 18 #include "X86NaClDecls.h" // @LOCALMOD |
18 #include "X86Subtarget.h" | 19 #include "X86Subtarget.h" |
19 #include "X86TargetMachine.h" | 20 #include "X86TargetMachine.h" |
20 #include "llvm/ADT/SmallSet.h" | 21 #include "llvm/ADT/SmallSet.h" |
21 #include "llvm/CodeGen/MachineFrameInfo.h" | 22 #include "llvm/CodeGen/MachineFrameInfo.h" |
22 #include "llvm/CodeGen/MachineFunction.h" | 23 #include "llvm/CodeGen/MachineFunction.h" |
23 #include "llvm/CodeGen/MachineInstrBuilder.h" | 24 #include "llvm/CodeGen/MachineInstrBuilder.h" |
24 #include "llvm/CodeGen/MachineModuleInfo.h" | 25 #include "llvm/CodeGen/MachineModuleInfo.h" |
25 #include "llvm/CodeGen/MachineRegisterInfo.h" | 26 #include "llvm/CodeGen/MachineRegisterInfo.h" |
26 #include "llvm/IR/DataLayout.h" | 27 #include "llvm/IR/DataLayout.h" |
27 #include "llvm/IR/Function.h" | 28 #include "llvm/IR/Function.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 default: return 0; | 124 default: return 0; |
124 case X86::RETL: | 125 case X86::RETL: |
125 case X86::RETQ: | 126 case X86::RETQ: |
126 case X86::RETIL: | 127 case X86::RETIL: |
127 case X86::RETIQ: | 128 case X86::RETIQ: |
128 case X86::TCRETURNdi: | 129 case X86::TCRETURNdi: |
129 case X86::TCRETURNri: | 130 case X86::TCRETURNri: |
130 case X86::TCRETURNmi: | 131 case X86::TCRETURNmi: |
131 case X86::TCRETURNdi64: | 132 case X86::TCRETURNdi64: |
132 case X86::TCRETURNri64: | 133 case X86::TCRETURNri64: |
| 134 case X86::NACL_CG_TCRETURNdi64: // @LOCALMOD |
133 case X86::TCRETURNmi64: | 135 case X86::TCRETURNmi64: |
134 case X86::EH_RETURN: | 136 case X86::EH_RETURN: |
135 case X86::EH_RETURN64: { | 137 case X86::EH_RETURN64: { |
136 SmallSet<uint16_t, 8> Uses; | 138 SmallSet<uint16_t, 8> Uses; |
137 for (unsigned i = 0, e = MBBI->getNumOperands(); i != e; ++i) { | 139 for (unsigned i = 0, e = MBBI->getNumOperands(); i != e; ++i) { |
138 MachineOperand &MO = MBBI->getOperand(i); | 140 MachineOperand &MO = MBBI->getOperand(i); |
139 if (!MO.isReg() || MO.isDef()) | 141 if (!MO.isReg() || MO.isDef()) |
140 continue; | 142 continue; |
141 unsigned Reg = MO.getReg(); | 143 unsigned Reg = MO.getReg(); |
142 if (!Reg) | 144 if (!Reg) |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 } else { | 580 } else { |
579 NumBytes = FrameSize - X86FI->getCalleeSavedFrameSize(); | 581 NumBytes = FrameSize - X86FI->getCalleeSavedFrameSize(); |
580 } | 582 } |
581 | 583 |
582 // Get the offset of the stack slot for the EBP register, which is | 584 // Get the offset of the stack slot for the EBP register, which is |
583 // guaranteed to be the last slot by processFunctionBeforeFrameFinalized. | 585 // guaranteed to be the last slot by processFunctionBeforeFrameFinalized. |
584 // Update the frame offset adjustment. | 586 // Update the frame offset adjustment. |
585 MFI->setOffsetAdjustment(-NumBytes); | 587 MFI->setOffsetAdjustment(-NumBytes); |
586 | 588 |
587 // Save EBP/RBP into the appropriate stack slot. | 589 // Save EBP/RBP into the appropriate stack slot. |
| 590 // @LOCALMOD-BEGIN |
| 591 unsigned RegToPush = MachineFramePtr; |
| 592 const bool HideSandboxBase = (FlagHideSandboxBase && |
| 593 STI.isTargetNaCl64() && |
| 594 !FlagUseZeroBasedSandbox); |
| 595 if (HideSandboxBase) { |
| 596 // Hide the sandbox base address by masking off the upper 32 |
| 597 // bits of the pushed/saved RBP on the stack, using: |
| 598 // mov %ebp, %r10d |
| 599 // push %r10 |
| 600 // instead of: |
| 601 // push %rbp |
| 602 // Additionally, we can use rax instead of r10 when it is not a |
| 603 // varargs function and therefore rax is available, saving one |
| 604 // byte of REX prefix per instruction. |
| 605 // Note that the epilog already adds R15 when restoring RBP. |
| 606 |
| 607 // mov %ebp, %r10d |
| 608 if (Fn->isVarArg()) { |
| 609 // Note: This use of r10 in the prolog can't be used with the |
| 610 // gcc "nest" attribute, due to its use of r10. Example: |
| 611 // target triple = "x86_64-pc-linux-gnu" |
| 612 // define i64 @func(i64 nest %arg) { |
| 613 // ret i64 %arg |
| 614 // } |
| 615 // |
| 616 // $ clang -m64 llvm_nest_attr.ll -S -o - |
| 617 // ... |
| 618 // func: |
| 619 // movq %r10, %rax |
| 620 // ret |
| 621 RegToPush = X86::R10; |
| 622 } else { |
| 623 RegToPush = X86::RAX; |
| 624 } |
| 625 BuildMI(MBB, MBBI, DL, TII.get(X86::MOV32rr), |
| 626 getX86SubSuperRegister(RegToPush, MVT::i32, false)) |
| 627 .addReg(getX86SubSuperRegister(FramePtr, MVT::i32, false)) |
| 628 .setMIFlag(MachineInstr::FrameSetup); |
| 629 } |
| 630 // @LOCALMOD-END |
588 BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::PUSH64r : X86::PUSH32r)) | 631 BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::PUSH64r : X86::PUSH32r)) |
589 .addReg(MachineFramePtr, RegState::Kill) | 632 .addReg(RegToPush, RegState::Kill) // @LOCALMOD |
590 .setMIFlag(MachineInstr::FrameSetup); | 633 .setMIFlag(MachineInstr::FrameSetup); |
591 | 634 |
592 if (NeedsDwarfCFI) { | 635 if (NeedsDwarfCFI) { |
593 // Mark the place where EBP/RBP was saved. | 636 // Mark the place where EBP/RBP was saved. |
594 // Define the current CFA rule to use the provided offset. | 637 // Define the current CFA rule to use the provided offset. |
595 assert(StackSize); | 638 assert(StackSize); |
596 unsigned CFIIndex = MMI.addFrameInst( | 639 unsigned CFIIndex = MMI.addFrameInst( |
597 MCCFIInstruction::createDefCfaOffset(nullptr, 2 * stackGrowth)); | 640 MCCFIInstruction::createDefCfaOffset(nullptr, 2 * stackGrowth)); |
598 BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION)) | 641 BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION)) |
599 .addCFIIndex(CFIIndex); | 642 .addCFIIndex(CFIIndex); |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
893 case X86::RETQ: | 936 case X86::RETQ: |
894 case X86::RETL: | 937 case X86::RETL: |
895 case X86::RETIL: | 938 case X86::RETIL: |
896 case X86::RETIQ: | 939 case X86::RETIQ: |
897 case X86::TCRETURNdi: | 940 case X86::TCRETURNdi: |
898 case X86::TCRETURNri: | 941 case X86::TCRETURNri: |
899 case X86::TCRETURNmi: | 942 case X86::TCRETURNmi: |
900 case X86::TCRETURNdi64: | 943 case X86::TCRETURNdi64: |
901 case X86::TCRETURNri64: | 944 case X86::TCRETURNri64: |
902 case X86::TCRETURNmi64: | 945 case X86::TCRETURNmi64: |
| 946 case X86::NACL_CG_TCRETURNdi64: // @LOCALMOD |
903 case X86::EH_RETURN: | 947 case X86::EH_RETURN: |
904 case X86::EH_RETURN64: | 948 case X86::EH_RETURN64: |
905 break; // These are ok | 949 break; // These are ok |
906 } | 950 } |
907 | 951 |
908 // Get the number of bytes to allocate from the FrameInfo. | 952 // Get the number of bytes to allocate from the FrameInfo. |
909 uint64_t StackSize = MFI->getStackSize(); | 953 uint64_t StackSize = MFI->getStackSize(); |
910 uint64_t MaxAlign = MFI->getMaxAlignment(); | 954 uint64_t MaxAlign = MFI->getMaxAlignment(); |
911 unsigned CSSize = X86FI->getCalleeSavedFrameSize(); | 955 unsigned CSSize = X86FI->getCalleeSavedFrameSize(); |
912 uint64_t NumBytes = 0; | 956 uint64_t NumBytes = 0; |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
998 if (RetOpcode == X86::EH_RETURN || RetOpcode == X86::EH_RETURN64) { | 1042 if (RetOpcode == X86::EH_RETURN || RetOpcode == X86::EH_RETURN64) { |
999 MBBI = MBB.getLastNonDebugInstr(); | 1043 MBBI = MBB.getLastNonDebugInstr(); |
1000 MachineOperand &DestAddr = MBBI->getOperand(0); | 1044 MachineOperand &DestAddr = MBBI->getOperand(0); |
1001 assert(DestAddr.isReg() && "Offset should be in register!"); | 1045 assert(DestAddr.isReg() && "Offset should be in register!"); |
1002 BuildMI(MBB, MBBI, DL, | 1046 BuildMI(MBB, MBBI, DL, |
1003 TII.get(Uses64BitFramePtr ? X86::MOV64rr : X86::MOV32rr), | 1047 TII.get(Uses64BitFramePtr ? X86::MOV64rr : X86::MOV32rr), |
1004 StackPtr).addReg(DestAddr.getReg()); | 1048 StackPtr).addReg(DestAddr.getReg()); |
1005 } else if (RetOpcode == X86::TCRETURNri || RetOpcode == X86::TCRETURNdi || | 1049 } else if (RetOpcode == X86::TCRETURNri || RetOpcode == X86::TCRETURNdi || |
1006 RetOpcode == X86::TCRETURNmi || | 1050 RetOpcode == X86::TCRETURNmi || |
1007 RetOpcode == X86::TCRETURNri64 || RetOpcode == X86::TCRETURNdi64 || | 1051 RetOpcode == X86::TCRETURNri64 || RetOpcode == X86::TCRETURNdi64 || |
| 1052 RetOpcode == X86::NACL_CG_TCRETURNdi64 || // @LOCALMOD |
1008 RetOpcode == X86::TCRETURNmi64) { | 1053 RetOpcode == X86::TCRETURNmi64) { |
1009 bool isMem = RetOpcode == X86::TCRETURNmi || RetOpcode == X86::TCRETURNmi64; | 1054 bool isMem = RetOpcode == X86::TCRETURNmi || RetOpcode == X86::TCRETURNmi64; |
1010 // Tail call return: adjust the stack pointer and jump to callee. | 1055 // Tail call return: adjust the stack pointer and jump to callee. |
1011 MBBI = MBB.getLastNonDebugInstr(); | 1056 MBBI = MBB.getLastNonDebugInstr(); |
1012 MachineOperand &JumpTarget = MBBI->getOperand(0); | 1057 MachineOperand &JumpTarget = MBBI->getOperand(0); |
1013 MachineOperand &StackAdjust = MBBI->getOperand(isMem ? 5 : 1); | 1058 MachineOperand &StackAdjust = MBBI->getOperand(isMem ? 5 : 1); |
1014 assert(StackAdjust.isImm() && "Expecting immediate value."); | 1059 assert(StackAdjust.isImm() && "Expecting immediate value."); |
1015 | 1060 |
1016 // Adjust stack pointer. | 1061 // Adjust stack pointer. |
1017 int StackAdj = StackAdjust.getImm(); | 1062 int StackAdj = StackAdjust.getImm(); |
1018 int MaxTCDelta = X86FI->getTCReturnAddrDelta(); | 1063 int MaxTCDelta = X86FI->getTCReturnAddrDelta(); |
1019 int Offset = 0; | 1064 int Offset = 0; |
1020 assert(MaxTCDelta <= 0 && "MaxTCDelta should never be positive"); | 1065 assert(MaxTCDelta <= 0 && "MaxTCDelta should never be positive"); |
1021 | 1066 |
1022 // Incoporate the retaddr area. | 1067 // Incoporate the retaddr area. |
1023 Offset = StackAdj-MaxTCDelta; | 1068 Offset = StackAdj-MaxTCDelta; |
1024 assert(Offset >= 0 && "Offset should never be negative"); | 1069 assert(Offset >= 0 && "Offset should never be negative"); |
1025 | 1070 |
1026 if (Offset) { | 1071 if (Offset) { |
1027 // Check for possible merge with preceding ADD instruction. | 1072 // Check for possible merge with preceding ADD instruction. |
1028 Offset += mergeSPUpdates(MBB, MBBI, StackPtr, true); | 1073 Offset += mergeSPUpdates(MBB, MBBI, StackPtr, true); |
1029 emitSPUpdate(MBB, MBBI, StackPtr, Offset, Is64Bit, Uses64BitFramePtr, | 1074 emitSPUpdate(MBB, MBBI, StackPtr, Offset, Is64Bit, Uses64BitFramePtr, |
1030 UseLEA, TII, *RegInfo); | 1075 UseLEA, TII, *RegInfo); |
1031 } | 1076 } |
1032 | 1077 |
1033 // Jump to label or value in register. | 1078 // Jump to label or value in register. |
1034 if (RetOpcode == X86::TCRETURNdi || RetOpcode == X86::TCRETURNdi64) { | 1079 if (RetOpcode == X86::TCRETURNdi || RetOpcode == X86::TCRETURNdi64 || |
| 1080 RetOpcode == X86::NACL_CG_TCRETURNdi64) { // @LOCALMOD |
| 1081 // @LOCALMOD-BEGIN |
| 1082 unsigned TailJmpOpc; |
| 1083 switch (RetOpcode) { |
| 1084 case X86::TCRETURNdi : TailJmpOpc = X86::TAILJMPd; break; |
| 1085 case X86::TCRETURNdi64: TailJmpOpc = X86::TAILJMPd64; break; |
| 1086 case X86::NACL_CG_TCRETURNdi64: |
| 1087 TailJmpOpc = X86::NACL_CG_TAILJMPd64; |
| 1088 break; |
| 1089 default: llvm_unreachable("Unexpected return opcode"); |
| 1090 } |
| 1091 // @LOCALMOD-END |
1035 MachineInstrBuilder MIB = | 1092 MachineInstrBuilder MIB = |
1036 BuildMI(MBB, MBBI, DL, TII.get((RetOpcode == X86::TCRETURNdi) | 1093 BuildMI(MBB, MBBI, DL, TII.get(TailJmpOpc)); // @LOCALMOD |
1037 ? X86::TAILJMPd : X86::TAILJMPd64)); | 1094 |
1038 if (JumpTarget.isGlobal()) | 1095 if (JumpTarget.isGlobal()) |
1039 MIB.addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(), | 1096 MIB.addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(), |
1040 JumpTarget.getTargetFlags()); | 1097 JumpTarget.getTargetFlags()); |
1041 else { | 1098 else { |
1042 assert(JumpTarget.isSymbol()); | 1099 assert(JumpTarget.isSymbol()); |
1043 MIB.addExternalSymbol(JumpTarget.getSymbolName(), | 1100 MIB.addExternalSymbol(JumpTarget.getSymbolName(), |
1044 JumpTarget.getTargetFlags()); | 1101 JumpTarget.getTargetFlags()); |
1045 } | 1102 } |
1046 } else if (RetOpcode == X86::TCRETURNmi || RetOpcode == X86::TCRETURNmi64) { | 1103 } else if (RetOpcode == X86::TCRETURNmi || RetOpcode == X86::TCRETURNmi64) { |
1047 MachineInstrBuilder MIB = | 1104 MachineInstrBuilder MIB = |
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1793 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, | 1850 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, |
1794 MachineBasicBlock::iterator I) const { | 1851 MachineBasicBlock::iterator I) const { |
1795 const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo(); | 1852 const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo(); |
1796 const X86RegisterInfo &RegInfo = *static_cast<const X86RegisterInfo *>( | 1853 const X86RegisterInfo &RegInfo = *static_cast<const X86RegisterInfo *>( |
1797 MF.getSubtarget().getRegisterInfo()); | 1854 MF.getSubtarget().getRegisterInfo()); |
1798 unsigned StackPtr = RegInfo.getStackRegister(); | 1855 unsigned StackPtr = RegInfo.getStackRegister(); |
1799 bool reseveCallFrame = hasReservedCallFrame(MF); | 1856 bool reseveCallFrame = hasReservedCallFrame(MF); |
1800 int Opcode = I->getOpcode(); | 1857 int Opcode = I->getOpcode(); |
1801 bool isDestroy = Opcode == TII.getCallFrameDestroyOpcode(); | 1858 bool isDestroy = Opcode == TII.getCallFrameDestroyOpcode(); |
1802 const X86Subtarget &STI = MF.getTarget().getSubtarget<X86Subtarget>(); | 1859 const X86Subtarget &STI = MF.getTarget().getSubtarget<X86Subtarget>(); |
1803 bool IsLP64 = STI.isTarget64BitLP64(); | 1860 // @LOCALMOD-BEGIN |
| 1861 // standard x86_64 and NaCl use 64-bit frame/stack pointers, x32 - 32-bit. |
| 1862 const bool Uses64BitStackPtr = |
| 1863 STI.isTarget64BitLP64() || STI.isTargetNaCl64(); |
| 1864 // @LOCALMOD-END |
1804 DebugLoc DL = I->getDebugLoc(); | 1865 DebugLoc DL = I->getDebugLoc(); |
1805 uint64_t Amount = !reseveCallFrame ? I->getOperand(0).getImm() : 0; | 1866 uint64_t Amount = !reseveCallFrame ? I->getOperand(0).getImm() : 0; |
1806 uint64_t CalleeAmt = isDestroy ? I->getOperand(1).getImm() : 0; | 1867 uint64_t CalleeAmt = isDestroy ? I->getOperand(1).getImm() : 0; |
1807 I = MBB.erase(I); | 1868 I = MBB.erase(I); |
1808 | 1869 |
1809 if (!reseveCallFrame) { | 1870 if (!reseveCallFrame) { |
1810 // If the stack pointer can be changed after prologue, turn the | 1871 // If the stack pointer can be changed after prologue, turn the |
1811 // adjcallstackup instruction into a 'sub ESP, <amt>' and the | 1872 // adjcallstackup instruction into a 'sub ESP, <amt>' and the |
1812 // adjcallstackdown instruction into 'add ESP, <amt>' | 1873 // adjcallstackdown instruction into 'add ESP, <amt>' |
1813 // TODO: consider using push / pop instead of sub + store / add | 1874 // TODO: consider using push / pop instead of sub + store / add |
1814 if (Amount == 0) | 1875 if (Amount == 0) |
1815 return; | 1876 return; |
1816 | 1877 |
1817 // We need to keep the stack aligned properly. To do this, we round the | 1878 // We need to keep the stack aligned properly. To do this, we round the |
1818 // amount of space needed for the outgoing arguments up to the next | 1879 // amount of space needed for the outgoing arguments up to the next |
1819 // alignment boundary. | 1880 // alignment boundary. |
1820 unsigned StackAlign = MF.getTarget() | 1881 unsigned StackAlign = MF.getTarget() |
1821 .getSubtargetImpl() | 1882 .getSubtargetImpl() |
1822 ->getFrameLowering() | 1883 ->getFrameLowering() |
1823 ->getStackAlignment(); | 1884 ->getStackAlignment(); |
1824 Amount = (Amount + StackAlign - 1) / StackAlign * StackAlign; | 1885 Amount = (Amount + StackAlign - 1) / StackAlign * StackAlign; |
1825 | 1886 |
1826 MachineInstr *New = nullptr; | 1887 MachineInstr *New = nullptr; |
1827 if (Opcode == TII.getCallFrameSetupOpcode()) { | 1888 if (Opcode == TII.getCallFrameSetupOpcode()) { |
1828 New = BuildMI(MF, DL, TII.get(getSUBriOpcode(IsLP64, Amount)), | 1889 // @LOCALMOD |
| 1890 New = BuildMI(MF, DL, TII.get(getSUBriOpcode(Uses64BitStackPtr, Amount)), |
1829 StackPtr) | 1891 StackPtr) |
1830 .addReg(StackPtr) | 1892 .addReg(StackPtr) |
1831 .addImm(Amount); | 1893 .addImm(Amount); |
1832 } else { | 1894 } else { |
1833 assert(Opcode == TII.getCallFrameDestroyOpcode()); | 1895 assert(Opcode == TII.getCallFrameDestroyOpcode()); |
1834 | 1896 |
1835 // Factor out the amount the callee already popped. | 1897 // Factor out the amount the callee already popped. |
1836 Amount -= CalleeAmt; | 1898 Amount -= CalleeAmt; |
1837 | 1899 |
1838 if (Amount) { | 1900 if (Amount) { |
1839 unsigned Opc = getADDriOpcode(IsLP64, Amount); | 1901 // @LOCALMOD |
| 1902 unsigned Opc = getADDriOpcode(Uses64BitStackPtr, Amount); |
1840 New = BuildMI(MF, DL, TII.get(Opc), StackPtr) | 1903 New = BuildMI(MF, DL, TII.get(Opc), StackPtr) |
1841 .addReg(StackPtr).addImm(Amount); | 1904 .addReg(StackPtr).addImm(Amount); |
1842 } | 1905 } |
1843 } | 1906 } |
1844 | 1907 |
1845 if (New) { | 1908 if (New) { |
1846 // The EFLAGS implicit def is dead. | 1909 // The EFLAGS implicit def is dead. |
1847 New->getOperand(3).setIsDead(); | 1910 New->getOperand(3).setIsDead(); |
1848 | 1911 |
1849 // Replace the pseudo instruction with a new instruction. | 1912 // Replace the pseudo instruction with a new instruction. |
1850 MBB.insert(I, New); | 1913 MBB.insert(I, New); |
1851 } | 1914 } |
1852 | 1915 |
1853 return; | 1916 return; |
1854 } | 1917 } |
1855 | 1918 |
1856 if (Opcode == TII.getCallFrameDestroyOpcode() && CalleeAmt) { | 1919 if (Opcode == TII.getCallFrameDestroyOpcode() && CalleeAmt) { |
1857 // If we are performing frame pointer elimination and if the callee pops | 1920 // If we are performing frame pointer elimination and if the callee pops |
1858 // something off the stack pointer, add it back. We do this until we have | 1921 // something off the stack pointer, add it back. We do this until we have |
1859 // more advanced stack pointer tracking ability. | 1922 // more advanced stack pointer tracking ability. |
1860 unsigned Opc = getSUBriOpcode(IsLP64, CalleeAmt); | 1923 // @LOCALMOD |
| 1924 unsigned Opc = getSUBriOpcode(Uses64BitStackPtr, CalleeAmt); |
1861 MachineInstr *New = BuildMI(MF, DL, TII.get(Opc), StackPtr) | 1925 MachineInstr *New = BuildMI(MF, DL, TII.get(Opc), StackPtr) |
1862 .addReg(StackPtr).addImm(CalleeAmt); | 1926 .addReg(StackPtr).addImm(CalleeAmt); |
1863 | 1927 |
1864 // The EFLAGS implicit def is dead. | 1928 // The EFLAGS implicit def is dead. |
1865 New->getOperand(3).setIsDead(); | 1929 New->getOperand(3).setIsDead(); |
1866 | 1930 |
1867 // We are not tracking the stack pointer adjustment by the callee, so make | 1931 // We are not tracking the stack pointer adjustment by the callee, so make |
1868 // sure we restore the stack pointer immediately after the call, there may | 1932 // sure we restore the stack pointer immediately after the call, there may |
1869 // be spill code inserted between the CALL and ADJCALLSTACKUP instructions. | 1933 // be spill code inserted between the CALL and ADJCALLSTACKUP instructions. |
1870 MachineBasicBlock::iterator B = MBB.begin(); | 1934 MachineBasicBlock::iterator B = MBB.begin(); |
1871 while (I != B && !std::prev(I)->isCall()) | 1935 while (I != B && !std::prev(I)->isCall()) |
1872 --I; | 1936 --I; |
1873 MBB.insert(I, New); | 1937 MBB.insert(I, New); |
1874 } | 1938 } |
1875 } | 1939 } |
1876 | |
OLD | NEW |