summaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-02 12:22:01 +0000
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-02 12:22:01 +0000
commit3237fc563842293e8fda533523bc3acd770643cd (patch)
tree3d70d4e52b2e726d7ebe1241651fedc71dfd0812 /libgcc
parent98e7c96c688d9ef4f1de01e91b5f3affcf71e5a6 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--libgcc/libgcov-driver-system.c49
-rw-r--r--libgcc/libgcov-driver.c8
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