This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ 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] |
There is a lot of code in libsupc++/eh_* that relies on __cxa_exception and __cxa_dependent_exception having similar layouts, so tricks like this work: static inline void* __gxx_caught_object(_Unwind_Exception* eo) { // Bad as it looks, this actually works for dependent exceptions too. __cxa_exception* header = __get_exception_header_from_ue (eo); return header->adjustedPtr; } The idea is that although the eo might be a pointer to the unwindHeader member of either __cxa_exception or __cxa_dependent_exception, the adjustedPtr member will be always be at the same location relative to the unwindHeader member, so it Just Works. Except it doesn't. offsetof(__cxa_exception, unwindHeader) == 80 offsetof(__cxa_dependent_exception, unwindHeader) == 80 offsetof(__cxa_exception, adjustedPtr) == 72 offsetof(__cxa_dependent_exception, adjustedPtr) == 64 This is the cause of PR 60612, and means we need to fix a lot of code by explicitly checking the exception class (see attached patch for a partial fix doing that in two places) or we need to change the layout of __cxa_dependent_exception (and then add some tests to verify the assumptions implicit in the code!) I don't think this is all fixable in time for 4.9.0, but the attached patch fixes one part of the problem, so I'm probably going to commit it and then work on a more complete fix later.
Attachment:
patch.txt
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |