Message ID | 20230601031255.1268906-1-jason@redhat.com |
---|---|
State | New |
Headers | show |
Series | libstdc++: optimize EH phase 2 | expand |
On Thu, 1 Jun 2023 at 04:13, Jason Merrill via Libstdc++ < libstdc++@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 > >
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.