gcc/ChangeLog.gimple-classes:
        * asan.c (asan_expand_check_ifn): Strengthen local "shadow_test"
        from gimple to gassign *.  Introduce gassign * locals "add_7",
        "cast", "t_ge_shadow", "and_expr", using them in place of
        gimple_seq_last_stmt (seq) for typesafety.
        * gimple-builder.c (build_assign): Strengthen param "g" from
        gimple to const gassign * for all overloads.
        (build_type_cast): Likewise for param "op".
        * gimple-builder.h (build_assign): Strengthen param from gimple to
        const gassign * for all overloads.
        (build_type_cast): Strengthen param 2 from gimple to
        const gassign *.
---
 gcc/ChangeLog.gimple-classes | 14 ++++++++++++++
 gcc/asan.c                   | 44 ++++++++++++++++++++++++--------------------
 gcc/gimple-builder.c         | 11 ++++++-----
 gcc/gimple-builder.h         | 14 +++++++++-----
 4 files changed, 53 insertions(+), 30 deletions(-)

diff --git a/gcc/ChangeLog.gimple-classes b/gcc/ChangeLog.gimple-classes
index d207213..631e0df 100644
--- a/gcc/ChangeLog.gimple-classes
+++ b/gcc/ChangeLog.gimple-classes
@@ -1,5 +1,19 @@
 2014-11-04  David Malcolm  <dmalc...@redhat.com>
 
+       * asan.c (asan_expand_check_ifn): Strengthen local "shadow_test"
+       from gimple to gassign *.  Introduce gassign * locals "add_7",
+       "cast", "t_ge_shadow", "and_expr", using them in place of
+       gimple_seq_last_stmt (seq) for typesafety.
+       * gimple-builder.c (build_assign): Strengthen param "g" from
+       gimple to const gassign * for all overloads.
+       (build_type_cast): Likewise for param "op".
+       * gimple-builder.h (build_assign): Strengthen param from gimple to
+       const gassign * for all overloads.
+       (build_type_cast): Strengthen param 2 from gimple to
+       const gassign *.
+
+2014-11-04  David Malcolm  <dmalc...@redhat.com>
+
        * gimple.h (gimple_expr_type): Split out if clause handling
        GIMPLE_ASSIGN and GIMPLE_CALL with an inner if GIMPLE_CALL
        into a pair of if clauses, first for GIMPLE_CALL, then for
diff --git a/gcc/asan.c b/gcc/asan.c
index 9b25f56..6808c30 100644
--- a/gcc/asan.c
+++ b/gcc/asan.c
@@ -2633,7 +2633,7 @@ asan_expand_check_ifn (gimple_stmt_iterator *iter, bool 
use_calls)
             & ((base_addr & 7) + (real_size_in_bytes - 1)) >= shadow).  */
          tree shadow = build_shadow_mem_access (&gsi, loc, base_addr,
                                                 shadow_ptr_type);
-         gimple shadow_test = build_assign (NE_EXPR, shadow, 0);
+         gassign *shadow_test = build_assign (NE_EXPR, shadow, 0);
          gimple_seq seq = NULL;
          gimple_seq_add_stmt (&seq, shadow_test);
          /* Aligned (>= 8 bytes) can test just
@@ -2641,23 +2641,24 @@ asan_expand_check_ifn (gimple_stmt_iterator *iter, bool 
use_calls)
             to be 0.  */
          if (align < 8)
            {
-             gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
-                                                      base_addr, 7));
-             gimple_seq_add_stmt (&seq,
-                                  build_type_cast (shadow_type,
-                                                   gimple_seq_last (seq)));
+             gassign *and_7 = build_assign (BIT_AND_EXPR,
+                                            base_addr, 7);
+             gimple_seq_add_stmt (&seq, and_7);
+             gassign *cast = build_type_cast (shadow_type, and_7);
+             gimple_seq_add_stmt (&seq, cast);
              if (real_size_in_bytes > 1)
                gimple_seq_add_stmt (&seq,
                                     build_assign (PLUS_EXPR,
-                                                  gimple_seq_last (seq),
+                                                  cast,
                                                   real_size_in_bytes - 1));
              t = gimple_assign_lhs (gimple_seq_last_stmt (seq));
            }
          else
            t = build_int_cst (shadow_type, real_size_in_bytes - 1);
-         gimple_seq_add_stmt (&seq, build_assign (GE_EXPR, t, shadow));
+         gassign *t_ge_shadow = build_assign (GE_EXPR, t, shadow);
+         gimple_seq_add_stmt (&seq, t_ge_shadow);
          gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
-                                                  gimple_seq_last (seq)));
+                                                  t_ge_shadow));
          t = gimple_assign_lhs (gimple_seq_last (seq));
          gimple_seq_set_location (seq, loc);
          gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
@@ -2684,21 +2685,24 @@ asan_expand_check_ifn (gimple_stmt_iterator *iter, bool 
use_calls)
 
          tree shadow = build_shadow_mem_access (&gsi, loc, base_end_addr,
                                                 shadow_ptr_type);
-         gimple shadow_test = build_assign (NE_EXPR, shadow, 0);
+         gassign *shadow_test = build_assign (NE_EXPR, shadow, 0);
          gimple_seq seq = NULL;
          gimple_seq_add_stmt (&seq, shadow_test);
-         gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR,
-                                                  base_end_addr, 7));
-         gimple_seq_add_stmt (&seq, build_type_cast (shadow_type,
-                                                     gimple_seq_last (seq)));
-         gimple_seq_add_stmt (&seq, build_assign (GE_EXPR,
-                                                  gimple_seq_last (seq),
-                                                  shadow));
-         gimple_seq_add_stmt (&seq, build_assign (BIT_AND_EXPR, shadow_test,
-                                                  gimple_seq_last (seq)));
+         gassign *and_7 = build_assign (BIT_AND_EXPR,
+                                        base_end_addr, 7);
+         gimple_seq_add_stmt (&seq, and_7);
+         gassign *cast = build_type_cast (shadow_type, and_7);
+         gimple_seq_add_stmt (&seq, cast);
+         gassign *cast_ge_shadow = build_assign (GE_EXPR,
+                                                 cast,
+                                                 shadow);
+         gimple_seq_add_stmt (&seq, cast_ge_shadow);
+         gassign *and_expr = build_assign (BIT_AND_EXPR, shadow_test,
+                                           cast_ge_shadow);
+         gimple_seq_add_stmt (&seq, and_expr);
          if (!start_instrumented)
            gimple_seq_add_stmt (&seq, build_assign (BIT_IOR_EXPR, t,
-                                                    gimple_seq_last (seq)));
+                                                    and_expr));
          t = gimple_assign_lhs (gimple_seq_last (seq));
          gimple_seq_set_location (seq, loc);
          gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
diff --git a/gcc/gimple-builder.c b/gcc/gimple-builder.c
index a7c6c4e..cab4e4b 100644
--- a/gcc/gimple-builder.c
+++ b/gcc/gimple-builder.c
@@ -70,7 +70,7 @@ build_assign (enum tree_code code, tree op1, int val, tree 
lhs)
 }
 
 gassign *
-build_assign (enum tree_code code, gimple g, int val, tree lhs )
+build_assign (enum tree_code code, const gassign *g, int val, tree lhs )
 {
   return build_assign (code, gimple_assign_lhs (g), val, lhs);
 }
@@ -93,19 +93,20 @@ build_assign (enum tree_code code, tree op1, tree op2, tree 
lhs)
 }
 
 gassign *
-build_assign (enum tree_code code, gimple op1, tree op2, tree lhs)
+build_assign (enum tree_code code, const gassign *op1, tree op2, tree lhs)
 {
   return build_assign (code, gimple_assign_lhs (op1), op2, lhs);
 }
 
 gassign *
-build_assign (enum tree_code code, tree op1, gimple op2, tree lhs)
+build_assign (enum tree_code code, tree op1, const gassign *op2, tree lhs)
 {
   return build_assign (code, op1, gimple_assign_lhs (op2), lhs);
 }
 
 gassign *
-build_assign (enum tree_code code, gimple op1, gimple op2, tree lhs)
+build_assign (enum tree_code code, const gassign *op1, const gassign *op2,
+             tree lhs)
 {
   return build_assign (code, gimple_assign_lhs (op1), gimple_assign_lhs (op2),
                        lhs);
@@ -124,7 +125,7 @@ build_type_cast (tree to_type, tree op, tree lhs)
 }
 
 gassign *
-build_type_cast (tree to_type, gimple op, tree lhs)
+build_type_cast (tree to_type, const gassign *op, tree lhs)
 {
   return build_type_cast (to_type, gimple_assign_lhs (op), lhs);
 }
diff --git a/gcc/gimple-builder.h b/gcc/gimple-builder.h
index f8ec23a..68f931b 100644
--- a/gcc/gimple-builder.h
+++ b/gcc/gimple-builder.h
@@ -22,12 +22,16 @@ along with GCC; see the file COPYING3.  If not see
 #define GCC_GIMPLE_BUILDER_H
 
 gassign *build_assign (enum tree_code, tree, int, tree lhs = NULL_TREE);
-gassign *build_assign (enum tree_code, gimple, int, tree lhs = NULL_TREE);
+gassign *build_assign (enum tree_code, const gassign *, int,
+                      tree lhs = NULL_TREE);
 gassign *build_assign (enum tree_code, tree, tree, tree lhs = NULL_TREE);
-gassign *build_assign (enum tree_code, gimple, tree, tree lhs = NULL_TREE);
-gassign *build_assign (enum tree_code, tree, gimple, tree lhs = NULL_TREE);
-gassign *build_assign (enum tree_code, gimple, gimple, tree lhs = NULL_TREE);
+gassign *build_assign (enum tree_code, const gassign *, tree,
+                      tree lhs = NULL_TREE);
+gassign *build_assign (enum tree_code, tree, const gassign *,
+                      tree lhs = NULL_TREE);
+gassign *build_assign (enum tree_code, const gassign *, const gassign *,
+                      tree lhs = NULL_TREE);
 gassign *build_type_cast (tree, tree, tree lhs = NULL_TREE);
-gassign *build_type_cast (tree, gimple, tree lhs = NULL_TREE);
+gassign *build_type_cast (tree, const gassign *, tree lhs = NULL_TREE);
 
 #endif /* GCC_GIMPLE_BUILDER_H */
-- 
1.7.11.7

Reply via email to