Add ability to remap file names in __FILE__, etc (PR other/70268)
authorBoris Kolpackov <boris@gcc.gnu.org>
Thu, 18 Jan 2018 13:17:37 +0000 (13:17 +0000)
committerBoris Kolpackov <boris@gcc.gnu.org>
Thu, 18 Jan 2018 13:17:37 +0000 (13:17 +0000)
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

30 files changed:
gcc/ChangeLog
gcc/Makefile.in
gcc/builtins.c
gcc/c-family/ChangeLog
gcc/c-family/c-lex.c
gcc/c-family/c-opts.c
gcc/c-family/c-ppoutput.c
gcc/c-family/c.opt
gcc/common.opt
gcc/dbxout.c
gcc/debug.h
gcc/doc/cppopts.texi
gcc/doc/invoke.texi
gcc/dwarf2out.c
gcc/file-prefix-map.c [new file with mode: 0644]
gcc/file-prefix-map.h [new file with mode: 0644]
gcc/final.c
gcc/opts-global.c
gcc/opts.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/cpp/ffile-prefix-map.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/cpp/fmacro-prefix-map.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/ffile-prefix-map.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/fmacro-prefix-map.c [new file with mode: 0644]
gcc/varasm.c
gcc/vmsdbgout.c
gcc/xcoffout.c
libcpp/ChangeLog
libcpp/include/cpplib.h
libcpp/macro.c

index 5eb37fa6f969d7617c5491b8e4941a3ab6ff129a..19116fb62444baa3d7a133fed76dc9476114d2fa 100644 (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
 
        * 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.
index 374bf3edeb42a82fb5a29c936dca89bfd9c33b54..6c37e46f7929ca2ec68fe9c047f04f205ccc67d8 100644 (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
index d9f1e476cb001657b43353b6fd28bffccb20fb33..683c6ec6e5b814ee2650f8a5bf538d4f394c7ae6 100644 (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, "");
 }
index d5012e251b4a7675a88a6c2d40d9d5169ae68208..7d293826e5dc5d86053ea31b1f07bf887ac20ea2 100644 (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
 
 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.
        (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.
 
            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.
 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.
index e82670f487cf3679186eaf8c830dc28009b8ed36..a4ad0a30f38836d42f50aeb67b05eac6acae9e42 100644 (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
index f84ecf4539cb98b0d46a8d8e429f3860db1c79e8..3db01d453a6864b1f6055f0df9c98b0fb8416288 100644 (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.  */
index 9d08776c187fa959fbff9716088cad63ba654b29..8c525caf28daa9e66652a8d9f6e38fe707210583 100644 (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;
index 16a515afd55367a46b5227f517c7b26a63db5543..9c7172607a7e0ee8094f23dfafab68eb2e81eb21 100644 (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.
index b20a9aac82e1c82c1a55c8bc67ecfdd1fe9d85bc..874d0c2e72b53672066d7d61b76ef6c4753b9c53 100644 (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)
index 507fd41f9ead5f8c09ce3388d9962bb72c5baa7b..a77e652d3d21884132d04aaf00eea45c042f87af 100644 (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"
index dc51182e4c246ec2f959af339c6395a822fac4ad..e1dfe4befaa1c15a20ca812da93ce63fe9cdbbc6 100644 (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 *
index 6bfa46e1c326ba46e6bc63f8ee48e0b33fa6ebad..7af15ddc617573286bdb64adb1721426ae1e0116 100644 (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.
-
index 98b73db17afb6e39b4e1ae585223df87a6655139..8c1d9b3c65283dbfeb7e7c5ae5840951c40b532c 100644 (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
index 0cc05cb5b870514fb2f97134d18d49e64a6e53e3..948b3cbe5918afadcd0afbcb74fe6c5670866d83 100644 (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;
diff --git a/gcc/file-prefix-map.c b/gcc/file-prefix-map.c
new file mode 100644 (file)
index 0000000..8824814
--- /dev/null
@@ -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);
+}
diff --git a/gcc/file-prefix-map.h b/gcc/file-prefix-map.h
new file mode 100644 (file)
index 0000000..3309eee
--- /dev/null
@@ -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  */
index db3095c5526248cd7c35519a2e36c48e4fb87924..578e5d6af4c709d29644cfd153962d5f2cc9c226 100644 (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;
 }
 \f
-/* ??? 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);
-}
-\f
 /* Return true if DWARF2 debug info can be emitted for DECL.  */
 
 static bool
index d2653dde7153968f626a86ed7d02fa97ce19c8d6..f33c9da4c3fec21f707e1e71d2c4d3b70c92289f 100644 (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);
index b1b6a325d092c9c602c720e9f2cab8ba6a2dec0c..f2795f98bf444dad13622aea74ec37dd35149aee 100644 (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;
 
index f20400de97b68374bba6d1ed09bac57eea47b53b..0ae3871d0893fcde7281c27e78b0baf686f1377e 100644 (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.
diff --git a/gcc/testsuite/c-c++-common/cpp/ffile-prefix-map.c b/gcc/testsuite/c-c++-common/cpp/ffile-prefix-map.c
new file mode 100644 (file)
index 0000000..294875b
--- /dev/null
@@ -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" } */
diff --git a/gcc/testsuite/c-c++-common/cpp/fmacro-prefix-map.c b/gcc/testsuite/c-c++-common/cpp/fmacro-prefix-map.c
new file mode 100644 (file)
index 0000000..43dc4bb
--- /dev/null
@@ -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" } */
diff --git a/gcc/testsuite/c-c++-common/ffile-prefix-map.c b/gcc/testsuite/c-c++-common/ffile-prefix-map.c
new file mode 100644 (file)
index 0000000..88c29ca
--- /dev/null
@@ -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" } */
diff --git a/gcc/testsuite/c-c++-common/fmacro-prefix-map.c b/gcc/testsuite/c-c++-common/fmacro-prefix-map.c
new file mode 100644 (file)
index 0000000..db51587
--- /dev/null
@@ -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" } */
index ea79893a547e746615b10c80948ea60444d4f013..b045efaabf5d0f622bdf30bbc3afed9bf92239f0 100644 (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.  */
index a940d32b23425d6c70bf05628a1cf0a92edb648f..ad0eac2e7d015be10c0ec50ccf3ac17c69a5f4aa 100644 (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;
index 591c590002750d99a2231ad134197dc1909fb898..53156a70fcb563974d08d516a3d51d8d0644521e 100644 (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
 
index b69e3645bad934624dd8cc82843ee50467f72ec5..5d2aa26b7bfb9ff63fdee8f6a63f736b6a9d8146 100644 (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
        * 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>
index 7cc40c6d0d4545d075dfa13fd23d413faa3bbbc2..9814d0d862b95a8c18747d6fb14acb77bae6b9e4 100644 (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
index 0f9f0632edda3a8da40b4aa2aac38bda5afc99ef..c5f3ffde7227bea0e1c356fdca02f05fecc13a18 100644 (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;