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.
@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}.
@opindex fexec-charset
@cindex character set, execution
-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}}
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.
@opindex fplugin
@item -fplugin=@var{name}.so
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}.
@opindex fvar-tracking
@item -fvar-tracking
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}.
@opindex fprofile-update
@item -fprofile-update=@var{method}
const char *new_prefix;
size_t old_len;
size_t new_len;
+ bool canonicalize;
struct file_prefix_map *next;
};
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);
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 */
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 *);
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;
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)
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;
#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
/* 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;
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_: