| //===- MipsCallLowering.h ---------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| /// \file |
| /// This file describes how to lower LLVM calls to machine code calls. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_MIPS_MIPSCALLLOWERING_H |
| #define LLVM_LIB_TARGET_MIPS_MIPSCALLLOWERING_H |
| |
| #include "llvm/CodeGen/GlobalISel/CallLowering.h" |
| |
| namespace llvm { |
| |
| class MipsTargetLowering; |
| |
| class MipsCallLowering : public CallLowering { |
| |
| public: |
| class MipsHandler { |
| public: |
| MipsHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI) |
| : MIRBuilder(MIRBuilder), MRI(MRI) {} |
| |
| virtual ~MipsHandler() = default; |
| |
| protected: |
| bool assign(const CCValAssign &VA, unsigned vreg); |
| |
| MachineIRBuilder &MIRBuilder; |
| MachineRegisterInfo &MRI; |
| |
| private: |
| virtual unsigned getStackAddress(uint64_t Size, int64_t Offset, |
| MachinePointerInfo &MPO) = 0; |
| |
| virtual void assignValueToReg(unsigned ValVReg, unsigned PhysReg) = 0; |
| |
| virtual void assignValueToAddress(unsigned ValVReg, unsigned Addr, |
| uint64_t Size, |
| MachinePointerInfo &MPO) = 0; |
| }; |
| |
| MipsCallLowering(const MipsTargetLowering &TLI); |
| |
| bool lowerReturn(MachineIRBuilder &MIRBuiler, const Value *Val, |
| unsigned VReg) const override; |
| |
| bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F, |
| ArrayRef<unsigned> VRegs) const override; |
| |
| bool lowerCall(MachineIRBuilder &MIRBuilder, CallingConv::ID CallConv, |
| const MachineOperand &Callee, const ArgInfo &OrigRet, |
| ArrayRef<ArgInfo> OrigArgs) const override; |
| |
| private: |
| using FunTy = |
| std::function<void(ISD::ArgFlagsTy flags, EVT vt, EVT argvt, bool used, |
| unsigned origIdx, unsigned partOffs)>; |
| |
| /// Based on registers available on target machine split or extend |
| /// type if needed, also change pointer type to appropriate integer |
| /// type. Lambda will fill some info so we can tell MipsCCState to |
| /// assign physical registers. |
| void subTargetRegTypeForCallingConv(MachineIRBuilder &MIRBuilder, |
| ArrayRef<ArgInfo> Args, |
| ArrayRef<unsigned> OrigArgIndices, |
| const FunTy &PushBack) const; |
| |
| /// Split structures and arrays, save original argument indices since |
| /// Mips calling conv needs info about original argument type. |
| void splitToValueTypes(const ArgInfo &OrigArg, unsigned OriginalIndex, |
| SmallVectorImpl<ArgInfo> &SplitArgs, |
| SmallVectorImpl<unsigned> &SplitArgsOrigIndices) const; |
| }; |
| |
| } // end namespace llvm |
| |
| #endif // LLVM_LIB_TARGET_MIPS_MIPSCALLLOWERING_H |