On Fri, Dec 12, 2014 at 10:33 PM, Jakub Jelinek <ja...@redhat.com> wrote: > 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?
Ok. (I suppose for branches as well) Thanks, Richard. > 2014-12-12 Jakub Jelinek <ja...@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