Home | History | Annotate | Download | only in AArch64
      1 //===- AArch64CallLowering.h - Call lowering --------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 ///
     10 /// \file
     11 /// This file describes how to lower LLVM calls to machine code calls.
     12 ///
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_LIB_TARGET_AARCH64_AARCH64CALLLOWERING_H
     16 #define LLVM_LIB_TARGET_AARCH64_AARCH64CALLLOWERING_H
     17 
     18 #include "llvm/ADT/ArrayRef.h"
     19 #include "llvm/CodeGen/GlobalISel/CallLowering.h"
     20 #include "llvm/IR/CallingConv.h"
     21 #include <cstdint>
     22 #include <functional>
     23 
     24 namespace llvm {
     25 
     26 class AArch64TargetLowering;
     27 class CCValAssign;
     28 class DataLayout;
     29 class MachineIRBuilder;
     30 class MachineRegisterInfo;
     31 class Type;
     32 
     33 class AArch64CallLowering: public CallLowering {
     34 public:
     35   AArch64CallLowering(const AArch64TargetLowering &TLI);
     36 
     37   bool lowerReturn(MachineIRBuilder &MIRBuiler, const Value *Val,
     38                    unsigned VReg) const override;
     39 
     40   bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F,
     41                             ArrayRef<unsigned> VRegs) const override;
     42 
     43   bool lowerCall(MachineIRBuilder &MIRBuilder, CallingConv::ID CallConv,
     44                  const MachineOperand &Callee, const ArgInfo &OrigRet,
     45                  ArrayRef<ArgInfo> OrigArgs) const override;
     46 
     47 private:
     48   using RegHandler = std::function<void(MachineIRBuilder &, Type *, unsigned,
     49                                         CCValAssign &)>;
     50 
     51   using MemHandler =
     52       std::function<void(MachineIRBuilder &, int, CCValAssign &)>;
     53 
     54   using SplitArgTy = std::function<void(unsigned, uint64_t)>;
     55 
     56   void splitToValueTypes(const ArgInfo &OrigArgInfo,
     57                          SmallVectorImpl<ArgInfo> &SplitArgs,
     58                          const DataLayout &DL, MachineRegisterInfo &MRI,
     59                          CallingConv::ID CallConv,
     60                          const SplitArgTy &SplitArg) const;
     61 };
     62 
     63 } // end namespace llvm
     64 
     65 #endif // LLVM_LIB_TARGET_AARCH64_AARCH64CALLLOWERING_H
     66