Hello,

I am doing instrumentation of GIMPLE code by adding extra coverage counters
at each basic block. Basically it's mimicking -fsanitize-coverage=trace-pc,
where the only difference is that __sanitizer_cov_trace_pc (the default
hander of fsanitize-coverage=trace-pc)  has no input parameters, but my
coverage hander has a parameter of basic block id.

My current issue is that after the instrumentation of one function, the
plugin throws an exception at the following gcc_assert and do not proceed
to instrument another function:

  if (flags & TODO_cleanup_cfg)
    cleanup_tree_cfg (flags & TODO_update_ssa_any);
  else if (flags & TODO_update_ssa_any)
    update_ssa (flags & TODO_update_ssa_any);
  gcc_assert (!need_ssa_update_p (fn));  <----------  line 1954 of
gcc/passes.c for gcc 10.1.0

This really confused me, because when I print out the instrumented
GIMPLE code and compare with fsanitize-coverage=trace-pc, I don't see
a major difference here:

====== my instrumented GIMPLE code ===========

fun2 ()
{
  int D.2588;
  int _3;

  <bb 2> :
  __sanitizer_cov_trace_pc (2);  <--- my coverage hander with basic
block id as the input
  __builtin_puts (&"fun2"[0]);
  _3 = 0;

  <bb 3> :
<L0>:
  __sanitizer_cov_trace_pc (3);
  return _3;

}

======= the corresponding instrumented GIMPLE code by
fsanitize-coverage=trace-pc =====

fun2 ()
{
  int D.2760;
  int _3;

  <bb 2> [0.00%]:
  __builtin___sanitizer_cov_trace_pc ();
  __builtin_puts (&"fun2"[0]);
  _3 = 0;

<L0> [0.00%]:
  __builtin___sanitizer_cov_trace_pc ();
  return _3;

}

There is no big difference here. Could anyone shed some lights on why
an exception on "need_ssa_update_p" is thrown? I don't think there is
an need to udpate any "SSA" here.. Thank you very much.

Best,

Shuai

Reply via email to