aboutsummaryrefslogtreecommitdiff
path: root/gcc/file-prefix-map.c
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@gcc.gnu.org>2018-01-18 13:17:37 +0000
committerBoris Kolpackov <boris@gcc.gnu.org>2018-01-18 13:17:37 +0000
commit7365279fca30371b07e49bfa83a23ddc44cc3860 (patch)
tree0cf4591ae68fe77087037b6e15317e5792deed8f /gcc/file-prefix-map.c
parent82a7bb2dff8f2055e64f14cff0e3e29d0c83c195 (diff)
downloadgcc-7365279fca30371b07e49bfa83a23ddc44cc3860.zip
gcc-7365279fca30371b07e49bfa83a23ddc44cc3860.tar.gz
gcc-7365279fca30371b07e49bfa83a23ddc44cc3860.tar.bz2
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
Diffstat (limited to 'gcc/file-prefix-map.c')
-rw-r--r--gcc/file-prefix-map.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/gcc/file-prefix-map.c b/gcc/file-prefix-map.c
new file mode 100644
index 0000000..8824814
--- /dev/null
+++ b/gcc/file-prefix-map.c
@@ -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);
+}