Line data Source code
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 : /// 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/CodeGen/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 246 : 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 : MachineBasicBlock *
52 : EmitInstrWithCustomInserter(MachineInstr &MI,
53 : MachineBasicBlock *MBB) const override;
54 : const char *getTargetNodeName(unsigned Opcode) const override;
55 : std::pair<unsigned, const TargetRegisterClass *> getRegForInlineAsmConstraint(
56 : const TargetRegisterInfo *TRI, StringRef Constraint,
57 : MVT VT) const override;
58 : bool isCheapToSpeculateCttz() const override;
59 : bool isCheapToSpeculateCtlz() const override;
60 : bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
61 : unsigned AS,
62 : Instruction *I = nullptr) const override;
63 : bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace, unsigned Align,
64 : bool *Fast) const override;
65 : bool isIntDivCheap(EVT VT, AttributeList Attr) const override;
66 :
67 : EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
68 : EVT VT) const override;
69 :
70 : SDValue LowerCall(CallLoweringInfo &CLI,
71 : SmallVectorImpl<SDValue> &InVals) const override;
72 : bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
73 : bool isVarArg,
74 : const SmallVectorImpl<ISD::OutputArg> &Outs,
75 : LLVMContext &Context) const override;
76 : SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
77 : const SmallVectorImpl<ISD::OutputArg> &Outs,
78 : const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
79 : SelectionDAG &DAG) const override;
80 : SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
81 : bool IsVarArg,
82 : const SmallVectorImpl<ISD::InputArg> &Ins,
83 : const SDLoc &DL, SelectionDAG &DAG,
84 : SmallVectorImpl<SDValue> &InVals) const override;
85 :
86 : // Custom lowering hooks.
87 : SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
88 : SDValue LowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
89 : SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
90 : SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
91 : SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
92 : SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
93 : SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
94 : SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
95 : SDValue LowerCopyToReg(SDValue Op, SelectionDAG &DAG) const;
96 : SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
97 : };
98 :
99 : namespace WebAssembly {
100 : FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
101 : const TargetLibraryInfo *libInfo);
102 : } // end namespace WebAssembly
103 :
104 : } // end namespace llvm
105 :
106 : #endif
|