From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 6CF763851ABB for ; Fri, 10 Mar 2023 08:51:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6CF763851ABB Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678438261; h=from:from:reply-to:reply-to:subject:subject: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=Ii7mk3TAdDr20Mq9P+0wi2OOsuE0r0E5r3UNm1MzOus=; b=JKxGkwkwaPRRJF7WVT92yLumj6UzZZdEpEb13zs33XLFVHuMFAZZuDolCzZ1iZjxPThEga jWMfZet/xzA452QNNewcSu2U13pFLW5scSSdI59Vr/wqApuIu20elvEWf3H4SQl6qQGEp2 rbLW/OFjBVFALjVQJW8xqGUrVw0BfSY= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-499-qOpY1SrtOm2FjxZOXAt9Mg-1; Fri, 10 Mar 2023 03:49:12 -0500 X-MC-Unique: qOpY1SrtOm2FjxZOXAt9Mg-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 384D5803490; Fri, 10 Mar 2023 08:49:12 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.16]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B545BC15BA0; Fri, 10 Mar 2023 08:49:11 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 32A8n8S0844496 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 10 Mar 2023 09:49:09 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 32A8n7jJ844495; Fri, 10 Mar 2023 09:49:07 +0100 Date: Fri, 10 Mar 2023 09:49:07 +0100 From: Jakub Jelinek To: Jeff Law , Richard Biener Cc: gcc-patches@gcc.gnu.org, Richard Purdie Subject: Patch ping - [PATCH] file-prefix-map: Fix up -f*-prefix-map= [PR108464] Message-ID: Reply-To: Jakub Jelinek References: <20220817121534.1825108-1-richard.purdie@linuxfoundation.org> <40aa90ef-2d06-9c02-be8c-be6b6e2e9b1c@gmail.com> MIME-Version: 1.0 In-Reply-To: X-Scanned-By: MIMEDefang 3.1 on 10.11.54.8 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,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: 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 > > 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