| From 4eadc99bdd0974761bf48f0fd32994dd9a3ffcfe Mon Sep 17 00:00:00 2001 |
| From: Hongxu Jia <hongxu.jia@windriver.com> |
| Date: Wed, 16 Mar 2016 02:27:43 -0400 |
| Subject: [PATCH 41/47] gcc/libcpp: support -ffile-prefix-map=<old>=<new> |
| |
| Similar -fdebug-prefix-map, add option -ffile-prefix-map to map one |
| directory name (old) to another (new) in __FILE__, __BASE_FILE__ and |
| __builtin_FILE (). |
| |
| https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70268 |
| |
| Upstream-Status: Submitted [gcc-patches@gcc.gnu.org] |
| Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> |
| --- |
| gcc/c-family/c-opts.c | 13 +++++++ |
| gcc/c-family/c.opt | 4 +++ |
| gcc/dwarf2out.c | 1 + |
| gcc/gimplify.c | 2 ++ |
| libcpp/Makefile.in | 10 +++--- |
| libcpp/file-map.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++ |
| libcpp/include/file-map.h | 30 ++++++++++++++++ |
| libcpp/macro.c | 2 ++ |
| 8 files changed, 149 insertions(+), 5 deletions(-) |
| create mode 100644 libcpp/file-map.c |
| create mode 100644 libcpp/include/file-map.h |
| |
| diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c |
| index ea0e01b101c..a741c75a78f 100644 |
| --- a/gcc/c-family/c-opts.c |
| +++ b/gcc/c-family/c-opts.c |
| @@ -39,6 +39,14 @@ along with GCC; see the file COPYING3. If not see |
| #include "opts.h" |
| #include "plugin.h" /* For PLUGIN_INCLUDE_FILE event. */ |
| #include "mkdeps.h" |
| +#include "file-map.h" |
| +#include "c-target.h" |
| +#include "tm.h" /* For BYTES_BIG_ENDIAN, |
| + DOLLARS_IN_IDENTIFIERS, |
| + STDC_0_IN_SYSTEM_HEADERS, |
| + TARGET_FLT_EVAL_METHOD_NON_DEFAULT and |
| + TARGET_OPTF. */ |
| +#include "tm_p.h" /* For C_COMMON_OVERRIDE_OPTIONS. */ |
| #include "dumpfile.h" |
| |
| #ifndef DOLLARS_IN_IDENTIFIERS |
| @@ -517,6 +525,11 @@ c_common_handle_option (size_t scode, const char *arg, int value, |
| cpp_opts->narrow_charset = arg; |
| break; |
| |
| + case OPT_ffile_prefix_map_: |
| + if (add_file_prefix_map (arg) < 0) |
| + error ("invalid argument %qs to -ffile-prefix-map", arg); |
| + break; |
| + |
| case OPT_fwide_exec_charset_: |
| cpp_opts->wide_charset = arg; |
| break; |
| diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt |
| index c4ef7796282..73333dfd57c 100644 |
| --- a/gcc/c-family/c.opt |
| +++ b/gcc/c-family/c.opt |
| @@ -1372,6 +1372,10 @@ fexec-charset= |
| C ObjC C++ ObjC++ Joined RejectNegative |
| -fexec-charset=<cset> Convert all strings and character constants to character set <cset>. |
| |
| +ffile-prefix-map= |
| +C ObjC C++ ObjC++ Joined RejectNegative |
| +-ffile-prefix-map=<old=new> Map one directory name to another in __FILE__, __BASE_FILE__ and __builtin_FILE () |
| + |
| fextended-identifiers |
| C ObjC C++ ObjC++ |
| Permit universal character names (\\u and \\U) in identifiers. |
| diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c |
| index 98c51576ec2..762f69ae88e 100644 |
| --- a/gcc/dwarf2out.c |
| +++ b/gcc/dwarf2out.c |
| @@ -23421,6 +23421,7 @@ gen_producer_string (void) |
| case OPT_fltrans_output_list_: |
| case OPT_fresolution_: |
| case OPT_fdebug_prefix_map_: |
| + case OPT_ffile_prefix_map_: |
| /* Ignore these. */ |
| continue; |
| default: |
| diff --git a/gcc/gimplify.c b/gcc/gimplify.c |
| index fd27eb1523f..5542b379f28 100644 |
| --- a/gcc/gimplify.c |
| +++ b/gcc/gimplify.c |
| @@ -58,6 +58,8 @@ along with GCC; see the file COPYING3. If not see |
| #include "gomp-constants.h" |
| #include "tree-dump.h" |
| #include "gimple-walk.h" |
| +#include "file-map.h" |
| + |
| #include "langhooks-def.h" /* FIXME: for lhd_set_decl_assembler_name */ |
| #include "builtins.h" |
| #include "asan.h" |
| diff --git a/libcpp/Makefile.in b/libcpp/Makefile.in |
| index 0bd3787c25e..d3b52956b52 100644 |
| --- a/libcpp/Makefile.in |
| +++ b/libcpp/Makefile.in |
| @@ -84,12 +84,12 @@ DEPMODE = $(CXXDEPMODE) |
| |
| |
| libcpp_a_OBJS = charset.o directives.o directives-only.o errors.o \ |
| - expr.o files.o identifiers.o init.o lex.o line-map.o macro.o \ |
| - mkdeps.o pch.o symtab.o traditional.o |
| + expr.o file-map.o files.o identifiers.o init.o lex.o line-map.o \ |
| + macro.o mkdeps.o pch.o symtab.o traditional.o |
| |
| libcpp_a_SOURCES = charset.c directives.c directives-only.c errors.c \ |
| - expr.c files.c identifiers.c init.c lex.c line-map.c macro.c \ |
| - mkdeps.c pch.c symtab.c traditional.c |
| + expr.c file-map.c files.c identifiers.c init.c lex.c line-map.c \ |
| + macro.c mkdeps.c pch.c symtab.c traditional.c |
| |
| all: libcpp.a $(USED_CATALOGS) |
| |
| @@ -263,7 +263,7 @@ po/$(PACKAGE).pot: $(libcpp_a_SOURCES) |
| |
| TAGS_SOURCES = $(libcpp_a_SOURCES) internal.h ucnid.h \ |
| include/line-map.h include/symtab.h include/cpp-id-data.h \ |
| - include/cpplib.h include/mkdeps.h system.h |
| + include/cpplib.h include/mkdeps.h system.h include/file-map.h |
| |
| TAGS: $(TAGS_SOURCES) |
| cd $(srcdir) && etags $(TAGS_SOURCES) |
| diff --git a/libcpp/file-map.c b/libcpp/file-map.c |
| new file mode 100644 |
| index 00000000000..18035ef6a72 |
| --- /dev/null |
| +++ b/libcpp/file-map.c |
| @@ -0,0 +1,92 @@ |
| +/* Map one directory name to another in __FILE__, __BASE_FILE__ |
| + and __builtin_FILE (). |
| + Copyright (C) 2001-2016 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/>. |
| + |
| + In other words, you are welcome to use, share and improve this program. |
| + You are forbidden to forbid anyone else to use, share and improve |
| + what you give them. Help stamp out software-hoarding! */ |
| + |
| +#include "config.h" |
| +#include "system.h" |
| +#include "file-map.h" |
| + |
| +/* Structure recording the mapping from source file and directory |
| + names at compile time to __FILE__ */ |
| +typedef 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; |
| +} file_prefix_map; |
| + |
| +/* Linked list of such structures. */ |
| +static file_prefix_map *file_prefix_maps; |
| + |
| +/* Record prefix mapping of __FILE__. ARG is the argument to |
| + -ffile-prefix-map and must be of the form OLD=NEW. */ |
| +int |
| +add_file_prefix_map (const char *arg) |
| +{ |
| + file_prefix_map *map; |
| + const char *p; |
| + |
| + p = strchr (arg, '='); |
| + if (!p) |
| + { |
| + fprintf(stderr, "invalid argument %qs to -ffile-prefix-map", arg); |
| + return -1; |
| + } |
| + 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 = file_prefix_maps; |
| + file_prefix_maps = map; |
| + |
| + return 0; |
| +} |
| + |
| +/* Perform user-specified mapping of __FILE__ prefixes. Return |
| + the new name corresponding to filename. */ |
| + |
| +const char * |
| +remap_file_filename (const char *filename) |
| +{ |
| + file_prefix_map *map; |
| + char *s; |
| + const char *name; |
| + size_t name_len; |
| + |
| + for (map = file_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 xstrdup (s); |
| +} |
| + |
| + |
| diff --git a/libcpp/include/file-map.h b/libcpp/include/file-map.h |
| new file mode 100644 |
| index 00000000000..87503152d27 |
| --- /dev/null |
| +++ b/libcpp/include/file-map.h |
| @@ -0,0 +1,30 @@ |
| +/* Map one directory name to another in __FILE__, __BASE_FILE__ |
| + and __builtin_FILE (). |
| + Copyright (C) 2001-2016 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/>. |
| + |
| + In other words, you are welcome to use, share and improve this program. |
| + You are forbidden to forbid anyone else to use, share and improve |
| + what you give them. Help stamp out software-hoarding! */ |
| + |
| +#ifndef LIBCPP_FILE_MAP_H |
| +#define LIBCPP_FILE_MAP_H |
| + |
| +const char * remap_file_filename (const char *filename); |
| + |
| +int add_file_prefix_map (const char *arg); |
| + |
| +#endif /* !LIBCPP_FILE_MAP_H */ |
| diff --git a/libcpp/macro.c b/libcpp/macro.c |
| index de18c2210cf..2748c70d520 100644 |
| --- a/libcpp/macro.c |
| +++ b/libcpp/macro.c |
| @@ -26,6 +26,7 @@ along with this program; see the file COPYING3. If not see |
| #include "system.h" |
| #include "cpplib.h" |
| #include "internal.h" |
| +#include "file-map.h" |
| |
| typedef struct macro_arg macro_arg; |
| /* This structure represents the tokens of a macro argument. These |
| @@ -301,6 +302,7 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node, |
| if (!name) |
| abort (); |
| } |
| + name = remap_file_filename (name); |
| len = strlen (name); |
| buf = _cpp_unaligned_alloc (pfile, len * 2 + 3); |
| result = buf; |
| -- |
| 2.12.2 |
| |