blob: 1288b706c5995c9c3ce2bdaea542f6db2796cce9 [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;
54 int ResolveFrameIndexReference(const MachineFunction &MF, int FI,
55 unsigned &FrameReg, int SPAdj) const;
56 int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
57
Anton Korobeynikov94c5ae02010-11-27 23:05:25 +000058 void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
59 RegScavenger *RS) const;
60
Anton Korobeynikovcd775ce2010-11-27 23:05:03 +000061 private:
Anton Korobeynikovcd775ce2010-11-27 23:05:03 +000062 void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
Jim Grosbachc6f92612010-12-09 18:31:13 +000063 const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc,
64 unsigned StrOpc, bool NoGap,
65 bool(*Func)(unsigned, bool)) const;
Evan Cheng06d65f52010-12-07 23:08:38 +000066 void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
Jim Grosbachc6f92612010-12-09 18:31:13 +000067 const std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc,
68 unsigned LdrOpc, bool isVarArg, bool NoGap,
Evan Cheng06d65f52010-12-07 23:08:38 +000069 bool(*Func)(unsigned, bool)) const;
Rafael Espindolaec46ea32006-08-16 14:43:33 +000070};
71
72} // End llvm namespace
73
74#endif