On Thu, 1 Jun 2023 at 04:13, Jason Merrill via Libstdc++ < libstd...@gcc.gnu.org> wrote:
> Tested x86_64-pc-linux-gnu, OK for trunk? > OK, thanks. > > -- 8< -- > > In the ABI's two-phase EH model, first we walk the stack looking for a > handler, then we walk the stack running cleanups until we reach that > handler. In the cleanup phase, we shouldn't redundantly check the handlers > along the way, e.g. when walking through g(): > > void f() { throw 42; } > void g() { try { f(); } catch (void *) { } } > int main() { try { g(); } catch (int) { } } > > libstdc++-v3/ChangeLog: > > * libsupc++/eh_personality.cc (PERSONALITY_FUNCTION): Don't check > handlers in the cleanup phase. > --- > libstdc++-v3/libsupc++/eh_personality.cc | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/libstdc++-v3/libsupc++/eh_personality.cc > b/libstdc++-v3/libsupc++/eh_personality.cc > index 12391e563d6..cc6bc048892 100644 > --- a/libstdc++-v3/libsupc++/eh_personality.cc > +++ b/libstdc++-v3/libsupc++/eh_personality.cc > @@ -592,6 +592,10 @@ PERSONALITY_FUNCTION (int version, > // Zero filter values are cleanups. > saw_cleanup = true; > } > + else if (actions == _UA_CLEANUP_PHASE) > + // We checked the handlers in the search phase; if one of them > + // matched, actions would also have _UA_HANDLER_FRAME set. > + ; > else if (ar_filter > 0) > { > // Positive filter values are handlers. > > base-commit: 68816ba245afc6d0e1482bde2d15b35b925b4195 > -- > 2.31.1 > >