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