<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 28, 2015 at 9:23 PM, Lang Hames <span dir="ltr"><<a href="mailto:lhames@gmail.com" target="_blank">lhames@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Courtney,<div><br></div><div>There are at least two distinct issues here:</div><div><br></div><div>(1) The error you're seeing from LLVM ("Tried to execute an unknown external function...") indicates that the mapping isn't working correctly, but your code for adding the global mapping looks good. There were some issues with the global mapping on older versions of LLVM, and that may be what you're running in to. What LLVM version and OS are you using?</div><div><br></div><div>(2) As Ramkumar noted, the lambda has two distinct addresses associated with it: The closure (which I expect you get from &lambdaBody, though I'd have to check with a C++ expert), and the function (which I think of as "&<lambda>::operator()", but I don't know if that's really how C++ treats it). You may be able to get the lambda to execute by setting up the mapping to point to &<lambda>::operator() if you can figure out how to express it in C++, then passing the pointer to the closure as the sole argument to the function (you'll need to change lambdaFN's signature from int() to int(void*)). Whether this is guaranteed to work though I'm not sure.</div></div></blockquote><div><br></div><div>Yep, pretty much everything there. Of course if you know the lambda is stateless, you can convert it to a real function pointer (the common idiom is to use unary '+' when you need to explicitly coerce a stateless lambda into a function pointer):<br><br>  addGlobalMapping(lambdaFN, +lambdaBody);<br><br>& there's no guaranteed way to get a usable free function for a stateful lambda. As you mentioned, you could try/cheat by taking the address of the operator() member function, reinterpret casting that to a non-member function with the extra first parameter then passing that when you want to call it.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><br></div><div>Alternatively, if possible you can always wrap the lambda in a normal C function to make it easy to access:</div><div><br></div><div>#include <...></div><div><br></div><div>auto MyLamba = []() { return 100; }</div><div><br></div><div>int MyLambdaCaller() {</div><div>  return MyLambda();</div><div>}</div><div><br></div><div>Now you can include all of your code from before, but map 'lambdaFN' to &MyLambdaCaller.</div><div><br></div><div>Hope this helps!</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>- Lang.</div></font></span></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="h5">On Tue, Oct 27, 2015 at 1:21 AM, Courtney Robinson via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><div dir="ltr"><div>Apologies for the noop question in advance (just getting started with LLVM), and I'm not entirely sure if this is the right list to post to. is it?</div><div><br></div>I have some lambda functions as member variables that I want to have my LLVM language make calls to. I've added a mapping to them, but this doesn't seem to enable LLVM to resolve the functions. I asked on stackoverflow but the suggestion there didn't help. The minimal test case to reproduce what I'm trying to do is:<div><br></div><div><pre style="margin-top:0px;padding:5px;border:0px;font-size:13px;overflow:auto;width:auto;max-height:600px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;color:rgb(57,51,24);word-wrap:normal;background-color:rgb(238,238,238)"><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(128,128,128)">#include</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"llvm/ExecutionEngine/GenericValue.h"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
</span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,128,128)">#include</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"llvm/ExecutionEngine/Interpreter.h"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
</span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,128,128)">#include</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"llvm/IR/Constants.h"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
</span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,128,128)">#include</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"llvm/IR/IRBuilder.h"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
</span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,128,128)">#include</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"llvm/Support/ManagedStatic.h"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
</span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,128,128)">#include</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"llvm/Support/TargetSelect.h"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,139)">using</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,139)">namespace</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> llvm</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">;</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">int</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> main</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">()</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">{</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">InitializeNativeTarget</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">();</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">LLVMContext</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Context</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">;</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  std</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">::</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">unique_ptr</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Module</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">></span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Owner</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> make_unique</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Module</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">>(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"SomeModule"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Context</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">);</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Module</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">*</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">M </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Owner</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">.</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">get</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">();</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">FunctionType</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">*</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">lambdaFT </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">FunctionType</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">::</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">get</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Type</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">::</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">getInt32Ty</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Context</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">),</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,139)">false</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">);</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Function</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">*</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">lambdaFN </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Function</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">::</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Create</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">lambdaFT</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Function</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">::</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">ExternalLinkage</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"lambda"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Owner</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">.</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">get</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">());</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,139)">auto</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> lambdaBody </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">[]()</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">{</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,139)">return</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">100</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">;</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">};</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Function</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">*</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">mainF </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> cast</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Function</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">>(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">M</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">-></span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">getOrInsertFunction</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"main"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Type</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">::</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">getInt32Ty</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Context</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">),</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Type</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">*)</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">0</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">));</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">BasicBlock</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">*</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">BB </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">BasicBlock</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">::</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Create</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Context</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"EntryBlock"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> mainF</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">);</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">IRBuilder</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><></span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> builder</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">BB</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">);</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">CallInst</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">*</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">lambdaRes </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> builder</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">.</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">CreateCall</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">lambdaFN</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> std</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">::</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">vector</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Value</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">*>(),</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"lambdaRetVar"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">);</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  builder</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">.</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">CreateRet</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">lambdaRes</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">);</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">ExecutionEngine</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">*</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">EE </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">EngineBuilder</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">std</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">::</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">move</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Owner</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">)).</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">create</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">();</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  EE</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">-></span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">addGlobalMapping</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">lambdaFN</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">&</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">lambdaBody</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">);</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  outs</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">()</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><<</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"We just constructed this LLVM module:\n\n"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><<</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">*</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">M</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">;</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  outs</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">()</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><<</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"\n\nRunning main: "</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">;</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  std</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">::</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">vector</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">GenericValue</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">></span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> noargs</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">;</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">GenericValue</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> gv </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> EE</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">-></span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">runFunction</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">(</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">mainF</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">,</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> noargs</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">);</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

  outs</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">()</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><<</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"Result: "</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><<</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> gv</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">.</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">IntVal</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><<</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">"\n"</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">;</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  llvm_shutdown</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">();</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,139)">delete</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> EE</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">;</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,139)">return</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">0</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">;</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">}</span></code></pre><div>The output is:</div><div><br></div><div><pre style="margin-top:0px;padding:5px;border:0px;font-size:13px;overflow:auto;width:auto;max-height:600px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;color:rgb(57,51,24);word-wrap:normal;background-color:rgb(238,238,238)"><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">We</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> just constructed </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,139)">this</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> LLVM module</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">:</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">;</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">ModuleID</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">'SomeModule'</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

declare i32 </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">@lambda</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">()</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

define i32 </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">@main</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">()</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">{</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">EntryBlock</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">:</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">%</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">lambdaRetVar </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">=</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> call i32 </span><span style="margin:0px;padding:0px;border:0px;color:rgb(128,0,0)">@lambda</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">()</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">
  ret i32 </span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">%</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">lambdaRetVar
</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">}</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">

</span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Running</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> main</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">:</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> 
LLVM ERROR</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">:</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> </span><span style="margin:0px;padding:0px;border:0px;color:rgb(43,145,175)">Tried</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> to execute an unknown external function</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">:</span><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"> lambda</span></code></pre></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">The following suggestion was made on StackOveflow:</span></code></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">"</span></code></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><span style="color:rgb(34,34,34);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:19.5px">Your lambda body is a class. You must pass the address of its function call operator, which you can do by converting it to a function pointer: </span><code style="margin:0px;padding:1px 5px;border:0px;font-size:13px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:pre-wrap;color:rgb(34,34,34);background-color:rgb(238,238,238)">auto lambdaBody = +[]() { return 100; };</code><span style="color:rgb(34,34,34);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:19.5px"> and passing it as a </span><code style="margin:0px;padding:1px 5px;border:0px;font-size:13px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:pre-wrap;color:rgb(34,34,34);background-color:rgb(238,238,238)">void*</code><span style="color:rgb(34,34,34);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:19.5px">: </span><code style="margin:0px;padding:1px 5px;border:0px;font-size:13px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:pre-wrap;color:rgb(34,34,34);background-color:rgb(238,238,238)">EE->addGlobalMapping(lambdaFN, reinterpret_cast<void*>(lambdaBody));</code><span style="color:rgb(34,34,34);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:19.5px">.</span><br></span></code></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">"</span></code></div><div><span style="color:rgb(0,0,0);font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit">However, after doing that, I get the same LLVM error message. How do I get LLVM to call to a lambda? I am likely to have some C functions loaded from a dynamic lib (I'll know the name and signatures), is it the same process to call these as it is for lambdas?</span><br></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><br></span></code></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">I know the Kaleidoscope example does std::sin so when it says it finds it because it is within the same address space I thought this would work too...<br></span></code></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><br></span></code></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">No suggestions or code samples welcome.</span></code></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)"><br></span></code></div><div><code style="margin:0px;padding:0px;border:0px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,sans-serif;white-space:inherit"><span style="margin:0px;padding:0px;border:0px;color:rgb(0,0,0)">Thanks in advance.</span></code></div><span><font color="#888888">-- <br><div>Courtney Robinson<br><div><div><br></div></div></div>
</font></span></div></div>
<br></div></div><span class="">_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br></span></blockquote></div><br></div>
</blockquote></div><br></div></div>