This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH v2] gcov: Runtime configurable destination output
- From: Aaron Conole <aconole at bytheb dot org>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Nathan Sidwell <nathan at acm dot org>, Jan Hubicka <hubicka at ucw dot cz>, Nathan Sidwell <nathan at codesourcery dot com>
- Date: Fri, 15 Apr 2016 15:01:51 -0400
- Subject: Re: [PATCH v2] gcov: Runtime configurable destination output
- Authentication-results: sourceware.org; auth=none
- References: <1456350732-8272-1-git-send-email-aconole at bytheb dot org>
Ping on this; what are the next steps?
Thanks
Aaron Conole <aconole@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