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
21namespace llvm {
22
23namespace WebAssemblyISD {
24
25enum 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
34class WebAssemblySubtarget;
35class WebAssemblyTargetMachine;
36
37class WebAssemblyTargetLowering final : public TargetLowering {
38public:
39  WebAssemblyTargetLowering(const TargetMachine &TM,
40                            const WebAssemblySubtarget &STI);
41
42private:
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
86namespace WebAssembly {
87FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
88                         const TargetLibraryInfo *libInfo);
89} // end namespace WebAssembly
90
91} // end namespace llvm
92
93#endif
94