X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FMips%2FMipsMachineFunction.h;h=a2f6ee03604fc0fa24d8aaa5c5f62d7c001cb20d;hb=6e961aa243f223ddb704ce708056238d7c1d7e24;hp=d2eba581147473fa00b5f1342fd9d7809658342d;hpb=294166d541fd634fea09fb1fe48457536ef43ed0;p=oota-llvm.git diff --git a/lib/Target/Mips/MipsMachineFunction.h b/lib/Target/Mips/MipsMachineFunction.h index d2eba581147..a2f6ee03604 100644 --- a/lib/Target/Mips/MipsMachineFunction.h +++ b/lib/Target/Mips/MipsMachineFunction.h @@ -11,14 +11,19 @@ // //===----------------------------------------------------------------------===// -#ifndef MIPS_MACHINE_FUNCTION_INFO_H -#define MIPS_MACHINE_FUNCTION_INFO_H +#ifndef LLVM_LIB_TARGET_MIPS_MIPSMACHINEFUNCTION_H +#define LLVM_LIB_TARGET_MIPS_MIPSMACHINEFUNCTION_H -#include "MipsSubtarget.h" -#include "llvm/CodeGen/MachineFunction.h" +#include "Mips16HardFloatInfo.h" #include "llvm/CodeGen/MachineFrameInfo.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineMemOperand.h" +#include "llvm/CodeGen/PseudoSourceValue.h" +#include "llvm/IR/ValueMap.h" #include "llvm/Target/TargetFrameLowering.h" #include "llvm/Target/TargetMachine.h" +#include +#include #include namespace llvm { @@ -26,6 +31,66 @@ namespace llvm { /// MipsFunctionInfo - This class is derived from MachineFunction private /// Mips target-specific information for each MachineFunction. class MipsFunctionInfo : public MachineFunctionInfo { +public: + MipsFunctionInfo(MachineFunction &MF) + : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), Mips16SPAliasReg(0), + VarArgsFrameIndex(0), CallsEhReturn(false), IsISR(false), SaveS2(false), + MoveF64ViaSpillFI(-1) {} + + ~MipsFunctionInfo(); + + unsigned getSRetReturnReg() const { return SRetReturnReg; } + void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } + + bool globalBaseRegSet() const; + unsigned getGlobalBaseReg(); + + bool mips16SPAliasRegSet() const; + unsigned getMips16SPAliasReg(); + + int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } + void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } + + bool hasByvalArg() const { return HasByvalArg; } + void setFormalArgInfo(unsigned Size, bool HasByval) { + IncomingArgSize = Size; + HasByvalArg = HasByval; + } + + unsigned getIncomingArgSize() const { return IncomingArgSize; } + + bool callsEhReturn() const { return CallsEhReturn; } + void setCallsEhReturn() { CallsEhReturn = true; } + + void createEhDataRegsFI(); + int getEhDataRegFI(unsigned Reg) const { return EhDataRegFI[Reg]; } + bool isEhDataRegFI(int FI) const; + + /// Create a MachinePointerInfo that has an ExternalSymbolPseudoSourceValue + /// object representing a GOT entry for an external function. + MachinePointerInfo callPtrInfo(const char *ES); + + // Functions with the "interrupt" attribute require special prologues, + // epilogues and additional spill slots. + bool isISR() const { return IsISR; } + void setISR() { IsISR = true; } + void createISRRegFI(); + int getISRRegFI(unsigned Reg) const { return ISRDataRegFI[Reg]; } + bool isISRRegFI(int FI) const; + + /// Create a MachinePointerInfo that has a GlobalValuePseudoSourceValue object + /// representing a GOT entry for a global function. + MachinePointerInfo callPtrInfo(const GlobalValue *GV); + + void setSaveS2() { SaveS2 = true; } + bool hasSaveS2() const { return SaveS2; } + + int getMoveF64ViaSpillFI(const TargetRegisterClass *RC); + + std::map + StubsNeeded; + +private: virtual void anchor(); MachineFunction& MF; @@ -47,42 +112,32 @@ class MipsFunctionInfo : public MachineFunctionInfo { /// VarArgsFrameIndex - FrameIndex for start of varargs area. int VarArgsFrameIndex; - // Formal argument information obtained during call to LowerFormalArguments. - unsigned NextStackOffset; + /// True if function has a byval argument. bool HasByvalArg; - // Size of incoming argument area. + /// Size of incoming argument area. unsigned IncomingArgSize; -public: - MipsFunctionInfo(MachineFunction& MF) - : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), Mips16SPAliasReg(0), - VarArgsFrameIndex(0) - {} - - unsigned getSRetReturnReg() const { return SRetReturnReg; } - void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; } + /// CallsEhReturn - Whether the function calls llvm.eh.return. + bool CallsEhReturn; - bool globalBaseRegSet() const; - unsigned getGlobalBaseReg(); + /// Frame objects for spilling eh data registers. + int EhDataRegFI[4]; - bool mips16SPAliasRegSet() const; - unsigned getMips16SPAliasReg(); + /// ISR - Whether the function is an Interrupt Service Routine. + bool IsISR; - int getVarArgsFrameIndex() const { return VarArgsFrameIndex; } - void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; } + /// Frame objects for spilling C0_STATUS, C0_EPC + int ISRDataRegFI[2]; - unsigned nextStackOffset() const { return NextStackOffset; } - bool hasByvalArg() const { return HasByvalArg; } - void setFormalArgInfo(unsigned Offset, bool HasByval) { - NextStackOffset = Offset; - HasByvalArg = HasByval; - } + // saveS2 + bool SaveS2; - unsigned getIncomingArgSize() const { return IncomingArgSize; } - void setIncomingArgSize(unsigned S) { IncomingArgSize = S; } + /// FrameIndex for expanding BuildPairF64 nodes to spill and reload when the + /// O32 FPXX ABI is enabled. -1 is used to denote invalid index. + int MoveF64ViaSpillFI; }; } // end of namespace llvm -#endif // MIPS_MACHINE_FUNCTION_INFO_H +#endif