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