diff options
author | Martin Liska <mliska@suse.cz> | 2021-11-11 16:42:23 +0100 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2021-12-02 14:13:09 +0100 |
commit | cde87638bf5cf6aafffb590986b6a890da0ba06c (patch) | |
tree | 992cb983e1e788230e477b16112c83026c6d57f1 /gcc | |
parent | 6f43a8a08053a871e785e2ebc80383e0849efb6f (diff) | |
download | gcc-cde87638bf5cf6aafffb590986b6a890da0ba06c.zip gcc-cde87638bf5cf6aafffb590986b6a890da0ba06c.tar.gz gcc-cde87638bf5cf6aafffb590986b6a890da0ba06c.tar.bz2 |
Implement -fprofile-prefix-map.
PR gcov-profile/96092
gcc/ChangeLog:
* common.opt: New option.
* coverage.c (coverage_begin_function): Emit filename with
remap_profile_filename.
* doc/invoke.texi: Document the new option.
* file-prefix-map.c (add_profile_prefix_map): New.
(remap_profile_filename): Likewise.
* file-prefix-map.h (add_profile_prefix_map): Likewise.
(remap_profile_filename): Likewise.
* lto-opts.c (lto_write_options): Handle
OPT_fprofile_prefix_map_.
* opts-global.c (handle_common_deferred_options): Likewise.
* opts.c (common_handle_option): Likewise.
(gen_command_line_string): Likewise.
* profile.c (output_location): Emit filename with
remap_profile_filename.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/common.opt | 4 | ||||
-rw-r--r-- | gcc/coverage.c | 3 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 14 | ||||
-rw-r--r-- | gcc/file-prefix-map.c | 17 | ||||
-rw-r--r-- | gcc/file-prefix-map.h | 2 | ||||
-rw-r--r-- | gcc/lto-opts.c | 1 | ||||
-rw-r--r-- | gcc/opts-global.c | 4 | ||||
-rw-r--r-- | gcc/opts.c | 2 | ||||
-rw-r--r-- | gcc/profile.c | 4 |
9 files changed, 48 insertions, 3 deletions
diff --git a/gcc/common.opt b/gcc/common.opt index fa0a44f..445a53a 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2327,6 +2327,10 @@ fprofile-prefix-path= Common Joined RejectNegative Var(profile_prefix_path) Remove prefix from absolute path before mangling name for -fprofile-generate= and -fprofile-use=. +fprofile-prefix-map= +Common Joined RejectNegative Var(common_deferred_options) Defer +-fprofile-prefix-map=<old>=<new> Map one directory name to another in GCOV coverage result. + fprofile-generate Common Enable common options for generating profile info for profile feedback directed optimizations. diff --git a/gcc/coverage.c b/gcc/coverage.c index 4daa3f9..7f8b532 100644 --- a/gcc/coverage.c +++ b/gcc/coverage.c @@ -51,6 +51,7 @@ along with GCC; see the file COPYING3. If not see #include "profile.h" #include "diagnostic.h" #include "varasm.h" +#include "file-prefix-map.h" #include "gcov-io.c" @@ -646,7 +647,7 @@ coverage_begin_function (unsigned lineno_checksum, unsigned cfg_checksum) gcov_write_unsigned (DECL_ARTIFICIAL (current_function_decl) && !DECL_FUNCTION_VERSIONED (current_function_decl) && !DECL_LAMBDA_FUNCTION_P (current_function_decl)); - gcov_write_filename (startloc.file); + gcov_write_filename (remap_profile_filename (startloc.file)); gcov_write_unsigned (startloc.line); gcov_write_unsigned (startloc.column); diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index d6858d8..6111a6b 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -613,7 +613,8 @@ Objective-C and Objective-C++ Dialects}. -fvtv-counts -fvtv-debug @gol -finstrument-functions @gol -finstrument-functions-exclude-function-list=@var{sym},@var{sym},@dots{} @gol --finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{}} +-finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{}} @gol +-fprofile-prefix-map=@var{old}=@var{new} @item Preprocessor Options @xref{Preprocessor Options,,Options Controlling the Preprocessor}. @@ -2182,7 +2183,8 @@ files resided in directory @file{@var{new}} instead. Specifying this option is equivalent to specifying all the individual @option{-f*-prefix-map} options. This can be used to make reproducible builds that are location independent. See also -@option{-fmacro-prefix-map} and @option{-fdebug-prefix-map}. +@option{-fmacro-prefix-map}, @option{-fdebug-prefix-map} and +@option{-fprofile-prefix-map}. @item -fplugin=@var{name}.so @opindex fplugin @@ -15273,6 +15275,14 @@ In such setups @option{-fprofile-prefix-path=}@var{path} with @var{path} pointing to the base directory of the build can be used to strip the irrelevant part of the path and keep all file names relative to the main build directory. +@item -fprofile-prefix-map=@var{old}=@var{new} +@opindex fprofile-prefix-map +When compiling files residing in directory @file{@var{old}}, record +profiling information (with @option{--coverage}) +describing them as if the files resided in +directory @file{@var{new}} instead. +See also @option{-ffile-prefix-map}. + @item -fprofile-update=@var{method} @opindex fprofile-update diff --git a/gcc/file-prefix-map.c b/gcc/file-prefix-map.c index ad242e5..290b4b2 100644 --- a/gcc/file-prefix-map.c +++ b/gcc/file-prefix-map.c @@ -92,6 +92,7 @@ remap_filename (file_prefix_map *maps, const char *filename) /* Linked lists of file_prefix_map structures. */ static file_prefix_map *macro_prefix_maps; /* -fmacro-prefix-map */ static file_prefix_map *debug_prefix_maps; /* -fdebug-prefix-map */ +static file_prefix_map *profile_prefix_maps; /* -fprofile-prefix-map */ /* Record a file prefix mapping for -fmacro-prefix-map. */ void @@ -113,6 +114,14 @@ add_file_prefix_map (const char *arg) { add_prefix_map (macro_prefix_maps, arg, "-ffile-prefix-map"); add_prefix_map (debug_prefix_maps, arg, "-ffile-prefix-map"); + add_prefix_map (profile_prefix_maps, arg, "-ffile-prefix-map"); +} + +/* Record a file prefix mapping for -fprofile-prefix-map. */ +void +add_profile_prefix_map (const char *arg) +{ + add_prefix_map (profile_prefix_maps, arg, "-fprofile-prefix-map"); } /* Remap using -fmacro-prefix-map. Return the GC-allocated new name @@ -130,3 +139,11 @@ remap_debug_filename (const char *filename) { return remap_filename (debug_prefix_maps, filename); } + +/* Remap using -fprofile-prefix-map. Return the GC-allocated new name + corresponding to FILENAME or FILENAME if no remapping was performed. */ +const char * +remap_profile_filename (const char *filename) +{ + return remap_filename (profile_prefix_maps, filename); +} diff --git a/gcc/file-prefix-map.h b/gcc/file-prefix-map.h index 5aecd5f..3a2b060 100644 --- a/gcc/file-prefix-map.h +++ b/gcc/file-prefix-map.h @@ -21,8 +21,10 @@ void add_macro_prefix_map (const char *); void add_debug_prefix_map (const char *); void add_file_prefix_map (const char *); +void add_profile_prefix_map (const char *); const char *remap_macro_filename (const char *); const char *remap_debug_filename (const char *); +const char *remap_profile_filename (const char *); #endif /* !GCC_FILE_PREFIX_MAP_H */ diff --git a/gcc/lto-opts.c b/gcc/lto-opts.c index 7b2ad74..30c1013 100644 --- a/gcc/lto-opts.c +++ b/gcc/lto-opts.c @@ -149,6 +149,7 @@ lto_write_options (void) case OPT_fdebug_prefix_map_: case OPT_ffile_prefix_map_: case OPT_fmacro_prefix_map_: + case OPT_fprofile_prefix_map_: continue; default: diff --git a/gcc/opts-global.c b/gcc/opts-global.c index 5527382..d4fde39 100644 --- a/gcc/opts-global.c +++ b/gcc/opts-global.c @@ -386,6 +386,10 @@ handle_common_deferred_options (void) add_file_prefix_map (opt->arg); break; + case OPT_fprofile_prefix_map_: + add_profile_prefix_map (opt->arg); + break; + case OPT_fdump_: g->get_dumps ()->dump_switch_p (opt->arg); break; @@ -2685,6 +2685,7 @@ common_handle_option (struct gcc_options *opts, case OPT_fdebug_prefix_map_: case OPT_ffile_prefix_map_: + case OPT_fprofile_prefix_map_: /* Deferred. */ break; @@ -3598,6 +3599,7 @@ gen_command_line_string (cl_decoded_option *options, case OPT_fdebug_prefix_map_: case OPT_fmacro_prefix_map_: case OPT_ffile_prefix_map_: + case OPT_fprofile_prefix_map_: case OPT_fcompare_debug: case OPT_fchecking: case OPT_fchecking_: diff --git a/gcc/profile.c b/gcc/profile.c index dbf42ff..d410305 100644 --- a/gcc/profile.c +++ b/gcc/profile.c @@ -65,6 +65,7 @@ along with GCC; see the file COPYING3. If not see #include "dumpfile.h" #include "cfgloop.h" #include "sreal.h" +#include "file-prefix-map.h" #include "profile.h" @@ -1060,6 +1061,9 @@ output_location (hash_set<location_triplet_hash> *streamed_locations, static int prev_line; bool name_differs, line_differs; + if (file_name != NULL) + file_name = remap_profile_filename (file_name); + location_triplet triplet; triplet.filename = file_name; triplet.lineno = line; |