blob: 260e5835cbb653668fe6ba5431854d84f72a1d13 [file] [log] [blame]
Rafael Espindolaec46ea32006-08-16 14:43:33 +00001//===-- ARMTargetFrameInfo.h - Define TargetFrameInfo for ARM ---*- C++ -*-===//
2//
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"
Evan Cheng1945b7b2009-07-09 06:49:09 +000019#include "llvm/Target/TargetFrameInfo.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
Evan Chenga8e29892007-01-19 07:51:42 +000024class ARMFrameInfo : public TargetFrameInfo {
Anton Korobeynikov33464912010-11-15 00:06:54 +000025protected:
26 const ARMSubtarget &STI;
27
Rafael Espindolaec46ea32006-08-16 14:43:33 +000028public:
Anton Korobeynikov33464912010-11-15 00:06:54 +000029 explicit ARMFrameInfo(const ARMSubtarget &sti)
30 : TargetFrameInfo(StackGrowsDown, sti.getStackAlignment(), 0, 4), STI(sti) {
Rafael Espindolaec46ea32006-08-16 14:43:33 +000031 }
Anton Korobeynikov33464912010-11-15 00:06:54 +000032
33 /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
34 /// the function.
35 void emitPrologue(MachineFunction &MF) const;
36 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
Anton Korobeynikovd0c38172010-11-18 21:19:35 +000037
Anton Korobeynikovcd775ce2010-11-27 23:05:03 +000038 bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
39 MachineBasicBlock::iterator MI,
40 const std::vector<CalleeSavedInfo> &CSI,
41 const TargetRegisterInfo *TRI) const;
42
43 bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
44 MachineBasicBlock::iterator MI,
45 const std::vector<CalleeSavedInfo> &CSI,
46 const TargetRegisterInfo *TRI) const;
47
Anton Korobeynikovd0c38172010-11-18 21:19:35 +000048 bool hasFP(const MachineFunction &MF) const;
49 bool hasReservedCallFrame(const MachineFunction &MF) const;
50 bool canSimplifyCallFramePseudos(const MachineFunction &MF) const;
Anton Korobeynikov82f58742010-11-20 15:59:32 +000051 int getFrameIndexReference(const MachineFunction &MF, int FI,
52 unsigned &FrameReg) const;
53 int ResolveFrameIndexReference(const MachineFunction &MF, int FI,
54 unsigned &FrameReg, int SPAdj) const;
55 int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
56
Anton Korobeynikov94c5ae02010-11-27 23:05:25 +000057 void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
58 RegScavenger *RS) const;
59
Anton Korobeynikovcd775ce2010-11-27 23:05:03 +000060 private:
Anton Korobeynikovcd775ce2010-11-27 23:05:03 +000061 void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
Jim Grosbachc6f92612010-12-09 18:31:13 +000062 const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc,
63 unsigned StrOpc, bool NoGap,
64 bool(*Func)(unsigned, bool)) const;
Evan Cheng06d65f52010-12-07 23:08:38 +000065 void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
Jim Grosbachc6f92612010-12-09 18:31:13 +000066 const std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc,
67 unsigned LdrOpc, bool isVarArg, bool NoGap,
Evan Cheng06d65f52010-12-07 23:08:38 +000068 bool(*Func)(unsigned, bool)) const;
Rafael Espindolaec46ea32006-08-16 14:43:33 +000069};
70
71} // End llvm namespace
72
73#endif