[Patch] Avoid gcc_assert in libgcov

Teresa Johnson tejohnson@google.com
Tue Jan 14 20:01:00 GMT 2014


On Thu, Jan 9, 2014 at 6:56 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
>> As suggested by Honza, avoid bloating libgcov from gcc_assert by using
>> a new macro gcov_nonruntime_assert in gcov-io.c that is only mapped to
>> gcc_assert when not in libgcov.
>>
>> Bootstrapped and tested on x86_64-unknown-linux-gnu. Ok for trunk?
>>
>> Thanks,
>> Teresa
>>
>> 2014-01-09  Teresa Johnson  <tejohnson@google.com>
>>
>>         * gcov-io.c (gcov_position): Use gcov_nonruntime_assert.
>>         (gcov_is_error): Ditto.
>>         (gcov_rewrite): Ditto.
>>         (gcov_open): Ditto.
>>         (gcov_write_words): Ditto.
>>         (gcov_write_length): Ditto.
>>         (gcov_read_words): Ditto.
>>         (gcov_read_summary): Ditto.
>>         (gcov_sync): Ditto.
>>         (gcov_seek): Ditto.
>>         (gcov_histo_index): Ditto.
>>         (static void gcov_histogram_merge): Ditto.
>>         (compute_working_sets): Ditto.
>>         * gcov-io.h (gcov_nonruntime_assert): Define.
>>
>
>> @@ -481,14 +481,14 @@ gcov_read_words (unsigned words)
>>    const gcov_unsigned_t *result;
>>    unsigned excess = gcov_var.length - gcov_var.offset;
>>
>> -  gcc_assert (gcov_var.mode > 0);
>> +  gcov_nonruntime_assert (gcov_var.mode > 0);
>>    if (excess < words)
>>      {
>>        gcov_var.start += gcov_var.offset;
>>  #if IN_LIBGCOV
>>        if (excess)
>>         {
>> -         gcc_assert (excess == 1);
>> +         gcov_nonruntime_assert (excess == 1);
>
> It probably makes no sense to put nonruntime access into IN_LIBGCOV defines.

You are right - there were several that were in IN_LIBGCOV defines
that I can just remove.

>
>>           memcpy (gcov_var.buffer, gcov_var.buffer + gcov_var.offset, 4);
>>         }
>>  #else
>> @@ -497,7 +497,7 @@ gcov_read_words (unsigned words)
>>        gcov_var.offset = 0;
>>        gcov_var.length = excess;
>>  #if IN_LIBGCOV
>> -      gcc_assert (!gcov_var.length || gcov_var.length == 1);
>> +      gcov_nonruntime_assert (!gcov_var.length || gcov_var.length == 1);
>>        excess = GCOV_BLOCK_SIZE;
>>  #else
>>        if (gcov_var.length + words > gcov_var.alloc)
>> @@ -614,7 +614,7 @@ gcov_read_summary (struct gcov_summary *summary)
>>            while (!cur_bitvector)
>>              {
>>                h_ix = bv_ix * 32;
>> -              gcc_assert (bv_ix < GCOV_HISTOGRAM_BITVECTOR_SIZE);
>> +              gcov_nonruntime_assert (bv_ix < GCOV_HISTOGRAM_BITVECTOR_SIZE);
>>                cur_bitvector = histo_bitvector[bv_ix++];
>>              }
>>            while (!(cur_bitvector & 0x1))
>> @@ -622,7 +622,7 @@ gcov_read_summary (struct gcov_summary *summary)
>>                h_ix++;
>>                cur_bitvector >>= 1;
>>              }
>> -          gcc_assert (h_ix < GCOV_HISTOGRAM_SIZE);
>> +          gcov_nonruntime_assert (h_ix < GCOV_HISTOGRAM_SIZE);
>
> How many of those asserts can be triggered by a corrupted gcda file?
> I would like to make libgcov more safe WRT file corruptions, too, so in that
> case we should produce an error message.

In that case should we call gcov_error when IN_LIBGCOV? One
possibility would be to simply make gcov_nonruntime_assert be defined
as if (!EXPR) gcov_error in the IN_LIBGCOV case. But I think what you
wanted here was to reduce libgcov bloat by removing calls altogether,
which this wouldn't solve. But if we want to call gcov_error in some
cases, I think I need to add another macro that will either do
gcc_assert when !IN_LIBGCOV and "if (!EXPR) gcov_error" when
IN_LIBGCOV. Is that what you had in mind?

Thanks,
Teresa

>
> The rest of changes seems OK.
>
> Honza



-- 
Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413



More information about the Gcc-patches mailing list