diff options
author | Martin Liska <mliska@suse.cz> | 2018-06-07 06:21:35 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-06-07 04:21:35 +0000 |
commit | 6c086e8c75deaedb7db807d8008529747b275275 (patch) | |
tree | bf1b9fcbe6c7ae18bf10e75a89c7d5437a865a21 /libgcc/libgcov-driver-system.c | |
parent | 37777cd0335f3220e4cbe263099af633f1e1c645 (diff) | |
download | gcc-6c086e8c75deaedb7db807d8008529747b275275.zip gcc-6c086e8c75deaedb7db807d8008529747b275275.tar.gz gcc-6c086e8c75deaedb7db807d8008529747b275275.tar.bz2 |
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
Diffstat (limited to 'libgcc/libgcov-driver-system.c')
-rw-r--r-- | libgcc/libgcov-driver-system.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/libgcc/libgcov-driver-system.c b/libgcc/libgcov-driver-system.c index 7f3de63..8c1fef0 100644 --- a/libgcc/libgcov-driver-system.c +++ b/libgcc/libgcov-driver-system.c @@ -190,9 +190,12 @@ replace_filename_variables (char *filename) char *buffer = (char *)xmalloc (start + end + repl_length + 1); char *buffer_ptr = buffer; - buffer_ptr = (char *)mempcpy (buffer_ptr, filename, start); - buffer_ptr = (char *)mempcpy (buffer_ptr, replacement, repl_length); - buffer_ptr = (char *)mempcpy (buffer_ptr, p, end); + buffer_ptr = (char *)memcpy (buffer_ptr, filename, start); + buffer_ptr += start; + 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'; free (filename); @@ -210,6 +213,7 @@ allocate_filename_struct (struct gcov_filename *gf) const char *gcov_prefix; size_t prefix_length; int strip = 0; + gf->filename = NULL; { /* Check if the level of dirs to strip off specified. */ @@ -239,12 +243,16 @@ allocate_filename_struct (struct gcov_filename *gf) gcov_prefix = "."; prefix_length = 1; } - gf->prefix = prefix_length; /* Allocate and initialize the filename scratch space. */ - gf->filename = (char *) xmalloc (gf->max_length + prefix_length + 2); 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. @@ -255,7 +263,7 @@ gcov_exit_open_gcda_file (struct gcov_info *gi_ptr, struct gcov_filename *gf) { const char *fname = gi_ptr->filename; - char *dst = gf->filename + gf->prefix; + int append_slash = 0; fname = gi_ptr->filename; @@ -288,9 +296,17 @@ gcov_exit_open_gcda_file (struct gcov_info *gi_ptr, fname += 2; 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); |