104eeddc0SDimitry Andric //===-- M68kCallLowering.h - Call lowering ----------------------*- C++ -*-===// 2349cc55cSDimitry Andric // 3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6349cc55cSDimitry Andric // 7349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8349cc55cSDimitry Andric // 9349cc55cSDimitry Andric /// \file 10349cc55cSDimitry Andric /// This file implements the lowering of LLVM calls to machine code calls for 11349cc55cSDimitry Andric /// GlobalISel. 12349cc55cSDimitry Andric // 13349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 14349cc55cSDimitry Andric 15349cc55cSDimitry Andric #ifndef LLVM_LIB_TARGET_M68K_GLSEL_M68KCALLLOWERING_H 16349cc55cSDimitry Andric #define LLVM_LIB_TARGET_M68K_GLSEL_M68KCALLLOWERING_H 17349cc55cSDimitry Andric 18349cc55cSDimitry Andric #include "llvm/CodeGen/CallingConvLower.h" 19349cc55cSDimitry Andric #include "llvm/CodeGen/GlobalISel/CallLowering.h" 20349cc55cSDimitry Andric #include "llvm/CodeGen/ValueTypes.h" 21349cc55cSDimitry Andric 22349cc55cSDimitry Andric namespace llvm { 23349cc55cSDimitry Andric 24349cc55cSDimitry Andric class M68kTargetLowering; 2581ad6265SDimitry Andric class MachineInstrBuilder; 26349cc55cSDimitry Andric 27349cc55cSDimitry Andric class M68kCallLowering : public CallLowering { 28349cc55cSDimitry Andric // TODO: We are only supporting return instruction with no value at this time 29349cc55cSDimitry Andric // point 30349cc55cSDimitry Andric 31349cc55cSDimitry Andric public: 32349cc55cSDimitry Andric M68kCallLowering(const M68kTargetLowering &TLI); 33349cc55cSDimitry Andric 34349cc55cSDimitry Andric bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val, 35349cc55cSDimitry Andric ArrayRef<Register> VRegs, FunctionLoweringInfo &FLI, 36349cc55cSDimitry Andric Register SwiftErrorVReg) const override; 37349cc55cSDimitry Andric 38349cc55cSDimitry Andric bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F, 39349cc55cSDimitry Andric ArrayRef<ArrayRef<Register>> VRegs, 40349cc55cSDimitry Andric FunctionLoweringInfo &FLI) const override; 41349cc55cSDimitry Andric 42349cc55cSDimitry Andric bool lowerCall(MachineIRBuilder &MIRBuilder, 43349cc55cSDimitry Andric CallLoweringInfo &Info) const override; 44349cc55cSDimitry Andric 45349cc55cSDimitry Andric bool enableBigEndian() const override; 46349cc55cSDimitry Andric }; 47349cc55cSDimitry Andric struct M68kIncomingValueHandler : public CallLowering::IncomingValueHandler { M68kIncomingValueHandlerM68kIncomingValueHandler48349cc55cSDimitry Andric M68kIncomingValueHandler(MachineIRBuilder &MIRBuilder, 49349cc55cSDimitry Andric MachineRegisterInfo &MRI) 50349cc55cSDimitry Andric : CallLowering::IncomingValueHandler(MIRBuilder, MRI) {} 51349cc55cSDimitry Andric 52349cc55cSDimitry Andric uint64_t StackUsed; 53349cc55cSDimitry Andric 54349cc55cSDimitry Andric private: 55349cc55cSDimitry Andric void assignValueToReg(Register ValVReg, Register PhysReg, 56*5f757f3fSDimitry Andric const CCValAssign &VA) override; 57349cc55cSDimitry Andric 58349cc55cSDimitry Andric void assignValueToAddress(Register ValVReg, Register Addr, LLT MemTy, 59*5f757f3fSDimitry Andric const MachinePointerInfo &MPO, 60*5f757f3fSDimitry Andric const CCValAssign &VA) override; 61349cc55cSDimitry Andric 62349cc55cSDimitry Andric Register getStackAddress(uint64_t Size, int64_t Offset, 63349cc55cSDimitry Andric MachinePointerInfo &MPO, 64349cc55cSDimitry Andric ISD::ArgFlagsTy Flags) override; 65349cc55cSDimitry Andric }; 66349cc55cSDimitry Andric } // end namespace llvm 67349cc55cSDimitry Andric 68349cc55cSDimitry Andric #endif // LLVM_LIB_TARGET_M68K_GLSEL_M68KCALLLOWERING_H 69