]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
rtl.h (REG_EH_REGION): Update comment to indicate a value of -1 indicates no throw...
authorAndrew MacLeod <amacleod@cygnus.com>
Tue, 27 Apr 1999 17:08:37 +0000 (17:08 +0000)
committerAndrew Macleod <amacleod@gcc.gnu.org>
Tue, 27 Apr 1999 17:08:37 +0000 (17:08 +0000)
Tue Apr 27 19:50:25 EDT 1999  Andrew MacLeod  <amacleod@cygnus.com>
* rtl.h (REG_EH_REGION): Update comment to indicate a value of -1
indicates no throw and no nonlocal gotos.
* optabs.c (emit_libcall_block): Emit REG_EH_REGION with a value
of -1 instead of 0 to indicate a nonlocal goto won't happen either.
* flow.c (count_basic_blocks, find_basic_blocks_1): Ignore libcall
blocks, look for REG_EH_REGION note exclusively.
(make_edges): Check for REG_EH_REGION > 0 for specified handlers.

From-SVN: r26680

gcc/ChangeLog
gcc/flow.c
gcc/optabs.c
gcc/rtl.h

index e8c0f043597476306d91aa1f9da22c188951ed67..d2c81274e0c253fe063afed016056b2122e2c204 100644 (file)
@@ -1,3 +1,13 @@
+Tue Apr 27 19:50:25 EDT 1999  Andrew MacLeod  <amacleod@cygnus.com>
+
+       * rtl.h (REG_EH_REGION): Update comment to indicate a value of -1
+       indicates no throw and no nonlocal gotos.
+       * optabs.c (emit_libcall_block): Emit REG_EH_REGION with a value
+       of -1 instead of 0 to indicate a nonlocal goto won't happen either.
+       * flow.c (count_basic_blocks, find_basic_blocks_1): Ignore libcall
+       blocks, look for REG_EH_REGION note exclusively.
+       (make_edges): Check for REG_EH_REGION > 0 for specified handlers.
+
 Tue Apr 27 15:33:42 1999  David Edelsohn  <edelsohn@gnu.org>
 
        * rs6000.h (read_only_data_section, private_data_section,
@@ -124,7 +134,7 @@ Mon Apr 26 15:27:33 1999  Mark Mitchell  <mark@codesourcery.com>
        * fixinc/inclhack.tpl: Remove unnecessary character quote
        * fixinc/fixincl.sh, fixinc/inclhack.sh: Regenerate
 
-Mon Apr 26 10:41:42 EDT 1999  <amacleod@cygnus.com>
+Mon Apr 26 10:41:42 EDT 1999  Andrew MacLeod  <amacleod@cygnus.com>
 
        * alpha.md (builtin_setjmp_receiver): Use a label_ref instead of 
        a code label.
index 9b2151e86a5046c1f4312491540e647a9cbb5124..b46c87ea46ac9c7139e85ab428ca98d7c82948dd 100644 (file)
@@ -435,7 +435,6 @@ count_basic_blocks (f)
   register RTX_CODE prev_code;
   register int count = 0;
   int eh_region = 0;
-  int in_libcall_block = 0;
   int call_had_abnormal_edge = 0;
   rtx prev_call = NULL_RTX;
 
@@ -444,11 +443,6 @@ count_basic_blocks (f)
     {
       register RTX_CODE code = GET_CODE (insn);
 
-      /* Track when we are inside in LIBCALL block.  */
-      if (GET_RTX_CLASS (code) == 'i'
-         && find_reg_note (insn, REG_LIBCALL, NULL_RTX))
-       in_libcall_block = 1;
-
       if (code == CODE_LABEL
          || (GET_RTX_CLASS (code) == 'i'
              && (prev_code == JUMP_INSN
@@ -473,14 +467,20 @@ count_basic_blocks (f)
       /* Record whether this call created an edge.  */
       if (code == CALL_INSN)
        {
+         rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
+         int region = (note ? XINT (XEXP (note, 0), 0) : 1);
          prev_call = insn;
          call_had_abnormal_edge = 0;
-         if (nonlocal_goto_handler_labels)
-           call_had_abnormal_edge = !in_libcall_block;
-         else if (eh_region)
+
+         /* If there is a specified EH region, we have an edge.  */
+         if (eh_region && region > 0)
+           call_had_abnormal_edge = 1;
+         else
            {
-             rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
-             if (!note || XINT (XEXP (note, 0), 0) != 0)
+             /* If there is a nonlocal goto label and the specified
+                region number isn't -1, we have an edge. (0 means
+                no throw, but might have a nonlocal goto).  */
+             if (nonlocal_goto_handler_labels && region >= 0)
                call_had_abnormal_edge = 1;
            }
        }
@@ -494,9 +494,6 @@ count_basic_blocks (f)
       else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EH_REGION_END)
        --eh_region;
 
-      if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
-         && find_reg_note (insn, REG_RETVAL, NULL_RTX))
-       in_libcall_block = 0;
     }
 
   /* The rest of the compiler works a bit smoother when we don't have to
@@ -527,7 +524,6 @@ find_basic_blocks_1 (f, bb_eh_end)
      rtx *bb_eh_end;
 {
   register rtx insn, next;
-  int in_libcall_block = 0;
   int call_has_abnormal_edge = 0;
   int i = 0;
   rtx bb_note = NULL_RTX;
@@ -548,21 +544,22 @@ find_basic_blocks_1 (f, bb_eh_end)
 
       next = NEXT_INSN (insn);
 
-      /* Track when we are inside in LIBCALL block.  */
-      if (GET_RTX_CLASS (code) == 'i'
-         && find_reg_note (insn, REG_LIBCALL, NULL_RTX))
-       in_libcall_block = 1;
-
       if (code == CALL_INSN)
        {
          /* Record whether this call created an edge.  */
+         rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
+         int region = (note ? XINT (XEXP (note, 0), 0) : 1);
          call_has_abnormal_edge = 0;
-         if (nonlocal_goto_handler_labels)
-           call_has_abnormal_edge = !in_libcall_block;
-         else if (eh_list)
+
+         /* If there is an EH region, we have an edge.  */
+         if (eh_list && region > 0)
+           call_has_abnormal_edge = 1;
+         else
            {
-             rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
-             if (!note || XINT (XEXP (note, 0), 0) != 0)
+             /* If there is a nonlocal goto label and the specified
+                region number isn't -1, we have an edge. (0 means
+                no throw, but might have a nonlocal goto).  */
+             if (nonlocal_goto_handler_labels && region >= 0)
                call_has_abnormal_edge = 1;
            }
        }
@@ -722,9 +719,6 @@ find_basic_blocks_1 (f, bb_eh_end)
                    = gen_rtx_EXPR_LIST (VOIDmode, XEXP (note, 0),
                                         label_value_list);
              }
-
-         if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
-           in_libcall_block = 0;
        }
     }
 
@@ -996,7 +990,7 @@ make_edges (label_value_list, bb_eh_end)
            x = find_reg_note (insn, REG_EH_REGION, 0);
          if (x)
            {
-             if (XINT (XEXP (x, 0), 0) != 0)
+             if (XINT (XEXP (x, 0), 0) > 0)
                {
                  ptr = get_first_handler (XINT (XEXP (x, 0), 0));
                  while (ptr)
index 00ce961743a08834564b6fffec40eeff8a5b8244..541471e0910c04383b5c4f21375e75416711a953 100644 (file)
@@ -2604,7 +2604,7 @@ emit_libcall_block (insns, target, result, equiv)
         {
           rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
           if (note == NULL_RTX)
-            REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EH_REGION, GEN_INT (0),
+            REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EH_REGION, GEN_INT (-1),
                                                   REG_NOTES (insn));
         }
     }
index 964a8abd99df7297ceb707bf29111df6c9f6b4e6..8eba5eab5d9dfa89d713a36e8f54ad17a21e26a2 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -343,12 +343,14 @@ typedef struct rtvec_def{
    but are too complex for DWARF to interpret what they imply.  The attached
    rtx is used instead of intuition.  */
 /*   REG_EH_REGION is used to indicate what exception region an INSN
-   belongs in. This can be used to indicate what region a call may throw
-   to. a REGION of 0 indicates that a call cannot throw at all.
+   belongs in.  This can be used to indicate what region a call may throw
+   to.  A REGION of 0 indicates that a call cannot throw at all.
+   A REGION  of -1 indicates that it cannot throw, nor will it execute
+   a non-local goto.
      REG_EH_RETHROW is used to indicate what that a call is actually a
    call to rethrow, and specifies which region the rethrow is targetting.
    This provides a way to generate the non standard flow edges required 
-   for a rethrow. */
+   for a rethrow.  */
    
 
 #define REG_NOTES(INSN)        ((INSN)->fld[6].rtx)