SparcFrameLowering.h revision 3a1e76d62706f2773c23a684446b4c549c151669
1//===-- SparcFrameLowering.h - Define frame lowering for Sparc --*- C++ -*-===//
2//
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//
10//
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef SPARC_FRAMEINFO_H
15#define SPARC_FRAMEINFO_H
16
17#include "Sparc.h"
18#include "SparcSubtarget.h"
19#include "llvm/Target/TargetFrameLowering.h"
20
21namespace llvm {
22  class SparcSubtarget;
23
24class SparcFrameLowering : public TargetFrameLowering {
25  const SparcSubtarget &SubTarget;
26public:
27  explicit SparcFrameLowering(const SparcSubtarget &ST)
28    : TargetFrameLowering(TargetFrameLowering::StackGrowsDown,
29                          ST.is64Bit() ? 16 : 8, 0, ST.is64Bit() ? 16 : 8),
30      SubTarget(ST) {}
31
32  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
33  /// the function.
34  void emitPrologue(MachineFunction &MF) const;
35  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
36
37  void eliminateCallFramePseudoInstr(MachineFunction &MF,
38                                     MachineBasicBlock &MBB,
39                                     MachineBasicBlock::iterator I) const;
40
41  bool hasReservedCallFrame(const MachineFunction &MF) const;
42  bool hasFP(const MachineFunction &MF) const;
43  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
44                                            RegScavenger *RS = NULL) const;
45
46private:
47  // Remap input registers to output registers for leaf procedure.
48  void remapRegsForLeafProc(MachineFunction &MF) const;
49
50  // Returns true if MF is a leaf procedure.
51  bool isLeafProc(MachineFunction &MF) const;
52
53
54  // Emits code for adjusting SP in function prologue/epilogue.
55  void emitSPAdjustment(MachineFunction &MF,
56                        MachineBasicBlock &MBB,
57                        MachineBasicBlock::iterator MBBI,
58                        int NumBytes, unsigned ADDrr, unsigned ADDri) const;
59
60};
61
62} // End llvm namespace
63
64#endif
65