public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jakub Jelinek <jakub@redhat.com>
To: Jeff Law <jeffreyalaw@gmail.com>, Richard Biener <rguenther@suse.de>
Cc: gcc-patches@gcc.gnu.org,
	Richard Purdie <richard.purdie@linuxfoundation.org>
Subject: Patch ping - [PATCH] file-prefix-map: Fix up -f*-prefix-map= [PR108464]
Date: Fri, 10 Mar 2023 09:49:07 +0100	[thread overview]
Message-ID: <ZArvA85kjSpwBwqc@tucnak> (raw)
In-Reply-To: <Y8qt0/yOySGsLEnt@tucnak>

Hi!

I'd like to ping these patches.  All 3 variants have been
bootstrapped/regtested on x86_64-linux and i686-linux, the last
one is my preference I guess.  The current state breaks e.g. ccache.

https://gcc.gnu.org/pipermail/gcc-patches/2023-January/610285.html
  - PR108464 - P1 - file-prefix-map: Fix up -f*-prefix-map= (3 variants)

Thanks
	Jakub

On Fri, Jan 20, 2023 at 04:05:55PM +0100, Jakub Jelinek via Gcc-patches wrote:
> On Tue, Nov 01, 2022 at 01:46:20PM -0600, Jeff Law via Gcc-patches wrote:
> > > This does cause a change of behaviour if users were previously relying upon
> > > symlinks or absolute paths not being resolved.
> > 
> > I'm not too worried about this scenario.
> 
> As mentioned in the PR, this patch breaks e.g. ccache testsuite.
> 
> I strongly doubt most of the users want such a behavior, because it
> makes all filenames absolute when -f*-prefix-map= options remap one
> absolute path to another one.
> Say if I'm in /tmp and /tmp is the canonical path and there is
> src/test.c file, with -fdebug-prefix-map=/tmp=/blah
> previously there would be DW_AT_comp_dir "/blah" and it is still there,
> but DW_AT_name which was previouly "src/test.c" (relative against
> DW_AT_comp_dir) is now "/blah/src/test.c" instead.
> 
> Even worse, the canonicalization is only done on the remap_filename
> argument, but not on the old_prefix side.  That is e.g. what breaks
> ccache.  If there is
> /tmp/foobar1 directory and
> ln -sf foobar1 /tmp/foobar2
> cd /tmp/foobar2
> then -fdebug-prefix-map=`pwd`:/blah will just not work, while
> src/test.c will be canonicalized to /tmp/foobar1/src/test.c,
> old_prefix is still what the user provided which is /tmp/foobar2.
> User would need to change their uses to use -fdebug-prefix-map=`realpath $(pwd)`=/blah
> 
> I'm attaching 3 so far just compile tested patches.
> 
> The first patch just reverts the patch (and its follow-up patch).
> 
> The second introduces a new option, -f{,no}-canon-prefix-map which affects
> the behavior of -f{file,macro,debug,profile}-prefix-map=, if on it
> canonicalizes the old path of the prefix map option and compares that
> against the canonicalized filename for absolute paths but not relative.
> 
> And last is like the second, but does that also for relative paths except
> for filenames with no / (or / or \ on DOS based fs).  So, the third patch
> gets an optional behavior of what has been on the trunk lately with the
> difference that the old_prefix is canonicalized by the compiler.
> 
> Initially I've thought I'd just add some magic syntax to the OLD=NEW
> argument of those options (because there are 4 of them), but as noted
> in the comments, = is valid char in OLD (just not new), so it would
> be hard to figure out some syntax.  So instead a new option, which one
> can turn on and off for different -f*-prefix-map= options if needed.
> 
> -fdebug-prefix-map=/path1=/mypath1 -fcanon-prefix-map \
> -fdebug-prefix-map=/path2=/mypath2 -fno-canon-prefix-map \
> -fdebug-prefix-map=/path3=/mypath3
> 
> will use the old behavior for the /path1 and /path3 handling and
> the new one only for /path2 handling.
> 
> Thoughts on this?
> 
> 	Jakub

> 2023-01-20  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR other/108464
> 	* file-prefix-map.cc (remap_filename): Revert 2022-11-01 and 2022-11-07
> 	changes.
> 
> --- gcc/file-prefix-map.cc
> +++ gcc/file-prefix-map.cc
> @@ -70,29 +70,19 @@ remap_filename (file_prefix_map *maps, const char *filename)
>    file_prefix_map *map;
>    char *s;
>    const char *name;
> -  char *realname;
>    size_t name_len;
>  
> -  if (!filename || lbasename (filename) == filename)
> -    return filename;
> -
> -  realname = lrealpath (filename);
> -
>    for (map = maps; map; map = map->next)
> -    if (filename_ncmp (realname, map->old_prefix, map->old_len) == 0)
> +    if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
>        break;
>    if (!map)
> -    {
> -      free (realname);
> -      return filename;
> -    }
> -  name = realname + map->old_len;
> +    return filename;
> +  name = filename + map->old_len;
>    name_len = strlen (name) + 1;
>  
>    s = (char *) ggc_alloc_atomic (name_len + map->new_len);
>    memcpy (s, map->new_prefix, map->new_len);
>    memcpy (s + map->new_len, name, name_len);
> -  free (realname);
>    return s;
>  }
>  

> 2023-01-20  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR other/108464
> 	* common.opt (fcanon-prefix-map): New option.
> 	* opts.cc: Include file-prefix-map.h.
> 	(flag_canon_prefix_map): New variable.
> 	(common_handle_option): Handle OPT_fcanon_prefix_map.
> 	(gen_command_line_string): Ignore OPT_fcanon_prefix_map.
> 	* file-prefix-map.h (flag_canon_prefix_map): Declare.
> 	* file-prefix-map.cc (struct file_prefix_map): Add canonicalize
> 	member.
> 	(add_prefix_map): Initialize canonicalize member from
> 	flag_canon_prefix_map, and if true and old_prefix is absolute
> 	pathname, canonicalize it using lrealpath.
> 	(remap_filename): Revert 2022-11-01 and 2022-11-07 changes,
> 	use lrealpath result only for absolute filenames and only for
> 	map->canonicalize map entries.
> 	* lto-opts.cc (lto_write_options): Ignore OPT_fcanon_prefix_map.
> 	* opts-global.cc (handle_common_deferred_options): Clear
> 	flag_canon_prefix_map at the start and handle OPT_fcanon_prefix_map.
> 	* doc/invoke.texi (-fcanon-prefix-map): Document.
> 	(-ffile-prefix-map, -fdebug-prefix-map, -fprofile-prefix-map): Add
> 	see also for -fcanon-prefix-map.
> 	* doc/cppopts.texi (-fmacro-prefix-map): Likewise.
> 
> --- gcc/common.opt.jj	2023-01-09 13:18:28.298019442 +0100
> +++ gcc/common.opt	2023-01-20 12:43:17.152178057 +0100
> @@ -1204,6 +1204,10 @@ fchecking=
>  Common Joined RejectNegative UInteger Var(flag_checking)
>  Perform internal consistency checkings.
>  
> +fcanon-prefix-map
> +Common Var(common_deferred_options) Defer
> +For -f*-prefix-map= options compare canonicalized pathnames rather than just strings.
> +
>  fcode-hoisting
>  Common Var(flag_code_hoisting) Optimization
>  Enable code hoisting.
> --- gcc/opts.cc.jj	2023-01-02 09:32:52.073856323 +0100
> +++ gcc/opts.cc	2023-01-20 13:54:53.526705571 +0100
> @@ -34,10 +34,14 @@ along with GCC; see the file COPYING3.
>  #include "diagnostic-color.h"
>  #include "version.h"
>  #include "selftest.h"
> +#include "file-prefix-map.h"
>  
>  /* In this file all option sets are explicit.  */
>  #undef OPTION_SET_P
>  
> +/* Set by -fcanon-prefix-map.  */
> +bool flag_canon_prefix_map;
> +
>  static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
>  
>  /* Names of fundamental debug info formats indexed by enum
> @@ -2812,6 +2816,10 @@ common_handle_option (struct gcc_options
>        /* Deferred.  */
>        break;
>  
> +    case OPT_fcanon_prefix_map:
> +      flag_canon_prefix_map = value;
> +      break;
> +
>      case OPT_fcallgraph_info:
>        opts->x_flag_callgraph_info = CALLGRAPH_INFO_NAKED;
>        break;
> @@ -3718,6 +3726,7 @@ gen_command_line_string (cl_decoded_opti
>        case OPT_fmacro_prefix_map_:
>        case OPT_ffile_prefix_map_:
>        case OPT_fprofile_prefix_map_:
> +      case OPT_fcanon_prefix_map:
>        case OPT_fcompare_debug:
>        case OPT_fchecking:
>        case OPT_fchecking_:
> --- gcc/file-prefix-map.h.jj	2023-01-02 09:32:33.258128185 +0100
> +++ gcc/file-prefix-map.h	2023-01-20 12:44:31.542094469 +0100
> @@ -22,6 +22,7 @@ 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 *);
> +extern bool flag_canon_prefix_map;
>  
>  const char *remap_macro_filename (const char *);
>  const char *remap_debug_filename (const char *);
> --- gcc/file-prefix-map.cc.jj	2023-01-02 09:32:52.787846007 +0100
> +++ gcc/file-prefix-map.cc	2023-01-20 13:53:31.568896433 +0100
> @@ -30,6 +30,7 @@ struct file_prefix_map
>    const char *new_prefix;
>    size_t old_len;
>    size_t new_len;
> +  bool canonicalize;
>    struct file_prefix_map *next;
>  };
>  
> @@ -51,8 +52,16 @@ add_prefix_map (file_prefix_map *&maps,
>        return;
>      }
>    map = XNEW (file_prefix_map);
> +  map->canonicalize = flag_canon_prefix_map;
>    map->old_prefix = xstrndup (arg, p - arg);
>    map->old_len = p - arg;
> +  if (map->canonicalize && IS_ABSOLUTE_PATH (map->old_prefix))
> +    {
> +      char *realname = lrealpath (map->old_prefix);
> +      free (const_cast <char *> (map->old_prefix));
> +      map->old_prefix = realname;
> +      map->old_len = strlen (realname);
> +    }
>    p++;
>    map->new_prefix = xstrdup (p);
>    map->new_len = strlen (p);
> @@ -70,23 +79,32 @@ remap_filename (file_prefix_map *maps, c
>    file_prefix_map *map;
>    char *s;
>    const char *name;
> -  char *realname;
> +  char *realname = NULL;
>    size_t name_len;
>  
> -  if (!filename || lbasename (filename) == filename)
> +  if (!filename)
>      return filename;
>  
> -  realname = lrealpath (filename);
> -
> +  bool absolute = IS_ABSOLUTE_PATH (filename);
>    for (map = maps; map; map = map->next)
> -    if (filename_ncmp (realname, map->old_prefix, map->old_len) == 0)
> +    if (map->canonicalize && absolute)
> +      {
> +	if (realname == NULL)
> +	  realname = lrealpath (filename);
> +	if (filename_ncmp (realname, map->old_prefix, map->old_len) == 0)
> +	  break;
> +      }
> +    else if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
>        break;
>    if (!map)
>      {
>        free (realname);
>        return filename;
>      }
> -  name = realname + map->old_len;
> +  if (map->canonicalize && absolute)
> +    name = realname + map->old_len;
> +  else
> +    name = filename + map->old_len;
>    name_len = strlen (name) + 1;
>  
>    s = (char *) ggc_alloc_atomic (name_len + map->new_len);
> @@ -97,7 +115,7 @@ remap_filename (file_prefix_map *maps, c
>  }
>  
>  /* NOTE: if adding another -f*-prefix-map option then don't forget to
> -   ignore it in DW_AT_producer (dwarf2out.cc).  */
> +   ignore it in DW_AT_producer (gen_command_line_string in opts.cc).  */
>  
>  /* Linked lists of file_prefix_map structures.  */
>  static file_prefix_map *macro_prefix_maps; /* -fmacro-prefix-map  */
> --- gcc/lto-opts.cc.jj	2023-01-02 09:32:29.547181803 +0100
> +++ gcc/lto-opts.cc	2023-01-20 13:55:35.010102584 +0100
> @@ -150,6 +150,7 @@ lto_write_options (void)
>  	case OPT_ffile_prefix_map_:
>  	case OPT_fmacro_prefix_map_:
>  	case OPT_fprofile_prefix_map_:
> +	case OPT_fcanon_prefix_map:
>  	case OPT_fwhole_program:
>  	  continue;
>  
> --- gcc/opts-global.cc.jj	2023-01-02 09:32:35.169100574 +0100
> +++ gcc/opts-global.cc	2023-01-20 13:38:31.174977423 +0100
> @@ -364,6 +364,7 @@ handle_common_deferred_options (void)
>    if (flag_opt_info)
>      opt_info_switch_p (NULL);
>  
> +  flag_canon_prefix_map = false;
>    FOR_EACH_VEC_ELT (v, i, opt)
>      {
>        switch (opt->opt_index)
> @@ -392,6 +393,10 @@ handle_common_deferred_options (void)
>  	  add_profile_prefix_map (opt->arg);
>  	  break;
>  
> +	case OPT_fcanon_prefix_map:
> +	  flag_canon_prefix_map = opt->value;
> +	  break;
> +
>  	case OPT_fdump_:
>  	  g->get_dumps ()->dump_switch_p (opt->arg);
>  	  break;
> --- gcc/doc/invoke.texi.jj	2023-01-16 11:52:16.115733593 +0100
> +++ gcc/doc/invoke.texi	2023-01-20 14:44:47.514203801 +0100
> @@ -191,7 +191,7 @@ in the following sections.
>  -dumpdir @var{dumppfx}  -x @var{language}  @gol
>  -v  -###  --help@r{[}=@var{class}@r{[},@dots{}@r{]]}  --target-help  --version @gol
>  -pass-exit-codes  -pipe  -specs=@var{file}  -wrapper  @gol
> -@@@var{file}  -ffile-prefix-map=@var{old}=@var{new}  @gol
> +@@@var{file}  -ffile-prefix-map=@var{old}=@var{new}  -fcanon-prefix-map  @gol
>  -fplugin=@var{file}  -fplugin-arg-@var{name}=@var{arg}  @gol
>  -fdump-ada-spec@r{[}-slim@r{]}  -fada-spec-parent=@var{unit}  -fdump-go-spec=@var{file}}
>  
> @@ -2203,9 +2203,20 @@ files resided in directory @file{@var{ne
>  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.  Directories referenced by
> -directives are not affected by these options. See also
> -@option{-fmacro-prefix-map}, @option{-fdebug-prefix-map} and
> -@option{-fprofile-prefix-map}.
> +directives are not affected by these options.  See also
> +@option{-fmacro-prefix-map}, @option{-fdebug-prefix-map},
> +@option{-fprofile-prefix-map} and @option{-fcanon-prefix-map}.
> +
> +@item -fcanon-prefix-map
> +@opindex fcanon-prefix-map
> +For the @option{-f*-prefix-map} options normally comparison
> +of @file{@var{old}} prefix against the filename that would be normally
> +referenced in the result of the compilation is done using textual
> +comparison of the prefixes, or ignoring character case for case insensitive
> +filesystems and considering slashes and backslashes as equal on DOS based
> +filesystems.  The @option{-fcanon-prefix-map} causes such comparisons
> +to be done for absolute pathnames on canonicalized paths of @file{@var{old}}
> +and the referenced filename.
>  
>  @item -fplugin=@var{name}.so
>  @opindex fplugin
> @@ -11289,7 +11300,8 @@ build-time path with an install-time pat
>  also be used to change an absolute path to a relative path by using
>  @file{.} for @var{new}.  This can give more reproducible builds, which
>  are location independent, but may require an extra command to tell GDB
> -where to find the source files. See also @option{-ffile-prefix-map}.
> +where to find the source files. See also @option{-ffile-prefix-map}
> +and @option{-fcanon-prefix-map}.
>  
>  @item -fvar-tracking
>  @opindex fvar-tracking
> @@ -16466,7 +16478,7 @@ When compiling files residing in directo
>  profiling information (with @option{--coverage})
>  describing them as if the files resided in
>  directory @file{@var{new}} instead.
> -See also @option{-ffile-prefix-map}.
> +See also @option{-ffile-prefix-map} and @option{-fcanon-prefix-map}.
>  
>  @item -fprofile-update=@var{method}
>  @opindex fprofile-update
> --- gcc/doc/cppopts.texi.jj	2023-01-16 11:52:16.102733784 +0100
> +++ gcc/doc/cppopts.texi	2023-01-20 14:45:09.106890233 +0100
> @@ -305,7 +305,7 @@ to change an absolute path to a relative
>  @var{new} which can result in more reproducible builds that are
>  location independent.  This option also affects
>  @code{__builtin_FILE()} during compilation.  See also
> -@option{-ffile-prefix-map}.
> +@option{-ffile-prefix-map} and @option{-fcanon-prefix-map}.
>  
>  @item -fexec-charset=@var{charset}
>  @opindex fexec-charset

> 2023-01-20  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR other/108464
> 	* common.opt (fcanon-prefix-map): New option.
> 	* opts.cc: Include file-prefix-map.h.
> 	(flag_canon_prefix_map): New variable.
> 	(common_handle_option): Handle OPT_fcanon_prefix_map.
> 	(gen_command_line_string): Ignore OPT_fcanon_prefix_map.
> 	* file-prefix-map.h (flag_canon_prefix_map): Declare.
> 	* file-prefix-map.cc (struct file_prefix_map): Add canonicalize
> 	member.
> 	(add_prefix_map): Initialize canonicalize member from
> 	flag_canon_prefix_map, and if true canonicalize it using lrealpath.
> 	(remap_filename): Revert 2022-11-01 and 2022-11-07 changes,
> 	use lrealpath result only for map->canonicalize map entries.
> 	* lto-opts.cc (lto_write_options): Ignore OPT_fcanon_prefix_map.
> 	* opts-global.cc (handle_common_deferred_options): Clear
> 	flag_canon_prefix_map at the start and handle OPT_fcanon_prefix_map.
> 	* doc/invoke.texi (-fcanon-prefix-map): Document.
> 	(-ffile-prefix-map, -fdebug-prefix-map, -fprofile-prefix-map): Add
> 	see also for -fcanon-prefix-map.
> 	* doc/cppopts.texi (-fmacro-prefix-map): Likewise.
> 
> --- gcc/common.opt.jj	2023-01-09 13:18:28.298019442 +0100
> +++ gcc/common.opt	2023-01-20 12:43:17.152178057 +0100
> @@ -1204,6 +1204,10 @@ fchecking=
>  Common Joined RejectNegative UInteger Var(flag_checking)
>  Perform internal consistency checkings.
>  
> +fcanon-prefix-map
> +Common Var(common_deferred_options) Defer
> +For -f*-prefix-map= options compare canonicalized pathnames rather than just strings.
> +
>  fcode-hoisting
>  Common Var(flag_code_hoisting) Optimization
>  Enable code hoisting.
> --- gcc/opts.cc.jj	2023-01-02 09:32:52.073856323 +0100
> +++ gcc/opts.cc	2023-01-20 13:54:53.526705571 +0100
> @@ -34,10 +34,14 @@ along with GCC; see the file COPYING3.
>  #include "diagnostic-color.h"
>  #include "version.h"
>  #include "selftest.h"
> +#include "file-prefix-map.h"
>  
>  /* In this file all option sets are explicit.  */
>  #undef OPTION_SET_P
>  
> +/* Set by -fcanon-prefix-map.  */
> +bool flag_canon_prefix_map;
> +
>  static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
>  
>  /* Names of fundamental debug info formats indexed by enum
> @@ -2812,6 +2816,10 @@ common_handle_option (struct gcc_options
>        /* Deferred.  */
>        break;
>  
> +    case OPT_fcanon_prefix_map:
> +      flag_canon_prefix_map = value;
> +      break;
> +
>      case OPT_fcallgraph_info:
>        opts->x_flag_callgraph_info = CALLGRAPH_INFO_NAKED;
>        break;
> @@ -3718,6 +3726,7 @@ gen_command_line_string (cl_decoded_opti
>        case OPT_fmacro_prefix_map_:
>        case OPT_ffile_prefix_map_:
>        case OPT_fprofile_prefix_map_:
> +      case OPT_fcanon_prefix_map:
>        case OPT_fcompare_debug:
>        case OPT_fchecking:
>        case OPT_fchecking_:
> --- gcc/file-prefix-map.h.jj	2023-01-02 09:32:33.258128185 +0100
> +++ gcc/file-prefix-map.h	2023-01-20 12:44:31.542094469 +0100
> @@ -22,6 +22,7 @@ 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 *);
> +extern bool flag_canon_prefix_map;
>  
>  const char *remap_macro_filename (const char *);
>  const char *remap_debug_filename (const char *);
> --- gcc/file-prefix-map.cc.jj	2023-01-02 09:32:52.787846007 +0100
> +++ gcc/file-prefix-map.cc	2023-01-20 15:42:30.661088219 +0100
> @@ -30,6 +30,7 @@ struct file_prefix_map
>    const char *new_prefix;
>    size_t old_len;
>    size_t new_len;
> +  bool canonicalize;
>    struct file_prefix_map *next;
>  };
>  
> @@ -51,8 +52,16 @@ add_prefix_map (file_prefix_map *&maps,
>        return;
>      }
>    map = XNEW (file_prefix_map);
> +  map->canonicalize = flag_canon_prefix_map;
>    map->old_prefix = xstrndup (arg, p - arg);
>    map->old_len = p - arg;
> +  if (map->canonicalize)
> +    {
> +      char *realname = lrealpath (map->old_prefix);
> +      free (const_cast <char *> (map->old_prefix));
> +      map->old_prefix = realname;
> +      map->old_len = strlen (realname);
> +    }
>    p++;
>    map->new_prefix = xstrdup (p);
>    map->new_len = strlen (p);
> @@ -70,34 +79,49 @@ remap_filename (file_prefix_map *maps, c
>    file_prefix_map *map;
>    char *s;
>    const char *name;
> -  char *realname;
> +  const char *realname = NULL;
>    size_t name_len;
>  
> -  if (!filename || lbasename (filename) == filename)
> +  if (!filename)
>      return filename;
>  
> -  realname = lrealpath (filename);
> -
>    for (map = maps; map; map = map->next)
> -    if (filename_ncmp (realname, map->old_prefix, map->old_len) == 0)
> +    if (map->canonicalize)
> +      {
> +	if (realname == NULL)
> +	  {
> +	    if (lbasename (filename) == filename)
> +	      realname = filename;
> +	    else
> +	      realname = lrealpath (filename);
> +	  }
> +	if (filename_ncmp (realname, map->old_prefix, map->old_len) == 0)
> +	  break;
> +      }
> +    else if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
>        break;
>    if (!map)
>      {
> -      free (realname);
> +      if (realname != filename)
> +	free (const_cast <char *> (realname));
>        return filename;
>      }
> -  name = realname + map->old_len;
> +  if (map->canonicalize)
> +    name = realname + map->old_len;
> +  else
> +    name = filename + map->old_len;
>    name_len = strlen (name) + 1;
>  
>    s = (char *) ggc_alloc_atomic (name_len + map->new_len);
>    memcpy (s, map->new_prefix, map->new_len);
>    memcpy (s + map->new_len, name, name_len);
> -  free (realname);
> +  if (realname != filename)
> +    free (const_cast <char *> (realname));
>    return s;
>  }
>  
>  /* NOTE: if adding another -f*-prefix-map option then don't forget to
> -   ignore it in DW_AT_producer (dwarf2out.cc).  */
> +   ignore it in DW_AT_producer (gen_command_line_string in opts.cc).  */
>  
>  /* Linked lists of file_prefix_map structures.  */
>  static file_prefix_map *macro_prefix_maps; /* -fmacro-prefix-map  */
> --- gcc/lto-opts.cc.jj	2023-01-02 09:32:29.547181803 +0100
> +++ gcc/lto-opts.cc	2023-01-20 13:55:35.010102584 +0100
> @@ -150,6 +150,7 @@ lto_write_options (void)
>  	case OPT_ffile_prefix_map_:
>  	case OPT_fmacro_prefix_map_:
>  	case OPT_fprofile_prefix_map_:
> +	case OPT_fcanon_prefix_map:
>  	case OPT_fwhole_program:
>  	  continue;
>  
> --- gcc/opts-global.cc.jj	2023-01-02 09:32:35.169100574 +0100
> +++ gcc/opts-global.cc	2023-01-20 13:38:31.174977423 +0100
> @@ -364,6 +364,7 @@ handle_common_deferred_options (void)
>    if (flag_opt_info)
>      opt_info_switch_p (NULL);
>  
> +  flag_canon_prefix_map = false;
>    FOR_EACH_VEC_ELT (v, i, opt)
>      {
>        switch (opt->opt_index)
> @@ -392,6 +393,10 @@ handle_common_deferred_options (void)
>  	  add_profile_prefix_map (opt->arg);
>  	  break;
>  
> +	case OPT_fcanon_prefix_map:
> +	  flag_canon_prefix_map = opt->value;
> +	  break;
> +
>  	case OPT_fdump_:
>  	  g->get_dumps ()->dump_switch_p (opt->arg);
>  	  break;
> --- gcc/doc/invoke.texi.jj	2023-01-16 11:52:16.115733593 +0100
> +++ gcc/doc/invoke.texi	2023-01-20 14:44:47.514203801 +0100
> @@ -191,7 +191,7 @@ in the following sections.
>  -dumpdir @var{dumppfx}  -x @var{language}  @gol
>  -v  -###  --help@r{[}=@var{class}@r{[},@dots{}@r{]]}  --target-help  --version @gol
>  -pass-exit-codes  -pipe  -specs=@var{file}  -wrapper  @gol
> -@@@var{file}  -ffile-prefix-map=@var{old}=@var{new}  @gol
> +@@@var{file}  -ffile-prefix-map=@var{old}=@var{new}  -fcanon-prefix-map  @gol
>  -fplugin=@var{file}  -fplugin-arg-@var{name}=@var{arg}  @gol
>  -fdump-ada-spec@r{[}-slim@r{]}  -fada-spec-parent=@var{unit}  -fdump-go-spec=@var{file}}
>  
> @@ -2203,9 +2203,20 @@ files resided in directory @file{@var{ne
>  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.  Directories referenced by
> -directives are not affected by these options. See also
> -@option{-fmacro-prefix-map}, @option{-fdebug-prefix-map} and
> -@option{-fprofile-prefix-map}.
> +directives are not affected by these options.  See also
> +@option{-fmacro-prefix-map}, @option{-fdebug-prefix-map},
> +@option{-fprofile-prefix-map} and @option{-fcanon-prefix-map}.
> +
> +@item -fcanon-prefix-map
> +@opindex fcanon-prefix-map
> +For the @option{-f*-prefix-map} options normally comparison
> +of @file{@var{old}} prefix against the filename that would be normally
> +referenced in the result of the compilation is done using textual
> +comparison of the prefixes, or ignoring character case for case insensitive
> +filesystems and considering slashes and backslashes as equal on DOS based
> +filesystems.  The @option{-fcanon-prefix-map} causes such comparisons
> +to be done on canonicalized paths of @file{@var{old}}
> +and the referenced filename.
>  
>  @item -fplugin=@var{name}.so
>  @opindex fplugin
> @@ -11289,7 +11300,8 @@ build-time path with an install-time pat
>  also be used to change an absolute path to a relative path by using
>  @file{.} for @var{new}.  This can give more reproducible builds, which
>  are location independent, but may require an extra command to tell GDB
> -where to find the source files. See also @option{-ffile-prefix-map}.
> +where to find the source files. See also @option{-ffile-prefix-map}
> +and @option{-fcanon-prefix-map}.
>  
>  @item -fvar-tracking
>  @opindex fvar-tracking
> @@ -16466,7 +16478,7 @@ When compiling files residing in directo
>  profiling information (with @option{--coverage})
>  describing them as if the files resided in
>  directory @file{@var{new}} instead.
> -See also @option{-ffile-prefix-map}.
> +See also @option{-ffile-prefix-map} and @option{-fcanon-prefix-map}.
>  
>  @item -fprofile-update=@var{method}
>  @opindex fprofile-update
> --- gcc/doc/cppopts.texi.jj	2023-01-16 11:52:16.102733784 +0100
> +++ gcc/doc/cppopts.texi	2023-01-20 14:45:09.106890233 +0100
> @@ -305,7 +305,7 @@ to change an absolute path to a relative
>  @var{new} which can result in more reproducible builds that are
>  location independent.  This option also affects
>  @code{__builtin_FILE()} during compilation.  See also
> -@option{-ffile-prefix-map}.
> +@option{-ffile-prefix-map} and @option{-fcanon-prefix-map}.
>  
>  @item -fexec-charset=@var{charset}
>  @opindex fexec-charset


  parent reply	other threads:[~2023-03-10  8:51 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-17 12:15 [PATCH 1/2] gcc/file-prefix-map: Allow remapping of relative paths Richard Purdie
2022-08-17 12:15 ` [PATCH 2/2] libcpp: Avoid remapping filenames within directives Richard Purdie
2022-08-17 14:19   ` Richard Purdie
2022-11-01 19:32   ` Jeff Law
2022-11-02 10:52     ` Richard Purdie
2022-11-01 19:46 ` [PATCH 1/2] gcc/file-prefix-map: Allow remapping of relative paths Jeff Law
2023-01-19 13:06   ` Jakub Jelinek
2023-01-20 15:05   ` [PATCH] file-prefix-map: Fix up -f*-prefix-map= [PR108464] Jakub Jelinek
2023-01-23 15:39     ` Jakub Jelinek
2023-03-10  8:49     ` Jakub Jelinek [this message]
2023-03-10  9:05       ` Patch ping - " Richard Biener
2023-03-10 10:14         ` Richard Purdie
2022-11-04  9:12 ` [PATCH 1/2] gcc/file-prefix-map: Allow remapping of relative paths Eric Botcazou
2022-11-04 17:21   ` Richard Purdie
2022-11-07  8:01     ` Eric Botcazou
2022-11-07 16:21       ` Jeff Law
2022-11-07 16:36         ` Eric Botcazou

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZArvA85kjSpwBwqc@tucnak \
    --to=jakub@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jeffreyalaw@gmail.com \
    --cc=rguenther@suse.de \
    --cc=richard.purdie@linuxfoundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).