diff options
author | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-06-02 12:22:01 +0000 |
---|---|---|
committer | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-06-02 12:22:01 +0000 |
commit | 3237fc563842293e8fda533523bc3acd770643cd (patch) | |
tree | 3d70d4e52b2e726d7ebe1241651fedc71dfd0812 /libgcc | |
parent | 98e7c96c688d9ef4f1de01e91b5f3affcf71e5a6 (diff) | |
download | gcc-3237fc563842293e8fda533523bc3acd770643cd.tar.gz |
On behalf of Aaron Conole <aconole@redhat.com>
* libgcov-driver-system.c (__gcov_error_file): New.
(get_gcov_error_file): New.
(gcov_error): Use and set __gcov_error_file.
(gcov_error_exit): New.
* libgcov-driver.c (gcov_exit): Call gcov_error_exit.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@237033 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 8 | ||||
-rw-r--r-- | libgcc/libgcov-driver-system.c | 49 | ||||
-rw-r--r-- | libgcc/libgcov-driver.c | 8 |
3 files changed, 62 insertions, 3 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index d99eb63a05d..a003c5171fb 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,11 @@ +2016-06-02 Aaron Conole <aconole@redhat.com> + + * libgcov-driver-system.c (__gcov_error_file): New. + (get_gcov_error_file): New. + (gcov_error): Use and set __gcov_error_file. + (gcov_error_exit): New. + * libgcov-driver.c (gcov_exit): Call gcov_error_exit. + 2016-05-26 Nathan Sidwell <nathan@acm.org> * config/nvptx/free.asm: Delete. diff --git a/libgcc/libgcov-driver-system.c b/libgcc/libgcov-driver-system.c index 4e3b244c7c1..ff8a521690b 100644 --- a/libgcc/libgcov-driver-system.c +++ b/libgcc/libgcov-driver-system.c @@ -23,19 +23,64 @@ 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/>. */ -/* A utility function for outputing errors. */ +/* Configured via the GCOV_ERROR_FILE environment variable; + it will either be stderr, or a file of the user's choosing. + Non-static to prevent multiple gcov-aware shared objects from + instantiating their own copies. */ +FILE *__gcov_error_file = NULL; + +/* A utility function to populate the __gcov_error_file pointer. + This should NOT be called outside of the gcov system driver code. */ + +static FILE * +get_gcov_error_file(void) +{ +#if !IN_GCOV_TOOL + return stderr; +#else + char *gcov_error_filename = getenv ("GCOV_ERROR_FILE"); + + 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; +#endif +} + +/* A utility function for outputting errors. */ static int __attribute__((format(printf, 1, 2))) 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); + __gcov_error_file = NULL; + } +} +#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 9c4eeca0163..d51397e0f8a 100644 --- a/libgcc/libgcov-driver.c +++ b/libgcc/libgcov-driver.c @@ -43,9 +43,13 @@ void __gcov_init (struct gcov_info *p __attribute__ ((unused))) {} #ifdef L_gcov -/* A utility function for outputing errors. */ +/* A utility function for outputting 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 |