On Mon, Jan 6, 2014 at 9:49 AM, Teresa Johnson <tejohn...@google.com> wrote: > On Sun, Jan 5, 2014 at 12:08 PM, Jan Hubicka <hubi...@ucw.cz> wrote: >>> 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. > > 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 | tejohn...@google.com | 408-460-2413 -- Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413