On Thu, Jan 9, 2014 at 6:56 AM, Jan Hubicka <hubi...@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 <tejohn...@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 | tejohn...@google.com | 408-460-2413