Home | History | Annotate | Download | only in WebAssembly
      1 //- WebAssemblyISelLowering.h - WebAssembly DAG Lowering Interface -*- 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 /// \brief This file defines the interfaces that WebAssembly uses to lower LLVM
     12 /// code into a selection DAG.
     13 ///
     14 //===----------------------------------------------------------------------===//
     15 
     16 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYISELLOWERING_H
     17 #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYISELLOWERING_H
     18 
     19 #include "llvm/Target/TargetLowering.h"
     20 
     21 namespace llvm {
     22 
     23 namespace WebAssemblyISD {
     24 
     25 enum NodeType : unsigned {
     26   FIRST_NUMBER = ISD::BUILTIN_OP_END,
     27 #define HANDLE_NODETYPE(NODE) NODE,
     28 #include "WebAssemblyISD.def"
     29 #undef HANDLE_NODETYPE
     30 };
     31 
     32 } // end namespace WebAssemblyISD
     33 
     34 class WebAssemblySubtarget;
     35 class WebAssemblyTargetMachine;
     36 
     37 class WebAssemblyTargetLowering final : public TargetLowering {
     38 public:
     39   WebAssemblyTargetLowering(const TargetMachine &TM,
     40                             const WebAssemblySubtarget &STI);
     41 
     42 private:
     43   /// Keep a pointer to the WebAssemblySubtarget around so that we can make the
     44   /// right decision when generating code for different targets.
     45   const WebAssemblySubtarget *Subtarget;
     46 
     47   FastISel *createFastISel(FunctionLoweringInfo &FuncInfo,
     48                            const TargetLibraryInfo *LibInfo) const override;
     49   bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
     50   MVT getScalarShiftAmountTy(const DataLayout &DL, EVT) const override;
     51   const char *getTargetNodeName(unsigned Opcode) const override;
     52   std::pair<unsigned, const TargetRegisterClass *>
     53   getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
     54                                StringRef Constraint, MVT VT) const override;
     55   bool isCheapToSpeculateCttz() const override;
     56   bool isCheapToSpeculateCtlz() const override;
     57   bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
     58                              unsigned AS) const override;
     59 
     60   SDValue LowerCall(CallLoweringInfo &CLI,
     61                     SmallVectorImpl<SDValue> &InVals) const override;
     62   bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
     63                       bool isVarArg,
     64                       const SmallVectorImpl<ISD::OutputArg> &Outs,
     65                       LLVMContext &Context) const override;
     66   SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
     67                       const SmallVectorImpl<ISD::OutputArg> &Outs,
     68                       const SmallVectorImpl<SDValue> &OutVals, SDLoc dl,
     69                       SelectionDAG &DAG) const override;
     70   SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
     71                                bool IsVarArg,
     72                                const SmallVectorImpl<ISD::InputArg> &Ins,
     73                                SDLoc DL, SelectionDAG &DAG,
     74                                SmallVectorImpl<SDValue> &InVals) const override;
     75 
     76   // Custom lowering hooks.
     77   SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
     78   SDValue LowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
     79   SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
     80   SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
     81   SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
     82   SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
     83   SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
     84 };
     85 
     86 namespace WebAssembly {
     87 FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
     88                          const TargetLibraryInfo *libInfo);
     89 } // end namespace WebAssembly
     90 
     91 } // end namespace llvm
     92 
     93 #endif
     94