Fix memory leak in cilk
authorMartin Liska <mliska@suse.cz>
Fri, 27 Nov 2015 09:36:20 +0000 (10:36 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 27 Nov 2015 09:36:20 +0000 (09:36 +0000)
PR c++/68312
* c-array-notation.c (fix_builtin_array_notation_fn):
Use release_vec_vec instead of vec::release.
(build_array_notation_expr): Likewise.
(fix_conditional_array_notations_1): Likewise.
(fix_array_notation_expr): Likewise.
(fix_array_notation_call_expr): Likewise.
PR c++/68312
* cp-array-notation.c (expand_sec_reduce_builtin):
Likewise.
(create_array_refs): Replace argument with const reference.
(expand_an_in_modify_expr): Likewise.
(cp_expand_cond_array_notations): Likewise.
(expand_unary_array_notation_exprs): Likewise.
PR c++/68312
* array-notation-common.c (cilkplus_extract_an_triplets):
Release vector of vectors.
* cilk.c (gimplify_cilk_spawn): Free allocated memory.
PR c++/68312
* vec.h (release_vec_vec): New function.

From-SVN: r231001

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/array-notation-common.c
gcc/c-family/cilk.c
gcc/c/ChangeLog
gcc/c/c-array-notation.c
gcc/cp/ChangeLog
gcc/cp/cp-array-notation.c
gcc/vec.h

index d70eddb1960ac16d364ca537abf73bee6f4f2ffe..24fb40fb90cc3b120c50a79219b8d9ecaf66133e 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-27  Martin Liska  <mliska@suse.cz>
+
+       PR c++/68312
+       * vec.h (release_vec_vec): New function.
+
 2015-11-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/68552
index 595fc3a9d6379cfc7abb4b6822a56f61e771b994..ad0fbc1c73559485f4608cc49fc91866d371393c 100644 (file)
@@ -1,3 +1,10 @@
+2015-11-27  Martin Liska  <mliska@suse.cz>
+
+       PR c++/68312
+       * array-notation-common.c (cilkplus_extract_an_triplets):
+       Release vector of vectors.
+       * cilk.c (gimplify_cilk_spawn): Free allocated memory.
+
 2015-11-26  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR c++/68527
index 4f7072bda84ef01388ea063c4ff5ce809a239899..5f2209dbc31aedc45c07fdd6df0bf4a170bef8ea 100644 (file)
@@ -636,6 +636,8 @@ cilkplus_extract_an_triplets (vec<tree, va_gc> *list, size_t size, size_t rank,
              fold_build1 (CONVERT_EXPR, integer_type_node,
                           ARRAY_NOTATION_STRIDE (ii_tree));
          }
+
+  release_vec_vec (array_exprs);
 }
 
 /* Replaces all the __sec_implicit_arg functions in LIST with the induction
index 15cce34b33d9f4534e7be57aa1be0aaede8819bd..99ff75a3966f19a19d81045952ef832a5de3a632 100644 (file)
@@ -857,6 +857,7 @@ gimplify_cilk_spawn (tree *spawn_p)
                            call2, build_empty_stmt (EXPR_LOCATION (call1)));
   append_to_statement_list (spawn_expr, spawn_p);
 
+  free (arg_array);
   return GS_OK;
 }
 
index 2f58369bf4a6c1f8010bef5144e8dfd87b62cd82..ffa365c1f7231e82ef8c4a06edb99a9410a88e7d 100644 (file)
@@ -1,3 +1,13 @@
+2015-11-27  Martin Liska  <mliska@suse.cz>
+
+       PR c++/68312
+       * c-array-notation.c (fix_builtin_array_notation_fn):
+       Use release_vec_vec instead of vec::release.
+       (build_array_notation_expr): Likewise.
+       (fix_conditional_array_notations_1): Likewise.
+       (fix_array_notation_expr): Likewise.
+       (fix_array_notation_call_expr): Likewise.
+
 2015-11-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/63326
index 21f8684eb4be03bda3401d67c80fa3379da69197..8d5876a4b32f8b8fa21c0e140fe736a86f2f8251 100644 (file)
@@ -205,7 +205,7 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree *new_var)
   location_t location = UNKNOWN_LOCATION;
   tree loop_with_init = alloc_stmt_list ();
   vec<vec<an_parts> > an_info = vNULL;
-  vec<an_loop_parts> an_loop_info = vNULL;
+  auto_vec<an_loop_parts> an_loop_info;
   enum built_in_function an_type =
     is_cilkplus_reduce_builtin (CALL_EXPR_FN (an_builtin_fn));
   if (an_type == BUILT_IN_NONE)
@@ -593,8 +593,7 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree *new_var)
     }
   append_to_statement_list_force (body, &loop_with_init);
 
-  an_info.release ();
-  an_loop_info.release ();
+  release_vec_vec (an_info);
   
   return loop_with_init;
 }
@@ -614,7 +613,7 @@ build_array_notation_expr (location_t location, tree lhs, tree lhs_origtype,
   tree array_expr_lhs = NULL_TREE, array_expr_rhs = NULL_TREE;
   tree array_expr = NULL_TREE;
   tree an_init = NULL_TREE;
-  vec<tree> cond_expr = vNULL;
+  auto_vec<tree> cond_expr;
   tree body, loop_with_init = alloc_stmt_list();
   tree scalar_mods = NULL_TREE;
   vec<tree, va_gc> *rhs_array_operand = NULL, *lhs_array_operand = NULL;
@@ -624,7 +623,7 @@ build_array_notation_expr (location_t location, tree lhs, tree lhs_origtype,
   tree new_modify_expr, new_var = NULL_TREE, builtin_loop = NULL_TREE;
   size_t rhs_list_size = 0, lhs_list_size = 0; 
   vec<vec<an_parts> > lhs_an_info = vNULL, rhs_an_info = vNULL;
-  vec<an_loop_parts> lhs_an_loop_info = vNULL, rhs_an_loop_info = vNULL;
+  auto_vec<an_loop_parts> lhs_an_loop_info, rhs_an_loop_info;
   
   /* If either of this is true, an error message must have been send out
      already.  Not necessary to send out multiple error messages.  */
@@ -771,7 +770,7 @@ build_array_notation_expr (location_t location, tree lhs, tree lhs_origtype,
          && length_mismatch_in_expr_p (EXPR_LOCATION (rhs), rhs_an_info)))
     {
       pop_stmt_list (an_init);
-      return error_mark_node;
+      goto error;
     }
   if (lhs_list_size > 0 && rhs_list_size > 0 && lhs_rank > 0 && rhs_rank > 0
       && TREE_CODE (lhs_an_info[0][0].length) == INTEGER_CST
@@ -786,7 +785,7 @@ build_array_notation_expr (location_t location, tree lhs, tree lhs_origtype,
        {
          error_at (location, "length mismatch between LHS and RHS");
          pop_stmt_list (an_init);
-         return error_mark_node;
+         goto error;
        }
     }
   for (ii = 0; ii < lhs_rank; ii++)
@@ -829,7 +828,7 @@ build_array_notation_expr (location_t location, tree lhs, tree lhs_origtype,
                                                 rhs_an_loop_info, rhs_rank,
                                                 rhs);
       if (!rhs_array_operand)
-       return error_mark_node;
+       goto error;
       replace_array_notations (&rhs, true, rhs_list, rhs_array_operand);
     }
   else if (rhs_list_size > 0)
@@ -838,7 +837,7 @@ build_array_notation_expr (location_t location, tree lhs, tree lhs_origtype,
                                                 lhs_an_loop_info, lhs_rank,
                                                 lhs);
       if (!rhs_array_operand)
-       return error_mark_node;
+       goto error;
       replace_array_notations (&rhs, true, rhs_list, rhs_array_operand);
     }
   array_expr_lhs = lhs;
@@ -881,15 +880,15 @@ build_array_notation_expr (location_t location, tree lhs, tree lhs_origtype,
     }
   append_to_statement_list_force (body, &loop_with_init);
 
-  lhs_an_info.release ();
-  lhs_an_loop_info.release ();
-  if (rhs_rank)
-    {
-      rhs_an_info.release ();
-      rhs_an_loop_info.release ();
-    }
-  cond_expr.release ();
+  release_vec_vec (lhs_an_info);
+  release_vec_vec (rhs_an_info);
   return loop_with_init;
+
+error:
+  release_vec_vec (lhs_an_info);
+  release_vec_vec (rhs_an_info);
+
+  return error_mark_node;
 }
 
 /* Helper function for fix_conditional_array_notations.  Encloses the 
@@ -909,7 +908,7 @@ fix_conditional_array_notations_1 (tree stmt)
   location_t location = EXPR_LOCATION (stmt);
   tree body = NULL_TREE, loop_with_init = alloc_stmt_list ();
   vec<vec<an_parts> > an_info = vNULL;
-  vec<an_loop_parts> an_loop_info = vNULL;
+  auto_vec<an_loop_parts> an_loop_info;
  
   if (TREE_CODE (stmt) == COND_EXPR)
     cond = COND_EXPR_COND (stmt);
@@ -1005,9 +1004,7 @@ fix_conditional_array_notations_1 (tree stmt)
       body = pop_stmt_list (new_loop);
     }
   append_to_statement_list_force (body, &loop_with_init);
-
-  an_loop_info.release ();
-  an_info.release ();
+  release_vec_vec (an_info);
 
   return loop_with_init;
 }
@@ -1048,7 +1045,7 @@ fix_array_notation_expr (location_t location, enum tree_code code,
   tree loop_init;
   tree body, loop_with_init = alloc_stmt_list ();
   vec<vec<an_parts> > an_info = vNULL;
-  vec<an_loop_parts> an_loop_info = vNULL;
+  auto_vec<an_loop_parts> an_loop_info;
   
   if (!find_rank (location, arg.value, arg.value, false, &rank))
     {
@@ -1110,8 +1107,7 @@ fix_array_notation_expr (location_t location, enum tree_code code,
     }
   append_to_statement_list_force (body, &loop_with_init);
   arg.value = loop_with_init;
-  an_info.release ();
-  an_loop_info.release ();
+  release_vec_vec (an_info);
   return arg;
 }
 
@@ -1128,7 +1124,7 @@ fix_array_notation_call_expr (tree arg)
   tree body, loop_with_init = alloc_stmt_list ();
   location_t location = UNKNOWN_LOCATION;
   vec<vec<an_parts> > an_info = vNULL;
-  vec<an_loop_parts> an_loop_info = vNULL;
+  auto_vec<an_loop_parts> an_loop_info;
 
   if (TREE_CODE (arg) == CALL_EXPR
       && is_cilkplus_reduce_builtin (CALL_EXPR_FN (arg)))
@@ -1194,8 +1190,7 @@ fix_array_notation_call_expr (tree arg)
       body = pop_stmt_list (new_loop);
     }
   append_to_statement_list_force (body, &loop_with_init);
-  an_loop_info.release ();
-  an_info.release ();
+  release_vec_vec (an_info);
   return loop_with_init;
 }
 
index bb54dce0fe945c358c4f4e98cd5229f3fe379617..b4243369fb2872c848d21fa14fc29bac7f6d53d9 100644 (file)
@@ -1,3 +1,13 @@
+2015-11-27  Martin Liska  <mliska@suse.cz>
+
+       PR c++/68312
+       * cp-array-notation.c (expand_sec_reduce_builtin):
+       Likewise.
+       (create_array_refs): Replace argument with const reference.
+       (expand_an_in_modify_expr): Likewise.
+       (cp_expand_cond_array_notations): Likewise.
+       (expand_unary_array_notation_exprs): Likewise.
+
 2015-11-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/63326
index 84d79258fdbbecb7ae85cf3f19b6cb30e9b55d89..8862af1bc4d761dde7ae9b1db8f0ba1a8422d3ea 100644 (file)
@@ -210,7 +210,7 @@ expand_sec_reduce_builtin (tree an_builtin_fn, tree *new_var)
   enum tree_code code = NOP_EXPR;
   location_t location = UNKNOWN_LOCATION;
   vec<vec<an_parts> > an_info = vNULL;
-  vec<an_loop_parts> an_loop_info = vNULL; 
+  auto_vec<an_loop_parts> an_loop_info;
   enum built_in_function an_type =
     is_cilkplus_reduce_builtin (CALL_EXPR_FN (an_builtin_fn));
   vec <tree, va_gc> *func_args;
@@ -494,8 +494,7 @@ expand_sec_reduce_builtin (tree an_builtin_fn, tree *new_var)
     }
   append_to_statement_list (body, &loop_with_init);
 
-  an_info.release ();
-  an_loop_info.release ();
+  release_vec_vec (an_info);
 
   return loop_with_init;
 }
@@ -512,7 +511,7 @@ expand_an_in_modify_expr (location_t location, tree lhs,
   tree array_expr_lhs = NULL_TREE, array_expr_rhs = NULL_TREE;
   tree array_expr = NULL_TREE;
   tree body = NULL_TREE;
-  vec<tree> cond_expr = vNULL;
+  auto_vec<tree> cond_expr;
   vec<tree, va_gc> *lhs_array_operand = NULL, *rhs_array_operand = NULL;
   size_t lhs_rank = 0, rhs_rank = 0, ii = 0;
   vec<tree, va_gc> *rhs_list = NULL, *lhs_list = NULL;
@@ -521,7 +520,8 @@ expand_an_in_modify_expr (location_t location, tree lhs,
   bool found_builtin_fn = false;
   tree an_init, loop_with_init = alloc_stmt_list ();
   vec<vec<an_parts> > lhs_an_info = vNULL, rhs_an_info = vNULL;
-  vec<an_loop_parts> lhs_an_loop_info = vNULL, rhs_an_loop_info = vNULL;
+  auto_vec<an_loop_parts> lhs_an_loop_info, rhs_an_loop_info;
+  tree lhs_len, rhs_len;
 
   if (!find_rank (location, rhs, rhs, false, &rhs_rank))
     return error_mark_node;
@@ -645,11 +645,11 @@ expand_an_in_modify_expr (location_t location, tree lhs,
                                                 rhs_an_info)))
     {
       pop_stmt_list (an_init);
-      return error_mark_node;
+      goto error;
     }
-  tree rhs_len = ((rhs_list_size > 0 && rhs_rank > 0) ?
+  rhs_len = ((rhs_list_size > 0 && rhs_rank > 0) ?
     rhs_an_info[0][0].length : NULL_TREE);
-  tree lhs_len = ((lhs_list_size > 0 && lhs_rank > 0) ?
+  lhs_len = ((lhs_list_size > 0 && lhs_rank > 0) ?
     lhs_an_info[0][0].length : NULL_TREE);
   if (lhs_list_size > 0 && rhs_list_size > 0 && lhs_rank > 0 && rhs_rank > 0
       && TREE_CODE (lhs_len) == INTEGER_CST && rhs_len
@@ -658,7 +658,7 @@ expand_an_in_modify_expr (location_t location, tree lhs,
     { 
       error_at (location, "length mismatch between LHS and RHS"); 
       pop_stmt_list (an_init); 
-      return error_mark_node;
+      goto error;
     }
    for (ii = 0; ii < lhs_rank; ii++) 
      {
@@ -676,7 +676,7 @@ expand_an_in_modify_expr (location_t location, tree lhs,
                                                  lhs_an_loop_info, lhs_rank,
                                                  lhs); 
        if (!rhs_array_operand)
-        return error_mark_node;
+        goto error;
      }
   replace_array_notations (&rhs, true, rhs_list, rhs_array_operand);
   rhs_list_size = 0;
@@ -717,7 +717,7 @@ expand_an_in_modify_expr (location_t location, tree lhs,
                                                 rhs_an_loop_info, rhs_rank,
                                                 rhs);
       if (!rhs_array_operand)
-       return error_mark_node;
+       goto error;
       replace_array_notations (&rhs, true, rhs_list, rhs_array_operand);
     }
 
@@ -768,16 +768,16 @@ expand_an_in_modify_expr (location_t location, tree lhs,
     }
   append_to_statement_list (body, &loop_with_init);
 
-  lhs_an_info.release ();
-  lhs_an_loop_info.release ();
-  if (rhs_rank) 
-    { 
-      rhs_an_info.release (); 
-      rhs_an_loop_info.release ();
-    }
-  cond_expr.release ();
+  release_vec_vec (lhs_an_info);
+  release_vec_vec (rhs_an_info);
 
   return loop_with_init;
+
+error:
+  release_vec_vec (lhs_an_info);
+  release_vec_vec (rhs_an_info);
+
+  return error_mark_node;
 }
 
 /* Helper function for expand_conditonal_array_notations.  Encloses the
@@ -796,7 +796,7 @@ cp_expand_cond_array_notations (tree orig_stmt)
   tree loop_with_init = alloc_stmt_list ();
   location_t location = UNKNOWN_LOCATION;
   vec<vec<an_parts> > an_info = vNULL;
-  vec<an_loop_parts> an_loop_info = vNULL;
+  auto_vec<an_loop_parts> an_loop_info;
 
   if (TREE_CODE (orig_stmt) == COND_EXPR)
     {
@@ -957,8 +957,7 @@ cp_expand_cond_array_notations (tree orig_stmt)
     }
   append_to_statement_list (body, &loop_with_init);
 
-  an_info.release ();
-  an_loop_info.release ();
+  release_vec_vec (an_info);
   
   return loop_with_init;
 }
@@ -977,7 +976,7 @@ expand_unary_array_notation_exprs (tree orig_stmt)
   location_t location = EXPR_LOCATION (orig_stmt);
   tree an_init, loop_with_init = alloc_stmt_list ();
   vec<vec<an_parts> > an_info = vNULL;
-  vec<an_loop_parts> an_loop_info = vNULL;
+  auto_vec<an_loop_parts> an_loop_info;
   
   if (!find_rank (location, orig_stmt, orig_stmt, true, &rank))
     return error_mark_node;
@@ -1060,8 +1059,7 @@ expand_unary_array_notation_exprs (tree orig_stmt)
     }
   append_to_statement_list (body, &loop_with_init);
 
-  an_info.release ();
-  an_loop_info.release ();
+  release_vec_vec (an_info);
 
   return loop_with_init;
 }
index 3e6e882b97046ddb28773fd359712eaa8f16c5a4..ed300b48c7fd9ee0e49b634aba68fe3c185f8b9b 100644 (file)
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -1702,6 +1702,18 @@ vec<T, va_heap, vl_ptr>::using_auto_storage () const
   return m_vec->m_vecpfx.m_using_auto_storage;
 }
 
+/* Release VEC and call release of all element vectors.  */
+
+template<typename T>
+inline void
+release_vec_vec (vec<vec<T> > &vec)
+{
+  for (unsigned i = 0; i < vec.length (); i++)
+    vec[i].release ();
+
+  vec.release ();
+}
+
 #if (GCC_VERSION >= 3000)
 # pragma GCC poison m_vec m_vecpfx m_vecdata
 #endif