<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 23, 2014 at 7:13 PM, Mark Seaborn <span dir="ltr"><<a href="mailto:mseaborn@chromium.org" target="_blank">mseaborn@chromium.org</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 23 January 2014 15:23, 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:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr"><div><div><div>Thanks Mark!  That'd be a useful starting point.<br></div><div><br>For the rest of the people here: to be a bit more specific, I am having doubts about the following:<br></div>
<div>
</div>- Can later optimization passes or code generation still create machine code that takes and stores (in a register perhaps) an address of something on the stack, even if not semantically visible to the programmer?   Can this somehow be detected?<br>


</div></div></div></blockquote><div><br></div><div>If you are concerned about later optimisation IR passes, you should probably ensure that you run something like ExpandAlloca as a last pass, with no general-purpose IR passes afterwards.</div>


<div><br></div><div>Otherwise, for code generation, I can think of one case where you will get a non-relocatable stack:  by-value argument passing.  For example:</div></div></div></div></blockquote><div> <br><snip><br>

</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div></div></div>

<div class="gmail_quote"><div>However, I don't think you can make that work for returning structs by value.</div></div></div></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>Varargs has a similar problem to passing structs by value.</div></div></div></div></blockquote><div><br>I think I can hoist all those variables into the heap-allocated frame as
 well.  The same for returning structs.  In this case it's actually very
fortunate that it's the front end that has to deal with the platform ABI, 
otherwise I'd have to guess which return values backend code generator 
is going to re-write as returns into the caller allocated buffer.  (Or are 
there platforms which do that in the backend???)</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra">
<div class="gmail_quote"><div>Do you want to be able to relocate the stack only at function call boundaries, or at any place that execution might be asynchronously interrupted?</div>
</div></div></div></blockquote><div><br></div><div>Synchronous only.<br><br><br></div><div>thanks!<br>Vadim<br></div></div></div></div>