1*d415bd75Srobert //===-- M68kMachineFunctionInfo.h - M68k private data -----------*- C++ -*-===// 273471bf0Spatrick // 373471bf0Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 473471bf0Spatrick // See https://llvm.org/LICENSE.txt for license information. 573471bf0Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 673471bf0Spatrick // 773471bf0Spatrick //===----------------------------------------------------------------------===// 873471bf0Spatrick /// 973471bf0Spatrick /// \file 1073471bf0Spatrick /// This file declares the M68k specific subclass of MachineFunctionInfo. 1173471bf0Spatrick /// 1273471bf0Spatrick //===----------------------------------------------------------------------===// 1373471bf0Spatrick 1473471bf0Spatrick #ifndef LLVM_LIB_TARGET_M68K_M68KMACHINEFUNCTION_H 1573471bf0Spatrick #define LLVM_LIB_TARGET_M68K_M68KMACHINEFUNCTION_H 1673471bf0Spatrick 1773471bf0Spatrick #include "llvm/CodeGen/CallingConvLower.h" 1873471bf0Spatrick #include "llvm/CodeGen/MachineFunction.h" 1973471bf0Spatrick #include "llvm/Support/MachineValueType.h" 2073471bf0Spatrick 2173471bf0Spatrick namespace llvm { 2273471bf0Spatrick 2373471bf0Spatrick class M68kMachineFunctionInfo : public MachineFunctionInfo { 2473471bf0Spatrick /// Non-zero if the function has base pointer and makes call to 2573471bf0Spatrick /// llvm.eh.sjlj.setjmp. When non-zero, the value is a displacement from the 2673471bf0Spatrick /// frame pointer to a slot where the base pointer is stashed. 2773471bf0Spatrick signed char RestoreBasePointerOffset = 0; 2873471bf0Spatrick 2973471bf0Spatrick /// Size of the callee-saved register portion of the stack frame in bytes. 3073471bf0Spatrick unsigned CalleeSavedFrameSize = 0; 3173471bf0Spatrick 3273471bf0Spatrick /// Number of bytes function pops on return (in addition to the space used by 3373471bf0Spatrick /// the return address). Used on windows platform for stdcall & fastcall 3473471bf0Spatrick /// name decoration 3573471bf0Spatrick unsigned BytesToPopOnReturn = 0; 3673471bf0Spatrick 3773471bf0Spatrick /// FrameIndex for return slot. 3873471bf0Spatrick int ReturnAddrIndex = 0; 3973471bf0Spatrick 4073471bf0Spatrick /// The number of bytes by which return address stack slot is moved as the 4173471bf0Spatrick /// result of tail call optimization. 4273471bf0Spatrick int TailCallReturnAddrDelta = 0; 4373471bf0Spatrick 4473471bf0Spatrick /// keeps track of the virtual register initialized for use as the global 4573471bf0Spatrick /// base register. This is used for PIC in some PIC relocation models. 4673471bf0Spatrick unsigned GlobalBaseReg = 0; 4773471bf0Spatrick 4873471bf0Spatrick /// FrameIndex for start of varargs area. 4973471bf0Spatrick int VarArgsFrameIndex = 0; 5073471bf0Spatrick 5173471bf0Spatrick /// Keeps track of whether this function uses sequences of pushes to pass 5273471bf0Spatrick /// function parameters. 5373471bf0Spatrick bool HasPushSequences = false; 5473471bf0Spatrick 5573471bf0Spatrick /// Some subtargets require that sret lowering includes 5673471bf0Spatrick /// returning the value of the returned struct in a register. This field 5773471bf0Spatrick /// holds the virtual register into which the sret argument is passed. 5873471bf0Spatrick unsigned SRetReturnReg = 0; 5973471bf0Spatrick 6073471bf0Spatrick /// A list of virtual and physical registers that must be forwarded to every 6173471bf0Spatrick /// musttail call. 6273471bf0Spatrick SmallVector<ForwardedRegister, 1> ForwardedMustTailRegParms; 6373471bf0Spatrick 6473471bf0Spatrick /// The number of bytes on stack consumed by the arguments being passed on 6573471bf0Spatrick /// the stack. 6673471bf0Spatrick unsigned ArgumentStackSize = 0; 6773471bf0Spatrick 6873471bf0Spatrick public: M68kMachineFunctionInfo(const Function & F,const TargetSubtargetInfo * STI)69*d415bd75Srobert explicit M68kMachineFunctionInfo(const Function &F, 70*d415bd75Srobert const TargetSubtargetInfo *STI) {} 71*d415bd75Srobert 72*d415bd75Srobert MachineFunctionInfo * 73*d415bd75Srobert clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF, 74*d415bd75Srobert const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB) 75*d415bd75Srobert const override; 7673471bf0Spatrick getRestoreBasePointer()7773471bf0Spatrick bool getRestoreBasePointer() const { return RestoreBasePointerOffset != 0; } 7873471bf0Spatrick void setRestoreBasePointer(const MachineFunction *MF); getRestoreBasePointerOffset()7973471bf0Spatrick int getRestoreBasePointerOffset() const { return RestoreBasePointerOffset; } 8073471bf0Spatrick getCalleeSavedFrameSize()8173471bf0Spatrick unsigned getCalleeSavedFrameSize() const { return CalleeSavedFrameSize; } setCalleeSavedFrameSize(unsigned bytes)8273471bf0Spatrick void setCalleeSavedFrameSize(unsigned bytes) { CalleeSavedFrameSize = bytes; } 8373471bf0Spatrick getBytesToPopOnReturn()8473471bf0Spatrick unsigned getBytesToPopOnReturn() const { return BytesToPopOnReturn; } setBytesToPopOnReturn(unsigned bytes)8573471bf0Spatrick void setBytesToPopOnReturn(unsigned bytes) { BytesToPopOnReturn = bytes; } 8673471bf0Spatrick getRAIndex()8773471bf0Spatrick int getRAIndex() const { return ReturnAddrIndex; } setRAIndex(int Index)8873471bf0Spatrick void setRAIndex(int Index) { ReturnAddrIndex = Index; } 8973471bf0Spatrick getTCReturnAddrDelta()9073471bf0Spatrick int getTCReturnAddrDelta() const { return TailCallReturnAddrDelta; } setTCReturnAddrDelta(int delta)9173471bf0Spatrick void setTCReturnAddrDelta(int delta) { TailCallReturnAddrDelta = delta; } 9273471bf0Spatrick getGlobalBaseReg()9373471bf0Spatrick unsigned getGlobalBaseReg() const { return GlobalBaseReg; } setGlobalBaseReg(unsigned Reg)9473471bf0Spatrick void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; } 9573471bf0Spatrick getVarArgsFrameIndex()9673471bf0Spatrick int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } setVarArgsFrameIndex(int Index)9773471bf0Spatrick void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } 9873471bf0Spatrick getHasPushSequences()9973471bf0Spatrick bool getHasPushSequences() const { return HasPushSequences; } setHasPushSequences(bool HasPush)10073471bf0Spatrick void setHasPushSequences(bool HasPush) { HasPushSequences = HasPush; } 10173471bf0Spatrick getSRetReturnReg()10273471bf0Spatrick unsigned getSRetReturnReg() const { return SRetReturnReg; } setSRetReturnReg(unsigned Reg)10373471bf0Spatrick void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } 10473471bf0Spatrick getArgumentStackSize()10573471bf0Spatrick unsigned getArgumentStackSize() const { return ArgumentStackSize; } setArgumentStackSize(unsigned size)10673471bf0Spatrick void setArgumentStackSize(unsigned size) { ArgumentStackSize = size; } 10773471bf0Spatrick getForwardedMustTailRegParms()10873471bf0Spatrick SmallVectorImpl<ForwardedRegister> &getForwardedMustTailRegParms() { 10973471bf0Spatrick return ForwardedMustTailRegParms; 11073471bf0Spatrick } 11173471bf0Spatrick 11273471bf0Spatrick private: 11373471bf0Spatrick virtual void anchor(); 11473471bf0Spatrick }; 11573471bf0Spatrick 11673471bf0Spatrick } // end of namespace llvm 11773471bf0Spatrick 118*d415bd75Srobert #endif // LLVM_LIB_TARGET_M68K_M68KMACHINEFUNCTION_H 119