Home | History | Annotate | Download | only in ARM
      1 //===- llvm/lib/Target/ARM/ARMCallLowering.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_ARM_ARMCALLLOWERING_H
     16 #define LLVM_LIB_TARGET_ARM_ARMCALLLOWERING_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 ARMTargetLowering;
     27 class MachineFunction;
     28 class MachineInstrBuilder;
     29 class MachineIRBuilder;
     30 class Value;
     31 
     32 class ARMCallLowering : public CallLowering {
     33 public:
     34   ARMCallLowering(const ARMTargetLowering &TLI);
     35 
     36   bool lowerReturn(MachineIRBuilder &MIRBuiler, const Value *Val,
     37                    unsigned VReg) const override;
     38 
     39   bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F,
     40                             ArrayRef<unsigned> VRegs) const override;
     41 
     42   bool lowerCall(MachineIRBuilder &MIRBuilder, CallingConv::ID CallConv,
     43                  const MachineOperand &Callee, const ArgInfo &OrigRet,
     44                  ArrayRef<ArgInfo> OrigArgs) const override;
     45 
     46 private:
     47   bool lowerReturnVal(MachineIRBuilder &MIRBuilder, const Value *Val,
     48                       unsigned VReg, MachineInstrBuilder &Ret) const;
     49 
     50   using SplitArgTy = std::function<void(unsigned Reg, uint64_t Offset)>;
     51 
     52   /// Split an argument into one or more arguments that the CC lowering can cope
     53   /// with (e.g. replace pointers with integers).
     54   void splitToValueTypes(const ArgInfo &OrigArg,
     55                          SmallVectorImpl<ArgInfo> &SplitArgs,
     56                          MachineFunction &MF,
     57                          const SplitArgTy &PerformArgSplit) const;
     58 };
     59 
     60 } // end namespace llvm
     61 
     62 #endif // LLVM_LIB_TARGET_ARM_ARMCALLLOWERING_H
     63