diff options
Diffstat (limited to 'contrib/llvm/lib/Target/Hexagon/HexagonMachineFunctionInfo.h')
-rw-r--r-- | contrib/llvm/lib/Target/Hexagon/HexagonMachineFunctionInfo.h | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/contrib/llvm/lib/Target/Hexagon/HexagonMachineFunctionInfo.h b/contrib/llvm/lib/Target/Hexagon/HexagonMachineFunctionInfo.h new file mode 100644 index 000000000000..d83bcbc41553 --- /dev/null +++ b/contrib/llvm/lib/Target/Hexagon/HexagonMachineFunctionInfo.h @@ -0,0 +1,79 @@ +//=- HexagonMachineFunctionInfo.h - Hexagon machine function info -*- C++ -*-=// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONMACHINEFUNCTIONINFO_H +#define LLVM_LIB_TARGET_HEXAGON_HEXAGONMACHINEFUNCTIONINFO_H + +#include "llvm/CodeGen/MachineFunction.h" +#include <map> + +namespace llvm { + +namespace Hexagon { + + const unsigned int StartPacket = 0x1; + const unsigned int EndPacket = 0x2; + +} // end namespace Hexagon + +/// Hexagon target-specific information for each MachineFunction. +class HexagonMachineFunctionInfo : public MachineFunctionInfo { + // SRetReturnReg - Some subtargets require that sret lowering includes + // returning the value of the returned struct in a register. This field + // holds the virtual register into which the sret argument is passed. + unsigned SRetReturnReg = 0; + unsigned StackAlignBaseVReg = 0; // Aligned-stack base register (virtual) + unsigned StackAlignBasePhysReg = 0; // (physical) + int VarArgsFrameIndex; + bool HasClobberLR = false; + bool HasEHReturn = false; + std::map<const MachineInstr*, unsigned> PacketInfo; + virtual void anchor(); + +public: + HexagonMachineFunctionInfo() = default; + + HexagonMachineFunctionInfo(MachineFunction &MF) {} + + unsigned getSRetReturnReg() const { return SRetReturnReg; } + void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } + + void setVarArgsFrameIndex(int v) { VarArgsFrameIndex = v; } + int getVarArgsFrameIndex() { return VarArgsFrameIndex; } + + void setStartPacket(MachineInstr* MI) { + PacketInfo[MI] |= Hexagon::StartPacket; + } + void setEndPacket(MachineInstr* MI) { + PacketInfo[MI] |= Hexagon::EndPacket; + } + bool isStartPacket(const MachineInstr* MI) const { + return (PacketInfo.count(MI) && + (PacketInfo.find(MI)->second & Hexagon::StartPacket)); + } + bool isEndPacket(const MachineInstr* MI) const { + return (PacketInfo.count(MI) && + (PacketInfo.find(MI)->second & Hexagon::EndPacket)); + } + void setHasClobberLR(bool v) { HasClobberLR = v; } + bool hasClobberLR() const { return HasClobberLR; } + + bool hasEHReturn() const { return HasEHReturn; }; + void setHasEHReturn(bool H = true) { HasEHReturn = H; }; + + void setStackAlignBaseVReg(unsigned R) { StackAlignBaseVReg = R; } + unsigned getStackAlignBaseVReg() const { return StackAlignBaseVReg; } + + void setStackAlignBasePhysReg(unsigned R) { StackAlignBasePhysReg = R; } + unsigned getStackAlignBasePhysReg() const { return StackAlignBasePhysReg; } +}; + +} // end namespace llvm + +#endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONMACHINEFUNCTIONINFO_H |