From f19c9228fc48df0ca59f7f9b1ba8408f7c145153 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 11 May 2000 16:20:31 +0200 Subject: [PATCH] except.c (find_exception_handler_labels_1): New function. * 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. From-SVN: r33849 --- 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 + + * 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 * 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. */ -- 2.30.2