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; 30*bdd1243dSDimitry Andric Register StackAlignBaseReg = 0; // Aligned-stack base register 310b57cec5SDimitry Andric int VarArgsFrameIndex; 325ffd83dbSDimitry Andric int RegSavedAreaStartFrameIndex; 335ffd83dbSDimitry Andric int FirstNamedArgFrameIndex; 345ffd83dbSDimitry Andric int LastNamedArgFrameIndex; 350b57cec5SDimitry Andric bool HasClobberLR = false; 360b57cec5SDimitry Andric bool HasEHReturn = false; 370b57cec5SDimitry Andric std::map<const MachineInstr*, unsigned> PacketInfo; 380b57cec5SDimitry Andric virtual void anchor(); 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric public: 410b57cec5SDimitry Andric HexagonMachineFunctionInfo() = default; 420b57cec5SDimitry Andric HexagonMachineFunctionInfo(const Function & F,const TargetSubtargetInfo * STI)43*bdd1243dSDimitry Andric HexagonMachineFunctionInfo(const Function &F, 44*bdd1243dSDimitry Andric const TargetSubtargetInfo *STI) {} 45*bdd1243dSDimitry Andric 4681ad6265SDimitry Andric MachineFunctionInfo * 4781ad6265SDimitry Andric clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, 4881ad6265SDimitry Andric const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB) 4981ad6265SDimitry Andric const override; 500b57cec5SDimitry Andric getSRetReturnReg()510b57cec5SDimitry Andric unsigned getSRetReturnReg() const { return SRetReturnReg; } setSRetReturnReg(unsigned Reg)520b57cec5SDimitry Andric void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 530b57cec5SDimitry Andric setVarArgsFrameIndex(int v)540b57cec5SDimitry Andric void setVarArgsFrameIndex(int v) { VarArgsFrameIndex = v; } getVarArgsFrameIndex()550b57cec5SDimitry Andric int getVarArgsFrameIndex() { return VarArgsFrameIndex; } 560b57cec5SDimitry Andric setRegSavedAreaStartFrameIndex(int v)575ffd83dbSDimitry Andric void setRegSavedAreaStartFrameIndex(int v) { RegSavedAreaStartFrameIndex = v;} getRegSavedAreaStartFrameIndex()585ffd83dbSDimitry Andric int getRegSavedAreaStartFrameIndex() { return RegSavedAreaStartFrameIndex; } 595ffd83dbSDimitry Andric setFirstNamedArgFrameIndex(int v)605ffd83dbSDimitry Andric void setFirstNamedArgFrameIndex(int v) { FirstNamedArgFrameIndex = v; } getFirstNamedArgFrameIndex()615ffd83dbSDimitry Andric int getFirstNamedArgFrameIndex() { return FirstNamedArgFrameIndex; } 625ffd83dbSDimitry Andric setLastNamedArgFrameIndex(int v)635ffd83dbSDimitry Andric void setLastNamedArgFrameIndex(int v) { LastNamedArgFrameIndex = v; } getLastNamedArgFrameIndex()645ffd83dbSDimitry Andric int getLastNamedArgFrameIndex() { return LastNamedArgFrameIndex; } 655ffd83dbSDimitry Andric setStartPacket(MachineInstr * MI)660b57cec5SDimitry Andric void setStartPacket(MachineInstr* MI) { 670b57cec5SDimitry Andric PacketInfo[MI] |= Hexagon::StartPacket; 680b57cec5SDimitry Andric } setEndPacket(MachineInstr * MI)690b57cec5SDimitry Andric void setEndPacket(MachineInstr* MI) { 700b57cec5SDimitry Andric PacketInfo[MI] |= Hexagon::EndPacket; 710b57cec5SDimitry Andric } isStartPacket(const MachineInstr * MI)720b57cec5SDimitry Andric bool isStartPacket(const MachineInstr* MI) const { 730b57cec5SDimitry Andric return (PacketInfo.count(MI) && 740b57cec5SDimitry Andric (PacketInfo.find(MI)->second & Hexagon::StartPacket)); 750b57cec5SDimitry Andric } isEndPacket(const MachineInstr * MI)760b57cec5SDimitry Andric bool isEndPacket(const MachineInstr* MI) const { 770b57cec5SDimitry Andric return (PacketInfo.count(MI) && 780b57cec5SDimitry Andric (PacketInfo.find(MI)->second & Hexagon::EndPacket)); 790b57cec5SDimitry Andric } setHasClobberLR(bool v)800b57cec5SDimitry Andric void setHasClobberLR(bool v) { HasClobberLR = v; } hasClobberLR()810b57cec5SDimitry Andric bool hasClobberLR() const { return HasClobberLR; } 820b57cec5SDimitry Andric hasEHReturn()830b57cec5SDimitry Andric bool hasEHReturn() const { return HasEHReturn; }; 840b57cec5SDimitry Andric void setHasEHReturn(bool H = true) { HasEHReturn = H; }; 850b57cec5SDimitry Andric setStackAlignBaseReg(Register R)86*bdd1243dSDimitry Andric void setStackAlignBaseReg(Register R) { StackAlignBaseReg = R; } getStackAlignBaseReg()87*bdd1243dSDimitry Andric Register getStackAlignBaseReg() const { return StackAlignBaseReg; } 880b57cec5SDimitry Andric }; 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric } // end namespace llvm 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONMACHINEFUNCTIONINFO_H 93