From 98b4572e5fc3ef26ed6cbfe33967cdfd0538de29 Mon Sep 17 00:00:00 2001
From: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 11 May 2000 14:20:31 +0000
Subject: [PATCH] 	* except.c (find_exception_handler_labels_1): New
 function. 	(find_exception_handler_labels): Split into two functions,
 dive 	into CALL_PLACEHOLDERs when looking for exception handler labels.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33849 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog |  6 ++++++
 gcc/except.c  | 46 +++++++++++++++++++++++++++++++---------------
 2 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7d4dadeda5f..8ecc00896a6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2000-05-11  Jakub Jelinek  <jakub@redhat.com>
+
+	* except.c (find_exception_handler_labels_1): New function.
+	(find_exception_handler_labels): Split into two functions, dive
+	into CALL_PLACEHOLDERs when looking for exception handler labels.
+
 2000-05-11 Stan Cox <scox@cygnus.com>
 
 	* regrename.c (replace_reg_in_block): Improve REG_DEAD handling.
diff --git a/gcc/except.c b/gcc/except.c
index 67bbc40c272..2926b5a295b 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -2388,27 +2388,18 @@ emit_eh_context ()
       }
 }
 
-/* Scan the current insns and build a list of handler labels. The
-   resulting list is placed in the global variable exception_handler_labels.
+/* Scan the insn chain F and build a list of handler labels. The
+   resulting list is placed in the global variable exception_handler_labels.  */
 
-   It is called after the last exception handling region is added to
-   the current function (when the rtl is almost all built for the
-   current function) and before the jump optimization pass.  */
-
-void
-find_exception_handler_labels ()
+static void
+find_exception_handler_labels_1 (f)
+     rtx f;
 {
   rtx insn;
 
-  exception_handler_labels = NULL_RTX;
-
-  /* If we aren't doing exception handling, there isn't much to check.  */
-  if (! doing_eh (0))
-    return;
-
   /* For each start of a region, add its label to the list.  */
 
-  for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
+  for (insn = f; insn; insn = NEXT_INSN (insn))
     {
       struct handler_info* ptr;
       if (GET_CODE (insn) == NOTE
@@ -2427,9 +2418,34 @@ find_exception_handler_labels ()
                                ptr->handler_label, exception_handler_labels);
             }
 	}
+      else if (GET_CODE (insn) == CALL_INSN
+	       && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
+	{
+	  find_exception_handler_labels_1 (XEXP (PATTERN (insn), 0));
+	  find_exception_handler_labels_1 (XEXP (PATTERN (insn), 1));
+	  find_exception_handler_labels_1 (XEXP (PATTERN (insn), 2));
+	}
     }
 }
 
+/* Scan the current insns and build a list of handler labels. The
+   resulting list is placed in the global variable exception_handler_labels.
+
+   It is called after the last exception handling region is added to
+   the current function (when the rtl is almost all built for the
+   current function) and before the jump optimization pass.  */
+void
+find_exception_handler_labels ()
+{
+  exception_handler_labels = NULL_RTX;
+
+  /* If we aren't doing exception handling, there isn't much to check.  */
+  if (! doing_eh (0))
+    return;
+
+  find_exception_handler_labels_1 (get_insns ());
+}     
+
 /* Return a value of 1 if the parameter label number is an exception handler
    label. Return 0 otherwise. */
 
-- 
GitLab