119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//=-- X86TargetFrameLowering.h - Define frame lowering for X86 ---*- C++ -*-===// 219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// The LLVM Compiler Infrastructure 419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source 619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details. 719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This class implements X86-specific bits of TargetFrameLowering class. 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#ifndef X86_FRAMELOWERING_H 1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define X86_FRAMELOWERING_H 1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "X86Subtarget.h" 1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCDwarf.h" 1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetFrameLowering.h" 2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm { 2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman class MCSymbol; 2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman class X86TargetMachine; 2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass X86FrameLowering : public TargetFrameLowering { 2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const X86TargetMachine &TM; 2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const X86Subtarget &STI; 2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic: 2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman explicit X86FrameLowering(const X86TargetMachine &tm, const X86Subtarget &sti) 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : TargetFrameLowering(StackGrowsDown, 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman sti.getStackAlignment(), 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman (sti.is64Bit() ? -8 : -4)), 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TM(tm), STI(sti) { 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void emitCalleeSavedFrameMoves(MachineFunction &MF, MCSymbol *Label, 3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned FramePtr) const; 3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// the function. 4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void emitPrologue(MachineFunction &MF) const; 4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void adjustForSegmentedStacks(MachineFunction &MF) const; 4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman RegScavenger *RS = NULL) const; 4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineBasicBlock::iterator MI, 5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const std::vector<CalleeSavedInfo> &CSI, 5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const TargetRegisterInfo *TRI) const; 5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineBasicBlock::iterator MI, 5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const std::vector<CalleeSavedInfo> &CSI, 5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const TargetRegisterInfo *TRI) const; 5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool hasFP(const MachineFunction &MF) const; 6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool hasReservedCallFrame(const MachineFunction &MF) const; 6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman int getFrameIndexOffset(const MachineFunction &MF, int FI) const; 6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman uint32_t getCompactUnwindEncoding(MachineFunction &MF) const; 6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}; 6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // End llvm namespace 6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#endif 69