]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix two small problems...
authorCaroline Tice <cmtice@google.com>
Fri, 6 Dec 2013 21:22:14 +0000 (13:22 -0800)
committerCaroline Tice <ctice@gcc.gnu.org>
Fri, 6 Dec 2013 21:22:14 +0000 (13:22 -0800)
Fix two small problems: Make the libvtv function
decls globally visible, and update all uses of the
verified vtable poitner with the verification results,
rather than just hte first use.

From-SVN: r205764

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/vtable-class-hierarchy.c
gcc/vtable-verify.c

index 039f7049d22cb5bcc1c3209cf17e45444ee2eb76..5fddf41caf18d026dcc1aaf1f0c21f2587827fc3 100644 (file)
@@ -1,3 +1,10 @@
+2013-12-06  Caroline Tice  <cmtice@google.com>
+
+       Submitting patch from Stephen Checkoway, s@cs.jhu.edu
+       * vtable-verify.c (verify_bb_vtables): Replace all uses of verified
+       vtable pointer with the results of the verification call, rather than
+       only the uses in the next statement.
+
 2013-12-06  Andrew Pinski  <apinski@cavium.com>
 
        PR target/59092
index e6828716e0dcd422e1d56fcb96a84f83f7affcd8..dd33b05945f0b2c4e05dc5abb292062587185411 100644 (file)
@@ -1,3 +1,9 @@
+2013-12-06  Caroline Tice  <cmtice@google.com>
+
+       Submitting patch from Stephen Checkoway, s@cs.jhu.edu
+       * vtable-class-hierarchy.c (init_functions): Make the libvtv
+       function decls externally visible.
+
 2013-12-06  Oleg Endo  <olegendo@gcc.gnu.org>
 
        * decl2.c: Remove struct tags when referring to class varpool_node.
index b6637248951c3abcc71dffd6d526eafc5d0f7c89..4eb78eee4be733fa71fb786ebb9af8d1e30723c9 100644 (file)
@@ -258,6 +258,7 @@ init_functions (void)
   DECL_ATTRIBUTES (vlt_register_set_fndecl) =
                     tree_cons (get_identifier ("leaf"), NULL,
                                DECL_ATTRIBUTES (vlt_register_set_fndecl));
+  DECL_EXTERNAL(vlt_register_set_fndecl) = 1;
   TREE_PUBLIC (vlt_register_set_fndecl) = 1;
   DECL_PRESERVE_P (vlt_register_set_fndecl) = 1;
   SET_DECL_LANGUAGE (vlt_register_set_fndecl, lang_cplusplus);
@@ -301,6 +302,7 @@ init_functions (void)
   DECL_ATTRIBUTES (vlt_register_pairs_fndecl) =
                     tree_cons (get_identifier ("leaf"), NULL,
                                DECL_ATTRIBUTES (vlt_register_pairs_fndecl));
+  DECL_EXTERNAL(vlt_register_pairs_fndecl) = 1;
   TREE_PUBLIC (vlt_register_pairs_fndecl) = 1;
   DECL_PRESERVE_P (vlt_register_pairs_fndecl) = 1;
   SET_DECL_LANGUAGE (vlt_register_pairs_fndecl, lang_cplusplus);
index 46c5621509db6956c6d3bc0f12bc916af6e4c3bf..b54469517cd29a48e8e3b39a52906b27e4c70b7f 100644 (file)
@@ -646,9 +646,6 @@ verify_bb_vtables (basic_block bb)
 
               if (vtable_map_node && vtable_map_node->vtbl_map_decl)
                 {
-                  use_operand_p use_p;
-                  ssa_op_iter iter;
-
                   vtable_map_node->is_used = true;
                   vtbl_var_decl = vtable_map_node->vtbl_map_decl;
 
@@ -695,35 +692,27 @@ verify_bb_vtables (basic_block bb)
                   gimple_call_set_lhs (call_stmt, tmp0);
                   update_stmt (call_stmt);
 
-                  /* Find the next stmt, after the vptr assignment
-                     statememt, which should use the result of the
-                     vptr assignment statement value. */
-                  gsi_next (&gsi_vtbl_assign);
-                  gimple next_stmt = gsi_stmt (gsi_vtbl_assign);
-
-                  if (!next_stmt)
-                    return;
-
-                  /* Find any/all uses of 'lhs' in next_stmt, and
-                     replace them with 'tmp0'.  */
+                  /* Replace all uses of lhs with tmp0. */
                   found = false;
-                  FOR_EACH_PHI_OR_STMT_USE (use_p, next_stmt, iter,
-                                            SSA_OP_ALL_USES)
+                  imm_use_iterator iterator;
+                  gimple use_stmt;
+                  FOR_EACH_IMM_USE_STMT (use_stmt, iterator, lhs)
                     {
-                      tree op = USE_FROM_PTR (use_p);
-                      if (op == lhs)
-                        {
-                          SET_USE (use_p, tmp0);
-                          found = true;
-                        }
+                      use_operand_p use_p;
+                      if (use_stmt == call_stmt)
+                        continue;
+                      FOR_EACH_IMM_USE_ON_STMT (use_p, iterator)
+                        SET_USE (use_p, tmp0);
+                      update_stmt (use_stmt);
+                      found = true;
                     }
-                  update_stmt (next_stmt);
+
                   gcc_assert (found);
 
                   /* Insert the new verification call just after the
                      statement that gets the vtable pointer out of the
                      object.  */
-                  gsi_vtbl_assign = gsi_for_stmt (stmt);
+                  gcc_assert (gsi_stmt (gsi_vtbl_assign) == stmt);
                   gsi_insert_after (&gsi_vtbl_assign, call_stmt,
                                     GSI_NEW_STMT);