<div dir="ltr">So, my code builds a closure structure, which contains pointers to the variables shared between the nested function and the outer function. <br><br>As long as you don't need function pointers that are compatible with function pointers without local variable usage, you don't need trampolines, just the closure structure to pass the arguments. Or you can just pass extra arguments with those local variables as references.<br><br>But if you want something that in C would look something like this:<br><br>void func1(void (*fptr)(int), int x)<br>{<br>    fptr(x);<br>}<br><br>void func2(int a)<br>{<br>    int y = a;<br><br>    void foo(int x)<br>    {<br>        printf("x=%d, y=%d\n", x, y);<br><div>    }<br><br>    func1(foo, 42);<br>}<br><br>void bar(int x);<br><br>int main()<br>{<br>    func1(bar);<br>    func2(17);<br>    return 0;<br>} <br><br>For the foo function to be compatible with bar, you need a trampoline. If you don't have this use-case, then you just need some way to pass y into foo. <br><br>[This is almost identical to the function in the Pascal conformance test that I had to implement trampolines for]<br><br>--</div><div>Mats</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 13 September 2015 at 22:03, Rodney M. Bates via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@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">I want to avoid trampolines for two reasons.  They have to be built in memory that is<br>
both writable and executable, which has already been a problem on some targets.  Also,<br>
a debugger needs to both construct and interpret them, which creates difficult target<br>
dependencies and compiler code-generation dependencies.<br>
<br>
I intend to pass some kind of environment pointer, like a static link.  The real question<br>
is, what does it point to?  As I understand, llvm locals can not be used outside the<br>
function they are created in, so using a static link from outside can't access the<br>
alloca values.  I am thinking the best way is to wrap at least up-level referenceable<br>
formals and locals  in a struct, and have the static link point to that.  This would<br>
include the next outer static link.<span class="im HOEnZb"><br>
<br>
On 09/13/2015 04:39 AM, David Chisnall wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On 13 Sep 2015, at 01:18, Rodney M. Bates via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Does Clang have an option that allows C nested functions, as in gcc?<br>
So far, I can't find it.  I just want to look at generated llvm IR, for<br>
ideas on the best way to produce it from another front end.<br>
</blockquote>
<br>
Clang doesn’t support it, but llvm-gcc did (and DragonEgg, possibly?), and this is what the trampoline intrinsics are for.  The way that GCC implements it is very dangerous - it requires having an executable stack, which makes various attacks significantly easier.<br>
<br>
The nested function approach is *only* required if you need the ability for unmodified C code (or code using a C FFI) to be able to call the generated functions.  If you do not have this requirement, then using an explicit argument in the LLVM IR to contain the state for the closure (as [Objective-]C blocks and C++ lambdas do) is probably a better option.<br>
<br>
David<br>
<br>
<br>
</blockquote>
<br></span><span class="HOEnZb"><font color="#888888">
-- <br>
Rodney Bates<br>
<a href="mailto:rodney.m.bates@acm.org" target="_blank">rodney.m.bates@acm.org</a></font></span><div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br></div>