[Patch] libgcov.c re-factoring

Teresa Johnson tejohnson@google.com
Wed Jan 8 14:05:00 GMT 2014


On Mon, Jan 6, 2014 at 9:49 AM, Teresa Johnson <tejohnson@google.com> wrote:
> On Sun, Jan 5, 2014 at 12:08 PM, Jan Hubicka <hubicka@ucw.cz> wrote:
>>> 2014-01-03  Rong Xu  <xur@google.com>
>>>
>>>         * gcc/gcov-io.c (gcov_var): Move from gcov-io.h.
>>>         (gcov_position): Ditto.
>>>         (gcov_is_error): Ditto.
>>>         (gcov_rewrite): Ditto.
>>>         * gcc/gcov-io.h: Refactor. Move gcov_var to gcov-io.h, and libgcov
>>>         only part to libgcc/libgcov.h.
>>>         * libgcc/libgcov-driver.c: Use libgcov.h.
>>>         (buffer_fn_data): Use xmalloc instead of malloc.
>>>         (gcov_exit_merge_gcda): Ditto.
>>>         * libgcc/libgcov-driver-system.c (allocate_filename_struct): Ditto.
>>>         * libgcc/libgcov.h: New common header files for libgcov-*.h.
>>>         * libgcc/libgcov-interface.c: Use libgcov.h
>>>         * libgcc/libgcov-merge.c: Ditto.
>>>         * libgcc/libgcov-profiler.c: Ditto.
>>>         * libgcc/Makefile.in: Add dependence to libgcov.h
>>
>> OK, with the licence changes and...
>>>
>>> Index: gcc/gcov-io.c
>>> ===================================================================
>>> --- gcc/gcov-io.c       (revision 206100)
>>> +++ gcc/gcov-io.c       (working copy)
>>> @@ -36,6 +36,61 @@ static const gcov_unsigned_t *gcov_read_words (uns
>>>  static void gcov_allocate (unsigned);
>>>  #endif
>>>
>>> +/* Optimum number of gcov_unsigned_t's read from or written to disk.  */
>>> +#define GCOV_BLOCK_SIZE (1 << 10)
>>> +
>>> +GCOV_LINKAGE struct gcov_var
>>> +{
>>> +  FILE *file;
>>> +  gcov_position_t start;       /* Position of first byte of block */
>>> +  unsigned offset;             /* Read/write position within the block.  */
>>> +  unsigned length;             /* Read limit in the block.  */
>>> +  unsigned overread;           /* Number of words overread.  */
>>> +  int error;                   /* < 0 overflow, > 0 disk error.  */
>>> +  int mode;                    /* < 0 writing, > 0 reading */
>>> +#if IN_LIBGCOV
>>> +  /* Holds one block plus 4 bytes, thus all coverage reads & writes
>>> +     fit within this buffer and we always can transfer GCOV_BLOCK_SIZE
>>> +     to and from the disk. libgcov never backtracks and only writes 4
>>> +     or 8 byte objects.  */
>>> +  gcov_unsigned_t buffer[GCOV_BLOCK_SIZE + 1];
>>> +#else
>>> +  int endian;                  /* Swap endianness.  */
>>> +  /* Holds a variable length block, as the compiler can write
>>> +     strings and needs to backtrack.  */
>>> +  size_t alloc;
>>> +  gcov_unsigned_t *buffer;
>>> +#endif
>>> +} gcov_var;
>>> +
>>> +/* Save the current position in the gcov file.  */
>>> +static inline gcov_position_t
>>> +gcov_position (void)
>>> +{
>>> +  gcc_assert (gcov_var.mode > 0);
>>> +  return gcov_var.start + gcov_var.offset;
>>> +}
>>> +
>>> +/* Return nonzero if the error flag is set.  */
>>> +static inline int
>>> +gcov_is_error (void)
>>> +{
>>> +  return gcov_var.file ? gcov_var.error : 1;
>>> +}
>>> +
>>> +#if IN_LIBGCOV
>>> +/* Move to beginning of file and initialize for writing.  */
>>> +GCOV_LINKAGE inline void
>>> +gcov_rewrite (void)
>>> +{
>>> +  gcc_assert (gcov_var.mode > 0);
>>
>> I would turn those two asserts into checking asserts so they do not
>> bloat the runtime lib.
>
> Ok, but note that there are a number of other gcc_assert already in
> gcov-io.c (these were the only 2 in gcov-io.h, now moved here). Should
> I go ahead and change all of them in gcov-io.c?

Actually, I tried changing these two, but gcc_checking_assert is
undefined in libgcov.a. Ok to commit without this change?

Teresa

>
> Thanks,
> Teresa
>
>>
>> Thanks,
>> Honza
>
>
>
> --
> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413



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



More information about the Gcc-patches mailing list