[LLVMdev] setjmp - longjmp

Khaled ElWazeer khalid.alwazeer at gmail.com
Tue Oct 4 20:23:36 PDT 2011


Actually my problem is solved when I added "__sigsetjmp" to this list.

Thanks,
-Khaled

On Tue, Oct 4, 2011 at 10:27 PM, Khaled ElWazeer
<khalid.alwazeer at gmail.com>wrote:

>
> 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/ee7543b4/attachment.html>


More information about the llvm-dev mailing list