X86FrameLowering.h revision 6a6b8c3e96b9e1ca7092eafd0cfb219cbbfbdfc4
116c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov//=-- 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
4494c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
4594c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov                                            RegScavenger *RS = NULL) const;
4694c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov
47cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
48cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 MachineBasicBlock::iterator MI,
49cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 const std::vector<CalleeSavedInfo> &CSI,
50cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 const TargetRegisterInfo *TRI) const;
51cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov
5294c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
5394c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov                                   MachineBasicBlock::iterator MI,
5494c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov                                   const std::vector<CalleeSavedInfo> &CSI,
5594c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov                                   const TargetRegisterInfo *TRI) const;
56cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov
57d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  bool hasFP(const MachineFunction &MF) const;
58d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  bool hasReservedCallFrame(const MachineFunction &MF) const;
59d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov
60d9e3385ced2dc887e2fe8e1c071bd2611e4d3edeAnton Korobeynikov  void getInitialFrameState(std::vector<MachineMove> &Moves) const;
6182f58740c76b42af8370247b23677a0318f6dde8Anton Korobeynikov  int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
626a6b8c3e96b9e1ca7092eafd0cfb219cbbfbdfc4Bill Wendling
636a6b8c3e96b9e1ca7092eafd0cfb219cbbfbdfc4Bill Wendling  uint32_t getCompactUnwindEncoding(const std::vector<MCCFIInstruction> &Instrs,
646a6b8c3e96b9e1ca7092eafd0cfb219cbbfbdfc4Bill Wendling                                    int DataAlignmentFactor, bool IsEH) const;
6533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov};
6633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
6733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov} // End llvm namespace
6833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
6933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#endif
70