https://gcc.gnu.org/g:7ec787200301f75109c41d7c4a82891971dbd62b

commit 7ec787200301f75109c41d7c4a82891971dbd62b
Author: Pranil Dey <mkd...@gmail.com>
Date:   Mon Sep 30 18:39:14 2024 +0530

    Integrated the resx functions with stmt_throw_types
    
    update_stmt_eh_region updated for resx stmt support and 
extract_fun_resx_types fixed

Diff:
---
 gcc/tree-eh.cc | 34 +++++++++++++++++++++++++++-------
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/gcc/tree-eh.cc b/gcc/tree-eh.cc
index 121cbed505b8..ea9a2ca6bb00 100644
--- a/gcc/tree-eh.cc
+++ b/gcc/tree-eh.cc
@@ -49,6 +49,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "gimplify.h"
 #include "print-tree.h"
 #include "ipa-utils.h"
+#include "hash-set.h"
 
 /* In some instances a tree and a gimple need to be stored in a same table,
    i.e. in hash tables. This is a structure to do this. */
@@ -2345,13 +2346,19 @@ void update_stmt_eh_region (gimple *stmt) {
     while (region) {
         switch (region->type) {
             case ERT_CLEANUP:
+                if(gimple_code (stmt) == GIMPLE_RESX){
+                  gimple_resx_set_region(stmt, region->index);
+                }
                 *cfun->eh->throw_stmt_table->get (const_cast<gimple *> (stmt)) 
= lp->index;
                 return;
 
             case ERT_TRY:
                 if (match_lp (lp, &exception_types)) {
-                    *cfun->eh->throw_stmt_table->get (const_cast<gimple *> 
(stmt)) = lp->index;
-                    return;
+                  if(gimple_code (stmt) == GIMPLE_RESX){
+                    gimple_resx_set_region(stmt, region->index);
+                  }
+                  *cfun->eh->throw_stmt_table->get (const_cast<gimple *> 
(stmt)) = lp->index;
+                  return;
                 }
                 break;
 
@@ -2371,7 +2378,10 @@ void update_stmt_eh_region (gimple *stmt) {
         region = region->outer;
     }
 
-    remove_stmt_from_eh_lp_fn (cfun, stmt);
+    if(gimple_code (stmt) == GIMPLE_RESX){
+      gimple_resx_set_region(stmt, -1);
+    }
+    else remove_stmt_from_eh_lp_fn (cfun, stmt);
 }
 
 /* Create the single EH edge from STMT to its nearest landing pad,
@@ -3044,10 +3054,14 @@ bool stmt_throw_types (function *fun, gimple *stmt, 
vec<tree> *ret_vector) {
     }
 
     switch (gimple_code (stmt)) {
+        case GIMPLE_RESX:
+            extract_fun_resx_types (fun, ret_vector);
+            return !ret_vector->is_empty ();
+
         case GIMPLE_CALL:
             extract_types_for_call (as_a<gcall*> (stmt), ret_vector);
             return !ret_vector->is_empty ();
-
+          
         default:
             return false;
     }
@@ -3089,10 +3103,10 @@ void extract_types_for_resx (gimple *resx_stmt, 
vec<tree> *ret_vector) {
 }
 
 // To get the types being thrown outside of a function
-void extract_fun_resx_types (function *fun){
+void extract_fun_resx_types (function *fun, vec<tree> *ret_vector) {
        basic_block bb;
        gimple_stmt_iterator gsi;
-       vec<tree> *exception_types;
+  hash_set<tree> *types;
 
        FOR_EACH_BB_FN (bb, fun)
        {
@@ -3113,9 +3127,15 @@ void extract_fun_resx_types (function *fun){
 
                for (unsigned i = 0;i<ret_vector->length ();++i){
                        tree type = (*ret_vector)[i];
-                       exception_types->safe_push (type);
+                 types->add (type);
                }
        }
+
+  for (auto it = types->begin(); it != types->end(); ++it) {
+        ret_vector->safe_push(*it);
+  }
+
+  clear_aux_for_blocks ();
 }
 
 /* Return true if statement STMT within FUN could throw an exception.  */

Reply via email to