[Patch] libgcov.c re-factoring

Teresa Johnson tejohnson@google.com
Mon Jan 6 17:49:00 GMT 2014


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?

Thanks,
Teresa

>
> Thanks,
> Honza



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



More information about the Gcc-patches mailing list