Add ability to remap file names in __FILE__, etc (PR other/70268)

This commit adds the -fmacro-prefix-map option that allows remapping of file
names in __FILE__, __BASE_FILE__, and __builtin_FILE(), similar to how
-fdebug-prefix-map allows to do the same for debug information.

Additionally, it adds -ffile-prefix-map which can be used to specify both
mappings with a single option (and, should we need to add more -f*-prefix-map
options in the future, those as well).

libcpp/ChangeLog:

2018-01-18  Boris Kolpackov  <boris@codesynthesis.com>

        PR other/70268
        * include/cpplib.h (cpp_callbacks::remap_filename): New callback.
        * libcpp/macro.c (_cpp_builtin_macro_text): Call remap_filename for
        __FILE__ and __BASE_FILE__.


gcc/ChangeLog:

2018-01-18  Boris Kolpackov  <boris@codesynthesis.com>

        PR other/70268
        * common.opt: (-ffile-prefix-map): New option.
        * opts.c (common_handle_option): Defer it.
        * opts-global.c (handle_common_deferred_options): Handle it.
        * debug.h (remap_debug_filename, add_debug_prefix_map): Move to...
        * file-prefix-map.h: New file.
        (remap_debug_filename, add_debug_prefix_map): ...here.
        (add_macro_prefix_map, add_file_prefix_map, remap_macro_filename): New.
        * final.c (debug_prefix_map, add_debug_prefix_map
        remap_debug_filename): Move to...
        * file-prefix-map.c: New file.
        (file_prefix_map, add_prefix_map, remap_filename) ...here and rename,
        generalize, get rid of alloca(), use strrchr() instead of strchr().
        (add_macro_prefix_map, add_debug_prefix_map, add_file_prefix_map):
        Implement in terms of add_prefix_map().
        (remap_macro_filename, remap_debug_filename): Implement in term of
        remap_filename().
        * Makefile.in (OBJS, PLUGIN_HEADERS): Add new files.
        * builtins.c (fold_builtin_FILE): Call remap_macro_filename().
        * dbxout.c: Include file-prefix-map.h.
        * varasm.c: Likewise.
        * vmsdbgout.c: Likewise.
        * xcoffout.c: Likewise.
        * dwarf2out.c: Likewise plus omit new options from DW_AT_producer.
        * doc/cppopts.texi (-fmacro-prefix-map): Document.
        * doc/invoke.texi (-ffile-prefix-map): Document.
	(-fdebug-prefix-map): Update description.


gcc/c-family/ChangeLog:

2018-01-18  Boris Kolpackov  <boris@codesynthesis.com>

        PR other/70268
        * c-family/c.opt (-fmacro-prefix-map): New option.
        * c-family/c-opts.c (c_common_handle_option): Handle it.
        * c-family/c-lex.c (init_c_lex): Set remap_filename cpp callback.
        * c-family/c-ppoutput.c (init_pp_output): Likewise.


gcc/testsuite/ChangeLog:

2018-01-18  Boris Kolpackov  <boris@codesynthesis.com>

        PR other/70268
        * c-c++-common/ffile-prefix-map.c: New test.
        * c-c++-common/fmacro-prefix-map.c: New test.
        * c-c++-common/cpp/ffile-prefix-map.c: New test.
        * c-c++-common/cpp/fmacro-prefix-map.c: New test.

From-SVN: r256847
This commit is contained in:
Boris Kolpackov 2018-01-18 13:17:37 +00:00
parent 82a7bb2dff
commit 7365279fca
30 changed files with 340 additions and 96 deletions

View File

@ -1,3 +1,33 @@
2018-01-18 Boris Kolpackov <boris@codesynthesis.com>
PR other/70268
* common.opt: (-ffile-prefix-map): New option.
* opts.c (common_handle_option): Defer it.
* opts-global.c (handle_common_deferred_options): Handle it.
* debug.h (remap_debug_filename, add_debug_prefix_map): Move to...
* file-prefix-map.h: New file.
(remap_debug_filename, add_debug_prefix_map): ...here.
(add_macro_prefix_map, add_file_prefix_map, remap_macro_filename): New.
* final.c (debug_prefix_map, add_debug_prefix_map
remap_debug_filename): Move to...
* file-prefix-map.c: New file.
(file_prefix_map, add_prefix_map, remap_filename) ...here and rename,
generalize, get rid of alloca(), use strrchr() instead of strchr().
(add_macro_prefix_map, add_debug_prefix_map, add_file_prefix_map):
Implement in terms of add_prefix_map().
(remap_macro_filename, remap_debug_filename): Implement in term of
remap_filename().
* Makefile.in (OBJS, PLUGIN_HEADERS): Add new files.
* builtins.c (fold_builtin_FILE): Call remap_macro_filename().
* dbxout.c: Include file-prefix-map.h.
* varasm.c: Likewise.
* vmsdbgout.c: Likewise.
* xcoffout.c: Likewise.
* dwarf2out.c: Likewise plus omit new options from DW_AT_producer.
* doc/cppopts.texi (-fmacro-prefix-map): Document.
* doc/invoke.texi (-ffile-prefix-map): Document.
(-fdebug-prefix-map): Update description.
2018-01-18 Martin Liska <mliska@suse.cz>
* config/i386/i386.c (indirect_thunk_name): Document that also
@ -73,7 +103,7 @@
* config/aarch64/aarch64.md (movti_aarch64): Use Uti constraint.
* config/aarch64/aarch64.c (aarch64_mov128_immediate): New function.
(aarch64_legitimate_constant_p): Just support CONST_DOUBLE
(aarch64_legitimate_constant_p): Just support CONST_DOUBLE
SF/DF/TF mode to avoid creating illegal CONST_WIDE_INT immediates.
* config/aarch64/aarch64-protos.h (aarch64_mov128_immediate):
Add declaration.

View File

@ -1285,6 +1285,7 @@ OBJS = \
expmed.o \
expr.o \
fibonacci_heap.o \
file-prefix-map.o \
final.o \
fixed-value.o \
fold-const.o \
@ -3506,8 +3507,8 @@ PLUGIN_HEADERS = $(TREE_H) $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
tree-ssa-loop-niter.h tree-ssa-ter.h tree-ssa-threadedge.h \
tree-ssa-threadupdate.h inchash.h wide-int.h signop.h hash-map.h \
hash-set.h dominance.h cfg.h cfgrtl.h cfganal.h cfgbuild.h cfgcleanup.h \
lcm.h cfgloopmanip.h builtins.def chkp-builtins.def pass-instances.def \
params.list
lcm.h cfgloopmanip.h file-prefix-map.h builtins.def chkp-builtins.def \
pass-instances.def params.list
# generate the 'build fragment' b-header-vars
s-header-vars: Makefile

View File

@ -70,6 +70,7 @@ along with GCC; see the file COPYING3. If not see
#include "case-cfn-macros.h"
#include "gimple-fold.h"
#include "intl.h"
#include "file-prefix-map.h" /* remap_macro_filename() */
struct target_builtins default_target_builtins;
#if SWITCHABLE_TARGET
@ -8871,7 +8872,13 @@ static inline tree
fold_builtin_FILE (location_t loc)
{
if (const char *fname = LOCATION_FILE (loc))
{
/* The documentation says this builtin is equivalent to the preprocessor
__FILE__ macro so it appears appropriate to use the same file prefix
mappings. */
fname = remap_macro_filename (fname);
return build_string_literal (strlen (fname) + 1, fname);
}
return build_string_literal (1, "");
}

View File

@ -1,3 +1,11 @@
2018-01-18 Boris Kolpackov <boris@codesynthesis.com>
PR other/70268
* c-family/c.opt (-fmacro-prefix-map): New option.
* c-family/c-opts.c (c_common_handle_option): Handle it.
* c-family/c-lex.c (init_c_lex): Set remap_filename cpp callback.
* c-family/c-ppoutput.c (init_pp_output): Likewise.
2018-01-17 David Malcolm <dmalcolm@redhat.com>
PR c++/83814
@ -119,7 +127,7 @@
2017-12-14 Qing Zhao <qing.zhao@oracle.com>
PR middle_end/79538
PR middle_end/79538
* c-cppbuiltin.c (builtin_define_with_hex_fp_value):
Adjust the size of buf1 and buf2, add a new buf to avoid
format-overflow warning.
@ -463,7 +471,7 @@
(set_std_cxx17): ... this.
(c_common_handle_option): Rename OPT_std_c__1z to OPT_std_c__17
and OPT_std_gnu__1z to OPT_std_gnu__17. Adjust set_std_cxx1z
caller.
caller.
(c_common_post_options): Use cxx17 instead of cxx1z. Adjust
comments.
@ -2430,7 +2438,7 @@
Matthias Klose <doko@debian.org>
* c-common.c (get_source_date_epoch): New function, gets the environment
variable SOURCE_DATE_EPOCH and parses it as long long with error
variable SOURCE_DATE_EPOCH and parses it as long long with error
handling.
* c-common.h (get_source_date_epoch): Prototype.
* c-lex.c (c_lex_with_flags): set parse_in->source_date_epoch.
@ -2901,7 +2909,7 @@
2015-11-12 James Norris <jnorris@codesourcery.com>
Joseph Myers <joseph@codesourcery.com>
* c-pragma.c (oacc_pragmas): Add entry for declare directive.
* c-pragma.c (oacc_pragmas): Add entry for declare directive.
* c-pragma.h (enum pragma_kind): Add PRAGMA_OACC_DECLARE.
(enum pragma_omp_clause): Add PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT and
PRAGMA_OACC_CLAUSE_LINK.

View File

@ -27,6 +27,7 @@ along with GCC; see the file COPYING3. If not see
#include "stor-layout.h"
#include "c-pragma.h"
#include "debug.h"
#include "file-prefix-map.h" /* remap_macro_filename() */
#include "attribs.h"
@ -82,6 +83,7 @@ init_c_lex (void)
cb->has_attribute = c_common_has_attribute;
cb->get_source_date_epoch = cb_get_source_date_epoch;
cb->get_suggestion = cb_get_suggestion;
cb->remap_filename = remap_macro_filename;
/* Set the debug callbacks if we can use them. */
if ((debug_info_level == DINFO_LEVEL_VERBOSE

View File

@ -40,6 +40,7 @@ along with GCC; see the file COPYING3. If not see
#include "plugin.h" /* For PLUGIN_INCLUDE_FILE event. */
#include "mkdeps.h"
#include "dumpfile.h"
#include "file-prefix-map.h" /* add_*_prefix_map() */
#ifndef DOLLARS_IN_IDENTIFIERS
# define DOLLARS_IN_IDENTIFIERS true
@ -448,6 +449,10 @@ c_common_handle_option (size_t scode, const char *arg, int value,
cpp_opts->dollars_in_ident = value;
break;
case OPT_fmacro_prefix_map_:
add_macro_prefix_map (arg);
break;
case OPT_ffreestanding:
value = !value;
/* Fall through. */

View File

@ -22,6 +22,7 @@
#include "c-common.h" /* For flags. */
#include "../libcpp/internal.h"
#include "c-pragma.h" /* For parse_in. */
#include "file-prefix-map.h" /* remap_macro_filename() */
/* Encapsulates state used to convert a stream of tokens into a text
file. */
@ -151,6 +152,7 @@ init_pp_output (FILE *out_stream)
cb->has_attribute = c_common_has_attribute;
cb->get_source_date_epoch = cb_get_source_date_epoch;
cb->remap_filename = remap_macro_filename;
/* Initialize the print structure. */
print.src_line = 1;

View File

@ -1390,6 +1390,10 @@ fdollars-in-identifiers
C ObjC C++ ObjC++
Permit '$' as an identifier character.
fmacro-prefix-map=
C ObjC C++ ObjC++ Joined RejectNegative
-fmacro-prefix-map=<old>=<new> Map one directory name to another in __FILE__, __BASE_FILE__, and __builtin_FILE().
fdump-ada-spec
C ObjC C++ ObjC++ RejectNegative Var(flag_dump_ada_spec)
Write all declarations as Ada code transitively.

View File

@ -1175,7 +1175,11 @@ Common RejectNegative Joined Var(common_deferred_options) Defer
fdebug-prefix-map=
Common Joined RejectNegative Var(common_deferred_options) Defer
Map one directory name to another in debug information.
-fdebug-prefix-map=<old>=<new> Map one directory name to another in debug information.
ffile-prefix-map=
Common Joined RejectNegative Var(common_deferred_options) Defer
-ffile-prefix-map=<old>=<new> Map one directory name to another in compilation result.
fdebug-types-section
Common Report Var(flag_debug_types_section) Init(0)

View File

@ -91,6 +91,7 @@ along with GCC; see the file COPYING3. If not see
#include "common/common-target.h"
#include "langhooks.h"
#include "expr.h"
#include "file-prefix-map.h" /* remap_debug_filename() */
#ifdef XCOFF_DEBUGGING_INFO
#include "xcoffout.h"

View File

@ -249,9 +249,6 @@ extern bool dwarf2out_do_frame (void);
extern bool dwarf2out_do_cfi_asm (void);
extern void dwarf2out_switch_text_section (void);
const char *remap_debug_filename (const char *);
void add_debug_prefix_map (const char *);
/* For -fdump-go-spec. */
extern const struct gcc_debug_hooks *

View File

@ -287,6 +287,17 @@ When this option is given no argument, the default parameter value is
Note that @code{-ftrack-macro-expansion=2} is activated by default.
@item -fmacro-prefix-map=@var{old}=@var{new}
@opindex fmacro-prefix-map
When preprocessing files residing in directory @file{@var{old}},
expand the @code{__FILE__} and @code{__BASE_FILE__} macros as if the
files resided in directory @file{@var{new}} instead. This can be used
to change an absolute path to a relative path by using @file{.} for
@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}.
@item -fexec-charset=@var{charset}
@opindex fexec-charset
@cindex character set, execution
@ -534,4 +545,3 @@ token in the output is preceded by the dump of the map its location
belongs to.
When used from GCC without @option{-E}, this option has no effect.

View File

@ -172,7 +172,8 @@ in the following sections.
@gccoptlist{-c -S -E -o @var{file} -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} -fplugin=@var{file} -fplugin-arg-@var{name}=@var{arg} @gol
@@@var{file} -ffile-prefix-map=@var{old}=@var{new} @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}}
@item C Language Options
@ -481,9 +482,9 @@ Objective-C and Objective-C++ Dialects}.
-dD -dI -dM -dN -dU @gol
-fdebug-cpp -fdirectives-only -fdollars-in-identifiers @gol
-fexec-charset=@var{charset} -fextended-identifiers @gol
-finput-charset=@var{charset} -fno-canonical-system-headers @gol
-fpch-deps -fpch-preprocess -fpreprocessed @gol
-ftabstop=@var{width} -ftrack-macro-expansion @gol
-finput-charset=@var{charset} -fmacro-prefix-map=@var{old}=@var{new} @gol
-fno-canonical-system-headers @gol -fpch-deps -fpch-preprocess @gol
-fpreprocessed -ftabstop=@var{width} -ftrack-macro-expansion @gol
-fwide-exec-charset=@var{charset} -fworking-directory @gol
-H -imacros @var{file} -include @var{file} @gol
-M -MD -MF -MG -MM -MMD -MP -MQ -MT @gol
@ -1660,6 +1661,16 @@ This invokes all subprograms of @command{gcc} under
@samp{gdb --args}, thus the invocation of @command{cc1} is
@samp{gdb --args cc1 @dots{}}.
@item -ffile-prefix-map=@var{old}=@var{new}
@opindex ffile-prefix-map
When compiling files residing in directory @file{@var{old}}, record
any references to them in the result of the compilation as if the
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}.
@item -fplugin=@var{name}.so
@opindex fplugin
Load the plugin code in file @var{name}.so, assumed to be a
@ -7103,13 +7114,14 @@ link processing time. Merging is enabled by default.
@item -fdebug-prefix-map=@var{old}=@var{new}
@opindex fdebug-prefix-map
When compiling files in directory @file{@var{old}}, record debugging
information describing them as in @file{@var{new}} instead. This can be
used to replace a build-time path with an install-time path in the debug info.
It can 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.
When compiling files residing in directory @file{@var{old}}, record
debugging information describing them as if the files resided in
directory @file{@var{new}} instead. This can be used to replace a
build-time path with an install-time path in the debug info. It can
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}.
@item -fvar-tracking
@opindex fvar-tracking

View File

@ -95,6 +95,7 @@ along with GCC; see the file COPYING3. If not see
#include "rtl-iter.h"
#include "stringpool.h"
#include "attribs.h"
#include "file-prefix-map.h" /* remap_debug_filename() */
static void dwarf2out_source_line (unsigned int, unsigned int, const char *,
int, bool);
@ -23535,6 +23536,8 @@ gen_producer_string (void)
case OPT_fltrans_output_list_:
case OPT_fresolution_:
case OPT_fdebug_prefix_map_:
case OPT_fmacro_prefix_map_:
case OPT_ffile_prefix_map_:
case OPT_fcompare_debug:
/* Ignore these. */
continue;

132
gcc/file-prefix-map.c Normal file
View File

@ -0,0 +1,132 @@
/* Implementation of file prefix remapping support (-f*-prefix-map options).
Copyright (C) 2017 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "diagnostic.h"
#include "file-prefix-map.h"
/* Structure recording the mapping from source file and directory names at
compile time to those to be embedded in the compilation result (debug
information, the __FILE__ macro expansion, etc). */
struct file_prefix_map
{
const char *old_prefix;
const char *new_prefix;
size_t old_len;
size_t new_len;
struct file_prefix_map *next;
};
/* Record a file prefix mapping in the specified map. ARG is the argument to
-f*-prefix-map and must be of the form OLD=NEW. OPT is the option name
for diagnostics. */
static void
add_prefix_map (file_prefix_map *&maps, const char *arg, const char *opt)
{
file_prefix_map *map;
const char *p;
/* Note: looking for the last '='. The thinking is we can control the paths
inside our projects but not where the users build them. */
p = strrchr (arg, '=');
if (!p)
{
error ("invalid argument %qs to %qs", arg, opt);
return;
}
map = XNEW (file_prefix_map);
map->old_prefix = xstrndup (arg, p - arg);
map->old_len = p - arg;
p++;
map->new_prefix = xstrdup (p);
map->new_len = strlen (p);
map->next = maps;
maps = map;
}
/* Perform user-specified mapping of filename prefixes. Return the
GC-allocated new name corresponding to FILENAME or FILENAME if no
remapping was performed. */
static const char *
remap_filename (file_prefix_map *maps, const char *filename)
{
file_prefix_map *map;
char *s;
const char *name;
size_t name_len;
for (map = maps; map; map = map->next)
if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
break;
if (!map)
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);
return s;
}
/* NOTE: if adding another -f*-prefix-map option then don't forget to
ignore it in DW_AT_producer (dwarf2out.c). */
/* 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 */
/* Record a file prefix mapping for -fmacro-prefix-map. */
void
add_macro_prefix_map (const char *arg)
{
add_prefix_map (macro_prefix_maps, arg, "-fmacro-prefix-map");
}
/* Record a file prefix mapping for -fdebug-prefix-map. */
void
add_debug_prefix_map (const char *arg)
{
add_prefix_map (debug_prefix_maps, arg, "-fdebug-prefix-map");
}
/* Record a file prefix mapping for all -f*-prefix-map. */
void
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");
}
/* Remap using -fmacro-prefix-map. Return the GC-allocated new name
corresponding to FILENAME or FILENAME if no remapping was performed. */
const char *
remap_macro_filename (const char *filename)
{
return remap_filename (macro_prefix_maps, filename);
}
/* Remap using -fdebug-prefix-map. Return the GC-allocated new name
corresponding to FILENAME or FILENAME if no remapping was performed. */
const char *
remap_debug_filename (const char *filename)
{
return remap_filename (debug_prefix_maps, filename);
}

28
gcc/file-prefix-map.h Normal file
View File

@ -0,0 +1,28 @@
/* Declarations for file prefix remapping support (-f*-prefix-map options).
Copyright (C) 2017 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#ifndef GCC_FILE_PREFIX_MAP_H
#define GCC_FILE_PREFIX_MAP_H
void add_macro_prefix_map (const char *);
void add_debug_prefix_map (const char *);
void add_file_prefix_map (const char *);
const char *remap_macro_filename (const char *);
const char *remap_debug_filename (const char *);
#endif /* !GCC_FILE_PREFIX_MAP_H */

View File

@ -196,7 +196,7 @@ static int dialect_number;
/* Nonnull if the insn currently being emitted was a COND_EXEC pattern. */
rtx current_insn_predicate;
/* True if printing into -fdump-final-insns= dump. */
/* True if printing into -fdump-final-insns= dump. */
bool final_insns_dump_p;
/* True if profile_function should be called, but hasn't been called yet. */
@ -760,7 +760,7 @@ compute_alignments (void)
if (!has_fallthru
&& (branch_count > count_threshold
|| (bb->count > bb->prev_bb->count.apply_scale (10, 1)
&& (bb->prev_bb->count
&& (bb->prev_bb->count
<= ENTRY_BLOCK_PTR_FOR_FN (cfun)
->count.apply_scale (1, 2)))))
{
@ -804,7 +804,7 @@ compute_alignments (void)
/* Grow the LABEL_ALIGN array after new labels are created. */
static void
static void
grow_label_align (void)
{
int old = max_labelno;
@ -1507,72 +1507,6 @@ asm_str_count (const char *templ)
return count;
}
/* ??? This is probably the wrong place for these. */
/* Structure recording the mapping from source file and directory
names at compile time to those to be embedded in debug
information. */
struct debug_prefix_map
{
const char *old_prefix;
const char *new_prefix;
size_t old_len;
size_t new_len;
struct debug_prefix_map *next;
};
/* Linked list of such structures. */
static debug_prefix_map *debug_prefix_maps;
/* Record a debug file prefix mapping. ARG is the argument to
-fdebug-prefix-map and must be of the form OLD=NEW. */
void
add_debug_prefix_map (const char *arg)
{
debug_prefix_map *map;
const char *p;
p = strchr (arg, '=');
if (!p)
{
error ("invalid argument %qs to -fdebug-prefix-map", arg);
return;
}
map = XNEW (debug_prefix_map);
map->old_prefix = xstrndup (arg, p - arg);
map->old_len = p - arg;
p++;
map->new_prefix = xstrdup (p);
map->new_len = strlen (p);
map->next = debug_prefix_maps;
debug_prefix_maps = map;
}
/* Perform user-specified mapping of debug filename prefixes. Return
the new name corresponding to FILENAME. */
const char *
remap_debug_filename (const char *filename)
{
debug_prefix_map *map;
char *s;
const char *name;
size_t name_len;
for (map = debug_prefix_maps; map; map = map->next)
if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
break;
if (!map)
return filename;
name = filename + map->old_len;
name_len = strlen (name) + 1;
s = (char *) alloca (name_len + map->new_len);
memcpy (s, map->new_prefix, map->new_len);
memcpy (s + map->new_len, name, name_len);
return ggc_strdup (s);
}
/* Return true if DWARF2 debug info can be emitted for DECL. */
static bool

View File

@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see
#include "stringpool.h"
#include "attribs.h"
#include "asan.h"
#include "file-prefix-map.h" /* add_*_prefix_map() */
typedef const char *const_char_p; /* For DEF_VEC_P. */
@ -365,6 +366,10 @@ handle_common_deferred_options (void)
add_debug_prefix_map (opt->arg);
break;
case OPT_ffile_prefix_map_:
add_file_prefix_map (opt->arg);
break;
case OPT_fdump_:
if (!g->get_dumps ()->dump_switch_p (opt->arg))
error ("unrecognized command line option %<-fdump-%s%>", opt->arg);

View File

@ -2103,6 +2103,7 @@ common_handle_option (struct gcc_options *opts,
break;
case OPT_fdebug_prefix_map_:
case OPT_ffile_prefix_map_:
/* Deferred. */
break;

View File

@ -1,3 +1,11 @@
2018-01-18 Boris Kolpackov <boris@codesynthesis.com>
PR other/70268
* c-c++-common/ffile-prefix-map.c: New test.
* c-c++-common/fmacro-prefix-map.c: New test.
* c-c++-common/cpp/ffile-prefix-map.c: New test.
* c-c++-common/cpp/fmacro-prefix-map.c: New test.
2018-01-18 Martin Liska <mliska@suse.cz>
* gcc.target/i386/indirect-thunk-3.c: Remove duplicate options.

View File

@ -0,0 +1,5 @@
/* { dg-do compile } */
/* { dg-options "-ffile-prefix-map==FILE-PREFIX" } */
#pragma message "FILE starts with " __FILE__ /* { dg-message "FILE starts with FILE-PREFIX" } */
#pragma message "BASE_FILE starts with " __BASE_FILE__ /* { dg-message "BASE_FILE starts with FILE-PREFIX" } */

View File

@ -0,0 +1,5 @@
/* { dg-do compile } */
/* { dg-options "-fmacro-prefix-map==MACRO-PREFIX" } */
#pragma message "FILE starts with " __FILE__ /* { dg-message "FILE starts with MACRO-PREFIX" } */
#pragma message "BASE_FILE starts with " __BASE_FILE__ /* { dg-message "BASE_FILE starts with MACRO-PREFIX" } */

View File

@ -0,0 +1,12 @@
/* Test __builtin_FILE(). */
/* { dg-do run } */
/* { dg-options "-ffile-prefix-map==FILE-PREFIX" } */
#include <stdio.h>
int main ()
{
printf ("__builtin_FILE starts with %s\n", __builtin_FILE ());
}
/* { dg-output "__builtin_FILE starts with FILE-PREFIX" } */

View File

@ -0,0 +1,12 @@
/* Test __builtin_FILE(). */
/* { dg-do run } */
/* { dg-options "-fmacro-prefix-map==MACRO-PREFIX" } */
#include <stdio.h>
int main ()
{
printf ("__builtin_FILE starts with %s\n", __builtin_FILE ());
}
/* { dg-output "__builtin_FILE starts with MACRO-PREFIX" } */

View File

@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. If not see
#include "attribs.h"
#include "asan.h"
#include "rtl-iter.h"
#include "file-prefix-map.h" /* remap_debug_filename() */
#ifdef XCOFF_DEBUGGING_INFO
#include "xcoffout.h" /* Needed for external data declarations. */

View File

@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see
#include "langhooks.h"
#include "function.h"
#include "target.h"
#include "file-prefix-map.h" /* remap_debug_filename() */
/* Difference in seconds between the VMS Epoch and the Unix Epoch */
static const long long vms_epoch_offset = 3506716800ll;

View File

@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see
#include "varasm.h"
#include "output.h"
#include "debug.h"
#include "file-prefix-map.h" /* remap_debug_filename() */
#ifdef XCOFF_DEBUGGING_INFO

View File

@ -1,3 +1,10 @@
2018-01-18 Boris Kolpackov <boris@codesynthesis.com>
PR other/70268
* include/cpplib.h (cpp_callbacks::remap_filename): New callback.
* libcpp/macro.c (_cpp_builtin_macro_text): Call remap_filename for
__FILE__ and __BASE_FILE__.
2018-01-10 Kelvin Nilsen <kelvin@gcc.gnu.org>
* lex.c (search_line_fast): Remove illegal coercion of an
@ -19,7 +26,7 @@
2017-12-14 Bernd Edlinger <bernd.edlinger@hotmail.de>
* internal.h (maybe_print_line): Change signature.
2017-12-05 Jakub Jelinek <jakub@redhat.com>
PR c++/79228
@ -714,9 +721,9 @@
* init.c (cpp_init_source_date_epoch): New function.
* internal.h: Added source_date_epoch variable to struct
cpp_reader to store a reproducible date.
* macro.c (_cpp_builtin_macro_text): Set pfile->date timestamp from
pfile->source_date_epoch instead of localtime if source_date_epoch is
set, to be used for __DATE__ and __TIME__ macros to help reproducible
* macro.c (_cpp_builtin_macro_text): Set pfile->date timestamp from
pfile->source_date_epoch instead of localtime if source_date_epoch is
set, to be used for __DATE__ and __TIME__ macros to help reproducible
builds.
2016-04-13 Bernd Schmidt <bschmidt@redhat.com>

View File

@ -622,6 +622,10 @@ struct cpp_callbacks
C++-style comments it does not include the terminating newline. */
void (*comment) (cpp_reader *, source_location, const unsigned char *,
size_t);
/* Callback for filename remapping in __FILE__ and __BASE_FILE__ macro
expansions. */
const char *(*remap_filename) (const char*);
};
#ifdef VMS

View File

@ -450,6 +450,8 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node,
if (!name)
abort ();
}
if (pfile->cb.remap_filename)
name = pfile->cb.remap_filename (name);
len = strlen (name);
buf = _cpp_unaligned_alloc (pfile, len * 2 + 3);
result = buf;