[llvm] r245882 - call
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 24 16:32:48 PDT 2015
On Mon, Aug 24, 2015 at 2:59 PM, JF Bastien via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: jfb
> Date: Mon Aug 24 16:59:51 2015
> New Revision: 245882
>
> URL: http://llvm.org/viewvc/llvm-project?rev=245882&view=rev
> Log:
> call
>
(guess you forgot to update this before committing - perhaps you could just
provide a follow up email here with a more descriptive commit message?)
>
> Added:
> llvm/trunk/lib/Target/WebAssembly/WebAssemblyISD.def
> - copied, changed from r245878,
> llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrCall.td
> llvm/trunk/test/CodeGen/WebAssembly/call.ll
> Modified:
>
> llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
> llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.h
> llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
> llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h
> llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrCall.td
> llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrFormats.td
>
> Modified:
> llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp?rev=245882&r1=245881&r2=245882&view=diff
>
> ==============================================================================
> ---
> llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
> (original)
> +++
> llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
> Mon Aug 24 16:59:51 2015
> @@ -44,3 +44,16 @@ void WebAssemblyInstPrinter::printInst(c
> printInstruction(MI, OS);
> printAnnotation(OS, Annot);
> }
> +
> +void WebAssemblyInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
> + raw_ostream &O) {
> + const MCOperand &Op = MI->getOperand(OpNo);
> + if (Op.isReg())
> + O << getRegisterName(Op.getReg());
> + else if (Op.isImm())
> + O << '#' << Op.getImm();
> + else {
> + assert(Op.isExpr() && "unknown operand kind in printOperand");
> + Op.getExpr()->print(O, &MAI);
> + }
> +}
>
> Modified:
> llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.h?rev=245882&r1=245881&r2=245882&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.h
> (original)
> +++ llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.h
> Mon Aug 24 16:59:51 2015
> @@ -32,6 +32,9 @@ public:
> void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot,
> const MCSubtargetInfo &STI) override;
>
> + // Used by tblegen code.
> + void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
> +
> // Autogenerated by tblgen.
> void printInstruction(const MCInst *MI, raw_ostream &O);
> static const char *getRegisterName(unsigned RegNo);
>
> Copied: llvm/trunk/lib/Target/WebAssembly/WebAssemblyISD.def (from
> r245878, llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrCall.td)
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyISD.def?p2=llvm/trunk/lib/Target/WebAssembly/WebAssemblyISD.def&p1=llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrCall.td&r1=245878&r2=245882&rev=245882&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrCall.td (original)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyISD.def Mon Aug 24
> 16:59:51 2015
> @@ -1,4 +1,4 @@
> -//===- WebAssemblyInstrCall.td-WebAssembly Call codegen support -*-
> tablegen -*-
> +//- WebAssemblyISD.def - WebAssembly ISD ---------------------------*-
> C++ -*-//
> //
> // The LLVM Compiler Infrastructure
> //
> @@ -8,14 +8,12 @@
>
> //===----------------------------------------------------------------------===//
> ///
> /// \file
> -/// \brief WebAssembly Call operand code-gen constructs.
> +/// \brief This file describes the various WebAssembly ISD node types.
> ///
>
> //===----------------------------------------------------------------------===//
>
> -/*
> - * TODO(jfb): Add the following.
> - *
> - * call_direct: call function directly
> - * call_indirect: call function indirectly
> - * addressof: obtain a function pointer value for a given function
> - */
> +// NOTE: NO INCLUDE GUARD DESIRED!
> +
> +HANDLE_NODETYPE(CALL)
> +HANDLE_NODETYPE(RETURN)
> +HANDLE_NODETYPE(ARGUMENT)
>
> Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp?rev=245882&r1=245881&r2=245882&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
> (original)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp Mon Aug
> 24 16:59:51 2015
> @@ -19,6 +19,7 @@
> #include "WebAssemblyTargetMachine.h"
> #include "WebAssemblyTargetObjectFile.h"
> #include "llvm/CodeGen/Analysis.h"
> +#include "llvm/CodeGen/CallingConvLower.h"
> #include "llvm/CodeGen/MachineRegisterInfo.h"
> #include "llvm/CodeGen/SelectionDAG.h"
> #include "llvm/IR/DiagnosticInfo.h"
> @@ -164,9 +165,13 @@ MVT WebAssemblyTargetLowering::getScalar
> const char *
> WebAssemblyTargetLowering::getTargetNodeName(unsigned Opcode) const {
> switch (static_cast<WebAssemblyISD::NodeType>(Opcode)) {
> - case WebAssemblyISD::FIRST_NUMBER: break;
> - case WebAssemblyISD::RETURN: return "WebAssemblyISD::RETURN";
> - case WebAssemblyISD::ARGUMENT: return "WebAssemblyISD::ARGUMENT";
> + case WebAssemblyISD::FIRST_NUMBER:
> + break;
> +#define HANDLE_NODETYPE(NODE)
> \
> + case WebAssemblyISD::NODE:
> \
> + return "WebAssemblyISD::" #NODE;
> +#include "WebAssemblyISD.def"
> +#undef HANDLE_NODETYPE
> }
> return nullptr;
> }
> @@ -185,6 +190,68 @@ static void fail(SDLoc DL, SelectionDAG
> DiagnosticInfoUnsupported(DL, *MF.getFunction(), msg, SDValue()));
> }
>
> +SDValue
> +WebAssemblyTargetLowering::LowerCall(CallLoweringInfo &CLI,
> + SmallVectorImpl<SDValue> &InVals)
> const {
> + SelectionDAG &DAG = CLI.DAG;
> + SDLoc DL = CLI.DL;
> + SDValue Chain = CLI.Chain;
> + SDValue Callee = CLI.Callee;
> + MachineFunction &MF = DAG.getMachineFunction();
> +
> + CallingConv::ID CallConv = CLI.CallConv;
> + if (CallConv != CallingConv::C)
> + fail(DL, DAG, "WebAssembly doesn't support non-C calling
> conventions");
> + if (CLI.IsTailCall || MF.getTarget().Options.GuaranteedTailCallOpt)
> + fail(DL, DAG, "WebAssembly doesn't support tail call yet");
> + if (CLI.IsPatchPoint)
> + fail(DL, DAG, "WebAssembly doesn't support patch point yet");
> +
> + SmallVectorImpl<ISD::OutputArg> &Outs = CLI.Outs;
> + SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
> + Type *retTy = CLI.RetTy;
> + bool IsStructRet = (Outs.empty()) ? false : Outs[0].Flags.isSRet();
> + if (IsStructRet)
> + fail(DL, DAG, "WebAssembly doesn't support struct return yet");
> + if (Outs.size() > 1)
> + fail(DL, DAG, "WebAssembly doesn't support more than 1 returned value
> yet");
> +
> + SmallVectorImpl<ISD::InputArg> &Ins = CLI.Ins;
> + ArgListTy &Args = CLI.getArgs();
> + bool IsVarArg = CLI.IsVarArg;
> + if (IsVarArg)
> + fail(DL, DAG, "WebAssembly doesn't support varargs yet");
> + // Analyze operands of the call, assigning locations to each operand.
> + SmallVector<CCValAssign, 16> ArgLocs;
> + CCState CCInfo(CallConv, IsVarArg, MF, ArgLocs, *DAG.getContext());
> + unsigned NumBytes = CCInfo.getNextStackOffset();
> +
> + auto PtrVT = getPointerTy(MF.getDataLayout());
> + auto Zero = DAG.getConstant(0, CLI.DL, PtrVT, true);
> + auto NB = DAG.getConstant(NumBytes, CLI.DL, PtrVT, true);
> + Chain = DAG.getCALLSEQ_START(Chain, NB, CLI.DL);
> +
> + SmallVector<SDValue, 16> Ops;
> + Ops.push_back(Chain);
> + Ops.push_back(CLI.Callee);
> + Ops.append(CLI.OutVals.begin(), CLI.OutVals.end());
> +
> + SmallVector<EVT, 8> Tys;
> + for (const auto &In : CLI.Ins)
> + Tys.push_back(In.VT);
> + Tys.push_back(MVT::Other);
> + SDVTList TyList = CLI.DAG.getVTList(Tys);
> + SDValue Res = CLI.DAG.getNode(WebAssemblyISD::CALL, CLI.DL, TyList,
> Ops);
> + InVals.push_back(Res);
> + Chain = Res.getValue(1);
> +
> + // FIXME: handle CLI.RetSExt and CLI.RetZExt?
> +
> + Chain = CLI.DAG.getCALLSEQ_END(Chain, NB, Zero, SDValue(), CLI.DL);
> +
> + return Chain;
> +}
> +
> bool WebAssemblyTargetLowering::CanLowerReturn(
> CallingConv::ID CallConv, MachineFunction &MF, bool IsVarArg,
> const SmallVectorImpl<ISD::OutputArg> &Outs, LLVMContext &Context)
> const {
>
> Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h?rev=245882&r1=245881&r2=245882&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h (original)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h Mon Aug 24
> 16:59:51 2015
> @@ -24,9 +24,9 @@ namespace WebAssemblyISD {
>
> enum NodeType : unsigned {
> FIRST_NUMBER = ISD::BUILTIN_OP_END,
> - RETURN,
> - ARGUMENT,
> -
> +#define HANDLE_NODETYPE(NODE) NODE,
> +#include "WebAssemblyISD.def"
> +#undef HANDLE_NODETYPE
> // add memory opcodes starting at ISD::FIRST_TARGET_MEMORY_OPCODE
> here...
> };
>
> @@ -52,6 +52,9 @@ private:
>
> const char *getTargetNodeName(unsigned Opcode) const override;
>
> + SDValue LowerCall(CallLoweringInfo &CLI,
> + SmallVectorImpl<SDValue> &InVals) const override;
> +
> bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
> bool isVarArg,
> const SmallVectorImpl<ISD::OutputArg> &Outs,
>
> Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrCall.td
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrCall.td?rev=245882&r1=245881&r2=245882&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrCall.td (original)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrCall.td Mon Aug 24
> 16:59:51 2015
> @@ -12,6 +12,29 @@
> ///
>
> //===----------------------------------------------------------------------===//
>
> +// The call sequence start/end LLVM-isms isn't useful to WebAssembly
> since it's
> +// a virtual ISA.
> +
> +// FIXME make noop?
> +//def : Pat<(WebAssemblycallseq_start timm), (i32 (IMPLICIT_DEF))>;
> +//def : Pat<(WebAssemblycallseq_end timm, timm), (i32 (IMPLICIT_DEF))>;
> +
> +def SDT_WebAssemblyCallSeqStart : SDCallSeqStart<[SDTCisVT<0, iPTR>]>;
> +def SDT_WebAssemblyCallSeqEnd :
> + SDCallSeqEnd<[SDTCisVT<0, iPTR>, SDTCisVT<1, iPTR>]>;
> +def WebAssemblycallseq_start :
> + SDNode<"ISD::CALLSEQ_START", SDT_WebAssemblyCallSeqStart,
> + [SDNPHasChain, SDNPOutGlue]>;
> +def WebAssemblycallseq_end :
> + SDNode<"ISD::CALLSEQ_END", SDT_WebAssemblyCallSeqEnd,
> + [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
> +def : Pseudo<(outs), (ins i64imm:$amt),
> + [(WebAssemblycallseq_start timm:$amt)],
> + "#ADJCALLSTACKDOWN $amt">;
> +def : Pseudo<(outs), (ins i64imm:$amt1, i64imm:$amt2),
> + [(WebAssemblycallseq_end timm:$amt1, timm:$amt2)],
> + "#ADJCALLSTACKUP $amt1 $amt2">;
> +
> /*
> * TODO(jfb): Add the following.
> *
>
> Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrFormats.td
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrFormats.td?rev=245882&r1=245881&r2=245882&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrFormats.td (original)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrFormats.td Mon Aug
> 24 16:59:51 2015
> @@ -12,7 +12,7 @@
> ///
>
> //===----------------------------------------------------------------------===//
>
> -// WebAssembly Instruction Format
> +// WebAssembly Instruction Format.
> class WebAssemblyInst<string cstr> : Instruction {
> field bits<0> Inst; // Instruction encoding.
> let Namespace = "WebAssembly";
> @@ -20,7 +20,7 @@ class WebAssemblyInst<string cstr> : Ins
> let Constraints = cstr;
> }
>
> -// Normal instructions
> +// Normal instructions.
> class I<dag oops, dag iops, list<dag> pattern, string cstr = "">
> : WebAssemblyInst<cstr> {
> dag OutOperandList = oops;
> @@ -28,6 +28,14 @@ class I<dag oops, dag iops, list<dag> pa
> let Pattern = pattern;
> }
>
> +// Pseudo instructions.
> +class Pseudo<dag oops, dag iops, list<dag> pattern, string asmstr,
> + string cstr = "">
> + : I<oops, iops, pattern, cstr> {
> + let isPseudo = 1;
> + let AsmString = asmstr;
> +}
> +
> // Unary and binary instructions, for the local types that WebAssembly
> supports.
> multiclass UnaryInt<SDNode node> {
> def _I32 : I<(outs Int32:$dst), (ins Int32:$src),
>
> Added: llvm/trunk/test/CodeGen/WebAssembly/call.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/call.ll?rev=245882&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/WebAssembly/call.ll (added)
> +++ llvm/trunk/test/CodeGen/WebAssembly/call.ll Mon Aug 24 16:59:51 2015
> @@ -0,0 +1,22 @@
> +; RUN: llc < %s -asm-verbose=false | FileCheck %s
> +
> +; Test that basic call operations assemble as expected.
> +
> +target datalayout = "e-p:32:32-i64:64-v128:8:128-n32:64-S128"
> +target triple = "wasm32-unknown-unknown"
> +
> +declare void @nullary()
> +
> +; CHECK-LABEL: call_nullary:
> +; CHECK-NEXT: (call @foo)
> +; CHECK-NEXT: (return)
> +define void @call_nullary() {
> + call void @nullary()
> + ret void
> +}
> +
> +
> +; tail call
> +; multiple args
> +; interesting returns (int, float, struct, multiple)
> +; vararg
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150824/9aa0ce99/attachment.html>
More information about the llvm-commits
mailing list