Symbol Size Variance

Sebastian Huber sebastian.huber at embedded-brains.de
Fri May 25 05:54:26 UTC 2018


On 24/05/18 17:46, Gedare Bloom wrote:
> On Thu, May 24, 2018 at 9:05 AM, Joel Sherrill <joel at rtems.org> wrote:
>>
>> On Thu, May 24, 2018, 8:04 AM Gedare Bloom <gedare at rtems.org> wrote:
>>> On Wed, May 23, 2018 at 2:28 AM, Sebastian Huber
>>> <sebastian.huber at embedded-brains.de> wrote:
>>>> On 23/05/18 01:06, Joel Sherrill wrote:
>>>>> Or we may need to limit ourselves to source line mapping on a per
>>>>> executable
>>>>> basis. And generate reports using gcov output if we see methods change
>>>>> between executables. I have shied away from gcov as the primary format
>>>>> because I don't see how to do subexpression analysis.
>>>>>
>>>>>    if (a == 0 || b == 1)
>>>>>
>>>>> That's one line of source but two sub-expressions. Unless it's changed
>>>>> recently, the debug info is not at a level of granularity to generate
>>>>> gcov data that can tell we always too the first sub-expression.
>>>>>
>>>>> I'm not arguing -- just saying that doing the analysis at the asm level
>>>>> gives us branch information I don't think we get via source line
>>>>> analysis and gcov.
>>>>
>>>> Is the --all-blocks option of gcov helpful here?
>>>>
>>>> https://gcc.gnu.org/onlinedocs/gcc/Invoking-Gcov.html#Invoking-Gcov
>>>>
>>> Yes, that seems like it should work to me.
>>
>> Can you decipher the gcov output to see if it is working?
> Not immediately, but maybe you can put together a simple example of a
> subexpr that is 'dead code' to test with/without the option.

It seems that gcov already produces sub-expression branch counts without 
the -a option:

int ff(int a, int b)
{
         if (a != 0 && b != 0) {
                 return 1;
         }

         return 0;
}

int ft(int a, int b)
{
         if (a != 0 && b != 0) {
                 return 1;
         }

         return 0;
}

int tf(int a, int b)
{
         if (a != 0 && b != 0) {
                 return 1;
         }

         return 0;
}

int tt(int a, int b)
{
         if (a != 0 && b != 0) {
                 return 1;
         }

         return 0;
}

int main(void)
{
         ff(0, 0);
         ft(0, 1);
         tf(1, 0);
         tt(1, 1);
         return 0;
}

gcc -fprofile-arcs -ftest-coverage test.c
./a.out
gcov -b -c test.c
File 'test.c'
Lines executed:81.82% of 22
Branches executed:75.00% of 16
Taken at least once:37.50% of 16
Calls executed:100.00% of 4
Creating 'test.c.gcov'

cat test.c.gcov
         -:    0:Source:test.c
         -:    0:Graph:test.gcno
         -:    0:Data:test.gcda
         -:    0:Runs:1
         -:    0:Programs:1
function ff called 1 returned 100% blocks executed 60%
         1:    1:int ff(int a, int b)
         -:    2:{
         1:    3:        if (a != 0 && b != 0) {
branch  0 taken 0 (fallthrough)
branch  1 taken 1
branch  2 never executed
branch  3 never executed
     #####:    4:                return 1;
         -:    5:        }
         -:    6:
         1:    7:        return 0;
         -:    8:}
         -:    9:
function ft called 1 returned 100% blocks executed 60%
         1:   10:int ft(int a, int b)
         -:   11:{
         1:   12:        if (a != 0 && b != 0) {
branch  0 taken 0 (fallthrough)
branch  1 taken 1
branch  2 never executed
branch  3 never executed
     #####:   13:                return 1;
         -:   14:        }
         -:   15:
         1:   16:        return 0;
         -:   17:}
         -:   18:
function tf called 1 returned 100% blocks executed 80%
         1:   19:int tf(int a, int b)
         -:   20:{
         1:   21:        if (a != 0 && b != 0) {
branch  0 taken 1 (fallthrough)
branch  1 taken 0
branch  2 taken 0 (fallthrough)
branch  3 taken 1
     #####:   22:                return 1;
         -:   23:        }
         -:   24:
         1:   25:        return 0;
         -:   26:}
         -:   27:
function tt called 1 returned 100% blocks executed 80%
         1:   28:int tt(int a, int b)
         -:   29:{
         1:   30:        if (a != 0 && b != 0) {
branch  0 taken 1 (fallthrough)
branch  1 taken 0
branch  2 taken 1 (fallthrough)
branch  3 taken 0
         1:   31:                return 1;
         -:   32:        }
         -:   33:
     #####:   34:        return 0;
         -:   35:}
         -:   36:
function main called 1 returned 100% blocks executed 100%
         1:   37:int main(void)
         -:   38:{
         1:   39:        ff(0, 0);
call    0 returned 1
         1:   40:        ft(0, 1);
call    0 returned 1
         1:   41:        tf(1, 0);
call    0 returned 1
         1:   42:        tt(1, 1);
call    0 returned 1
         1:   43:        return 0;
         -:   44:}

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.




More information about the devel mailing list