libstdc++: optimize EH phase 2

Message ID 20230601031255.1268906-1-jason@redhat.com
State Committed
Commit 5d9c9119079ef14798b0a4fc771fd8d3905ec746
Headers
Series libstdc++: optimize EH phase 2 |

Commit Message

Jason Merrill June 1, 2023, 3:12 a.m. UTC
  Tested x86_64-pc-linux-gnu, OK for trunk?

-- 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(+)


base-commit: 68816ba245afc6d0e1482bde2d15b35b925b4195
  

Comments

Jonathan Wakely June 1, 2023, 9:09 a.m. UTC | #1
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
>
>
  

Patch

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.