[M3devel] how to use gcc exception/unwind support?
Tony Hosking
hosking at cs.purdue.edu
Mon Jan 3 22:33:53 CET 2011
I don't understand why we can't continue to use the same approach we had with gcc 4.3, except utilizing the gcc unwind mechanisms.
On Jan 2, 2011, at 8:57 PM, Jay K wrote:
> I understand partly and agree as far as I understand.
>
>
> For example..I think it is important, interesting, and subtle that C++ throw resolves to a function call generated
> by the C++ front end, with the implication that the backend has a certain ignorance as to how it works,
> with the additional implication that we can (continue to) call our own function to throw/raise an exception.
>
>
> Where I get confused however is esp. resolving "TRY_CATCH", that the backend is given
> a list of handlers. What is a "handler"?
>
>
> And then..there is also a list of types..but ah, I think I start to see.
> I think the list of types are meaningless in tree/gimple, only a C++ thing,
> and the handlers are probably merely pieces of code to connect control flow edges too?
>
>
> I have another idea though...I was thinking...if this is true, if it is just about flow graph...
> I think there might be two useful intermediate steps toward implementing this.
>
>
> The first implementation would not change the compiler at all, just write the new RTException.m3, and
> only work with no optimizations. Get this to work.
>
>
> The second implementation would sprinkle volatile on all locals in functions
> that have "try". Or heck, just as an *experiment* put volatile everywhere like
> it was before, enable -O3, see that that seems to work.
>
>
> Neither of those two versions would likely be commited, except maybe requiring non-default compiler switches.
>
>
> And then tell the backend about the control flow via the eh stuff in tree.def, and enable optimizations.
>
>
> Make some sense?
>
>
> The first step is at least a good necessary/easy experiment I think.
> Not so easy, but necessary anyway.
>
>
> Furthermore..give me a bit more time to consider all this, instead of going
> back to 4.3?
>
>
> Granted, SPARC32_SOLARIS might not ever get this.
> You know -- what is the availability of the gcc unwinder on Solaris?
But we do use gcc as the M3 backend on Sparc, so not a problem.
> Surely it is there if you use gcc. But if you use cc?
>
>
> Then to wonder, how does Sun CC work?
>
>
> But I think if we had this working on Darwin, and then Linux, and then FreeBSD,
> and then OpenBSD and NetBSD, maybe Cygwin, it wouldn't be so awful for Solaris, et. al. to still use setjmp.
> NT386 could easily remain with setjmp a while too.
>
>
> - Jay
>
>
>
> From: hosking at cs.purdue.edu
> Date: Sun, 2 Jan 2011 18:19:36 -0500
> To: jay.krell at cornell.edu
> CC: m3devel at elegosoft.com
> Subject: Re: [M3devel] how to use gcc exception/unwind support?
>
> My take was that we would use the unwind support with RTExStack along with recording the flow constraints for the IR. They were never that tricky.
>
> On Jan 2, 2011, at 3:29 AM, Jay K wrote:
>
> Tony et. al. do you have much idea already in mind of what using gcc exception and/or unwind support would look like?
>
>
> In particular, do you think we could/should/would use
> TRY_CATCH_EXPR, TRY_FINALLY_EXPR? I'm not sure (see below).
>
>
> Do you understand the difference between WITH_CLEANUP_EXPR and TRY_FINALLY_EXPR?
> I don't. Maybe WITH_CLEANUP_EXPR captures a common case is very similar?
>
>
> Regarding TRY_CATCH_EXPR, TRY_FINALLY_EXPR, they sound very promising.
> But does CATCH_EXPR provide the right construct for deciding to catch or not,
> and passing the exception properly to the handler?
>
>
> Or should we use RTExStack nearly or completely unchanged, but:
> 1) have it call libgcc/libunwind, via interface RTStack.
> 2) in the backend mimic TRY_CATCH_EXPR, TRY_FINALLY_EXPR's affects/pessimisations
> on the control flow graph and such?
>
>
> Related question is how to model throwing an exception in the backend.
> This I had looked at even less (e.g. trying to understand how g++ uses this stuff) but is clearly important.
> g++ clearly sometimes calls __cxa_throw, not clear if it always does.
> Not clear it does anything else in terms of informing the backend. It looks like not.
>
>
> - Jay
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20110103/26a7ce34/attachment-0002.html>
More information about the M3devel
mailing list