1 //=-- X86TargetFrameLowering.h - Define frame lowering for X86 ---*- C++ -*-===// 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 // 10 // This class implements X86-specific bits of TargetFrameLowering class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef X86_FRAMELOWERING_H 15 #define X86_FRAMELOWERING_H 16 17 #include "X86Subtarget.h" 18 #include "llvm/MC/MCDwarf.h" 19 #include "llvm/Target/TargetFrameLowering.h" 20 21 namespace llvm { 22 class MCSymbol; 23 class X86TargetMachine; 24 25 class X86FrameLowering : public TargetFrameLowering { 26 const X86TargetMachine &TM; 27 const X86Subtarget &STI; 28 public: 29 explicit X86FrameLowering(const X86TargetMachine &tm, const X86Subtarget &sti) 30 : TargetFrameLowering(StackGrowsDown, 31 sti.getStackAlignment(), 32 (sti.is64Bit() ? -8 : -4)), 33 TM(tm), STI(sti) { 34 } 35 36 void emitCalleeSavedFrameMoves(MachineFunction &MF, MCSymbol *Label, 37 unsigned FramePtr) const; 38 39 /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 40 /// the function. 41 void emitPrologue(MachineFunction &MF) const; 42 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; 43 44 void adjustForSegmentedStacks(MachineFunction &MF) const; 45 46 void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 47 RegScavenger *RS = NULL) const; 48 49 bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 50 MachineBasicBlock::iterator MI, 51 const std::vector<CalleeSavedInfo> &CSI, 52 const TargetRegisterInfo *TRI) const; 53 54 bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 55 MachineBasicBlock::iterator MI, 56 const std::vector<CalleeSavedInfo> &CSI, 57 const TargetRegisterInfo *TRI) const; 58 59 bool hasFP(const MachineFunction &MF) const; 60 bool hasReservedCallFrame(const MachineFunction &MF) const; 61 62 int getFrameIndexOffset(const MachineFunction &MF, int FI) const; 63 uint32_t getCompactUnwindEncoding(MachineFunction &MF) const; 64 }; 65 66 } // End llvm namespace 67 68 #endif 69