> 2014-01-03  Rong Xu  <x...@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.

Thanks,
Honza

Reply via email to