blob: 05c703b60bd69acc4eb1a0bc681a43353a642b18 [file] [log] [blame]
Petar Jovanovicfac93e22018-02-23 11:06:40 +00001//===- MipsCallLowering.h ---------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Petar Jovanovicfac93e22018-02-23 11:06:40 +00006//
7//===----------------------------------------------------------------------===//
8//
9/// \file
10/// This file describes how to lower LLVM calls to machine code calls.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_MIPS_MIPSCALLLOWERING_H
15#define LLVM_LIB_TARGET_MIPS_MIPSCALLLOWERING_H
16
Petar Jovanovicfac93e22018-02-23 11:06:40 +000017#include "llvm/CodeGen/GlobalISel/CallLowering.h"
Petar Jovanovicfac93e22018-02-23 11:06:40 +000018
19namespace llvm {
20
21class MipsTargetLowering;
22
23class MipsCallLowering : public CallLowering {
24
25public:
Petar Jovanovic366857a2018-04-11 15:12:32 +000026 class MipsHandler {
27 public:
28 MipsHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI)
29 : MIRBuilder(MIRBuilder), MRI(MRI) {}
30
31 virtual ~MipsHandler() = default;
32
Petar Jovanovicff1bc622018-09-28 13:28:47 +000033 bool handle(ArrayRef<CCValAssign> ArgLocs,
34 ArrayRef<CallLowering::ArgInfo> Args);
35
Petar Jovanovic366857a2018-04-11 15:12:32 +000036 protected:
Petar Jovanovicff1bc622018-09-28 13:28:47 +000037 bool assignVRegs(ArrayRef<unsigned> VRegs, ArrayRef<CCValAssign> ArgLocs,
Petar Avramovic5a457e02019-03-25 11:23:41 +000038 unsigned ArgLocsStartIndex, const EVT &VT);
Petar Jovanovicff1bc622018-09-28 13:28:47 +000039
Petar Avramovic2624c8d2018-11-07 11:45:43 +000040 void setLeastSignificantFirst(SmallVectorImpl<unsigned> &VRegs);
Petar Jovanovic366857a2018-04-11 15:12:32 +000041
42 MachineIRBuilder &MIRBuilder;
43 MachineRegisterInfo &MRI;
Petar Jovanovic226e6112018-07-03 09:31:48 +000044
45 private:
Petar Avramovic5a457e02019-03-25 11:23:41 +000046 bool assign(unsigned VReg, const CCValAssign &VA, const EVT &VT);
Petar Jovanovicff1bc622018-09-28 13:28:47 +000047
Petar Jovanovic65d463b2018-08-23 20:41:09 +000048 virtual unsigned getStackAddress(const CCValAssign &VA,
49 MachineMemOperand *&MMO) = 0;
Petar Jovanovic226e6112018-07-03 09:31:48 +000050
Petar Avramovic5a457e02019-03-25 11:23:41 +000051 virtual void assignValueToReg(unsigned ValVReg, const CCValAssign &VA,
52 const EVT &VT) = 0;
Petar Jovanovic226e6112018-07-03 09:31:48 +000053
Petar Jovanovic65d463b2018-08-23 20:41:09 +000054 virtual void assignValueToAddress(unsigned ValVReg,
55 const CCValAssign &VA) = 0;
Petar Jovanovicff1bc622018-09-28 13:28:47 +000056
57 virtual bool handleSplit(SmallVectorImpl<unsigned> &VRegs,
58 ArrayRef<CCValAssign> ArgLocs,
Petar Avramovic5a457e02019-03-25 11:23:41 +000059 unsigned ArgLocsStartIndex, unsigned ArgsReg,
60 const EVT &VT) = 0;
Petar Jovanovic366857a2018-04-11 15:12:32 +000061 };
62
Petar Jovanovicfac93e22018-02-23 11:06:40 +000063 MipsCallLowering(const MipsTargetLowering &TLI);
64
Alexander Ivchenko49168f62018-08-02 08:33:31 +000065 bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val,
Alexander Ivchenko48eba542018-08-02 08:55:05 +000066 ArrayRef<unsigned> VRegs) const override;
Petar Jovanovicfac93e22018-02-23 11:06:40 +000067
68 bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F,
69 ArrayRef<unsigned> VRegs) const override;
Petar Jovanovic366857a2018-04-11 15:12:32 +000070
Petar Jovanovic326ec322018-06-06 07:24:52 +000071 bool lowerCall(MachineIRBuilder &MIRBuilder, CallingConv::ID CallConv,
72 const MachineOperand &Callee, const ArgInfo &OrigRet,
73 ArrayRef<ArgInfo> OrigArgs) const override;
74
Petar Jovanovic366857a2018-04-11 15:12:32 +000075private:
Petar Jovanovic366857a2018-04-11 15:12:32 +000076 /// Based on registers available on target machine split or extend
77 /// type if needed, also change pointer type to appropriate integer
Petar Jovanovicff1bc622018-09-28 13:28:47 +000078 /// type.
79 template <typename T>
80 void subTargetRegTypeForCallingConv(const Function &F, ArrayRef<ArgInfo> Args,
Petar Jovanovic366857a2018-04-11 15:12:32 +000081 ArrayRef<unsigned> OrigArgIndices,
Petar Jovanovicff1bc622018-09-28 13:28:47 +000082 SmallVectorImpl<T> &ISDArgs) const;
Petar Jovanovic366857a2018-04-11 15:12:32 +000083
84 /// Split structures and arrays, save original argument indices since
Petar Avramovice72a7432018-10-22 13:27:50 +000085 /// Mips calling convention needs info about original argument type.
Petar Jovanovic366857a2018-04-11 15:12:32 +000086 void splitToValueTypes(const ArgInfo &OrigArg, unsigned OriginalIndex,
87 SmallVectorImpl<ArgInfo> &SplitArgs,
88 SmallVectorImpl<unsigned> &SplitArgsOrigIndices) const;
Petar Jovanovicfac93e22018-02-23 11:06:40 +000089};
90
91} // end namespace llvm
92
93#endif // LLVM_LIB_TARGET_MIPS_MIPSCALLLOWERING_H