blob: 1f18e2bf80c46f0e0ee7c4c0e22d4a99268b8084 [file] [log] [blame]
Eugene Zelenko076468c2017-09-20 21:35:51 +00001//===- ARMTargetFrameLowering.h - Define frame lowering for ARM -*- C++ -*-===//
Rafael Espindolabf8e7512006-08-16 14:43:33 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
Rafael Espindolabf8e7512006-08-16 14:43:33 +00006// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Rafael Espindolabf8e7512006-08-16 14:43:33 +00009
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000010#ifndef LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H
11#define LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H
Rafael Espindolabf8e7512006-08-16 14:43:33 +000012
Eugene Zelenko076468c2017-09-20 21:35:51 +000013#include "llvm/CodeGen/MachineBasicBlock.h"
David Blaikie1be62f02017-11-03 22:32:11 +000014#include "llvm/CodeGen/TargetFrameLowering.h"
Eugene Zelenko076468c2017-09-20 21:35:51 +000015#include <vector>
Rafael Espindolabf8e7512006-08-16 14:43:33 +000016
17namespace llvm {
Eugene Zelenko076468c2017-09-20 21:35:51 +000018
19class ARMSubtarget;
20class CalleeSavedInfo;
21class MachineFunction;
Rafael Espindolabf8e7512006-08-16 14:43:33 +000022
Anton Korobeynikov2f931282011-01-10 12:39:04 +000023class ARMFrameLowering : public TargetFrameLowering {
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000024protected:
25 const ARMSubtarget &STI;
26
Rafael Espindolabf8e7512006-08-16 14:43:33 +000027public:
Eric Christopher45fb7b62014-06-26 19:29:59 +000028 explicit ARMFrameLowering(const ARMSubtarget &sti);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000029
30 /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
31 /// the function.
Quentin Colombet61b305e2015-05-05 17:38:16 +000032 void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
Craig Topper6bc27bf2014-03-10 02:09:33 +000033 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
Anton Korobeynikov0eecf5d2010-11-18 21:19:35 +000034
Anton Korobeynikovd08fbd12010-11-27 23:05:03 +000035 bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
36 MachineBasicBlock::iterator MI,
37 const std::vector<CalleeSavedInfo> &CSI,
Craig Topper6bc27bf2014-03-10 02:09:33 +000038 const TargetRegisterInfo *TRI) const override;
Anton Korobeynikovd08fbd12010-11-27 23:05:03 +000039
40 bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
Craig Topper6bc27bf2014-03-10 02:09:33 +000041 MachineBasicBlock::iterator MI,
Krzysztof Parzyszekbea30c62017-08-10 16:17:32 +000042 std::vector<CalleeSavedInfo> &CSI,
Craig Topper6bc27bf2014-03-10 02:09:33 +000043 const TargetRegisterInfo *TRI) const override;
Anton Korobeynikovd08fbd12010-11-27 23:05:03 +000044
Akira Hatanakaddf76aa2015-05-23 01:14:08 +000045 bool noFramePointerElim(const MachineFunction &MF) const override;
46
Craig Topper6bc27bf2014-03-10 02:09:33 +000047 bool hasFP(const MachineFunction &MF) const override;
48 bool hasReservedCallFrame(const MachineFunction &MF) const override;
49 bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override;
Anton Korobeynikov46877782010-11-20 15:59:32 +000050 int getFrameIndexReference(const MachineFunction &MF, int FI,
Craig Topper6bc27bf2014-03-10 02:09:33 +000051 unsigned &FrameReg) const override;
52 int ResolveFrameIndexReference(const MachineFunction &MF, int FI,
Anton Korobeynikov46877782010-11-20 15:59:32 +000053 unsigned &FrameReg, int SPAdj) const;
Anton Korobeynikov46877782010-11-20 15:59:32 +000054
Matthias Braun02564862015-07-14 17:17:13 +000055 void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
56 RegScavenger *RS) const override;
Anton Korobeynikov7283b8d2010-11-27 23:05:25 +000057
Quentin Colombet61b305e2015-05-05 17:38:16 +000058 void adjustForSegmentedStacks(MachineFunction &MF,
59 MachineBasicBlock &MBB) const override;
Oliver Stannardb14c6252014-04-02 16:10:33 +000060
Quentin Colombet8cb95b82015-11-18 00:40:54 +000061 /// Returns true if the target will correctly handle shrink wrapping.
62 bool enableShrinkWrapping(const MachineFunction &MF) const override {
63 return true;
64 }
65
Eugene Zelenko076468c2017-09-20 21:35:51 +000066private:
Anton Korobeynikovd08fbd12010-11-27 23:05:03 +000067 void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
Jim Grosbach5fccad82010-12-09 18:31:13 +000068 const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc,
69 unsigned StrOpc, bool NoGap,
Jakob Stoklund Olesen09655852011-12-23 00:36:18 +000070 bool(*Func)(unsigned, bool), unsigned NumAlignedDPRCS2Regs,
Anton Korobeynikove7410dd2011-03-05 18:43:32 +000071 unsigned MIFlags = 0) const;
Evan Cheng775ead32010-12-07 23:08:38 +000072 void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
Krzysztof Parzyszekbea30c62017-08-10 16:17:32 +000073 std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc,
Jim Grosbach5fccad82010-12-09 18:31:13 +000074 unsigned LdrOpc, bool isVarArg, bool NoGap,
Jakob Stoklund Olesen09655852011-12-23 00:36:18 +000075 bool(*Func)(unsigned, bool),
76 unsigned NumAlignedDPRCS2Regs) const;
Eli Bendersky8da87162013-02-21 20:05:00 +000077
Hans Wennborge1a2e902016-03-31 18:33:38 +000078 MachineBasicBlock::iterator
Craig Topper6bc27bf2014-03-10 02:09:33 +000079 eliminateCallFramePseudoInstr(MachineFunction &MF,
80 MachineBasicBlock &MBB,
81 MachineBasicBlock::iterator MI) const override;
Rafael Espindolabf8e7512006-08-16 14:43:33 +000082};
83
Eugene Zelenko076468c2017-09-20 21:35:51 +000084} // end namespace llvm
Rafael Espindolabf8e7512006-08-16 14:43:33 +000085
Eugene Zelenko076468c2017-09-20 21:35:51 +000086#endif // LLVM_LIB_TARGET_ARM_ARMFRAMELOWERING_H