MipsMachineFunction.h revision 225ca9cdd70de3d12641b0aba7daf6cb568a7ebd
14215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//===-- 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//
84215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//===----------------------------------------------------------------------===//
94215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//
104215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// This file declares the Mips specific subclass of MachineFunctionInfo.
114215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//
124215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//===----------------------------------------------------------------------===//
134215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
144215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#ifndef MIPS_MACHINE_FUNCTION_INFO_H
154215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#define MIPS_MACHINE_FUNCTION_INFO_H
164215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
172d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#include "llvm/ADT/VectorExtras.h"
184215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes#include "llvm/CodeGen/MachineFunction.h"
192d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#include "llvm/CodeGen/MachineFrameInfo.h"
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 {
264215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
274215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopesprivate:
28225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// Holds for each function where on the stack the Frame Pointer must be
29225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// saved.
304215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  int FPStackOffset;
314215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
32225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// Holds for each function where on the stack the Return Address must be
33225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// saved.
344215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  int RAStackOffset;
354215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
362d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  /// MipsFIHolder - Holds a FrameIndex and it's Stack Pointer Offset
372d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  struct MipsFIHolder {
382d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
392d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    int FI;
402d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    int SPOffset;
412d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
422d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    MipsFIHolder(int FrameIndex, int StackPointerOffset)
432d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes      : FI(FrameIndex), SPOffset(StackPointerOffset) {}
442d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  };
452d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
46225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// When PIC is used the GP must be saved on the stack on the function
47225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// prologue and must be reloaded from this stack location after every
48225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// call. A reference to its stack location and frame index must be kept
49225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// to be used on emitPrologue and processFunctionBeforeFrameFinalized.
50c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes  MipsFIHolder GPHolder;
51c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes
52225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  // On LowerFORMAL_ARGUMENTS the stack size is unknown, so the Stack
53225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  // Pointer Offset calculation of "not in register arguments" must be
54225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  // postponed to emitPrologue.
552d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  SmallVector<MipsFIHolder, 16> FnLoadArgs;
562d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  bool HasLoadArgs;
572d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
58225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  // When VarArgs, we must write registers back to caller stack, preserving
59225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  // on register arguments. Since the stack size is unknown on
60225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  // LowerFORMAL_ARGUMENTS, the Stack Pointer Offset calculation must be
612d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  // postponed to emitPrologue.
622d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  SmallVector<MipsFIHolder, 4> FnStoreVarArgs;
632d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  bool HasStoreVarArgs;
642d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
65225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// SRetReturnReg - Some subtargets require that sret lowering includes
66225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// returning the value of the returned struct in a register. This field
67225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  /// holds the virtual register into which the sret argument is passed.
68225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  unsigned SRetReturnReg;
69225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes
704215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopespublic:
714215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  MipsFunctionInfo(MachineFunction& MF)
72225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  : FPStackOffset(0), RAStackOffset(0), GPHolder(-1,-1), HasLoadArgs(false),
73225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes    HasStoreVarArgs(false), SRetReturnReg(0)
744215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  {}
754215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
764215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  int getFPStackOffset() const { return FPStackOffset; }
774215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  void setFPStackOffset(int Off) { FPStackOffset = Off; }
784215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
794215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  int getRAStackOffset() const { return RAStackOffset; }
804215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  void setRAStackOffset(int Off) { RAStackOffset = Off; }
814215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
82c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes  int getGPStackOffset() const { return GPHolder.SPOffset; }
83c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes  int getGPFI() const { return GPHolder.FI; }
84c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes  void setGPStackOffset(int Off) { GPHolder.SPOffset = Off; }
85c7db5618f9e5e708b87d9ae6595b3fd510a2a0c0Bruno Cardoso Lopes  void setGPFI(int FI) { GPHolder.FI = FI; }
860a6040063fd9419041a81ada8f75b389381eb6b9Bruno Cardoso Lopes
874215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  int getTopSavedRegOffset() const {
884215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes    return (RAStackOffset > FPStackOffset) ?
894215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes           (RAStackOffset) : (FPStackOffset);
904215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  }
912d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
922d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  bool hasLoadArgs() const { return HasLoadArgs; }
932d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  bool hasStoreVarArgs() const { return HasStoreVarArgs; }
942d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
952d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  void recordLoadArgsFI(int FI, int SPOffset) {
962d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    if (!HasLoadArgs) HasLoadArgs=true;
972d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    FnLoadArgs.push_back(MipsFIHolder(FI, SPOffset));
982d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  }
992d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  void recordStoreVarArgsFI(int FI, int SPOffset) {
1002d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    if (!HasStoreVarArgs) HasStoreVarArgs=true;
1012d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    FnStoreVarArgs.push_back(MipsFIHolder(FI, SPOffset));
1022d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  }
1032d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
1042d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  void adjustLoadArgsFI(MachineFrameInfo *MFI) const {
1052d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    if (!hasLoadArgs()) return;
1062d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    for (unsigned i = 0, e = FnLoadArgs.size(); i != e; ++i)
1072d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes      MFI->setObjectOffset( FnLoadArgs[i].FI, FnLoadArgs[i].SPOffset );
1082d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  }
1092d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  void adjustStoreVarArgsFI(MachineFrameInfo *MFI) const {
1102d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    if (!hasStoreVarArgs()) return;
1112d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    for (unsigned i = 0, e = FnStoreVarArgs.size(); i != e; ++i)
1122d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes      MFI->setObjectOffset( FnStoreVarArgs[i].FI, FnStoreVarArgs[i].SPOffset );
1132d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  }
1142d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
115225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  unsigned getSRetReturnReg() const { return SRetReturnReg; }
116225ca9cdd70de3d12641b0aba7daf6cb568a7ebdBruno Cardoso Lopes  void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
1174215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes};
1184215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
1194215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes} // end of namespace llvm
1204215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
1212d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#endif // MIPS_MACHINE_FUNCTION_INFO_H
122