1148871Scperciva//===-- X86TargetFrameLowering.h - Define frame lowering for X86 -*- C++ -*-==// 2148871Scperciva// 3148871Scperciva// The LLVM Compiler Infrastructure 4148871Scperciva// 5148871Scperciva// This file is distributed under the University of Illinois Open Source 6148871Scperciva// License. See LICENSE.TXT for details. 7148871Scperciva// 8148871Scperciva//===----------------------------------------------------------------------===// 9148871Scperciva// 10148871Scperciva// This class implements X86-specific bits of TargetFrameLowering class. 11148871Scperciva// 12148871Scperciva//===----------------------------------------------------------------------===// 13148871Scperciva 14148871Scperciva#ifndef X86_FRAMELOWERING_H 15148871Scperciva#define X86_FRAMELOWERING_H 16148871Scperciva 17148871Scperciva#include "X86Subtarget.h" 18148871Scperciva#include "llvm/MC/MCDwarf.h" 19148871Scperciva#include "llvm/Target/TargetFrameLowering.h" 20148871Scperciva 21148871Scpercivanamespace llvm { 22148871Scperciva 23148871Scpercivaclass MCSymbol; 24148871Scpercivaclass X86TargetMachine; 25148871Scperciva 26148871Scpercivaclass X86FrameLowering : public TargetFrameLowering { 27148871Scperciva const X86TargetMachine &TM; 28148871Scperciva const X86Subtarget &STI; 29148871Scpercivapublic: 30148871Scperciva explicit X86FrameLowering(const X86TargetMachine &tm, const X86Subtarget &sti) 31148871Scperciva : TargetFrameLowering(StackGrowsDown, 32148871Scperciva sti.getStackAlignment(), 33148871Scperciva (sti.is64Bit() ? -8 : -4)), 34148871Scperciva TM(tm), STI(sti) { 35148871Scperciva } 36148871Scperciva 37149027Scperciva void emitCalleeSavedFrameMoves(MachineFunction &MF, MCSymbol *Label, 38148871Scperciva unsigned FramePtr) const; 39148871Scperciva 40148871Scperciva /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 41148871Scperciva /// the function. 42148871Scperciva void emitPrologue(MachineFunction &MF) const; 43148871Scperciva void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; 44148871Scperciva 45148871Scperciva void adjustForSegmentedStacks(MachineFunction &MF) const; 46148871Scperciva 47148871Scperciva void adjustForHiPEPrologue(MachineFunction &MF) const; 48148871Scperciva 49148871Scperciva void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 50148871Scperciva RegScavenger *RS = NULL) const; 51148871Scperciva 52148871Scperciva bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 53148871Scperciva MachineBasicBlock::iterator MI, 54148871Scperciva const std::vector<CalleeSavedInfo> &CSI, 55148871Scperciva const TargetRegisterInfo *TRI) const; 56148871Scperciva 57148871Scperciva bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 58148871Scperciva MachineBasicBlock::iterator MI, 59148871Scperciva const std::vector<CalleeSavedInfo> &CSI, 60148871Scperciva const TargetRegisterInfo *TRI) const; 61148871Scperciva 62148871Scperciva bool hasFP(const MachineFunction &MF) const; 63148871Scperciva bool hasReservedCallFrame(const MachineFunction &MF) const; 64148871Scperciva 65148871Scperciva int getFrameIndexOffset(const MachineFunction &MF, int FI) const; 66148871Scperciva int getFrameIndexReference(const MachineFunction &MF, int FI, 67148871Scperciva unsigned &FrameReg) const; 68148871Scperciva 69148871Scperciva void eliminateCallFramePseudoInstr(MachineFunction &MF, 70148871Scperciva MachineBasicBlock &MBB, 71148871Scperciva MachineBasicBlock::iterator MI) const; 72148871Scperciva}; 73148871Scperciva 74148871Scperciva} // End llvm namespace 75149027Scperciva 76148871Scperciva#endif 77148871Scperciva