[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