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
174215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#include "llvm/CodeGen/MachineFunction.h"
182d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFrameInfo.h"
1979aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include <utility>
204215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
214215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesnamespace llvm {
224215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
234215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes/// MipsFunctionInfo - This class is derived from MachineFunction private
244215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes/// Mips target-specific information for each MachineFunction.
254215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesclass MipsFunctionInfo : public MachineFunctionInfo {
262d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
274215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
2821afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka  MachineFunction& MF;
29225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// SRetReturnReg - Some subtargets require that sret lowering includes
30225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// returning the value of the returned struct in a register. This field
31225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// holds the virtual register into which the sret argument is passed.
32225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  unsigned SRetReturnReg;
33225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes
349911405183f8596fe9d521467f83f6652a296cf4Dan Gohman  /// GlobalBaseReg - keeps track of the virtual register initialized for
359911405183f8596fe9d521467f83f6652a296cf4Dan Gohman  /// use as the global base register. This is used for PIC in some PIC
369911405183f8596fe9d521467f83f6652a296cf4Dan Gohman  /// relocation models.
379911405183f8596fe9d521467f83f6652a296cf4Dan Gohman  unsigned GlobalBaseReg;
389911405183f8596fe9d521467f83f6652a296cf4Dan Gohman
391e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  /// VarArgsFrameIndex - FrameIndex for start of varargs area.
401e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int VarArgsFrameIndex;
411e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
42da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  // Range of frame object indices.
43da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  // InArgFIRange: Range of indices of all frame objects created during call to
44da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  //               LowerFormalArguments.
45da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  // OutArgFIRange: Range of indices of all frame objects created during call to
46bb481f882093fb738d2bb15610c79364bada5496Jia Liu  //                LowerCall except for the frame object for restoring $gp.
47da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  std::pair<int, int> InArgFIRange, OutArgFIRange;
48bb481f882093fb738d2bb15610c79364bada5496Jia Liu  int GPFI; // Index of the frame object for restoring $gp
49bb481f882093fb738d2bb15610c79364bada5496Jia Liu  mutable int DynAllocFI; // Frame index of dynamically allocated stack area.
50f15f49850768f5889c2e12aeb273e158597a1223Akira Hatanaka  unsigned MaxCallFrameSize;
514e694c96f1c0c2d09a287ff69bab5896e04dd3fdBruno Cardoso Lopes
5295f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka  bool EmitNOAT;
5395f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka
544215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopespublic:
55acf1d482bff0eb8e9a3562a1f53033a53baf3727Che-Liang Chiou  MipsFunctionInfo(MachineFunction& MF)
5621afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka  : MF(MF), SRetReturnReg(0), GlobalBaseReg(0),
57da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka    VarArgsFrameIndex(0), InArgFIRange(std::make_pair(-1, 0)),
5821afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka    OutArgFIRange(std::make_pair(-1, 0)), GPFI(0), DynAllocFI(0),
5995f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka    MaxCallFrameSize(0), EmitNOAT(false)
604215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  {}
614215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
62da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  bool isInArgFI(int FI) const {
63da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka    return FI <= InArgFIRange.first && FI >= InArgFIRange.second;
64da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  }
65da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  void setLastInArgFI(int FI) { InArgFIRange.second = FI; }
66da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka
67bb481f882093fb738d2bb15610c79364bada5496Jia Liu  bool isOutArgFI(int FI) const {
68da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka    return FI <= OutArgFIRange.first && FI >= OutArgFIRange.second;
69da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  }
70da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  void extendOutArgFIRange(int FirstFI, int LastFI) {
71da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka    if (!OutArgFIRange.second)
72da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka      // this must be the first time this function was called.
73da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka      OutArgFIRange.first = FirstFI;
74da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka    OutArgFIRange.second = LastFI;
75da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  }
76da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka
7769c19f7316ed8e545c7339421b910543eb8e9eefAkira Hatanaka  int getGPFI() const { return GPFI; }
7869c19f7316ed8e545c7339421b910543eb8e9eefAkira Hatanaka  void setGPFI(int FI) { GPFI = FI; }
7969c19f7316ed8e545c7339421b910543eb8e9eefAkira Hatanaka  bool needGPSaveRestore() const { return getGPFI(); }
80da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka  bool isGPFI(int FI) const { return GPFI && GPFI == FI; }
810a6040063fd9419041a81ada8f75b389381eb6b9Bruno Cardoso Lopes
8221afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka  // The first call to this function creates a frame object for dynamically
8321afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka  // allocated stack area.
8421afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka  int getDynAllocFI() const {
8521afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka    if (!DynAllocFI)
8621afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka      DynAllocFI = MF.getFrameInfo()->CreateFixedObject(4, 0, true);
8721afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka
8821afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka    return DynAllocFI;
8921afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka  }
9021afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka  bool isDynAllocFI(int FI) const { return DynAllocFI && DynAllocFI == FI; }
9121afc63ea7b8227ccb1b735255be55bf422136d6Akira Hatanaka
92225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  unsigned getSRetReturnReg() const { return SRetReturnReg; }
93225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
949911405183f8596fe9d521467f83f6652a296cf4Dan Gohman
95648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka  bool globalBaseRegFixed() const;
96648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka  bool globalBaseRegSet() const;
97648f00c2f0eb29c0ae2a333fa0bfa55970059f08Akira Hatanaka  unsigned getGlobalBaseReg();
981e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
991e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
1001e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman  void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
101da0a3571d635ca2b6f58929217995c1700200485Akira Hatanaka
102f15f49850768f5889c2e12aeb273e158597a1223Akira Hatanaka  unsigned getMaxCallFrameSize() const { return MaxCallFrameSize; }
103f15f49850768f5889c2e12aeb273e158597a1223Akira Hatanaka  void setMaxCallFrameSize(unsigned S) { MaxCallFrameSize = S; }
10495f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka
10595f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka  bool getEmitNOAT() const { return EmitNOAT; }
10695f95a783f9acf822a58132851016c953a2ef1f7Akira Hatanaka  void setEmitNOAT() { EmitNOAT = true; }
1074215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes};
1084215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
1094215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes} // end of namespace llvm
1104215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
1112d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#endif // MIPS_MACHINE_FUNCTION_INFO_H
112