blob: d83bcbc41553f1756ad4c0239945209f0d380fec [file] [log] [blame]
Juergen Ributzkad12ccbd2013-11-19 00:57:56 +00001//=- HexagonMachineFunctionInfo.h - Hexagon machine function info -*- C++ -*-=//
Tony Linthicum1213a7a2011-12-12 21:14:40 +00002//
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
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000010#ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONMACHINEFUNCTIONINFO_H
11#define LLVM_LIB_TARGET_HEXAGON_HEXAGONMACHINEFUNCTIONINFO_H
Tony Linthicum1213a7a2011-12-12 21:14:40 +000012
13#include "llvm/CodeGen/MachineFunction.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000014#include <map>
Tony Linthicum1213a7a2011-12-12 21:14:40 +000015
16namespace llvm {
17
Eugene Zelenkob2ca1b32017-01-04 02:02:05 +000018namespace Hexagon {
19
Tony Linthicum1213a7a2011-12-12 21:14:40 +000020 const unsigned int StartPacket = 0x1;
21 const unsigned int EndPacket = 0x2;
Tony Linthicum1213a7a2011-12-12 21:14:40 +000022
Eugene Zelenkob2ca1b32017-01-04 02:02:05 +000023} // end namespace Hexagon
Tony Linthicum1213a7a2011-12-12 21:14:40 +000024
25/// Hexagon target-specific information for each MachineFunction.
26class HexagonMachineFunctionInfo : public MachineFunctionInfo {
27 // SRetReturnReg - Some subtargets require that sret lowering includes
28 // returning the value of the returned struct in a register. This field
29 // holds the virtual register into which the sret argument is passed.
Eugene Zelenkob2ca1b32017-01-04 02:02:05 +000030 unsigned SRetReturnReg = 0;
31 unsigned StackAlignBaseVReg = 0; // Aligned-stack base register (virtual)
32 unsigned StackAlignBasePhysReg = 0; // (physical)
Tony Linthicum1213a7a2011-12-12 21:14:40 +000033 int VarArgsFrameIndex;
Eugene Zelenkob2ca1b32017-01-04 02:02:05 +000034 bool HasClobberLR = false;
35 bool HasEHReturn = false;
Tony Linthicum1213a7a2011-12-12 21:14:40 +000036 std::map<const MachineInstr*, unsigned> PacketInfo;
Juergen Ributzkad12ccbd2013-11-19 00:57:56 +000037 virtual void anchor();
Tony Linthicum1213a7a2011-12-12 21:14:40 +000038
39public:
Eugene Zelenkob2ca1b32017-01-04 02:02:05 +000040 HexagonMachineFunctionInfo() = default;
Tony Linthicum1213a7a2011-12-12 21:14:40 +000041
Eugene Zelenkob2ca1b32017-01-04 02:02:05 +000042 HexagonMachineFunctionInfo(MachineFunction &MF) {}
Tony Linthicum1213a7a2011-12-12 21:14:40 +000043
44 unsigned getSRetReturnReg() const { return SRetReturnReg; }
45 void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
46
Tony Linthicum1213a7a2011-12-12 21:14:40 +000047 void setVarArgsFrameIndex(int v) { VarArgsFrameIndex = v; }
48 int getVarArgsFrameIndex() { return VarArgsFrameIndex; }
49
50 void setStartPacket(MachineInstr* MI) {
51 PacketInfo[MI] |= Hexagon::StartPacket;
52 }
53 void setEndPacket(MachineInstr* MI) {
54 PacketInfo[MI] |= Hexagon::EndPacket;
55 }
56 bool isStartPacket(const MachineInstr* MI) const {
57 return (PacketInfo.count(MI) &&
58 (PacketInfo.find(MI)->second & Hexagon::StartPacket));
59 }
60 bool isEndPacket(const MachineInstr* MI) const {
61 return (PacketInfo.count(MI) &&
62 (PacketInfo.find(MI)->second & Hexagon::EndPacket));
63 }
64 void setHasClobberLR(bool v) { HasClobberLR = v; }
65 bool hasClobberLR() const { return HasClobberLR; }
66
Jyotsna Verma5ed51812013-05-01 21:37:34 +000067 bool hasEHReturn() const { return HasEHReturn; };
68 void setHasEHReturn(bool H = true) { HasEHReturn = H; };
Krzysztof Parzyszek4fa2a9f2015-04-22 16:43:53 +000069
Krzysztof Parzyszeka34901a2016-03-28 14:42:03 +000070 void setStackAlignBaseVReg(unsigned R) { StackAlignBaseVReg = R; }
71 unsigned getStackAlignBaseVReg() const { return StackAlignBaseVReg; }
72
73 void setStackAlignBasePhysReg(unsigned R) { StackAlignBasePhysReg = R; }
74 unsigned getStackAlignBasePhysReg() const { return StackAlignBasePhysReg; }
Tony Linthicum1213a7a2011-12-12 21:14:40 +000075};
Tony Linthicum1213a7a2011-12-12 21:14:40 +000076
Eugene Zelenkob2ca1b32017-01-04 02:02:05 +000077} // end namespace llvm
78
79#endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONMACHINEFUNCTIONINFO_H