On 03/14/2017 09:13 AM, Richard Biener wrote:
> On Tue, 14 Mar 2017, Martin Liška wrote:
> 
>> On 03/13/2017 04:16 PM, Richard Biener wrote:
>>> On Mon, 13 Mar 2017, Martin Liška wrote:
>>>
>>>> On 03/13/2017 02:53 PM, Richard Biener wrote:
>>>>> On Mon, 13 Mar 2017, Martin Liška wrote:
>>>>>
>>>>>> On 03/13/2017 02:01 PM, Richard Biener wrote:
>>>>>>> On Mon, 13 Mar 2017, Richard Biener wrote:
>>>>>>>
>>>>>>>> On Fri, 10 Mar 2017, Martin Liška wrote:
>>>>>>>>
>>>>>>>>> Hello.
>>>>>>>>>
>>>>>>>>> As briefly discussed in the PR, there are BB that do not correspond 
>>>>>>>>> to a real
>>>>>>>>> line in source
>>>>>>>>> code. profile.c emits locations for all BBs that have a gimple 
>>>>>>>>> statement
>>>>>>>>> belonging to a line.
>>>>>>>>> I hope these should be marked in gcov utility and not added in 
>>>>>>>>> --all-block
>>>>>>>>> mode to counts of lines.
>>>>>>>>>
>>>>>>>>> Patch survives make check RUNTESTFLAGS="gcov.exp".
>>>>>>>>>
>>>>>>>>> Thanks for review and feedback.
>>>>>>>>
>>>>>>>> Humm, the patch doesn't seem to change the BBs associated with a line
>>>>>>>> but rather somehow changes how we compute counts (the patch lacks a
>>>>>>>> description of how you arrived at it).  I expected the line-to-BB
>>>>>>>> assignment process to be changed (whereever that is...).
>>>>>>
>>>>>> Currently, each basic block must belong to a source line. It's how gcov
>>>>>> iterates all blocks (via lines).
>>>>>>
>>>>>>>
>>>>>>> Ah, ok, looking at where output_location is called on I see we do not
>>>>>>> assign any line to that block.  But still why does
>>>>>>> line->has_block (arc->src) return true?
>>>>>>
>>>>>> Good objection! Problematic that  4->5 edge really comes from the same 
>>>>>> line.
>>>>>>
>>>>>>   <bb 4> [0.00%]:
>>>>>>   ret_7 = 111;
>>>>>>   PROF_edge_counter_10 = __gcov0.UuT[0];
>>>>>>   PROF_edge_counter_11 = PROF_edge_counter_10 + 1;
>>>>>>   __gcov0.UuT[0] = PROF_edge_counter_11;
>>>>>>
>>>>>>   <bb 5> [0.00%]:
>>>>>>   # ret_1 = PHI <ret_5(3), ret_7(4)>
>>>>>>   goto <bb 7>; [0.00%]
>>>>>
>>>>> Yes, but that's basically meaningless, unless not all edges come from the
>>>>> same line?  I see nowhere where we'd explicitely assign lines to
>>>>> edges so it must be gcov "reconstructing" this somewhere.
>>>>
>>>> That's why I added the another flag. We stream locations for basic blocks 
>>>> via
>>>> 'output_location' function. And assignment blocks to lines happens here:
>>>>
>>>> static void
>>>> add_line_counts (coverage_t *coverage, function_t *fn)
>>>> {
>>>> ...
>>>>       if (!ix || ix + 1 == fn->num_blocks)
>>>>    /* Entry or exit block */;
>>>>       else if (flag_all_blocks)
>>>>    {
>>>>      line_t *block_line = line;
>>>>
>>>>      if (!block_line)
>>>>        block_line = &sources[fn->src].lines[fn->line];
>>>>
>>>>      block->chain = block_line->u.blocks;
>>>>      block_line->u.blocks = block;
>>>>    }
>>>>
>>>> where line is always changes when we reach a BB that has a source line 
>>>> assigned. Thus it's changed
>>>> for BB 4 and that's why BB 5 is added to same line.
>>>
>>> Ah, so this means we should "clear" the current line for BB 5 in
>>> output_location?  At least I don't see how your patch may not regress
>>> some cases where the line wasn't output as an optimization?
>>
>> The new flag on block is kind of clearing that the BB is artificial and in 
>> fact does not
>> belong to the line. I didn't want to do a bigger refactoring how blocks are 
>> iterated via lines.
>>
>> Can you be please more specific about such a case?
> 
> in profile.c I see
> 
>   if (name_differs || line_differs)
>     {
>       if (!*offset)
>         {
>           *offset = gcov_write_tag (GCOV_TAG_LINES);
>           gcov_write_unsigned (bb->index);
>           name_differs = line_differs=true;
>         }
> 
> ...
> 
> so if line_differs is false we might not output GCOV_TAG_LINES either
> because 1) optimization, less stuff output, 2) the block has no line.
> Looks like we can't really distinguish those.

Agree with that.

> 
> Not sure how on the input side we end up associating a BB with
> a line if nothing was output for it though.
> 
> That is, with your change don't we need
> 
> Index: gcc/profile.c
> ===================================================================
> --- gcc/profile.c       (revision 246082)
> +++ gcc/profile.c       (working copy)
> @@ -941,8 +941,6 @@ output_location (char const *file_name,
>    name_differs = !prev_file_name || filename_cmp (file_name, 
> prev_file_name);
>    line_differs = prev_line != line;
>  
> -  if (name_differs || line_differs)
> -    {
>        if (!*offset)
>         {
>           *offset = gcov_write_tag (GCOV_TAG_LINES);
> @@ -950,6 +948,9 @@ output_location (char const *file_name,
>           name_differs = line_differs=true;
>         }
>  
> +  if (name_differs || line_differs)
> +    {
> +
>        /* If this is a new source file, then output the
>          file's name to the .bb file.  */
>        if (name_differs)
> 
> to resolve this ambiguity?  That is, _always_ emit GCOV_TAG_LINES
> for a BB?  So then a BB w/o GCOV_TAG_LINES does _not_ have any
> lines associated.

That should revolve it. Let me find and example where we do not emit
GCOV_TAG_LINES jsut because there's not difference in lines.

Martin

> 
> Richard.
> 
> 
>> Hope Nathan will find time to provide review as he's familiar with content 
>> of gcov.c.
>>
>> Martin
>>
>>>
>>> OTOH I don't know much about gcov format.
>>>
>>> Richard.
>>>
>>>> Martin
>>>>
>>>>>
>>>>> Richard.
>>>>>
>>>>>> Martin
>>>>>>
>>>>>>>
>>>>>>> Richard.
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>
> 

Reply via email to