From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id CA8B23857C44 for ; Fri, 10 Mar 2023 09:05:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CA8B23857C44 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de Received: from relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id ADA5A20651; Fri, 10 Mar 2023 09:05:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1678439131; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=2wb6IBY6svvFfyxFeFQhkYuL3EcruMvaXi1UoYv8ZhE=; b=fuuDVWvrmVM401R5Do1FoEnjgOsml9f1j8L6OACKNq0MXP5oOaDSM9SOFhDmiJdDAbQ09y rHBHd5Wt13fTPtKGuju20/NST5cZOlQ2Ew/Tz+nlpCPJifvIrrbqiiMYawif86QpwZv8j6 TxPyaya0TEfpsU5pM1gW/ExVcAf4SLM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1678439131; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=2wb6IBY6svvFfyxFeFQhkYuL3EcruMvaXi1UoYv8ZhE=; b=FU3DR55h3bz2iv8qNnBM/XEAX3s3yukqi7oWlBA2Tm6gmJQHURSnJElhtmwvajnc4oybgR iPt7h+1LJGnB4pDQ== Received: from wotan.suse.de (wotan.suse.de [10.160.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by relay2.suse.de (Postfix) with ESMTPS id 8AA3B2C141; Fri, 10 Mar 2023 09:05:31 +0000 (UTC) Date: Fri, 10 Mar 2023 09:05:31 +0000 (UTC) From: Richard Biener To: Jakub Jelinek cc: Jeff Law , gcc-patches@gcc.gnu.org, Richard Purdie Subject: Re: Patch ping - [PATCH] file-prefix-map: Fix up -f*-prefix-map= [PR108464] In-Reply-To: Message-ID: References: <20220817121534.1825108-1-richard.purdie@linuxfoundation.org> <40aa90ef-2d06-9c02-be8c-be6b6e2e9b1c@gmail.com> User-Agent: Alpine 2.22 (LSU 394 2020-01-19) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-5.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,KAM_SHORT,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Fri, 10 Mar 2023, Jakub Jelinek wrote: > 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) Let's go with your preference - I was hoping on comments from Richard Purdie as of his preference but then .. Thanks, Richard. > 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 > > > > 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 > > > > 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 (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 > > > > 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 (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 (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 (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 > > -- Richard Biener SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman; HRB 36809 (AG Nuernberg)