This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: __attribute__((cleanup(function)) versus try/finally
- From: Mike Stump <mrs at apple dot com>
- To: Ranjit Mathew <rmathew at hotmail dot com>
- Cc: jason at redhat dot com, gcc at gcc dot gnu dot org
- Date: Thu, 8 May 2003 11:02:16 -0700
- Subject: Re: __attribute__((cleanup(function)) versus try/finally
On Wednesday, May 7, 2003, at 03:19 AM, Ranjit Mathew wrote:
Now I have an issue somewhat related to this
discussion that I hope someone would be able to
shed some light on: on Windows, the Cygwin/MinGW
targets have had to give up on DW2 EH in favour of
SJLJ purely because exceptions could not be
thrown from a callback function, across the
Windows Event Dispatcher stack to the handler
of the exception.
This can be made to work given an integrated sjlj/dwarf2 EH scheme. At
transition points into and out of code compiled by other compilation
systems (or -fno-exception code), we introduce a sjlj cleanup point
there. For, take for example:
foo() {
DispatchMessage();
}
we have to know that DispatchMessage is going to go to `outside',
imagine if you will:
#pragma gcc EH doesnt have unwind tables: DispatchMessage
foo() {
...
DispatchMessage();
...
}
then it is a simple process to generate:
foo() {
...
sjljtry {
DispatchMessage();
} catch (...) {
rethrow;
}
...
}
instead. We can get back `into' the unwind tables by doing the lj back
to this point.
In fact, this seems to be a fundamental limitation
of the DW2 EH mechanism and not just on Windows.
An unimplemented feature, I'd say, not a fundamental limitation.
Though, such a change would be probably have ABI impact, as only the
enhanced thrower would be able to fall back to doing the throw when it
runs out of unwind information.