blob: a1c2b93562c9c78c717af72162ba4455c2a03472 [file] [log] [blame]
Anton Korobeynikov16c29b52011-01-10 12:39:04 +00001//==-- ARMTargetFrameLowering.h - Define frame lowering for ARM --*- C++ -*-==//
Rafael Espindolaec46ea32006-08-16 14:43:33 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
Rafael Espindolaec46ea32006-08-16 14:43:33 +00006// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef ARM_FRAMEINFO_H
15#define ARM_FRAMEINFO_H
16
17#include "ARM.h"
Evan Chenga8e29892007-01-19 07:51:42 +000018#include "ARMSubtarget.h"
Anton Korobeynikov16c29b52011-01-10 12:39:04 +000019#include "llvm/Target/TargetFrameLowering.h"
Rafael Espindolaec46ea32006-08-16 14:43:33 +000020
21namespace llvm {
Anton Korobeynikov33464912010-11-15 00:06:54 +000022 class ARMSubtarget;
Rafael Espindolaec46ea32006-08-16 14:43:33 +000023
Anton Korobeynikov16c29b52011-01-10 12:39:04 +000024class ARMFrameLowering : public TargetFrameLowering {
Anton Korobeynikov33464912010-11-15 00:06:54 +000025protected:
26 const ARMSubtarget &STI;
27
Rafael Espindolaec46ea32006-08-16 14:43:33 +000028public:
Anton Korobeynikov16c29b52011-01-10 12:39:04 +000029 explicit ARMFrameLowering(const ARMSubtarget &sti)
30 : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 4),
31 STI(sti) {
Rafael Espindolaec46ea32006-08-16 14:43:33 +000032 }
Anton Korobeynikov33464912010-11-15 00:06:54 +000033
34 /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
35 /// the function.
36 void emitPrologue(MachineFunction &MF) const;
37 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
Anton Korobeynikovd0c38172010-11-18 21:19:35 +000038
Anton Korobeynikovcd775ce2010-11-27 23:05:03 +000039 bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
40 MachineBasicBlock::iterator MI,
41 const std::vector<CalleeSavedInfo> &CSI,
42 const TargetRegisterInfo *TRI) const;
43
44 bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
45 MachineBasicBlock::iterator MI,
46 const std::vector<CalleeSavedInfo> &CSI,
47 const TargetRegisterInfo *TRI) const;
48
Anton Korobeynikovd0c38172010-11-18 21:19:35 +000049 bool hasFP(const MachineFunction &MF) const;
50 bool hasReservedCallFrame(const MachineFunction &MF) const;
51 bool canSimplifyCallFramePseudos(const MachineFunction &MF) const;
Anton Korobeynikov82f58742010-11-20 15:59:32 +000052 int getFrameIndexReference(const MachineFunction &MF, int FI,
53 unsigned &FrameReg) const;
Evan Chengdb6cbe12011-04-22 01:42:52 +000054 int ResolveFrameIndexReference(const MachineFunction &MF,
55 int FI,
Anton Korobeynikov82f58742010-11-20 15:59:32 +000056 unsigned &FrameReg, int SPAdj) const;
57 int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
58
Anton Korobeynikov94c5ae02010-11-27 23:05:25 +000059 void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
60 RegScavenger *RS) const;
61
Anton Korobeynikovcd775ce2010-11-27 23:05:03 +000062 private:
Anton Korobeynikovcd775ce2010-11-27 23:05:03 +000063 void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
Jim Grosbachc6f92612010-12-09 18:31:13 +000064 const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc,
65 unsigned StrOpc, bool NoGap,
Jakob Stoklund Olesenf06f6f52011-12-23 00:36:18 +000066 bool(*Func)(unsigned, bool), unsigned NumAlignedDPRCS2Regs,
Anton Korobeynikov57caad72011-03-05 18:43:32 +000067 unsigned MIFlags = 0) const;
Evan Cheng06d65f52010-12-07 23:08:38 +000068 void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
Jim Grosbachc6f92612010-12-09 18:31:13 +000069 const std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc,
70 unsigned LdrOpc, bool isVarArg, bool NoGap,
Jakob Stoklund Olesenf06f6f52011-12-23 00:36:18 +000071 bool(*Func)(unsigned, bool),
72 unsigned NumAlignedDPRCS2Regs) const;
Rafael Espindolaec46ea32006-08-16 14:43:33 +000073};
74
75} // End llvm namespace
76
77#endif