MipsMachineFunction.h revision 2d4575ea5aa68465d8440d5cbeeac702ba8114b2
14215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//===-- MipsMachineFunctionInfo.h - Private data used for Mips ----*- C++ -*-=//
24215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//
34215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//                     The LLVM Compiler Infrastructure
44215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes//
54215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// This file was developed by Bruno Cardoso Lopes and is distributed under
64215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes// the University of Illinois Open Source 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:
284215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  /// Holds for each function where on the stack
294215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  /// the Frame Pointer must be saved
304215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  int FPStackOffset;
314215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
324215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  /// Holds for each function where on the stack
334215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  /// the Return Address must be 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
462d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  // On LowerFORMAL_ARGUMENTS the stack size is unknown,
472d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  // so the Stack Pointer Offset calculation of "not in
482d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  // register arguments" must be postponed to emitPrologue.
492d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  SmallVector<MipsFIHolder, 16> FnLoadArgs;
502d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  bool HasLoadArgs;
512d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
522d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  // When VarArgs, we must write registers back to caller
532d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  // stack, preserving on register arguments. Since the
542d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  // stack size is unknown on LowerFORMAL_ARGUMENTS,
552d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  // the Stack Pointer Offset calculation must be
562d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  // postponed to emitPrologue.
572d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  SmallVector<MipsFIHolder, 4> FnStoreVarArgs;
582d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  bool HasStoreVarArgs;
592d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
604215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopespublic:
614215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  MipsFunctionInfo(MachineFunction& MF)
622d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  : FPStackOffset(0), RAStackOffset(0),
632d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    HasLoadArgs(false), HasStoreVarArgs(false)
644215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  {}
654215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
664215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  int getFPStackOffset() const { return FPStackOffset; }
674215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  void setFPStackOffset(int Off) { FPStackOffset = Off; }
684215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
694215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  int getRAStackOffset() const { return RAStackOffset; }
704215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  void setRAStackOffset(int Off) { RAStackOffset = Off; }
714215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
724215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  int getTopSavedRegOffset() const {
734215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes    return (RAStackOffset > FPStackOffset) ?
744215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes           (RAStackOffset) : (FPStackOffset);
754215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes  }
762d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
772d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  bool hasLoadArgs() const { return HasLoadArgs; }
782d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  bool hasStoreVarArgs() const { return HasStoreVarArgs; }
792d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
802d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  void recordLoadArgsFI(int FI, int SPOffset) {
812d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    if (!HasLoadArgs) HasLoadArgs=true;
822d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    FnLoadArgs.push_back(MipsFIHolder(FI, SPOffset));
832d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  }
842d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  void recordStoreVarArgsFI(int FI, int SPOffset) {
852d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    if (!HasStoreVarArgs) HasStoreVarArgs=true;
862d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    FnStoreVarArgs.push_back(MipsFIHolder(FI, SPOffset));
872d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  }
882d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
892d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  void adjustLoadArgsFI(MachineFrameInfo *MFI) const {
902d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    if (!hasLoadArgs()) return;
912d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    for (unsigned i = 0, e = FnLoadArgs.size(); i != e; ++i)
922d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes      MFI->setObjectOffset( FnLoadArgs[i].FI, FnLoadArgs[i].SPOffset );
932d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  }
942d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  void adjustStoreVarArgsFI(MachineFrameInfo *MFI) const {
952d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    if (!hasStoreVarArgs()) return;
962d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes    for (unsigned i = 0, e = FnStoreVarArgs.size(); i != e; ++i)
972d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes      MFI->setObjectOffset( FnStoreVarArgs[i].FI, FnStoreVarArgs[i].SPOffset );
982d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes  }
992d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes
1004215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes};
1014215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
1024215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes} // end of namespace llvm
1034215a59a76d2b2dcbc1d2447792f8efb4a0087fdBruno Cardoso Lopes
1042d4575ea5aa68465d8440d5cbeeac702ba8114b2Bruno Cardoso Lopes#endif // MIPS_MACHINE_FUNCTION_INFO_H
105