Commit 6c086e8c by Martin Liska Committed by Martin Liska

Fix libgcov-driver-system bootstrap failure (PR bootstrap/86057).

2018-06-07  Martin Liska  <mliska@suse.cz>

        PR bootstrap/86057
	* libgcov-driver-system.c (replace_filename_variables): Use
        memcpy instead of mempcpy.
	(allocate_filename_struct): Do not allocate filename, allocate
        prefix and set it.
	(gcov_exit_open_gcda_file): Allocate memory for gf->filename
        here and properly copy content into it.
	* libgcov-driver.c (struct gcov_filename): Remove max_length
        field, change prefix from size_t into char *.
	(compute_summary): Do not calculate longest filename.
	(gcov_do_dump): Release memory of gf.filename after each file.
	* libgcov-util.c (compute_summary): Use new signature of
        compute_summary.
	(calculate_overlap): Likewise.

From-SVN: r261260
parent 37777cd0
2018-06-07 Martin Liska <mliska@suse.cz>
PR bootstrap/86057
* libgcov-driver-system.c (replace_filename_variables): Use
memcpy instead of mempcpy.
(allocate_filename_struct): Do not allocate filename, allocate
prefix and set it.
(gcov_exit_open_gcda_file): Allocate memory for gf->filename
here and properly copy content into it.
* libgcov-driver.c (struct gcov_filename): Remove max_length
field, change prefix from size_t into char *.
(compute_summary): Do not calculate longest filename.
(gcov_do_dump): Release memory of gf.filename after each file.
* libgcov-util.c (compute_summary): Use new signature of
compute_summary.
(calculate_overlap): Likewise.
2018-06-05 Martin Liska <mliska@suse.cz> 2018-06-05 Martin Liska <mliska@suse.cz>
PR gcov-profile/47618 PR gcov-profile/47618
......
...@@ -190,9 +190,12 @@ replace_filename_variables (char *filename) ...@@ -190,9 +190,12 @@ replace_filename_variables (char *filename)
char *buffer = (char *)xmalloc (start + end + repl_length + 1); char *buffer = (char *)xmalloc (start + end + repl_length + 1);
char *buffer_ptr = buffer; char *buffer_ptr = buffer;
buffer_ptr = (char *)mempcpy (buffer_ptr, filename, start); buffer_ptr = (char *)memcpy (buffer_ptr, filename, start);
buffer_ptr = (char *)mempcpy (buffer_ptr, replacement, repl_length); buffer_ptr += start;
buffer_ptr = (char *)mempcpy (buffer_ptr, p, end); buffer_ptr = (char *)memcpy (buffer_ptr, replacement, repl_length);
buffer_ptr += repl_length;
buffer_ptr = (char *)memcpy (buffer_ptr, p, end);
buffer_ptr += end;
*buffer_ptr = '\0'; *buffer_ptr = '\0';
free (filename); free (filename);
...@@ -210,6 +213,7 @@ allocate_filename_struct (struct gcov_filename *gf) ...@@ -210,6 +213,7 @@ allocate_filename_struct (struct gcov_filename *gf)
const char *gcov_prefix; const char *gcov_prefix;
size_t prefix_length; size_t prefix_length;
int strip = 0; int strip = 0;
gf->filename = NULL;
{ {
/* Check if the level of dirs to strip off specified. */ /* Check if the level of dirs to strip off specified. */
...@@ -239,12 +243,16 @@ allocate_filename_struct (struct gcov_filename *gf) ...@@ -239,12 +243,16 @@ allocate_filename_struct (struct gcov_filename *gf)
gcov_prefix = "."; gcov_prefix = ".";
prefix_length = 1; prefix_length = 1;
} }
gf->prefix = prefix_length;
/* Allocate and initialize the filename scratch space. */ /* Allocate and initialize the filename scratch space. */
gf->filename = (char *) xmalloc (gf->max_length + prefix_length + 2);
if (prefix_length) if (prefix_length)
memcpy (gf->filename, gcov_prefix, prefix_length); {
gf->prefix = (char *) xmalloc (prefix_length + 1);
char *p = (char *) memcpy (gf->prefix, gcov_prefix, prefix_length);
*(p + prefix_length) = '\0';
}
else
gf->prefix = NULL;
} }
/* Open a gcda file specified by GI_FILENAME. /* Open a gcda file specified by GI_FILENAME.
...@@ -255,7 +263,7 @@ gcov_exit_open_gcda_file (struct gcov_info *gi_ptr, ...@@ -255,7 +263,7 @@ gcov_exit_open_gcda_file (struct gcov_info *gi_ptr,
struct gcov_filename *gf) struct gcov_filename *gf)
{ {
const char *fname = gi_ptr->filename; const char *fname = gi_ptr->filename;
char *dst = gf->filename + gf->prefix; int append_slash = 0;
fname = gi_ptr->filename; fname = gi_ptr->filename;
...@@ -288,9 +296,17 @@ gcov_exit_open_gcda_file (struct gcov_info *gi_ptr, ...@@ -288,9 +296,17 @@ gcov_exit_open_gcda_file (struct gcov_info *gi_ptr,
fname += 2; fname += 2;
if (!IS_DIR_SEPARATOR (*fname)) if (!IS_DIR_SEPARATOR (*fname))
*dst++ = '/'; append_slash = 1;
} }
strcpy (dst, fname);
size_t prefix_length = gf->prefix ? strlen (gf->prefix) : 0;
gf->filename = (char *) xmalloc (prefix_length + strlen (fname) + 2);
*gf->filename = '\0';
if (prefix_length)
strcat (gf->filename, gf->prefix);
if (append_slash)
*gf->filename++ = '/';
strcat (gf->filename, fname);
gf->filename = replace_filename_variables (gf->filename); gf->filename = replace_filename_variables (gf->filename);
......
...@@ -72,9 +72,8 @@ struct gcov_summary_buffer ...@@ -72,9 +72,8 @@ struct gcov_summary_buffer
struct gcov_filename struct gcov_filename
{ {
char *filename; /* filename buffer */ char *filename; /* filename buffer */
size_t max_length; /* maximum filename length */
int strip; /* leading chars to strip from filename */ int strip; /* leading chars to strip from filename */
size_t prefix; /* chars to prepend to filename */ char *prefix; /* prefix string */
}; };
static struct gcov_fn_buffer * static struct gcov_fn_buffer *
...@@ -259,15 +258,13 @@ static struct gcov_fn_buffer *fn_buffer; ...@@ -259,15 +258,13 @@ static struct gcov_fn_buffer *fn_buffer;
static struct gcov_summary_buffer *sum_buffer; static struct gcov_summary_buffer *sum_buffer;
/* This function computes the program level summary and the histo-gram. /* This function computes the program level summary and the histo-gram.
It computes and returns CRC32 and stored summary in THIS_PRG. It computes and returns CRC32 and stored summary in THIS_PRG. */
Also determines the longest filename length of the info files. */
#if !IN_GCOV_TOOL #if !IN_GCOV_TOOL
static static
#endif #endif
gcov_unsigned_t gcov_unsigned_t
compute_summary (struct gcov_info *list, struct gcov_summary *this_prg, compute_summary (struct gcov_info *list, struct gcov_summary *this_prg)
size_t *max_length)
{ {
struct gcov_info *gi_ptr; struct gcov_info *gi_ptr;
const struct gcov_fn_info *gfi_ptr; const struct gcov_fn_info *gfi_ptr;
...@@ -278,13 +275,8 @@ compute_summary (struct gcov_info *list, struct gcov_summary *this_prg, ...@@ -278,13 +275,8 @@ compute_summary (struct gcov_info *list, struct gcov_summary *this_prg,
/* Find the totals for this execution. */ /* Find the totals for this execution. */
memset (this_prg, 0, sizeof (*this_prg)); memset (this_prg, 0, sizeof (*this_prg));
*max_length = 0;
for (gi_ptr = list; gi_ptr; gi_ptr = gi_ptr->next) for (gi_ptr = list; gi_ptr; gi_ptr = gi_ptr->next)
{ {
size_t len = strlen (gi_ptr->filename);
if (len > *max_length)
*max_length = len;
crc32 = crc32_unsigned (crc32, gi_ptr->stamp); crc32 = crc32_unsigned (crc32, gi_ptr->stamp);
crc32 = crc32_unsigned (crc32, gi_ptr->n_functions); crc32 = crc32_unsigned (crc32, gi_ptr->n_functions);
...@@ -799,7 +791,7 @@ gcov_do_dump (struct gcov_info *list, int run_counted) ...@@ -799,7 +791,7 @@ gcov_do_dump (struct gcov_info *list, int run_counted)
struct gcov_summary all_prg; struct gcov_summary all_prg;
struct gcov_summary this_prg; struct gcov_summary this_prg;
crc32 = compute_summary (list, &this_prg, &gf.max_length); crc32 = compute_summary (list, &this_prg);
allocate_filename_struct (&gf); allocate_filename_struct (&gf);
#if !GCOV_LOCKED #if !GCOV_LOCKED
...@@ -808,9 +800,12 @@ gcov_do_dump (struct gcov_info *list, int run_counted) ...@@ -808,9 +800,12 @@ gcov_do_dump (struct gcov_info *list, int run_counted)
/* Now merge each file. */ /* Now merge each file. */
for (gi_ptr = list; gi_ptr; gi_ptr = gi_ptr->next) for (gi_ptr = list; gi_ptr; gi_ptr = gi_ptr->next)
dump_one_gcov (gi_ptr, &gf, run_counted, crc32, &all_prg, &this_prg); {
dump_one_gcov (gi_ptr, &gf, run_counted, crc32, &all_prg, &this_prg);
free (gf.filename);
}
free (gf.filename); free (gf.prefix);
} }
#if IN_GCOV_TOOL #if IN_GCOV_TOOL
......
...@@ -1202,7 +1202,7 @@ matched_gcov_info (const struct gcov_info *info1, const struct gcov_info *info2) ...@@ -1202,7 +1202,7 @@ matched_gcov_info (const struct gcov_info *info1, const struct gcov_info *info2)
/* Defined in libgcov-driver.c. */ /* Defined in libgcov-driver.c. */
extern gcov_unsigned_t compute_summary (struct gcov_info *, extern gcov_unsigned_t compute_summary (struct gcov_info *,
struct gcov_summary *, size_t *); struct gcov_summary *);
/* Compute the overlap score of two profiles with the head of GCOV_LIST1 and /* Compute the overlap score of two profiles with the head of GCOV_LIST1 and
GCOV_LIST1. Return a number ranging from [0.0, 1.0], with 0.0 meaning no GCOV_LIST1. Return a number ranging from [0.0, 1.0], with 0.0 meaning no
...@@ -1215,15 +1215,14 @@ calculate_overlap (struct gcov_info *gcov_list1, ...@@ -1215,15 +1215,14 @@ calculate_overlap (struct gcov_info *gcov_list1,
struct gcov_summary this_prg; struct gcov_summary this_prg;
unsigned list1_cnt = 0, list2_cnt= 0, all_cnt; unsigned list1_cnt = 0, list2_cnt= 0, all_cnt;
unsigned int i, j; unsigned int i, j;
size_t max_length;
const struct gcov_info *gi_ptr; const struct gcov_info *gi_ptr;
struct overlap_t *all_infos; struct overlap_t *all_infos;
compute_summary (gcov_list1, &this_prg, &max_length); compute_summary (gcov_list1, &this_prg);
overlap_sum_1 = (double) (this_prg.sum_all); overlap_sum_1 = (double) (this_prg.sum_all);
p1_sum_all = this_prg.sum_all; p1_sum_all = this_prg.sum_all;
p1_run_max = this_prg.run_max; p1_run_max = this_prg.run_max;
compute_summary (gcov_list2, &this_prg, &max_length); compute_summary (gcov_list2, &this_prg);
overlap_sum_2 = (double) (this_prg.sum_all); overlap_sum_2 = (double) (this_prg.sum_all);
p2_sum_all = this_prg.sum_all; p2_sum_all = this_prg.sum_all;
p2_run_max = this_prg.run_max; p2_run_max = this_prg.run_max;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment