10b57cec5SDimitry Andric //=- HexagonMachineFunctionInfo.h - Hexagon machine function info -*- C++ -*-=// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONMACHINEFUNCTIONINFO_H 100b57cec5SDimitry Andric #define LLVM_LIB_TARGET_HEXAGON_HEXAGONMACHINEFUNCTIONINFO_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 130b57cec5SDimitry Andric #include <map> 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric namespace llvm { 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric namespace Hexagon { 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric const unsigned int StartPacket = 0x1; 200b57cec5SDimitry Andric const unsigned int EndPacket = 0x2; 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric } // end namespace Hexagon 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric /// Hexagon target-specific information for each MachineFunction. 250b57cec5SDimitry Andric class HexagonMachineFunctionInfo : public MachineFunctionInfo { 260b57cec5SDimitry Andric // SRetReturnReg - Some subtargets require that sret lowering includes 270b57cec5SDimitry Andric // returning the value of the returned struct in a register. This field 280b57cec5SDimitry Andric // holds the virtual register into which the sret argument is passed. 290b57cec5SDimitry Andric unsigned SRetReturnReg = 0; 300b57cec5SDimitry Andric unsigned StackAlignBaseVReg = 0; // Aligned-stack base register (virtual) 310b57cec5SDimitry Andric unsigned StackAlignBasePhysReg = 0; // (physical) 320b57cec5SDimitry Andric int VarArgsFrameIndex; 33*5ffd83dbSDimitry Andric int RegSavedAreaStartFrameIndex; 34*5ffd83dbSDimitry Andric int FirstNamedArgFrameIndex; 35*5ffd83dbSDimitry Andric int LastNamedArgFrameIndex; 360b57cec5SDimitry Andric bool HasClobberLR = false; 370b57cec5SDimitry Andric bool HasEHReturn = false; 380b57cec5SDimitry Andric std::map<const MachineInstr*, unsigned> PacketInfo; 390b57cec5SDimitry Andric virtual void anchor(); 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric public: 420b57cec5SDimitry Andric HexagonMachineFunctionInfo() = default; 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric HexagonMachineFunctionInfo(MachineFunction &MF) {} 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric unsigned getSRetReturnReg() const { return SRetReturnReg; } 470b57cec5SDimitry Andric void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric void setVarArgsFrameIndex(int v) { VarArgsFrameIndex = v; } 500b57cec5SDimitry Andric int getVarArgsFrameIndex() { return VarArgsFrameIndex; } 510b57cec5SDimitry Andric 52*5ffd83dbSDimitry Andric void setRegSavedAreaStartFrameIndex(int v) { RegSavedAreaStartFrameIndex = v;} 53*5ffd83dbSDimitry Andric int getRegSavedAreaStartFrameIndex() { return RegSavedAreaStartFrameIndex; } 54*5ffd83dbSDimitry Andric 55*5ffd83dbSDimitry Andric void setFirstNamedArgFrameIndex(int v) { FirstNamedArgFrameIndex = v; } 56*5ffd83dbSDimitry Andric int getFirstNamedArgFrameIndex() { return FirstNamedArgFrameIndex; } 57*5ffd83dbSDimitry Andric 58*5ffd83dbSDimitry Andric void setLastNamedArgFrameIndex(int v) { LastNamedArgFrameIndex = v; } 59*5ffd83dbSDimitry Andric int getLastNamedArgFrameIndex() { return LastNamedArgFrameIndex; } 60*5ffd83dbSDimitry Andric 610b57cec5SDimitry Andric void setStartPacket(MachineInstr* MI) { 620b57cec5SDimitry Andric PacketInfo[MI] |= Hexagon::StartPacket; 630b57cec5SDimitry Andric } 640b57cec5SDimitry Andric void setEndPacket(MachineInstr* MI) { 650b57cec5SDimitry Andric PacketInfo[MI] |= Hexagon::EndPacket; 660b57cec5SDimitry Andric } 670b57cec5SDimitry Andric bool isStartPacket(const MachineInstr* MI) const { 680b57cec5SDimitry Andric return (PacketInfo.count(MI) && 690b57cec5SDimitry Andric (PacketInfo.find(MI)->second & Hexagon::StartPacket)); 700b57cec5SDimitry Andric } 710b57cec5SDimitry Andric bool isEndPacket(const MachineInstr* MI) const { 720b57cec5SDimitry Andric return (PacketInfo.count(MI) && 730b57cec5SDimitry Andric (PacketInfo.find(MI)->second & Hexagon::EndPacket)); 740b57cec5SDimitry Andric } 750b57cec5SDimitry Andric void setHasClobberLR(bool v) { HasClobberLR = v; } 760b57cec5SDimitry Andric bool hasClobberLR() const { return HasClobberLR; } 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric bool hasEHReturn() const { return HasEHReturn; }; 790b57cec5SDimitry Andric void setHasEHReturn(bool H = true) { HasEHReturn = H; }; 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric void setStackAlignBaseVReg(unsigned R) { StackAlignBaseVReg = R; } 820b57cec5SDimitry Andric unsigned getStackAlignBaseVReg() const { return StackAlignBaseVReg; } 830b57cec5SDimitry Andric 840b57cec5SDimitry Andric void setStackAlignBasePhysReg(unsigned R) { StackAlignBasePhysReg = R; } 850b57cec5SDimitry Andric unsigned getStackAlignBasePhysReg() const { return StackAlignBasePhysReg; } 860b57cec5SDimitry Andric }; 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric } // end namespace llvm 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONMACHINEFUNCTIONINFO_H 91