Home | History | Annotate | Download | only in Mips
      1 //===-- MipsMachineFunctionInfo.h - Private data used for Mips ----*- C++ -*-=//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file declares the Mips specific subclass of MachineFunctionInfo.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef MIPS_MACHINE_FUNCTION_INFO_H
     15 #define MIPS_MACHINE_FUNCTION_INFO_H
     16 
     17 #include "MipsSubtarget.h"
     18 #include "llvm/CodeGen/MachineFrameInfo.h"
     19 #include "llvm/CodeGen/MachineFunction.h"
     20 #include "llvm/Target/TargetFrameLowering.h"
     21 #include "llvm/Target/TargetMachine.h"
     22 #include <utility>
     23 
     24 namespace llvm {
     25 
     26 /// MipsFunctionInfo - This class is derived from MachineFunction private
     27 /// Mips target-specific information for each MachineFunction.
     28 class MipsFunctionInfo : public MachineFunctionInfo {
     29   virtual void anchor();
     30 
     31   MachineFunction& MF;
     32   /// SRetReturnReg - Some subtargets require that sret lowering includes
     33   /// returning the value of the returned struct in a register. This field
     34   /// holds the virtual register into which the sret argument is passed.
     35   unsigned SRetReturnReg;
     36 
     37   /// GlobalBaseReg - keeps track of the virtual register initialized for
     38   /// use as the global base register. This is used for PIC in some PIC
     39   /// relocation models.
     40   unsigned GlobalBaseReg;
     41 
     42   /// Mips16SPAliasReg - keeps track of the virtual register initialized for
     43   /// use as an alias for SP for use in load/store of halfword/byte from/to
     44   /// the stack
     45   unsigned Mips16SPAliasReg;
     46 
     47   /// VarArgsFrameIndex - FrameIndex for start of varargs area.
     48   int VarArgsFrameIndex;
     49 
     50   /// True if function has a byval argument.
     51   bool HasByvalArg;
     52 
     53   /// Size of incoming argument area.
     54   unsigned IncomingArgSize;
     55 
     56   /// CallsEhReturn - Whether the function calls llvm.eh.return.
     57   bool CallsEhReturn;
     58 
     59   /// Frame objects for spilling eh data registers.
     60   int EhDataRegFI[4];
     61 
     62 public:
     63   MipsFunctionInfo(MachineFunction& MF)
     64    : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), Mips16SPAliasReg(0),
     65      VarArgsFrameIndex(0), CallsEhReturn(false)
     66   {}
     67 
     68   unsigned getSRetReturnReg() const { return SRetReturnReg; }
     69   void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
     70 
     71   bool globalBaseRegSet() const;
     72   unsigned getGlobalBaseReg();
     73 
     74   bool mips16SPAliasRegSet() const;
     75   unsigned getMips16SPAliasReg();
     76 
     77   int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
     78   void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
     79 
     80   bool hasByvalArg() const { return HasByvalArg; }
     81   void setFormalArgInfo(unsigned Size, bool HasByval) {
     82     IncomingArgSize = Size;
     83     HasByvalArg = HasByval;
     84   }
     85 
     86   unsigned getIncomingArgSize() const { return IncomingArgSize; }
     87 
     88   bool callsEhReturn() const { return CallsEhReturn; }
     89   void setCallsEhReturn() { CallsEhReturn = true; }
     90 
     91   void createEhDataRegsFI();
     92   int getEhDataRegFI(unsigned Reg) const { return EhDataRegFI[Reg]; }
     93   bool isEhDataRegFI(int FI) const;
     94 
     95 };
     96 
     97 } // end of namespace llvm
     98 
     99 #endif // MIPS_MACHINE_FUNCTION_INFO_H
    100