summaryrefslogtreecommitdiff
path: root/libgcc/libgcov-driver-system.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgcc/libgcov-driver-system.c')
-rw-r--r--libgcc/libgcov-driver-system.c49
1 files changed, 47 insertions, 2 deletions
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. */