xref: /openbsd-src/gnu/llvm/llvm/lib/Target/M68k/M68kMachineFunction.h (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
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