This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]