14552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===-- MipsMachineFunctionInfo.h - Private data used for Mips ----*- C++ -*-=//
24215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//
34215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//                     The LLVM Compiler Infrastructure
44215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
74215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//
84552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
94215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//
104215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// This file declares the Mips specific subclass of MachineFunctionInfo.
114215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//
124552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
134215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
144215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#ifndef MIPS_MACHINE_FUNCTION_INFO_H
154215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#define MIPS_MACHINE_FUNCTION_INFO_H
164215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
17a76220a40c1fcb0aa986a2ea2c129b7549e84c3eAkira Hatanaka#include "MipsSubtarget.h"
182d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFrameInfo.h"
19a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/CodeGen/MachineFunction.h"
20a76220a40c1fcb0aa986a2ea2c129b7549e84c3eAkira Hatanaka#include "llvm/Target/TargetFrameLowering.h"
21a76220a40c1fcb0aa986a2ea2c129b7549e84c3eAkira Hatanaka#include "llvm/Target/TargetMachine.h"
2279aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include <utility>
234215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
244215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesnamespace llvm {
254215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
264215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes/// MipsFunctionInfo - This class is derived from MachineFunction private
274215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes/// Mips target-specific information for each MachineFunction.
284215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesclass MipsFunctionInfo : public MachineFunctionInfo {
292d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
304215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
3121afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka  MachineFunction& MF;
32225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// SRetReturnReg - Some subtargets require that sret lowering includes
33225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// returning the value of the returned struct in a register. This field
34225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// holds the virtual register into which the sret argument is passed.
35225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  unsigned SRetReturnReg;
36225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes
379911405183f8596fe9d521467f83f6652a296cf4Dan Gohman  /// GlobalBaseReg - keeps track of the virtual register initialized for
389911405183f8596fe9d521467f83f6652a296cf4Dan Gohman  /// use as the global base register. This is used for PIC in some PIC
399911405183f8596fe9d521467f83f6652a296cf4Dan Gohman  /// relocation models.
409911405183f8596fe9d521467f83f6652a296cf4Dan Gohman  unsigned GlobalBaseReg;
419911405183f8596fe9d521467f83f6652a296cf4Dan Gohman
42f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler  /// Mips16SPAliasReg - keeps track of the virtual register initialized for
43f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler  /// use as an alias for SP for use in load/store of halfword/byte from/to
44f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler  /// the stack
45f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler  unsigned Mips16SPAliasReg;
46f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler
471e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  /// VarArgsFrameIndex - FrameIndex for start of varargs area.
481e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int VarArgsFrameIndex;
491e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
507085221a593ac5cb2478a4f81e0f7212616a9afbAkira Hatanaka  /// True if function has a byval argument.
51b33b34a7dc447cf52702b8892c9829344e81f73aAkira Hatanaka  bool HasByvalArg;
52b33b34a7dc447cf52702b8892c9829344e81f73aAkira Hatanaka
537085221a593ac5cb2478a4f81e0f7212616a9afbAkira Hatanaka  /// Size of incoming argument area.
54294166d541fd634fea09fb1fe48457536ef43ed0Akira Hatanaka  unsigned IncomingArgSize;
55294166d541fd634fea09fb1fe48457536ef43ed0Akira Hatanaka
56544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka  /// CallsEhReturn - Whether the function calls llvm.eh.return.
57544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka  bool CallsEhReturn;
58544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka
59544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka  /// Frame objects for spilling eh data registers.
60544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka  int EhDataRegFI[4];
61544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka
624215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopespublic:
63acf1d482bff0eb8e9a3562a1f53033a53baf3727Che-Liang Chiou  MipsFunctionInfo(MachineFunction& MF)
64f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler   : MF(MF), SRetReturnReg(0), GlobalBaseReg(0), Mips16SPAliasReg(0),
65544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka     VarArgsFrameIndex(0), CallsEhReturn(false)
664215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  {}
674215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
68225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  unsigned getSRetReturnReg() const { return SRetReturnReg; }
69225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
709911405183f8596fe9d521467f83f6652a296cf4Dan Gohman
71648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka  bool globalBaseRegSet() const;
72648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka  unsigned getGlobalBaseReg();
731e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
74f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler  bool mips16SPAliasRegSet() const;
75f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler  unsigned getMips16SPAliasReg();
76f99998a2b0a6c186b3a1b6ad7bfa488009a0c5f5Reed Kotler
771e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
781e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
79da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka
80b33b34a7dc447cf52702b8892c9829344e81f73aAkira Hatanaka  bool hasByvalArg() const { return HasByvalArg; }
817085221a593ac5cb2478a4f81e0f7212616a9afbAkira Hatanaka  void setFormalArgInfo(unsigned Size, bool HasByval) {
827085221a593ac5cb2478a4f81e0f7212616a9afbAkira Hatanaka    IncomingArgSize = Size;
83b33b34a7dc447cf52702b8892c9829344e81f73aAkira Hatanaka    HasByvalArg = HasByval;
84b33b34a7dc447cf52702b8892c9829344e81f73aAkira Hatanaka  }
85294166d541fd634fea09fb1fe48457536ef43ed0Akira Hatanaka
86294166d541fd634fea09fb1fe48457536ef43ed0Akira Hatanaka  unsigned getIncomingArgSize() const { return IncomingArgSize; }
87544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka
88544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka  bool callsEhReturn() const { return CallsEhReturn; }
89544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka  void setCallsEhReturn() { CallsEhReturn = true; }
90544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka
91544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka  void createEhDataRegsFI();
92544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka  int getEhDataRegFI(unsigned Reg) const { return EhDataRegFI[Reg]; }
93544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka  bool isEhDataRegFI(int FI) const;
94544cc21cf4807116251a699d8b1d3d4bace21597Akira Hatanaka
954215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes};
964215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
974215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes} // end of namespace llvm
984215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
992d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#endif // MIPS_MACHINE_FUNCTION_INFO_H
100