第 9 页 ARCS tag: tag_arcs() 函数3.3 ARCS tag: tag_arcs() 函数
static void
tag_arcs ( const char * filename ATTRIBUTE_UNUSED ,
unsigned tag ATTRIBUTE_UNUSED , unsigned length ATTRIBUTE_UNUSED )
{
unsigned n_arcs = GCOV_TAG_ARCS_NUM ( length );
printf ( " %u arcs" , n_arcs ); // 输出提示信息,几个 arcs
if ( flag_dump_contents )
{
unsigned ix ;
unsigned blockno = gcov_read_unsigned ();
for ( ix = 0 ; ix != n_arcs ; ix ++ )
{
unsigned dst , flags ;
if ( ! ( ix & 3 )) // 如果 arcs 较多,则每 4 个为 1 行输出,且每行前面输出 blockno
{
printf ( "/n" );
print_prefix ( filename , 0 , gcov_position ());
printf ( "/tblock %u:" , blockno );
}
dst = gcov_read_unsigned (); // 读取目的 blockno
flags = gcov_read_unsigned ();
printf ( " %u:%04x" , dst , flags );
}
}
}
输出格式:
n arcs //n 个 arcs ,每 4 个为 1 行输出
blockno: dst0:flags0 dst1:flags1 dst2:flags2 dst3:flags3
blockno: dst4:flags4 dst5:flags5 dst6:flags6 dst7:flags7
...
同上,需要注意前导符或者输出位置。 dst0, ..., 表示目的 block 的 blockno 。
3.4 LINES tag: tag_lines() 函数
static void
tag_lines ( const char * filename ATTRIBUTE_UNUSED ,
unsigned tag ATTRIBUTE_UNUSED , unsigned length ATTRIBUTE_UNUSED )
{
if ( flag_dump_contents )
{
unsigned blockno = gcov_read_unsigned ();
char const * sep = NULL ;
while ( 1 )
{
gcov_position_t position = gcov_position ();
const char * source = NULL ;
unsigned lineno = gcov_read_unsigned ();
if ( ! lineno ) //lineno=0 时才会执行该 clause ,因此 lineno=0 即为以后的新的文件的标志
{
source = gcov_read_string (); // 该函数读取 length(4 字节 ) 和 length 个 words(4*length 字节 )
if ( ! source ) //source 即为文件名,没有源文件了,就退出
break ;
sep = NULL ;
}
if ( ! sep ) //sep=NULL 才会执行该 clause ,那么什么时候会为 NULL 呢?——就是新的文件开始,实际上就是 lineno=0
{
printf ( "/n" );
print_prefix ( filename , 0 , position );
printf ( "/tblock %u:" , blockno );
sep = "" ;
}
if ( lineno )
{
printf ( "%s%u" , sep , lineno );
sep = ", " ;
}
else
{
printf ( "%s`%s'" , sep , source ); //lineno=0 时,输出该文件名,之后 sep= " : "
sep = ":" ;
}
}
}
}
输出格式:
block blockno:'filename':lineno1, lineno2, ...
例如: block 1:'test.c':4, 7, 9
其中,前面的 block 为提示信息。同上,需要注意前导符或者输出位置。