diff options
author | Martin Liska <mliska@suse.cz> | 2018-06-05 14:10:22 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-06-05 12:10:22 +0000 |
commit | 97a53d1d04d5dc36f64c0897ff0c49c78ef83ffc (patch) | |
tree | d088d0aa4d340c24d5eedc905d9cd05b01c035ba /libgcc | |
parent | 066c4268db267ef6d88498b001b143db404e495e (diff) | |
download | gcc-97a53d1d04d5dc36f64c0897ff0c49c78ef83ffc.zip gcc-97a53d1d04d5dc36f64c0897ff0c49c78ef83ffc.tar.gz gcc-97a53d1d04d5dc36f64c0897ff0c49c78ef83ffc.tar.bz2 |
Support variables in expansion of -fprofile-generate option (PR gcov-profile/47618).
2018-06-05 Martin Liska <mliska@suse.cz>
PR gcov-profile/47618
* doc/invoke.texi: Document how -fprofile-dir format
is extended.
2018-06-05 Martin Liska <mliska@suse.cz>
PR gcov-profile/47618
* libgcov-driver-system.c (replace_filename_variables): New
function.
(gcov_exit_open_gcda_file): Use it.
From-SVN: r261199
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 7 | ||||
-rw-r--r-- | libgcc/libgcov-driver-system.c | 70 |
2 files changed, 77 insertions, 0 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index f2297c0..5389999 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,5 +1,12 @@ 2018-06-05 Martin Liska <mliska@suse.cz> + PR gcov-profile/47618 + * libgcov-driver-system.c (replace_filename_variables): New + function. + (gcov_exit_open_gcda_file): Use it. + +2018-06-05 Martin Liska <mliska@suse.cz> + * libgcov-driver.c (gcov_compute_histogram): Remove usage of gcov_ctr_summary. (compute_summary): Do it just for a single summary. diff --git a/libgcc/libgcov-driver-system.c b/libgcc/libgcov-driver-system.c index bf12586..7f3de63 100644 --- a/libgcc/libgcov-driver-system.c +++ b/libgcc/libgcov-driver-system.c @@ -136,6 +136,74 @@ create_file_directory (char *filename) #endif } +/* Replace filename variables in FILENAME. We currently support expansion: + + %p - process ID + %q{ENV} - value of environment variable ENV + */ + +static char * +replace_filename_variables (char *filename) +{ + char buffer[16]; + char empty[] = ""; + for (char *p = filename; *p != '\0'; p++) + { + unsigned length = strlen (filename); + if (*p == '%' && *(p + 1) != '\0') + { + unsigned start = p - filename; + p++; + char *replacement = NULL; + switch (*p) + { + case 'p': + sprintf (buffer, "%d", getpid ()); + replacement = buffer; + p++; + break; + case 'q': + if (*(p + 1) == '{') + { + p += 2; + char *e = strchr (p, '}'); + if (e) + { + *e = '\0'; + replacement = getenv (p); + if (replacement == NULL) + replacement = empty; + p = e + 1; + } + else + return filename; + } + break; + default: + return filename; + } + + /* Concat beginning of the path, replacement and + ending of the path. */ + unsigned end = length - (p - filename); + unsigned repl_length = strlen (replacement); + + 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 = '\0'; + + free (filename); + filename = buffer; + p = buffer + start + repl_length; + } + } + + return filename; +} + static void allocate_filename_struct (struct gcov_filename *gf) { @@ -224,6 +292,8 @@ gcov_exit_open_gcda_file (struct gcov_info *gi_ptr, } strcpy (dst, fname); + gf->filename = replace_filename_variables (gf->filename); + if (!gcov_open (gf->filename)) { /* Open failed likely due to missed directory. |