131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- X86TargetFrameLowering.h - Define frame lowering for X86 -*- C++ -*-==//
233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//                     The LLVM Compiler Infrastructure
433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// This file is distributed under the University of Illinois Open Source
633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// License. See LICENSE.TXT for details.
733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//===----------------------------------------------------------------------===//
933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
1016c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov// This class implements X86-specific bits of TargetFrameLowering class.
1133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
1233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//===----------------------------------------------------------------------===//
1333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
1416c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#ifndef X86_FRAMELOWERING_H
1516c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#define X86_FRAMELOWERING_H
1633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
1733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "X86Subtarget.h"
186a6b8c3e96b9e1ca7092eafd0cfb219cbbfbdfc4Bill Wendling#include "llvm/MC/MCDwarf.h"
1916c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
2033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovnamespace llvm {
2233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  class MCSymbol;
23d9e3385ced2dc887e2fe8e1c071bd2611e4d3edeAnton Korobeynikov  class X86TargetMachine;
2433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2516c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovclass X86FrameLowering : public TargetFrameLowering {
26d9e3385ced2dc887e2fe8e1c071bd2611e4d3edeAnton Korobeynikov  const X86TargetMachine &TM;
2733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  const X86Subtarget &STI;
2833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovpublic:
2916c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  explicit X86FrameLowering(const X86TargetMachine &tm, const X86Subtarget &sti)
3016c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov    : TargetFrameLowering(StackGrowsDown,
3116c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov                          sti.getStackAlignment(),
323f4be4fb86172e6b87a457b338483efc0c1efd05NAKAMURA Takumi                          (sti.is64Bit() ? -8 : -4)),
33d9e3385ced2dc887e2fe8e1c071bd2611e4d3edeAnton Korobeynikov      TM(tm), STI(sti) {
3433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  }
3533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
3633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  void emitCalleeSavedFrameMoves(MachineFunction &MF, MCSymbol *Label,
3733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov                                 unsigned FramePtr) const;
3833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
3933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
4033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// the function.
4133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  void emitPrologue(MachineFunction &MF) const;
4233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
43d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov
4476927d758657b3a511c73467ec5a7288795c1513Rafael Espindola  void adjustForSegmentedStacks(MachineFunction &MF) const;
4576927d758657b3a511c73467ec5a7288795c1513Rafael Espindola
4694c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
4794c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov                                            RegScavenger *RS = NULL) const;
4894c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov
49cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
50cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 MachineBasicBlock::iterator MI,
51cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 const std::vector<CalleeSavedInfo> &CSI,
52cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 const TargetRegisterInfo *TRI) const;
53cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov
5494c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
5594c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov                                   MachineBasicBlock::iterator MI,
5694c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov                                   const std::vector<CalleeSavedInfo> &CSI,
5794c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov                                   const TargetRegisterInfo *TRI) const;
58cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov
59d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  bool hasFP(const MachineFunction &MF) const;
60d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  bool hasReservedCallFrame(const MachineFunction &MF) const;
61d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov
6282f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
6309b02c8dddf822e84c30cc08e7759d6ceebb2334Bill Wendling  uint32_t getCompactUnwindEncoding(MachineFunction &MF) const;
6433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov};
6533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
6633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov} // End llvm namespace
6733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
6833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#endif
69