]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
trans.h (struct gfc_ss_info): New field refcount.
authorMikael Morin <mikael@gcc.gnu.org>
Thu, 3 Nov 2011 22:50:06 +0000 (22:50 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Thu, 3 Nov 2011 22:50:06 +0000 (22:50 +0000)
* trans.h (struct gfc_ss_info): New field refcount.
* trans-array.c (free_ss_info): Decrement refcount. Return early if
still non-zero.
(gfc_get_array_ss, gfc_get_temp_ss, gfc_get_scalar_ss): Increment
refcount.

From-SVN: r180883

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/fortran/trans.h

index 9b07f76723ffb1eb82513ffd749472baf176e9d2..d014b9d97db93829ffcc62a1801f9c8ae6ddf0a3 100644 (file)
@@ -1,3 +1,11 @@
+2011-11-03  Mikael Morin  <mikael@gcc.gnu.org>
+
+       * trans.h (struct gfc_ss_info): New field refcount.
+       * trans-array.c (free_ss_info): Decrement refcount. Return early if
+       still non-zero.
+       (gfc_get_array_ss, gfc_get_temp_ss, gfc_get_scalar_ss): Increment
+       refcount.
+
 2011-11-03  Mikael Morin  <mikael@gcc.gnu.org>
 
        * trans-array.c (gfc_trans_create_temp_array): Move invariant condition
index 663d12e6e6925b0d458ccbb1558204b46249f482..abb6db2a97fc390d0aa6bc90c1c9da3f66dc4a14 100644 (file)
@@ -489,6 +489,11 @@ gfc_free_ss_chain (gfc_ss * ss)
 static void
 free_ss_info (gfc_ss_info *ss_info)
 {
+  ss_info->refcount--;
+  if (ss_info->refcount > 0)
+    return;
+
+  gcc_assert (ss_info->refcount == 0);
   free (ss_info);
 }
 
@@ -532,6 +537,7 @@ gfc_get_array_ss (gfc_ss *next, gfc_expr *expr, int dimen, gfc_ss_type type)
   int i;
 
   ss_info = gfc_get_ss_info ();
+  ss_info->refcount++;
   ss_info->type = type;
   ss_info->expr = expr;
 
@@ -556,6 +562,7 @@ gfc_get_temp_ss (tree type, tree string_length, int dimen)
   int i;
 
   ss_info = gfc_get_ss_info ();
+  ss_info->refcount++;
   ss_info->type = GFC_SS_TEMP;
   ss_info->string_length = string_length;
   ss_info->data.temp.type = type;
@@ -580,6 +587,7 @@ gfc_get_scalar_ss (gfc_ss *next, gfc_expr *expr)
   gfc_ss_info *ss_info;
 
   ss_info = gfc_get_ss_info ();
+  ss_info->refcount++;
   ss_info->type = GFC_SS_SCALAR;
   ss_info->expr = expr;
 
index c35b1ae0fdacbb3812588188f118dd760922cc3f..02f2b422f07b3efe7e427530ef57d8e31aaf5edc 100644 (file)
@@ -185,6 +185,7 @@ gfc_ss_type;
 
 typedef struct gfc_ss_info
 {
+  int refcount;
   gfc_ss_type type;
   gfc_expr *expr;
   tree string_length;