diff mbox series

Describe better version mismatch in libgcov driver.

Message ID 8fca37bb-1498-8b6d-9bde-731419dff0e4@suse.cz
State New
Headers show
Series Describe better version mismatch in libgcov driver. | expand

Commit Message

Martin Liška Jan. 18, 2019, 10:04 a.m. UTC
Hi.

The patch is about better explanation of version mismatch in libgcov
driver. Now we'll print:

profiling:/tmp/main.gcda:Version mismatch - expected 9.0 (experimental) (A90e) got 8.2 (release) (A82*)

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
It's approved by Honza.

Thanks,
Martin

libgcc/ChangeLog:

2019-01-17  Martin Liska  <mliska@suse.cz>

	* libgcov-driver.c (gcov_version_string): New function.
	(gcov_version): Convert version integer into string.
---
 libgcc/libgcov-driver.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/libgcc/libgcov-driver.c b/libgcc/libgcov-driver.c
index 44f43e6e9af..41d28ace926 100644
--- a/libgcc/libgcov-driver.c
+++ b/libgcc/libgcov-driver.c
@@ -157,6 +157,27 @@  fail:
   return (struct gcov_fn_buffer **)free_fn_data (gi_ptr, fn_buffer, ix);
 }
 
+/* Convert VERSION into a string description and return the it.
+   BUFFER is used for storage of the string.  The code should be
+   aligned wit gcov-iov.c.  */
+
+static char *
+gcov_version_string (char *buffer, char version[4])
+{
+  if (version[0] < 'A' || version[0] > 'Z'
+      || version[1] < '0' || version[1] > '9'
+      || version[2] < '0' || version[2] > '9')
+    sprintf (buffer, "(unknown)");
+  else
+    {
+      unsigned major = 10 * (version[0] - 'A') + (version[1] - '0');
+      unsigned minor = version[2] - '0';
+      sprintf (buffer, "%u.%u (%s)", major, minor,
+	       version[3] == '*' ? "release" : "experimental");
+    }
+  return buffer;
+}
+
 /* Check if VERSION of the info block PTR matches libgcov one.
    Return 1 on success, or zero in case of versions mismatch.
    If FILENAME is not NULL, its value used for reporting purposes
@@ -169,12 +190,16 @@  gcov_version (struct gcov_info *ptr, gcov_unsigned_t version,
   if (version != GCOV_VERSION)
     {
       char v[4], e[4];
+      char version_string[128], expected_string[128];
 
       GCOV_UNSIGNED2STRING (v, version);
       GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
 
-      gcov_error ("profiling:%s:Version mismatch - expected %.4s got %.4s\n",
-                  filename? filename : ptr->filename, e, v);
+      gcov_error ("profiling:%s:Version mismatch - expected %s (%.4s) "
+		  "got %s (%.4s)\n",
+		  filename? filename : ptr->filename,
+		  gcov_version_string (expected_string, e), e,
+		  gcov_version_string (version_string, v), v);
       return 0;
     }
   return 1;