| Jia Liu | b22310f | 2012-02-18 12:03:15 +0000 | [diff] [blame] | 1 | //===-- X86TargetFrameLowering.h - Define frame lowering for X86 -*- C++ -*-==// |
| Anton Korobeynikov | f7183ed | 2010-11-15 00:06:54 +0000 | [diff] [blame] | 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| Anton Korobeynikov | 2f93128 | 2011-01-10 12:39:04 +0000 | [diff] [blame] | 10 | // This class implements X86-specific bits of TargetFrameLowering class. |
| Anton Korobeynikov | f7183ed | 2010-11-15 00:06:54 +0000 | [diff] [blame] | 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| Benjamin Kramer | a7c40ef | 2014-08-13 16:26:38 +0000 | [diff] [blame] | 14 | #ifndef LLVM_LIB_TARGET_X86_X86FRAMELOWERING_H |
| 15 | #define LLVM_LIB_TARGET_X86_X86FRAMELOWERING_H |
| Anton Korobeynikov | f7183ed | 2010-11-15 00:06:54 +0000 | [diff] [blame] | 16 | |
| Anton Korobeynikov | 2f93128 | 2011-01-10 12:39:04 +0000 | [diff] [blame] | 17 | #include "llvm/Target/TargetFrameLowering.h" |
| Anton Korobeynikov | f7183ed | 2010-11-15 00:06:54 +0000 | [diff] [blame] | 18 | |
| 19 | namespace llvm { |
| Bill Wendling | df9bf40 | 2013-04-19 00:05:59 +0000 | [diff] [blame] | 20 | |
| Bill Wendling | df9bf40 | 2013-04-19 00:05:59 +0000 | [diff] [blame] | 21 | class MCSymbol; |
| 22 | class X86TargetMachine; |
| Anton Korobeynikov | f7183ed | 2010-11-15 00:06:54 +0000 | [diff] [blame] | 23 | |
| Anton Korobeynikov | 2f93128 | 2011-01-10 12:39:04 +0000 | [diff] [blame] | 24 | class X86FrameLowering : public TargetFrameLowering { |
| Anton Korobeynikov | f7183ed | 2010-11-15 00:06:54 +0000 | [diff] [blame] | 25 | public: |
| Eric Christopher | 66f676e | 2014-06-05 22:10:58 +0000 | [diff] [blame] | 26 | explicit X86FrameLowering(StackDirection D, unsigned StackAl, int LAO) |
| 27 | : TargetFrameLowering(StackGrowsDown, StackAl, LAO) {} |
| Anton Korobeynikov | f7183ed | 2010-11-15 00:06:54 +0000 | [diff] [blame] | 28 | |
| Rafael Espindola | b1f25f1 | 2014-03-07 06:08:31 +0000 | [diff] [blame] | 29 | void emitCalleeSavedFrameMoves(MachineBasicBlock &MBB, |
| NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 30 | MachineBasicBlock::iterator MBBI, |
| 31 | DebugLoc DL) const; |
| Anton Korobeynikov | f7183ed | 2010-11-15 00:06:54 +0000 | [diff] [blame] | 32 | |
| 33 | /// emitProlog/emitEpilog - These methods insert prolog and epilog code into |
| 34 | /// the function. |
| Craig Topper | 2d9361e | 2014-03-09 07:44:38 +0000 | [diff] [blame] | 35 | void emitPrologue(MachineFunction &MF) const override; |
| 36 | void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; |
| Anton Korobeynikov | 0eecf5d | 2010-11-18 21:19:35 +0000 | [diff] [blame] | 37 | |
| Craig Topper | 2d9361e | 2014-03-09 07:44:38 +0000 | [diff] [blame] | 38 | void adjustForSegmentedStacks(MachineFunction &MF) const override; |
| Rafael Espindola | c217421 | 2011-08-30 19:39:58 +0000 | [diff] [blame] | 39 | |
| Craig Topper | 2d9361e | 2014-03-09 07:44:38 +0000 | [diff] [blame] | 40 | void adjustForHiPEPrologue(MachineFunction &MF) const override; |
| Benjamin Kramer | 53bc37c | 2013-02-18 20:55:12 +0000 | [diff] [blame] | 41 | |
| Anton Korobeynikov | 7283b8d | 2010-11-27 23:05:25 +0000 | [diff] [blame] | 42 | void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, |
| Craig Topper | e73658d | 2014-04-28 04:05:08 +0000 | [diff] [blame] | 43 | RegScavenger *RS = nullptr) const override; |
| Anton Korobeynikov | 7283b8d | 2010-11-27 23:05:25 +0000 | [diff] [blame] | 44 | |
| NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 45 | bool |
| 46 | assignCalleeSavedSpillSlots(MachineFunction &MF, |
| 47 | const TargetRegisterInfo *TRI, |
| 48 | std::vector<CalleeSavedInfo> &CSI) const override; |
| 49 | |
| Anton Korobeynikov | d08fbd1 | 2010-11-27 23:05:03 +0000 | [diff] [blame] | 50 | bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, |
| 51 | MachineBasicBlock::iterator MI, |
| 52 | const std::vector<CalleeSavedInfo> &CSI, |
| Craig Topper | 2d9361e | 2014-03-09 07:44:38 +0000 | [diff] [blame] | 53 | const TargetRegisterInfo *TRI) const override; |
| Anton Korobeynikov | d08fbd1 | 2010-11-27 23:05:03 +0000 | [diff] [blame] | 54 | |
| Anton Korobeynikov | 7283b8d | 2010-11-27 23:05:25 +0000 | [diff] [blame] | 55 | bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, |
| Craig Topper | 2d9361e | 2014-03-09 07:44:38 +0000 | [diff] [blame] | 56 | MachineBasicBlock::iterator MI, |
| 57 | const std::vector<CalleeSavedInfo> &CSI, |
| 58 | const TargetRegisterInfo *TRI) const override; |
| Anton Korobeynikov | d08fbd1 | 2010-11-27 23:05:03 +0000 | [diff] [blame] | 59 | |
| Craig Topper | 2d9361e | 2014-03-09 07:44:38 +0000 | [diff] [blame] | 60 | bool hasFP(const MachineFunction &MF) const override; |
| 61 | bool hasReservedCallFrame(const MachineFunction &MF) const override; |
| Anton Korobeynikov | 0eecf5d | 2010-11-18 21:19:35 +0000 | [diff] [blame] | 62 | |
| Craig Topper | 2d9361e | 2014-03-09 07:44:38 +0000 | [diff] [blame] | 63 | int getFrameIndexOffset(const MachineFunction &MF, int FI) const override; |
| Alexey Samsonov | c4b3ad8 | 2012-05-01 15:16:06 +0000 | [diff] [blame] | 64 | int getFrameIndexReference(const MachineFunction &MF, int FI, |
| Craig Topper | 2d9361e | 2014-03-09 07:44:38 +0000 | [diff] [blame] | 65 | unsigned &FrameReg) const override; |
| Eli Bendersky | 8da8716 | 2013-02-21 20:05:00 +0000 | [diff] [blame] | 66 | |
| 67 | void eliminateCallFramePseudoInstr(MachineFunction &MF, |
| Craig Topper | 2d9361e | 2014-03-09 07:44:38 +0000 | [diff] [blame] | 68 | MachineBasicBlock &MBB, |
| 69 | MachineBasicBlock::iterator MI) const override; |
| Anton Korobeynikov | f7183ed | 2010-11-15 00:06:54 +0000 | [diff] [blame] | 70 | }; |
| 71 | |
| 72 | } // End llvm namespace |
| 73 | |
| 74 | #endif |