[llvm] r245882 - call

JF Bastien via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 24 16:51:16 PDT 2015


I reverted this and the following commit, and fixed things after.

On Mon, Aug 24, 2015 at 4:32 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> 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/9ff96c74/attachment.html>


More information about the llvm-commits mailing list