From 42393a73c0433d7de28dc560f47ff61e615718bf Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Tue, 9 Aug 2016 16:27:10 +0200
Subject: [PATCH] gcov: add new option (--hash-names) (PR gcov-profile/36412).
gcc/ChangeLog:
2016-08-09 Martin Liska <mliska@suse.cz>
PR gcov-profile/36412
* doc/gcov.texi: Document --hash-names (-e).
* gcov.c (print_usage): Add the option.
(process_args): Process the option.
(md5sum_to_hex): New function.
(make_gcov_file_name): Do the md5sum and append it to a
filename.
---
gcc/doc/gcov.texi | 6 ++++++
gcc/gcov.c | 47 +++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 51 insertions(+), 2 deletions(-)
@@ -123,6 +123,7 @@ gcov [@option{-v}|@option{--version}] [@option{-h}|@option{--help}]
[@option{-b}|@option{--branch-probabilities}]
[@option{-c}|@option{--branch-counts}]
[@option{-d}|@option{--display-progress}]
+ [@option{-e}|@option{--hash-names}]
[@option{-f}|@option{--function-summaries}]
[@option{-i}|@option{--intermediate-format}]
[@option{-l}|@option{--long-file-names}]
@@ -171,6 +172,11 @@ be shown, unless the @option{-u} option is given.
Write branch frequencies as the number of branches taken, rather than
the percentage of branches taken.
+@item -e
+@itemx --hash-names
+For situations when a long name can potentially hit filesystem path limit,
+let's calculate md5sum of the patch and create file x.gcov##md5sum.gcov.
+
@item -n
@itemx --no-output
Do not create the @command{gcov} output file.
@@ -43,6 +43,7 @@ along with Gcov; see the file COPYING3. If not see
#include <vector>
#include <algorithm>
+#include "md5.h"
using namespace std;
@@ -359,6 +360,11 @@ static int flag_demangled_names = 0;
static int flag_long_names = 0;
+/* For situations when a long name can potentially hit filesystem path limit,
+ let's calculate md5sum of the patch and create file x.gcov##md5sum.gcov. */
+
+static int flag_hash_names = 0;
+
/* Output count information for every basic block, not merely those
that contain line number information. */
@@ -655,6 +661,8 @@ print_usage (int error_p)
fnotice (file, " -c, --branch-counts Output counts of branches taken\n\
rather than percentages\n");
fnotice (file, " -d, --display-progress Display progress information\n");
+ fnotice (file, " -e, --hash-names Use hash of file path in "
+ "file names\n");
fnotice (file, " -f, --function-summaries Output summaries for each function\n");
fnotice (file, " -i, --intermediate-format Output .gcov file in intermediate text format\n");
fnotice (file, " -l, --long-file-names Use long output file names for included\n\
@@ -694,6 +702,7 @@ static const struct option options[] =
{ "all-blocks", no_argument, NULL, 'a' },
{ "branch-probabilities", no_argument, NULL, 'b' },
{ "branch-counts", no_argument, NULL, 'c' },
+ { "long-file-names", no_argument, NULL, 'e' },
{ "intermediate-format", no_argument, NULL, 'i' },
{ "no-output", no_argument, NULL, 'n' },
{ "long-file-names", no_argument, NULL, 'l' },
@@ -716,8 +725,8 @@ process_args (int argc, char **argv)
{
int opt;
- while ((opt = getopt_long (argc, argv, "abcdfhilmno:s:pruv", options, NULL)) !=
- -1)
+ const char *opts = "abcdefhilmno:s:pruv";
+ while ((opt = getopt_long (argc, argv, opts, options, NULL)) != -1)
{
switch (opt)
{
@@ -730,6 +739,9 @@ process_args (int argc, char **argv)
case 'c':
flag_counts = 1;
break;
+ case 'e':
+ flag_hash_names = 1;
+ break;
case 'f':
flag_function_summary = 1;
break;
@@ -2147,6 +2159,15 @@ canonicalize_name (const char *name)
return result;
}
+/* Print hex representation of 16 bytes from SUM and write it to BUFFER. */
+
+static void
+md5sum_to_hex (const char *sum, char *buffer)
+{
+ for (unsigned i = 0; i < 16; i++)
+ sprintf (buffer + (2 * i), "%02x", sum[i]);
+}
+
/* Generate an output file name. INPUT_NAME is the canonicalized main
input file and SRC_NAME is the canonicalized file name.
LONG_OUTPUT_NAMES and PRESERVE_PATHS affect name generation. With
@@ -2184,6 +2205,28 @@ make_gcov_file_name (const char *input_name, const char *src_name)
ptr = mangle_name (src_name, ptr);
strcpy (ptr, ".gcov");
+ if (flag_hash_names)
+ {
+ md5_ctx ctx;
+ char md5sum[16];
+ char md5sum_hex[33];
+
+ md5_init_ctx (&ctx);
+ md5_process_bytes (result, strlen (result), &ctx);
+ md5_finish_ctx (&ctx, md5sum);
+ md5sum_to_hex (md5sum, md5sum_hex);
+ free (result);
+
+ result = XNEWVEC (char, strlen (src_name) + 50);
+ ptr = result;
+ ptr = mangle_name (src_name, ptr);
+ ptr[0] = ptr[1] = '#';
+ ptr += 2;
+ memcpy (ptr, md5sum_hex, 32);
+ ptr += 32;
+ strcpy (ptr, ".gcov");
+ }
+
return result;
}
--
2.9.2