Next: profopt Testing, Previous: LTO Testing, Up: Testsuites
提供了对测试gcov和检查分支profile是否产生预期值的语言无关的支持。 gcov测试还依赖于gcc.dg.exp的程序,来编译和运行测试程序。 一个典型的gcov测试包含下列在注释中的DejaGnu命令:
{ dg-options "-fprofile-arcs -ftest-coverage" } { dg-do run { target native } } { dg-final { run-gcov sourcefile } }
对gcov输出的检测可以包括行数,分支百分比和调用返回百分比。
所有这些检测都由在测试源文件中注释里出现的命令来请求。
缺省情况下处理检测行数的命令。检测分支百分比和调用返回百分比的命令,
当run-gcov命令具有相应的参数branches
或calls
时,
才会被处理。例如,下面指定了两者都检测,
同时还传给gcov一个-b:
{ dg-final { run-gcov branches calls { -b sourcefile } } }
行数命令出现在注释中,其源行期望能获得指定的数,
并具有形式count(
cnt)
。
测试应该只检测对于任意体系结构都会得到同一数值的行数。
检测分支百分比(branch
)和调用返回百分比(returns
)的命令彼此很
相似。起始命令出现在将报告百分比的一个行范围的第一行或者之前,
结束命令跟在行范围之后。起始命令可以包括一个百分比列表,其为在范围内期望获得的。
范围由同种类型的下一个命令来终止。
命令branch(end)
或returns(end)
标记了范围的结束,
而不起是一个新的。例如:
if (i > 10 && j > i && j < 20) /* branch(27 50 75) */ /* branch(end) */ foo (i, j);
对于调用返回百分比,指定的值为调用报告返回的百分比。对于分支百分比, 值或者为期望的百分比,或者为100减去那个值, 因为分支的方向可以根据目标机或优化级别而不同。
并不是所有的分支和调用都需要被检测。 测试不应检测可能被优化掉的或者被断言指令替代的分支。 不要检测编译器插入的调用或者可能被inline或优化掉的。
单个测试可以检测行数,分支百分比和调用返回百分比的组合。 检测行数的命令必须出现在将会报告行数的行中, 但是检测分支百分比和调用返回百分比的命令,可以将报告的行括起来。