<br>That code should do it, but I realized you only detect setjmp functions by name. My code is calling "__sigsetjmp" not "segsetjmp". You only support these functions:<br><br>  static const char *ReturnsTwiceFns[] = {<br>
    "_setjmp",<br>    "setjmp",<br>    "sigsetjmp",<br>    "setjmp_syscall",<br>    "savectx",<br>    "qsetjmp",<br>    "vfork",<br>    "getcontext"<br>
  };<br><br>I think if I add mine to this list, it should work. I will try that.<br><br>Thanks, <br>-Khaled<br><br><div class="gmail_quote">On Tue, Oct 4, 2011 at 7:15 PM, Jakob Stoklund Olesen <span dir="ltr"><<a href="mailto:stoklund@2pi.dk">stoklund@2pi.dk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div></div><div class="h5"><br>
On Oct 4, 2011, at 3:53 PM, Eli Friedman wrote:<br>
<br>
> On Tue, Oct 4, 2011 at 3:10 PM, Khaled ElWazeer<br>
> <<a href="mailto:khalid.alwazeer@gmail.com">khalid.alwazeer@gmail.com</a>> wrote:<br>
>> Hi,<br>
>><br>
>> I have some code which has sigsetjmp / longjmp. After a longjmp, unreachable<br>
>> is inserted, which is fine. The problem is that in the backend before<br>
>> calling longjmp, some register was spilled to a stack location which is live<br>
>> across the jmp. I mean, it will be live after jumping. The stack location<br>
>> was initialized before the call to setjmp, and is used afterwards.<br>
>><br>
>> Is there any bug in handling such a case? I mean, how do LLVM knows about<br>
>> CFG in case of longjmp / setjmp calls?<br>
><br>
> No, no handling; we just don't inline anything into functions which<br>
> call setjmp, and hope we get lucky.  In practice, that's generally<br>
> good enough, given the restrictions on functions that call setjmp, but<br>
> there are probably some subtle bugs nobody has discovered yet.<br>
<br>
</div></div>We already disable stack slot sharing in functions that callsFunctionThatReturnsTwice():<br>
<br>
  // If there are calls to setjmp or sigsetjmp, don't perform stack slot<br>
  // coloring. The stack could be modified before the longjmp is executed,<br>
  // resulting in the wrong value being used afterwards. (See<br>
  // <rdar://problem/8007500>.)<br>
  if (MF.callsSetJmp())<br>
    return false;<br>
<br>
It might be possible for register coalescing to break something as well.<br>
<font color="#888888"><br>
/jakob<br>
<br>
</font></blockquote></div><br>