blob: cd50cce707d28c93f67213071e66a848de386f7a [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- X86TargetFrameLowering.h - Define frame lowering for X86 -*- C++ -*-==//
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov2f931282011-01-10 12:39:04 +000010// This class implements X86-specific bits of TargetFrameLowering class.
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000011//
12//===----------------------------------------------------------------------===//
13
Anton Korobeynikov2f931282011-01-10 12:39:04 +000014#ifndef X86_FRAMELOWERING_H
15#define X86_FRAMELOWERING_H
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000016
17#include "X86Subtarget.h"
Bill Wendlingb6adf462011-07-07 00:54:13 +000018#include "llvm/MC/MCDwarf.h"
Anton Korobeynikov2f931282011-01-10 12:39:04 +000019#include "llvm/Target/TargetFrameLowering.h"
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000020
21namespace llvm {
Bill Wendlingdf9bf402013-04-19 00:05:59 +000022
Bill Wendlingdf9bf402013-04-19 00:05:59 +000023class MCSymbol;
24class X86TargetMachine;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000025
Anton Korobeynikov2f931282011-01-10 12:39:04 +000026class X86FrameLowering : public TargetFrameLowering {
Anton Korobeynikov14ee3442010-11-18 23:25:52 +000027 const X86TargetMachine &TM;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000028 const X86Subtarget &STI;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000029public:
Anton Korobeynikov2f931282011-01-10 12:39:04 +000030 explicit X86FrameLowering(const X86TargetMachine &tm, const X86Subtarget &sti)
31 : TargetFrameLowering(StackGrowsDown,
32 sti.getStackAlignment(),
NAKAMURA Takumi1850c802011-02-05 15:11:32 +000033 (sti.is64Bit() ? -8 : -4)),
Anton Korobeynikov14ee3442010-11-18 23:25:52 +000034 TM(tm), STI(sti) {
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000035 }
36
Rafael Espindolab1f25f12014-03-07 06:08:31 +000037 void emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
38 MachineBasicBlock::iterator MBBI, DebugLoc DL,
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000039 unsigned FramePtr) const;
40
41 /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
42 /// the function.
43 void emitPrologue(MachineFunction &MF) const;
44 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
Anton Korobeynikov0eecf5d2010-11-18 21:19:35 +000045
Rafael Espindolac2174212011-08-30 19:39:58 +000046 void adjustForSegmentedStacks(MachineFunction &MF) const;
47
Benjamin Kramer53bc37c2013-02-18 20:55:12 +000048 void adjustForHiPEPrologue(MachineFunction &MF) const;
49
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +000050 void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
51 RegScavenger *RS = NULL) const;
52
Anton Korobeynikovd08fbd12010-11-27 23:05:03 +000053 bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
54 MachineBasicBlock::iterator MI,
55 const std::vector<CalleeSavedInfo> &CSI,
56 const TargetRegisterInfo *TRI) const;
57
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +000058 bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
59 MachineBasicBlock::iterator MI,
60 const std::vector<CalleeSavedInfo> &CSI,
61 const TargetRegisterInfo *TRI) const;
Anton Korobeynikovd08fbd12010-11-27 23:05:03 +000062
Anton Korobeynikov0eecf5d2010-11-18 21:19:35 +000063 bool hasFP(const MachineFunction &MF) const;
64 bool hasReservedCallFrame(const MachineFunction &MF) const;
65
Anton Korobeynikov46877782010-11-20 15:59:32 +000066 int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
Alexey Samsonovc4b3ad82012-05-01 15:16:06 +000067 int getFrameIndexReference(const MachineFunction &MF, int FI,
68 unsigned &FrameReg) const;
Eli Bendersky8da87162013-02-21 20:05:00 +000069
70 void eliminateCallFramePseudoInstr(MachineFunction &MF,
71 MachineBasicBlock &MBB,
72 MachineBasicBlock::iterator MI) const;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000073};
74
75} // End llvm namespace
76
77#endif