[LLVMdev] x86 unwind support[MESSAGE NOT SCANNED]

Mark Shannon marks at dcs.gla.ac.uk
Mon Jul 20 08:17:37 PDT 2009


Andrew Haley wrote:
> Mark Shannon wrote:
>> Andrew Haley wrote:
> 
>>> Let's go back a bit.  Your claim is that there is no need to unwind
>>> frame-by-frame, an unwind simply needs to make a single jump to an
>>> invoke instruction and restore the context (which in x86 is just 6
>>> registers).  (This is, more or less, what longjmp() does.)  Duncan Sands
>>> explained to you why that wouldn't work, saying "if you throw an
>>> exception using your proposed unwind implementation, then it wouldn't
>>> be caught by dwarf catch/cleanup regions".
>> If you can make your point without any references to any C/C++ specific 
>> features it might be more convincing ;)
> 
> Well, you seemed to be claiming that cleanups were due to stack-allocated
> objects in C++.  I have shown that is not the case.

You have shown no such thing.
> 
>>> He's right.  You can't just jump to the invoke instruction, you must
>>> also pop any cleanups.  This is nothing to do with C++, and it has
>>> nothing to do with whether a language has stack-allocated objects.
>> What cleanups?
> 
> The ones pushed by pthread_cleanup_push().

pthread_cleanup_push() only exists in C/C++. It is a C library function 
declared in "pthreads.h" a C header file
There are other languages than C/C++.
And some of them are easier to use :)
> 
>> If the C++ front end leaves all these dead objects on the stack and
>> insists they are cleaned up promptly, then it its responsibility to
>> clean them up.
>> It shouldn't burden other front-ends.
> 
> Like I said, it's nothing to do with C++, or with the C++ front end.
So give me an example than is not related to C/C++.

> 
>> In a purely heap allocated language without finalizers, say ML or
>> haskell, there is nothing to clean-up and a simple jump will suffice.
>>
>> For languages with finalizers such as Python or Java, a special
>> finalizer thread can do the cleaning up lazily once the GC has collected
>> the dead objects.
> 
> [Aside: That's not quite true for Java, where unwinding releases
> locks.  This could be done by registering a handler at every site
> where a lock is acquired, but I don't think that's how it generally
> works.]
But llvm doesn't support that, so a Java front-end must insert code to 
do the unlocking. Its separate from unwinding. Why can't the C++ 
front-end insert code to do its language-specific cleanups.

> 
> Maybe there does exist a programming language that never calls (or is
> called by) programs in other programming languages and never runs in
> an environment where one of its threads may be terminated.  In that
> case, interoperability of generated code doesn't matter.  In the
> heterogeneous world of the contemporary OS I'm not sure if that's a
> common case.
The level of inter-language interoperability you are talking about is 
frankly next to impossible.
Java doesn't allow threads to be terminated precisely because of the 
sort of problems it causes.

> 
> Andrew.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> 




More information about the llvm-dev mailing list