<div dir="ltr">Could you comment on how this interacts with:<blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><a href="http://reviews.llvm.org/rL251534">http://reviews.llvm.org/rL251534</a></div></blockquote><div><br></div><div>Your intent is just to allow user-called memcpy? Is it a temporary thing until we do proper linking and have a real libc?</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 25, 2015 at 8:44 AM, Dan Gohman via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: djg<br>
Date: Wed Nov 25 10:44:29 2015<br>
New Revision: 254075<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=254075&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=254075&view=rev</a><br>
Log:<br>
[WebAssembly] Codegen support for ISD::ExternalSymbol<br>
<br>
Modified:<br>
    llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp<br>
    llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td<br>
    llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp<br>
    llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.h<br>
    llvm/trunk/test/CodeGen/WebAssembly/global.ll<br>
<br>
Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp?rev=254075&r1=254074&r2=254075&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp?rev=254075&r1=254074&r2=254075&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp Wed Nov 25 10:44:29 2015<br>
@@ -114,6 +114,7 @@ WebAssemblyTargetLowering::WebAssemblyTa<br>
   computeRegisterProperties(Subtarget->getRegisterInfo());<br>
<br>
   setOperationAction(ISD::GlobalAddress, MVTPtr, Custom);<br>
+  setOperationAction(ISD::ExternalSymbol, MVTPtr, Custom);<br>
   setOperationAction(ISD::JumpTable, MVTPtr, Custom);<br>
<br>
   for (auto T : {MVT::f32, MVT::f64}) {<br>
@@ -412,6 +413,8 @@ SDValue WebAssemblyTargetLowering::Lower<br>
     return SDValue();<br>
   case ISD::GlobalAddress:<br>
     return LowerGlobalAddress(Op, DAG);<br>
+  case ISD::ExternalSymbol:<br>
+    return LowerExternalSymbol(Op, DAG);<br>
   case ISD::JumpTable:<br>
     return LowerJumpTable(Op, DAG);<br>
   case ISD::BR_JT:<br>
@@ -433,6 +436,16 @@ SDValue WebAssemblyTargetLowering::Lower<br>
                      DAG.getTargetGlobalAddress(GA->getGlobal(), DL, VT));<br>
 }<br>
<br>
+SDValue WebAssemblyTargetLowering::LowerExternalSymbol(SDValue Op,<br>
+                                                       SelectionDAG &DAG) const {<br>
+  SDLoc DL(Op);<br>
+  const auto *ES = cast<ExternalSymbolSDNode>(Op);<br>
+  EVT VT = Op.getValueType();<br>
+  assert(ES->getTargetFlags() == 0 && "WebAssembly doesn't set target flags");<br>
+  return DAG.getNode(WebAssemblyISD::Wrapper, DL, VT,<br>
+                     DAG.getTargetExternalSymbol(ES->getSymbol(), VT));<br>
+}<br>
+<br>
 SDValue WebAssemblyTargetLowering::LowerJumpTable(SDValue Op,<br>
                                                   SelectionDAG &DAG) const {<br>
   // There's no need for a Wrapper node because we always incorporate a jump<br>
<br>
Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td?rev=254075&r1=254074&r2=254075&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td?rev=254075&r1=254074&r2=254075&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td (original)<br>
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td Wed Nov 25 10:44:29 2015<br>
@@ -125,8 +125,10 @@ def CONST_F64 : I<(outs F64:$res), (ins<br>
                   [(set F64:$res, fpimm:$imm)],<br>
                   "f64.const\t$res, $imm">;<br>
<br>
-def : Pat<(i32 (WebAssemblywrapper tglobaladdr :$dst)),<br>
-          (CONST_I32 tglobaladdr :$dst)>;<br>
+def : Pat<(i32 (WebAssemblywrapper tglobaladdr:$dst)),<br>
+          (CONST_I32 tglobaladdr:$dst)>;<br>
+def : Pat<(i32 (WebAssemblywrapper texternalsym:$dst)),<br>
+          (CONST_I32 texternalsym:$dst)>;<br>
<br>
 def JUMP_TABLE : I<(outs I32:$dst), (ins tjumptable_op:$addr),<br>
                    [(set I32:$dst, (WebAssemblywrapper tjumptable:$addr))],<br>
<br>
Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp?rev=254075&r1=254074&r2=254075&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp?rev=254075&r1=254074&r2=254075&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp (original)<br>
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.cpp Wed Nov 25 10:44:29 2015<br>
@@ -34,6 +34,11 @@ WebAssemblyMCInstLower::GetGlobalAddress<br>
   return Printer.getSymbol(MO.getGlobal());<br>
 }<br>
<br>
+MCSymbol *<br>
+WebAssemblyMCInstLower::GetExternalSymbolSymbol(const MachineOperand &MO) const {<br>
+  return Printer.GetExternalSymbolSymbol(MO.getSymbolName());<br>
+}<br>
+<br>
 MCOperand WebAssemblyMCInstLower::LowerSymbolOperand(const MachineOperand &MO,<br>
                                                      MCSymbol *Sym) const {<br>
<br>
@@ -90,6 +95,9 @@ void WebAssemblyMCInstLower::Lower(const<br>
     case MachineOperand::MO_GlobalAddress:<br>
       MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO));<br>
       break;<br>
+    case MachineOperand::MO_ExternalSymbol:<br>
+      MCOp = LowerSymbolOperand(MO, GetExternalSymbolSymbol(MO));<br>
+      break;<br>
     }<br>
<br>
     OutMI.addOperand(MCOp);<br>
<br>
Modified: llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.h?rev=254075&r1=254074&r2=254075&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.h?rev=254075&r1=254074&r2=254075&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.h (original)<br>
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyMCInstLower.h Wed Nov 25 10:44:29 2015<br>
@@ -44,6 +44,7 @@ public:<br>
   MCOperand LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const;<br>
<br>
   MCSymbol *GetGlobalAddressSymbol(const MachineOperand &MO) const;<br>
+  MCSymbol *GetExternalSymbolSymbol(const MachineOperand &MO) const;<br>
 };<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/test/CodeGen/WebAssembly/global.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/global.ll?rev=254075&r1=254074&r2=254075&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WebAssembly/global.ll?rev=254075&r1=254074&r2=254075&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/WebAssembly/global.ll (original)<br>
+++ llvm/trunk/test/CodeGen/WebAssembly/global.ll Wed Nov 25 10:44:29 2015<br>
@@ -18,6 +18,18 @@ define i32 @foo() {<br>
   ret i32 %a<br>
 }<br>
<br>
+; CHECK-LABEL: call_memcpy:<br>
+; CHECK-NEXT: .param          i32, i32, i32{{$}}<br>
+; CHECK-NEXT: .result         i32{{$}}<br>
+; CHECK-NEXT: i32.const       $push0=, memcpy{{$}}<br>
+; CHECK-NEXT: call_indirect   $pop0, $0, $1, $2{{$}}<br>
+; CHECK-NEXT: return          $0{{$}}<br>
+declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1)<br>
+define i8* @call_memcpy(i8* %p, i8* nocapture readonly %q, i32 %n) {<br>
+  tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %p, i8* %q, i32 %n, i32 1, i1 false)<br>
+  ret i8* %p<br>
+}<br>
+<br>
 ; CHECK: .type   g,@object<br>
 ; CHECK: .align  2{{$}}<br>
 ; CHECK-NEXT: g:<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>