MipsMachineFunction.h revision 263508
155714Skris//===-- MipsMachineFunctionInfo.h - Private data used for Mips ----*- C++ -*-=//
255714Skris//
355714Skris//                     The LLVM Compiler Infrastructure
455714Skris//
555714Skris// This file is distributed under the University of Illinois Open Source
655714Skris// License. See LICENSE.TXT for details.
755714Skris//
8280304Sjkim//===----------------------------------------------------------------------===//
955714Skris//
1055714Skris// This file declares the Mips specific subclass of MachineFunctionInfo.
1155714Skris//
1255714Skris//===----------------------------------------------------------------------===//
1355714Skris
1455714Skris#ifndef MIPS_MACHINE_FUNCTION_INFO_H
15280304Sjkim#define MIPS_MACHINE_FUNCTION_INFO_H
1655714Skris
1755714Skris#include "MipsSubtarget.h"
1855714Skris#include "llvm/ADT/StringMap.h"
1955714Skris#include "llvm/ADT/ValueMap.h"
2055714Skris#include "llvm/CodeGen/MachineFrameInfo.h"
2155714Skris#include "llvm/CodeGen/MachineFunction.h"
22280304Sjkim#include "llvm/CodeGen/MachineMemOperand.h"
2355714Skris#include "llvm/CodeGen/PseudoSourceValue.h"
2455714Skris#include "llvm/IR/GlobalValue.h"
2555714Skris#include "llvm/Target/TargetFrameLowering.h"
2655714Skris#include "llvm/Target/TargetMachine.h"
2755714Skris#include <utility>
2855714Skris
2955714Skrisnamespace llvm {
3055714Skris
3155714Skris/// \brief A class derived from PseudoSourceValue that represents a GOT entry
3255714Skris/// resolved by lazy-binding.
3355714Skrisclass MipsCallEntry : public PseudoSourceValue {
3455714Skrispublic:
3555714Skris  explicit MipsCallEntry(const StringRef &N);
3655714Skris  explicit MipsCallEntry(const GlobalValue *V);
37280304Sjkim  virtual bool isConstant(const MachineFrameInfo *) const;
3855714Skris  virtual bool isAliased(const MachineFrameInfo *) const;
3955714Skris  virtual bool mayAlias(const MachineFrameInfo *) const;
40280304Sjkim
4155714Skrisprivate:
4255714Skris  virtual void printCustom(raw_ostream &O) const;
4355714Skris#ifndef NDEBUG
4455714Skris  std::string Name;
4555714Skris  const GlobalValue *Val;
4655714Skris#endif
4755714Skris};
4855714Skris
4955714Skris/// MipsFunctionInfo - This class is derived from MachineFunction private
5055714Skris/// Mips target-specific information for each MachineFunction.
5155714Skrisclass MipsFunctionInfo : public MachineFunctionInfo {
52280304Sjkimpublic:
5355714Skris  MipsFunctionInfo(MachineFunction& MF)
5455714Skris   : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), Mips16SPAliasReg(0),
5555714Skris     VarArgsFrameIndex(0), CallsEhReturn(false)
5655714Skris  {}
5755714Skris
5855714Skris  ~MipsFunctionInfo();
5955714Skris
6055714Skris  unsigned getSRetReturnReg() const { return SRetReturnReg; }
6155714Skris  void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
6255714Skris
6355714Skris  bool globalBaseRegSet() const;
64280304Sjkim  unsigned getGlobalBaseReg();
65280304Sjkim
66280304Sjkim  bool mips16SPAliasRegSet() const;
67280304Sjkim  unsigned getMips16SPAliasReg();
68280304Sjkim
6955714Skris  int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
70280304Sjkim  void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
71280304Sjkim
72280304Sjkim  bool hasByvalArg() const { return HasByvalArg; }
73280304Sjkim  void setFormalArgInfo(unsigned Size, bool HasByval) {
74280304Sjkim    IncomingArgSize = Size;
75280304Sjkim    HasByvalArg = HasByval;
76280304Sjkim  }
7755714Skris
78280304Sjkim  unsigned getIncomingArgSize() const { return IncomingArgSize; }
79280304Sjkim
80280304Sjkim  bool callsEhReturn() const { return CallsEhReturn; }
81280304Sjkim  void setCallsEhReturn() { CallsEhReturn = true; }
82280304Sjkim
83280304Sjkim  void createEhDataRegsFI();
84280304Sjkim  int getEhDataRegFI(unsigned Reg) const { return EhDataRegFI[Reg]; }
85280304Sjkim  bool isEhDataRegFI(int FI) const;
86280304Sjkim
87280304Sjkim  /// \brief Create a MachinePointerInfo that has a MipsCallEntr object
88280304Sjkim  /// representing a GOT entry for an external function.
89280304Sjkim  MachinePointerInfo callPtrInfo(const StringRef &Name);
9055714Skris
91109998Smarkm  /// \brief Create a MachinePointerInfo that has a MipsCallEntr object
92280304Sjkim  /// representing a GOT entry for a global function.
93280304Sjkim  MachinePointerInfo callPtrInfo(const GlobalValue *Val);
94280304Sjkim
9555714Skrisprivate:
96280304Sjkim  virtual void anchor();
97280304Sjkim
98280304Sjkim  MachineFunction& MF;
99280304Sjkim  /// SRetReturnReg - Some subtargets require that sret lowering includes
100280304Sjkim  /// returning the value of the returned struct in a register. This field
101280304Sjkim  /// holds the virtual register into which the sret argument is passed.
102280304Sjkim  unsigned SRetReturnReg;
103280304Sjkim
104280304Sjkim  /// GlobalBaseReg - keeps track of the virtual register initialized for
105280304Sjkim  /// use as the global base register. This is used for PIC in some PIC
10655714Skris  /// relocation models.
107280304Sjkim  unsigned GlobalBaseReg;
108280304Sjkim
109280304Sjkim  /// Mips16SPAliasReg - keeps track of the virtual register initialized for
110280304Sjkim  /// use as an alias for SP for use in load/store of halfword/byte from/to
11155714Skris  /// the stack
112280304Sjkim  unsigned Mips16SPAliasReg;
113280304Sjkim
114280304Sjkim  /// VarArgsFrameIndex - FrameIndex for start of varargs area.
115280304Sjkim  int VarArgsFrameIndex;
116280304Sjkim
117280304Sjkim  /// True if function has a byval argument.
118280304Sjkim  bool HasByvalArg;
119280304Sjkim
120280304Sjkim  /// Size of incoming argument area.
121280304Sjkim  unsigned IncomingArgSize;
122280304Sjkim
123280304Sjkim  /// CallsEhReturn - Whether the function calls llvm.eh.return.
124280304Sjkim  bool CallsEhReturn;
125280304Sjkim
126280304Sjkim  /// Frame objects for spilling eh data registers.
127280304Sjkim  int EhDataRegFI[4];
128280304Sjkim
129  /// MipsCallEntry maps.
130  StringMap<const MipsCallEntry *> ExternalCallEntries;
131  ValueMap<const GlobalValue *, const MipsCallEntry *> GlobalCallEntries;
132};
133
134} // end of namespace llvm
135
136#endif // MIPS_MACHINE_FUNCTION_INFO_H
137