<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 22 January 2014 22:10, Vadim <span dir="ltr"><<a href="mailto:vadimcn@gmail.com" target="_blank">vadimcn@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div>Hi,</div><div>I am toying with an idea of having LLVM generate code that has position-independent stacks.   This would be a very useful property for implementing all sorts of micro-thread libraries (I am thinking something similar to Python <a href="http://stackoverflow.com/a/17447308" target="_blank">greenlets</a>), because you'd be able to easily save threadlet state from one OS thread and later restore it into another.</div>

<div><br></div><div>On the surface, it seems entirely do-able - basically, one needs to get rid of all the things that point into the stack.  It should be sufficient to:</div><div>1. write a function pass that finds all local variables, whose address is ever taken, and hoists them into a heap-allocated secondary "stack frame", </div>

<div>2. either turn off frame base pointers, or make sure they are adjusted after the stack had been relocated,</div><div>3. ... can't think of anything else, actually.</div><div><br></div><div>What do you guys think?  Any reasons this approach wouldn't fly?</div>
</div></blockquote><div><br></div><div>I've implemented something similar, but with the motivation of implementing SFI sandboxing rather than making the stack relocatable.</div><div><br></div><div>The code is here: <a href="https://codereview.chromium.org/29743003/">https://codereview.chromium.org/29743003/</a>  In particular, see the ExpandAlloca pass.</div>
<div><br></div><div>That code implements sandboxing at the level of LLVM IR.  It restricts all memory accesses to a range of address space by truncating the memory address and adding a base pointer.  Here are some notes explaining further:  <a href="https://docs.google.com/presentation/d/1RD3bxsBfTZOIfrlq7HzGMsygPHgb61A1eTdelIYOurs/edit">https://docs.google.com/presentation/d/1RD3bxsBfTZOIfrlq7HzGMsygPHgb61A1eTdelIYOurs/edit</a></div>
<div><br></div><div>Cheers,</div><div>Mark</div><div><br></div></div></div></div>