]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Implement -fprofile-prefix-map.
authorMartin Liska <mliska@suse.cz>
Thu, 11 Nov 2021 15:42:23 +0000 (16:42 +0100)
committerMartin Liska <mliska@suse.cz>
Thu, 2 Dec 2021 13:13:09 +0000 (14:13 +0100)
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.

gcc/common.opt
gcc/coverage.c
gcc/doc/invoke.texi
gcc/file-prefix-map.c
gcc/file-prefix-map.h
gcc/lto-opts.c
gcc/opts-global.c
gcc/opts.c
gcc/profile.c

index fa0a44f3674741f371c99ba512c17cc78e35fa7a..445a53a265ca4bc3910691a7387cd79f6306ce1e 100644 (file)
@@ -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.
index 4daa3f9fc302606a26b5ba3da218d972a341d13f..7f8b532cb5237a97fddf5e8a4d6f7eb1c6d24282 100644 (file)
@@ -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);
 
index d6858d834f9d916e0beaf462b755ca6e85d41461..6111a6b67944298984c4cffb197ce362c625fe16 100644 (file)
@@ -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
 
index ad242e5b9c581c650a03c183dda8b13f4ef08009..290b4b2da331cddebcf0ac2ed9ff3831c9505d4b 100644 (file)
@@ -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);
+}
index 5aecd5f7e19cfe7a21f148ff75866aafc2136088..3a2b0605ae09ebf1d3c68f56068e27ed252e4b17 100644 (file)
 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  */
index 7b2ad74e69a68b40f3afad035a8d9e4ed58e1d82..30c10136f312ebf311ef128e803c55c6e11f2634 100644 (file)
@@ -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:
index 55273822ec5ca19d622d19f7a12676840c95777c..d4fde39b9bdeb1ad52f25cf61bac55900ddeb33a 100644 (file)
@@ -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;
index b16497e45b3021729442fe184c8399ef490225c3..870cceca85a26db655c34dd3dac49227b656ee02 100644 (file)
@@ -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_:
index dbf42ff7b2bd665a2733341f74e5ee964866f369..d4103058fcd59c3eafe5ca2f76f9f1d179a42010 100644 (file)
@@ -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;