Apologies for the top post. Pinging on this again. It still applies cleanly, so no need to resubmit, I think. Is there anything else missing or required before this can go in?
Thanks, -Aaron Aaron Conole <acon...@bytheb.org> writes: > The previous gcov behavior was to always output errors on the stderr channel. > This is fine for most uses, but some programs will require stderr to be > untouched by libgcov for certain tests. This change allows configuring > the gcov output via an environment variable which will be used to open > the appropriate file. > --- > v2: > * Retitled subject > * Cleaned up whitespace in libgcov-driver-system.c diff > * Lazy error file opening > * non-static error file > * No warnings during compilation > > libgcc/libgcov-driver-system.c | 35 ++++++++++++++++++++++++++++++++++- > libgcc/libgcov-driver.c | 6 ++++++ > 2 files changed, 40 insertions(+), 1 deletion(-) > > diff --git a/libgcc/libgcov-driver-system.c b/libgcc/libgcov-driver-system.c > index 4e3b244..0eb9755 100644 > --- a/libgcc/libgcov-driver-system.c > +++ b/libgcc/libgcov-driver-system.c > @@ -23,6 +23,24 @@ a copy of the GCC Runtime Library Exception along with > this program; > see the files COPYING3 and COPYING.RUNTIME respectively. If not, see > <http://www.gnu.org/licenses/>. */ > > +FILE *__gcov_error_file = NULL; > + > +static FILE * > +get_gcov_error_file(void) > +{ > + char *gcov_error_filename = getenv("GCOV_ERROR_FILE"); > + FILE *gcov_error_file = NULL; > + if (gcov_error_filename) > + { > + FILE *openfile = fopen(gcov_error_filename, "a"); > + if (openfile) > + gcov_error_file = openfile; > + } > + if (!gcov_error_file) > + gcov_error_file = stderr; > + return gcov_error_file; > +} > + > /* A utility function for outputing errors. */ > > static int __attribute__((format(printf, 1, 2))) > @@ -30,12 +48,27 @@ gcov_error (const char *fmt, ...) > { > int ret; > va_list argp; > + > + if (!__gcov_error_file) > + __gcov_error_file = get_gcov_error_file(); > + > va_start (argp, fmt); > - ret = vfprintf (stderr, fmt, argp); > + ret = vfprintf (__gcov_error_file, fmt, argp); > va_end (argp); > return ret; > } > > +#if !IN_GCOV_TOOL > +static void > +gcov_error_exit(void) > +{ > + if (__gcov_error_file && __gcov_error_file != stderr) > + { > + fclose(__gcov_error_file); > + } > +} > +#endif > + > /* Make sure path component of the given FILENAME exists, create > missing directories. FILENAME must be writable. > Returns zero on success, or -1 if an error occurred. */ > diff --git a/libgcc/libgcov-driver.c b/libgcc/libgcov-driver.c > index 9c4eeca..83d84c5c 100644 > --- a/libgcc/libgcov-driver.c > +++ b/libgcc/libgcov-driver.c > @@ -46,6 +46,10 @@ void __gcov_init (struct gcov_info *p __attribute__ > ((unused))) {} > /* A utility function for outputing errors. */ > static int gcov_error (const char *, ...); > > +#if !IN_GCOV_TOOL > +static void gcov_error_exit(void); > +#endif > + > #include "gcov-io.c" > > struct gcov_fn_buffer > @@ -878,6 +882,8 @@ gcov_exit (void) > __gcov_root.prev->next = __gcov_root.next; > else > __gcov_master.root = __gcov_root.next; > + > + gcov_error_exit(); > } > > /* Add a new object file onto the bb chain. Invoked automatically