ipa-prop.c (ipa_propagate_indirect_call_infos): Remove obsolette WPA hack.
authorJan Hubicka <jh@suse.cz>
Sun, 24 Apr 2011 10:43:00 +0000 (12:43 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 24 Apr 2011 10:43:00 +0000 (10:43 +0000)
* ipa-prop.c (ipa_propagate_indirect_call_infos): Remove obsolette
WPA hack.
* ipa-prop.h (ipa_get_param, ipa_is_param_used, ipa_param_cannot_devirtualize_p,
ipa_param_types_vec_empty, ipa_get_ith_jump_func, ipa_get_lattice):
Fortify array bounds.
* ipa-inline-analysis.c (add_clause): Fix clause ordering.
(and_predicates, or_predicates, predicates_equal_p, evaulate_predicate):
Sanity check predicate length.
(remap_predicate): Likewise; sanity check jump functions.
(inline_read_section, inline_write_summary): Sanity check
predicate length.

From-SVN: r172914

gcc/ChangeLog
gcc/ipa-inline-analysis.c
gcc/ipa-prop.c
gcc/ipa-prop.h

index 1f191ee2e18e2e1143e8a8d7c1b1ea9ba3be20ec..3a7ebf0e42425e2d9e46e42b2c9c8a2c56cd20e8 100644 (file)
@@ -1,3 +1,17 @@
+2011-04-24  Jan Hubicka  <jh@suse.cz>
+
+       * ipa-prop.c (ipa_propagate_indirect_call_infos): Remove obsolette
+       WPA hack.
+       * ipa-prop.h (ipa_get_param, ipa_is_param_used, ipa_param_cannot_devirtualize_p,
+       ipa_param_types_vec_empty, ipa_get_ith_jump_func, ipa_get_lattice):
+       Fortify array bounds.
+       * ipa-inline-analysis.c (add_clause): Fix clause ordering.
+       (and_predicates, or_predicates, predicates_equal_p, evaulate_predicate):
+       Sanity check predicate length.
+       (remap_predicate): Likewise; sanity check jump functions.
+       (inline_read_section, inline_write_summary): Sanity check
+       predicate length.
+
 2011-04-24  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR other/48748
index c7f9bbb353519eb4c526a828398cc1b6e2a77115..bedd9633da8527dfbe2336a936e1dcf0c9850c13 100644 (file)
@@ -200,7 +200,7 @@ static inline void
 add_clause (struct predicate *p, clause_t clause)
 {
   int i;
-  int insert_here = 0;
+  int insert_here = -1;
   /* True clause.  */
   if (!clause)
     return;
@@ -211,7 +211,7 @@ add_clause (struct predicate *p, clause_t clause)
       p->clause[0] = (1 << predicate_false_condition);
       p->clause[1] = 0;
     }
-  for (i = 0; i < MAX_CLAUSES; i++)
+  for (i = 0; i < MAX_CLAUSES - 1; i++)
     {
       if (p->clause[i] == clause)
         return;
@@ -225,8 +225,11 @@ add_clause (struct predicate *p, clause_t clause)
     return;
   /* Keep clauses ordered by index, so equivalence testing is easy.  */
   p->clause[i + 1] = 0;
-  for (;i > insert_here; i--)
-    p->clause[i] = p->clause[i - 1];
+  if (insert_here >= 0)
+    for (;i > insert_here; i--)
+      p->clause[i] = p->clause[i - 1];
+  else
+    insert_here = i;
   p->clause[insert_here] = clause;
 }
 
@@ -239,7 +242,10 @@ and_predicates (struct predicate *p, struct predicate *p2)
   struct predicate out = *p;
   int i;
   for (i = 0; p2->clause[i]; i++)
-    add_clause (&out, p2->clause[i]);
+    {
+      gcc_checking_assert (i < MAX_CLAUSES);
+      add_clause (&out, p2->clause[i]);
+    }
   return out;
 }
 
@@ -264,7 +270,10 @@ or_predicates (struct predicate *p, struct predicate *p2)
     }
   for (i = 0; p->clause[i]; i++)
     for (j = 0; p2->clause[j]; j++)
-      add_clause (&out, p->clause[i] | p2->clause[j]);
+      {
+        gcc_checking_assert (i < MAX_CLAUSES && j < MAX_CLAUSES);
+        add_clause (&out, p->clause[i] | p2->clause[j]);
+      }
   return out;
 }
 
@@ -276,8 +285,11 @@ predicates_equal_p (struct predicate *p, struct predicate *p2)
 {
   int i;
   for (i = 0; p->clause[i]; i++)
-    if (p->clause[i] != p2->clause[i])
-      return false;
+    {
+      gcc_checking_assert (i < MAX_CLAUSES);
+      if (p->clause[i] != p2->clause[i])
+        return false;
+    }
   return !p2->clause[i];
 }
 
@@ -296,8 +308,11 @@ evaulate_predicate (struct predicate *p, clause_t possible_truths)
 
   /* See if we can find clause we can disprove.  */
   for (i = 0; p->clause[i]; i++)
-    if (!(p->clause[i] & possible_truths))
-      return false;
+    {
+      gcc_checking_assert (i < MAX_CLAUSES);
+      if (!(p->clause[i] & possible_truths))
+        return false;
+    }
   return true;
 }
 
@@ -1166,6 +1181,8 @@ remap_predicate (struct inline_summary *info, struct inline_summary *callee_info
       int cond;
       struct predicate clause_predicate = false_predicate ();
 
+      gcc_assert (i < MAX_CLAUSES);
+
       for (cond = 0; cond < NUM_CONDITIONS; cond ++)
        /* Do we have condition we can't disprove?   */
        if (clause & possible_truths & (1 << cond))
@@ -1240,6 +1257,7 @@ inline_merge_summary (struct cgraph_edge *edge)
              && jfunc->value.pass_through.operation == NOP_EXPR)
            map = jfunc->value.pass_through.formal_id;
          VEC_replace (int, operand_map, i, map);
+         gcc_assert (map < ipa_get_param_count (IPA_NODE_REF (to)));
        }
     }
   for (i = 0; VEC_iterate (size_time_entry, callee_info->entry, i, e); i++)
@@ -1544,6 +1562,7 @@ inline_read_section (struct lto_file_decl_data *file_data, const char *data,
          do 
            {
              clause = e.predicate.clause[k++] = lto_input_uleb128 (&ib);
+             gcc_assert (k < MAX_CLAUSES);
            }
          while (clause);
 
@@ -1658,8 +1677,11 @@ inline_write_summary (cgraph_node_set set,
              lto_output_uleb128_stream (ob->main_stream,
                                         e->time);
              for (j = 0; e->predicate.clause[j]; j++)
-               lto_output_uleb128_stream (ob->main_stream,
-                                          e->predicate.clause[j]);
+               {
+                  gcc_assert (j < MAX_CLAUSES);
+                  lto_output_uleb128_stream (ob->main_stream,
+                                             e->predicate.clause[j]);
+               }
              lto_output_uleb128_stream (ob->main_stream, 0);
            }
        }
index afec18848a5ea2132f8c0f9f3072de0b1fb41557..5691193ce0deddb9c19f10acecc6bb614735b546 100644 (file)
@@ -1890,10 +1890,6 @@ bool
 ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
                                   VEC (cgraph_edge_p, heap) **new_edges)
 {
-  /* FIXME lto: We do not stream out indirect call information.  */
-  if (flag_wpa)
-    return false;
-
   /* Do nothing if the preparation phase has not been carried out yet
      (i.e. during early inlining).  */
   if (!ipa_node_params_vector)
index 3ae0d1b2bd735812472e89b9acc8886a016e45ab..d5f1bc6de2875ad4df95de5dd61a88055e4e0105 100644 (file)
@@ -228,6 +228,7 @@ ipa_get_param_count (struct ipa_node_params *info)
 static inline tree
 ipa_get_param (struct ipa_node_params *info, int i)
 {
+  gcc_assert (i >= 0 && i <= info->param_count);
   return info->params[i].decl;
 }
 
@@ -237,6 +238,7 @@ ipa_get_param (struct ipa_node_params *info, int i)
 static inline bool
 ipa_is_param_used (struct ipa_node_params *info, int i)
 {
+  gcc_assert (i >= 0 && i <= info->param_count);
   return info->params[i].used;
 }
 
@@ -247,6 +249,7 @@ ipa_is_param_used (struct ipa_node_params *info, int i)
 static inline bool
 ipa_param_cannot_devirtualize_p (struct ipa_node_params *info, int i)
 {
+  gcc_assert (i >= 0 && i <= info->param_count);
   return info->params[i].cannot_devirtualize;
 }
 
@@ -256,6 +259,7 @@ ipa_param_cannot_devirtualize_p (struct ipa_node_params *info, int i)
 static inline bool
 ipa_param_types_vec_empty (struct ipa_node_params *info, int i)
 {
+  gcc_assert (i >= 0 && i <= info->param_count);
   return info->params[i].types == NULL;
 }
 
@@ -315,6 +319,7 @@ ipa_get_cs_argument_count (struct ipa_edge_args *args)
 static inline struct ipa_jump_func *
 ipa_get_ith_jump_func (struct ipa_edge_args *args, int i)
 {
+  gcc_assert (i >= 0 && i <= args->argument_count);
   return &args->jump_functions[i];
 }
 
@@ -528,6 +533,7 @@ tree build_ref_for_offset (location_t, tree, HOST_WIDE_INT, tree,
 static inline struct ipcp_lattice *
 ipa_get_lattice (struct ipa_node_params *info, int i)
 {
+  gcc_assert (i >= 0 && i <= info->param_count);
   return &(info->params[i].ipcp_lattice);
 }