diff options
author | Caroline Tice <cmtice@google.com> | 2013-12-06 13:22:14 -0800 |
---|---|---|
committer | Caroline Tice <ctice@gcc.gnu.org> | 2013-12-06 13:22:14 -0800 |
commit | 31226750a1cdf4542f402adc097aaae0bb988c33 (patch) | |
tree | 61aeffc1a983c7f43bfe016b023a8fe91fe023ed | |
parent | cd93c60e35410dad9df0f21b8e1d2825f49b9386 (diff) | |
download | gcc-31226750a1cdf4542f402adc097aaae0bb988c33.zip gcc-31226750a1cdf4542f402adc097aaae0bb988c33.tar.gz gcc-31226750a1cdf4542f402adc097aaae0bb988c33.tar.bz2 |
Fix two small problems...
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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/vtable-class-hierarchy.c | 2 | ||||
-rw-r--r-- | gcc/vtable-verify.c | 37 |
4 files changed, 28 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 039f704..5fddf41 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e682871..dd33b05 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/vtable-class-hierarchy.c b/gcc/cp/vtable-class-hierarchy.c index b663724..4eb78ee 100644 --- a/gcc/cp/vtable-class-hierarchy.c +++ b/gcc/cp/vtable-class-hierarchy.c @@ -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); diff --git a/gcc/vtable-verify.c b/gcc/vtable-verify.c index 46c5621..b544695 100644 --- a/gcc/vtable-verify.c +++ b/gcc/vtable-verify.c @@ -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); |