fix for gcc_plugin

This commit is contained in:
van Hauser 2020-09-09 09:36:27 +02:00
parent eb9f323d7c
commit 9b6564f0a3

View File

@ -278,6 +278,10 @@ struct afl_pass : gimple_opt_pass {
} }
/* .map_ptr is initialized at the function entry point, if we
instrument any blocks, see below. */
/* .entry = &map_ptr[.index]; */
gimple *idx_map = gimple *idx_map =
gimple_build_assign(ntry, POINTER_PLUS_EXPR, map_ptr, indx); gimple_build_assign(ntry, POINTER_PLUS_EXPR, map_ptr, indx);
gimple_seq_add_stmt(&seq, idx_map); gimple_seq_add_stmt(&seq, idx_map);
@ -288,10 +292,11 @@ struct afl_pass : gimple_opt_pass {
if (blocks == 0) if (blocks == 0)
cntr = create_tmp_var(TREE_TYPE(memref), ".afl_edge_count"); cntr = create_tmp_var(TREE_TYPE(memref), ".afl_edge_count");
/* Load the count from the entry. */
gimple *load_cntr = gimple_build_assign(cntr, memref); gimple *load_cntr = gimple_build_assign(cntr, memref);
gimple_seq_add_stmt(&seq, load_cntr); gimple_seq_add_stmt(&seq, load_cntr);
tree cntrb = cntr; /* Prepare to add constant 1 to it. */
tree incrv = build_one_cst(TREE_TYPE(cntr)); tree incrv = build_one_cst(TREE_TYPE(cntr));
if (neverZero) { if (neverZero) {
@ -306,6 +311,10 @@ struct afl_pass : gimple_opt_pass {
} }
/* Call the ADD_OVERFLOW builtin, to add 1 (in incrv) to
count. The builtin yields a complex pair: the result of
the add in the real part, and the overflow flag in the
imaginary part, */
auto_vec<tree> vargs(2); auto_vec<tree> vargs(2);
vargs.quick_push(cntr); vargs.quick_push(cntr);
vargs.quick_push(incrv); vargs.quick_push(incrv);
@ -314,14 +323,27 @@ struct afl_pass : gimple_opt_pass {
gimple_call_set_lhs(add1_cntr, xaddc); gimple_call_set_lhs(add1_cntr, xaddc);
gimple_seq_add_stmt(&seq, add1_cntr); gimple_seq_add_stmt(&seq, add1_cntr);
cntrb = build1(REALPART_EXPR, TREE_TYPE(cntr), xaddc); /* Extract the real part into count. */
incrv = build1(IMAGPART_EXPR, TREE_TYPE(xincr), xaddc); tree cntrb = build1(REALPART_EXPR, TREE_TYPE(cntr), xaddc);
gimple *xtrct_cntr = gimple_build_assign(cntr, cntrb);
gimple_seq_add_stmt(&seq, xtrct_cntr);
/* Extract the imaginary part into xincr. */
tree incrb = build1(IMAGPART_EXPR, TREE_TYPE(xincr), xaddc);
gimple *xtrct_xincr = gimple_build_assign(xincr, incrb);
gimple_seq_add_stmt(&seq, xtrct_xincr);
/* Arrange for the add below to use the overflow flag stored
in xincr. */
incrv = xincr;
} }
gimple *incr_cntr = gimple_build_assign(cntr, PLUS_EXPR, cntrb, incrv); /* Add the increment (1 or the overflow bit) to count. */
gimple *incr_cntr = gimple_build_assign(cntr, PLUS_EXPR, cntr, incrv);
gimple_seq_add_stmt(&seq, incr_cntr); gimple_seq_add_stmt(&seq, incr_cntr);
/* Store count in the map entry. */
gimple *store_cntr = gimple_build_assign(unshare_expr(memref), cntr); gimple *store_cntr = gimple_build_assign(unshare_expr(memref), cntr);
gimple_seq_add_stmt(&seq, store_cntr); gimple_seq_add_stmt(&seq, store_cntr);