[PATCH] Ensure __tsan_func_entry call isn't in a loop (PR sanitizer/64265)

Jakub Jelinek jakub@redhat.com
Fri Dec 12 21:33:00 GMT 2014


Hi!

This patch ensures that if successor of entry bb has multiple predecessors,
we emit the __tsan_func_entry call on the edge from entry bb, so it can't
be called inside a loop in the same function.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2014-12-12  Jakub Jelinek  <jakub@redhat.com>

	PR sanitizer/64265
	* tsan.c (instrument_func_entry): Insert __tsan_func_entry
	call on edge from entry block to single succ instead
	of after labels of single succ of entry block.

--- gcc/tsan.c.jj	2014-12-01 14:57:30.000000000 +0100
+++ gcc/tsan.c	2014-12-12 18:25:26.448608011 +0100
@@ -652,25 +652,24 @@ instrument_memory_accesses (void)
 static void
 instrument_func_entry (void)
 {
-  basic_block succ_bb;
-  gimple_stmt_iterator gsi;
   tree ret_addr, builtin_decl;
   gimple g;
-
-  succ_bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun));
-  gsi = gsi_after_labels (succ_bb);
+  gimple_seq seq = NULL;
 
   builtin_decl = builtin_decl_implicit (BUILT_IN_RETURN_ADDRESS);
   g = gimple_build_call (builtin_decl, 1, integer_zero_node);
   ret_addr = make_ssa_name (ptr_type_node);
   gimple_call_set_lhs (g, ret_addr);
   gimple_set_location (g, cfun->function_start_locus);
-  gsi_insert_before (&gsi, g, GSI_SAME_STMT);
+  gimple_seq_add_stmt_without_update (&seq, g);
 
-  builtin_decl =  builtin_decl_implicit (BUILT_IN_TSAN_FUNC_ENTRY);
+  builtin_decl = builtin_decl_implicit (BUILT_IN_TSAN_FUNC_ENTRY);
   g = gimple_build_call (builtin_decl, 1, ret_addr);
   gimple_set_location (g, cfun->function_start_locus);
-  gsi_insert_before (&gsi, g, GSI_SAME_STMT);
+  gimple_seq_add_stmt_without_update (&seq, g);
+
+  edge e = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun));
+  gsi_insert_seq_on_edge_immediate (e, seq);
 }
 
 /* Instruments function exits.  */

	Jakub



More information about the Gcc-patches mailing list