mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
47a4ab84fe
argument registers on the callee's stack frame, along with functions that set and get it. It is not necessary to add the size of this area when computing stack size in emitPrologue, since it has already been accounted for in PEI::calculateFrameObjectOffsets. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144549 91177308-0d34-0410-b5e6-96231b3b80d8
108 lines
3.8 KiB
C++
108 lines
3.8 KiB
C++
//===-- MipsMachineFunctionInfo.h - Private data used for Mips ----*- C++ -*-=//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares the Mips specific subclass of MachineFunctionInfo.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef MIPS_MACHINE_FUNCTION_INFO_H
|
|
#define MIPS_MACHINE_FUNCTION_INFO_H
|
|
|
|
#include <utility>
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/ADT/VectorExtras.h"
|
|
#include "llvm/CodeGen/MachineFunction.h"
|
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// MipsFunctionInfo - This class is derived from MachineFunction private
|
|
/// Mips target-specific information for each MachineFunction.
|
|
class MipsFunctionInfo : public MachineFunctionInfo {
|
|
|
|
private:
|
|
MachineFunction& MF;
|
|
/// SRetReturnReg - Some subtargets require that sret lowering includes
|
|
/// returning the value of the returned struct in a register. This field
|
|
/// holds the virtual register into which the sret argument is passed.
|
|
unsigned SRetReturnReg;
|
|
|
|
/// GlobalBaseReg - keeps track of the virtual register initialized for
|
|
/// use as the global base register. This is used for PIC in some PIC
|
|
/// relocation models.
|
|
unsigned GlobalBaseReg;
|
|
|
|
/// VarArgsFrameIndex - FrameIndex for start of varargs area.
|
|
int VarArgsFrameIndex;
|
|
|
|
// Range of frame object indices.
|
|
// InArgFIRange: Range of indices of all frame objects created during call to
|
|
// LowerFormalArguments.
|
|
// OutArgFIRange: Range of indices of all frame objects created during call to
|
|
// LowerCall except for the frame object for restoring $gp.
|
|
std::pair<int, int> InArgFIRange, OutArgFIRange;
|
|
int GPFI; // Index of the frame object for restoring $gp
|
|
mutable int DynAllocFI; // Frame index of dynamically allocated stack area.
|
|
unsigned MaxCallFrameSize;
|
|
|
|
public:
|
|
MipsFunctionInfo(MachineFunction& MF)
|
|
: MF(MF), SRetReturnReg(0), GlobalBaseReg(0),
|
|
VarArgsFrameIndex(0), InArgFIRange(std::make_pair(-1, 0)),
|
|
OutArgFIRange(std::make_pair(-1, 0)), GPFI(0), DynAllocFI(0),
|
|
MaxCallFrameSize(0)
|
|
{}
|
|
|
|
bool isInArgFI(int FI) const {
|
|
return FI <= InArgFIRange.first && FI >= InArgFIRange.second;
|
|
}
|
|
void setLastInArgFI(int FI) { InArgFIRange.second = FI; }
|
|
|
|
bool isOutArgFI(int FI) const {
|
|
return FI <= OutArgFIRange.first && FI >= OutArgFIRange.second;
|
|
}
|
|
void extendOutArgFIRange(int FirstFI, int LastFI) {
|
|
if (!OutArgFIRange.second)
|
|
// this must be the first time this function was called.
|
|
OutArgFIRange.first = FirstFI;
|
|
OutArgFIRange.second = LastFI;
|
|
}
|
|
|
|
int getGPFI() const { return GPFI; }
|
|
void setGPFI(int FI) { GPFI = FI; }
|
|
bool needGPSaveRestore() const { return getGPFI(); }
|
|
bool isGPFI(int FI) const { return GPFI && GPFI == FI; }
|
|
|
|
// The first call to this function creates a frame object for dynamically
|
|
// allocated stack area.
|
|
int getDynAllocFI() const {
|
|
if (!DynAllocFI)
|
|
DynAllocFI = MF.getFrameInfo()->CreateFixedObject(4, 0, true);
|
|
|
|
return DynAllocFI;
|
|
}
|
|
bool isDynAllocFI(int FI) const { return DynAllocFI && DynAllocFI == FI; }
|
|
|
|
unsigned getSRetReturnReg() const { return SRetReturnReg; }
|
|
void setSRetReturnReg(unsigned Reg) { SRetReturnReg = Reg; }
|
|
|
|
unsigned getGlobalBaseReg() const { return GlobalBaseReg; }
|
|
void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; }
|
|
|
|
int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
|
|
void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
|
|
|
|
unsigned getMaxCallFrameSize() const { return MaxCallFrameSize; }
|
|
void setMaxCallFrameSize(unsigned S) { MaxCallFrameSize = S; }
|
|
};
|
|
|
|
} // end of namespace llvm
|
|
|
|
#endif // MIPS_MACHINE_FUNCTION_INFO_H
|