blob: 97f8c85b9e799228b55d8741c18eb46f33bbd681 [file] [log] [blame]
Tom Stellard000c5af2016-04-14 19:09:28 +00001//===- lib/Target/AMDGPU/AMDGPUCallLowering.h - Call lowering -*- 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
Tom Stellard000c5af2016-04-14 19:09:28 +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_AMDGPU_AMDGPUCALLLOWERING_H
15#define LLVM_LIB_TARGET_AMDGPU_AMDGPUCALLLOWERING_H
16
Yaxun Liu1a14bfa2017-03-27 14:04:01 +000017#include "AMDGPU.h"
Tom Stellard000c5af2016-04-14 19:09:28 +000018#include "llvm/CodeGen/GlobalISel/CallLowering.h"
19
20namespace llvm {
21
22class AMDGPUTargetLowering;
23
24class AMDGPUCallLowering: public CallLowering {
Matt Arsenaultfaeaedf2019-06-24 16:16:12 +000025 Register lowerParameterPtr(MachineIRBuilder &MIRBuilder, Type *ParamTy,
Matt Arsenault29f30372018-07-05 17:01:20 +000026 uint64_t Offset) const;
Tom Stellardca166212017-01-30 21:56:46 +000027
28 void lowerParameter(MachineIRBuilder &MIRBuilder, Type *ParamTy,
Matt Arsenault29f30372018-07-05 17:01:20 +000029 uint64_t Offset, unsigned Align,
Matt Arsenaulte3a676e2019-06-24 15:50:29 +000030 Register DstReg) const;
Tom Stellardca166212017-01-30 21:56:46 +000031
Matt Arsenaultfecf43e2019-07-19 14:15:18 +000032 /// A function of this type is used to perform value split action.
33 using SplitArgTy = std::function<void(ArrayRef<Register>, LLT, LLT)>;
34
35 void splitToValueTypes(const ArgInfo &OrigArgInfo,
36 SmallVectorImpl<ArgInfo> &SplitArgs,
37 const DataLayout &DL, MachineRegisterInfo &MRI,
38 CallingConv::ID CallConv,
39 SplitArgTy SplitArg) const;
40
41public:
Tom Stellard000c5af2016-04-14 19:09:28 +000042 AMDGPUCallLowering(const AMDGPUTargetLowering &TLI);
43
Alexander Ivchenko49168f62018-08-02 08:33:31 +000044 bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val,
Matt Arsenaulte3a676e2019-06-24 15:50:29 +000045 ArrayRef<Register> VRegs) const override;
Matt Arsenaultb725d272019-07-11 14:18:25 +000046
47 bool lowerFormalArgumentsKernel(MachineIRBuilder &MIRBuilder,
48 const Function &F,
49 ArrayRef<ArrayRef<Register>> VRegs) const;
50
Tim Northover862758ec2016-09-21 12:57:35 +000051 bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F,
Diana Picusc3dbe232019-06-27 08:54:17 +000052 ArrayRef<ArrayRef<Register>> VRegs) const override;
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +000053 static CCAssignFn *CCAssignFnForCall(CallingConv::ID CC, bool IsVarArg);
54 static CCAssignFn *CCAssignFnForReturn(CallingConv::ID CC, bool IsVarArg);
Tom Stellard000c5af2016-04-14 19:09:28 +000055};
56} // End of namespace llvm;
57#endif