[LLVMdev] setjmp - longjmp

Khaled ElWazeer khalid.alwazeer at gmail.com
Tue Oct 4 19:27:08 PDT 2011


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:

  static const char *ReturnsTwiceFns[] = {
    "_setjmp",
    "setjmp",
    "sigsetjmp",
    "setjmp_syscall",
    "savectx",
    "qsetjmp",
    "vfork",
    "getcontext"
  };

I think if I add mine to this list, it should work. I will try that.

Thanks,
-Khaled

On Tue, Oct 4, 2011 at 7:15 PM, Jakob Stoklund Olesen <stoklund at 2pi.dk>wrote:

>
> On Oct 4, 2011, at 3:53 PM, Eli Friedman wrote:
>
> > On Tue, Oct 4, 2011 at 3:10 PM, Khaled ElWazeer
> > <khalid.alwazeer at gmail.com> wrote:
> >> Hi,
> >>
> >> I have some code which has sigsetjmp / longjmp. After a longjmp,
> unreachable
> >> is inserted, which is fine. The problem is that in the backend before
> >> calling longjmp, some register was spilled to a stack location which is
> live
> >> across the jmp. I mean, it will be live after jumping. The stack
> location
> >> was initialized before the call to setjmp, and is used afterwards.
> >>
> >> Is there any bug in handling such a case? I mean, how do LLVM knows
> about
> >> CFG in case of longjmp / setjmp calls?
> >
> > No, no handling; we just don't inline anything into functions which
> > call setjmp, and hope we get lucky.  In practice, that's generally
> > good enough, given the restrictions on functions that call setjmp, but
> > there are probably some subtle bugs nobody has discovered yet.
>
> We already disable stack slot sharing in functions that
> callsFunctionThatReturnsTwice():
>
>  // If there are calls to setjmp or sigsetjmp, don't perform stack slot
>  // coloring. The stack could be modified before the longjmp is executed,
>  // resulting in the wrong value being used afterwards. (See
>  // <rdar://problem/8007500>.)
>  if (MF.callsSetJmp())
>    return false;
>
> It might be possible for register coalescing to break something as well.
>
> /jakob
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111004/797531bc/attachment.html>


More information about the llvm-dev mailing list