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