[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