gcc: add a patch to 5.x that supports translation of __FILE__ paths
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 47490
This commit is contained in:
parent
0d5915d2fe
commit
331735a357
1 changed files with 182 additions and 0 deletions
182
toolchain/gcc/patches/5.2.0/950-cpp_file_path_translation.patch
Normal file
182
toolchain/gcc/patches/5.2.0/950-cpp_file_path_translation.patch
Normal file
|
@ -0,0 +1,182 @@
|
|||
Forward ported from attachment to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47047
|
||||
|
||||
--- a/gcc/c-family/c-opts.c
|
||||
+++ b/gcc/c-family/c-opts.c
|
||||
@@ -581,6 +581,10 @@ c_common_handle_option (size_t scode, co
|
||||
add_path (xstrdup (arg), SYSTEM, 0, true);
|
||||
break;
|
||||
|
||||
+ case OPT_iremap:
|
||||
+ add_cpp_remap_path (arg);
|
||||
+ break;
|
||||
+
|
||||
case OPT_iwithprefix:
|
||||
add_prefixed_path (arg, SYSTEM);
|
||||
break;
|
||||
--- a/gcc/c-family/c.opt
|
||||
+++ b/gcc/c-family/c.opt
|
||||
@@ -1528,6 +1528,10 @@ iquote
|
||||
C ObjC C++ ObjC++ Joined Separate MissingArgError(missing path after %qs)
|
||||
-iquote <dir> Add <dir> to the end of the quote include path
|
||||
|
||||
+iremap
|
||||
+C ObjC C++ ObjC++ Joined Separate
|
||||
+-iremap <src:dst> Convert <src> to <dst> if it occurs as prefix in __FILE__.
|
||||
+
|
||||
iwithprefix
|
||||
C ObjC C++ ObjC++ Joined Separate
|
||||
-iwithprefix <dir> Add <dir> to the end of the system include path
|
||||
--- a/gcc/doc/cpp.texi
|
||||
+++ b/gcc/doc/cpp.texi
|
||||
@@ -4441,6 +4441,7 @@ without notice.
|
||||
@c man begin SYNOPSIS
|
||||
cpp [@option{-D}@var{macro}[=@var{defn}]@dots{}] [@option{-U}@var{macro}]
|
||||
[@option{-I}@var{dir}@dots{}] [@option{-iquote}@var{dir}@dots{}]
|
||||
+ [@option{-iremap}@var{src}:@var{dst}]
|
||||
[@option{-W}@var{warn}@dots{}]
|
||||
[@option{-M}|@option{-MM}] [@option{-MG}] [@option{-MF} @var{filename}]
|
||||
[@option{-MP}] [@option{-MQ} @var{target}@dots{}]
|
||||
--- a/gcc/doc/cppopts.texi
|
||||
+++ b/gcc/doc/cppopts.texi
|
||||
@@ -532,6 +532,12 @@ Search @var{dir} only for header files r
|
||||
If @var{dir} begins with @code{=}, then the @code{=} will be replaced
|
||||
by the sysroot prefix; see @option{--sysroot} and @option{-isysroot}.
|
||||
|
||||
+@item -iremap @var{src}:@var{dst}
|
||||
+@opindex iremap
|
||||
+Replace the prefix @var{src} in __FILE__ with @var{dst} at expansion time.
|
||||
+This option can be specified more than once. Processing stops at the first
|
||||
+match.
|
||||
+
|
||||
@item -fdirectives-only
|
||||
@opindex fdirectives-only
|
||||
When preprocessing, handle directives, but do not expand macros.
|
||||
--- a/gcc/doc/invoke.texi
|
||||
+++ b/gcc/doc/invoke.texi
|
||||
@@ -494,8 +494,8 @@ Objective-C and Objective-C++ Dialects}.
|
||||
@item Directory Options
|
||||
@xref{Directory Options,,Options for Directory Search}.
|
||||
@gccoptlist{-B@var{prefix} -I@var{dir} -iplugindir=@var{dir} @gol
|
||||
--iquote@var{dir} -L@var{dir} -specs=@var{file} -I- @gol
|
||||
---sysroot=@var{dir} --no-sysroot-suffix}
|
||||
+-iquote@var{dir} -iremap@var{src}:@var{dst} -L@var{dir} -specs=@var{file} @gol
|
||||
+-I- --sysroot=@var{dir} --no-sysroot-suffix}
|
||||
|
||||
@item Machine Dependent Options
|
||||
@xref{Submodel Options,,Hardware Models and Configurations}.
|
||||
@@ -11463,6 +11463,12 @@ be searched for header files only for th
|
||||
"@var{file}"}; they are not searched for @code{#include <@var{file}>},
|
||||
otherwise just like @option{-I}.
|
||||
|
||||
+@item -iremap @var{src}:@var{dst}
|
||||
+@opindex iremap
|
||||
+Replace the prefix @var{src} in __FILE__ with @var{dst} at expansion time.
|
||||
+This option can be specified more than once. Processing stops at the first
|
||||
+match.
|
||||
+
|
||||
@item -L@var{dir}
|
||||
@opindex L
|
||||
Add directory @var{dir} to the list of directories to be searched
|
||||
--- a/libcpp/include/cpplib.h
|
||||
+++ b/libcpp/include/cpplib.h
|
||||
@@ -751,6 +751,9 @@ extern void cpp_set_lang (cpp_reader *,
|
||||
/* Set the include paths. */
|
||||
extern void cpp_set_include_chains (cpp_reader *, cpp_dir *, cpp_dir *, int);
|
||||
|
||||
+/* Provide src:dst pair for __FILE__ remapping. */
|
||||
+extern void add_cpp_remap_path (const char *);
|
||||
+
|
||||
/* Call these to get pointers to the options, callback, and deps
|
||||
structures for a given reader. These pointers are good until you
|
||||
call cpp_finish on that reader. You can either edit the callbacks
|
||||
--- a/libcpp/macro.c
|
||||
+++ b/libcpp/macro.c
|
||||
@@ -224,6 +224,64 @@ static const char * const monthnames[] =
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
||||
};
|
||||
|
||||
+static size_t remap_pairs;
|
||||
+static char **remap_src;
|
||||
+static char **remap_dst;
|
||||
+
|
||||
+void
|
||||
+add_cpp_remap_path (const char *arg)
|
||||
+{
|
||||
+ const char *arg_dst;
|
||||
+ size_t len;
|
||||
+
|
||||
+ arg_dst = strchr(arg, ':');
|
||||
+ if (arg_dst == NULL)
|
||||
+ {
|
||||
+ fprintf(stderr, "Invalid argument for -iremap\n");
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
+ len = arg_dst - arg;
|
||||
+ ++arg_dst;
|
||||
+
|
||||
+ remap_src = (char **) xrealloc(remap_src, sizeof(char *) * (remap_pairs + 1));
|
||||
+ remap_dst = (char **) xrealloc(remap_dst, sizeof(char *) * (remap_pairs + 1));
|
||||
+
|
||||
+ remap_src[remap_pairs] = (char *) xmalloc(len + 1);
|
||||
+ memcpy(remap_src[remap_pairs], arg, len);
|
||||
+ remap_src[remap_pairs][len] = '\0';
|
||||
+ remap_dst[remap_pairs] = xstrdup(arg_dst);
|
||||
+ ++remap_pairs;
|
||||
+}
|
||||
+
|
||||
+static const char *
|
||||
+cpp_remap_file (const char *arg, char **tmp_name)
|
||||
+{
|
||||
+ char *result;
|
||||
+ size_t i, len;
|
||||
+
|
||||
+ for (i = 0; i < remap_pairs; ++i)
|
||||
+ {
|
||||
+ len = strlen (remap_src[i]);
|
||||
+ if (strncmp (remap_src[i], arg, len))
|
||||
+ continue;
|
||||
+ if (arg[len] == '\0')
|
||||
+ return xstrdup (remap_dst[i]);
|
||||
+ if (arg[len] != '/')
|
||||
+ continue;
|
||||
+ arg += len;
|
||||
+ len = strlen (remap_dst[i]);
|
||||
+ result = (char *) xmalloc (len + strlen (arg) + 1);
|
||||
+ memcpy(result, remap_dst[i], len);
|
||||
+ strcpy(result + len, arg);
|
||||
+ *tmp_name = result;
|
||||
+
|
||||
+ return result;
|
||||
+ }
|
||||
+
|
||||
+ return arg;
|
||||
+}
|
||||
+
|
||||
/* Helper function for builtin_macro. Returns the text generated by
|
||||
a builtin macro. */
|
||||
const uchar *
|
||||
@@ -286,6 +344,7 @@ _cpp_builtin_macro_text (cpp_reader *pfi
|
||||
{
|
||||
unsigned int len;
|
||||
const char *name;
|
||||
+ char *tmp_name = NULL;
|
||||
uchar *buf;
|
||||
|
||||
if (node->value.builtin == BT_FILE)
|
||||
@@ -297,6 +356,7 @@ _cpp_builtin_macro_text (cpp_reader *pfi
|
||||
if (!name)
|
||||
abort ();
|
||||
}
|
||||
+ name = cpp_remap_file (name, &tmp_name);
|
||||
len = strlen (name);
|
||||
buf = _cpp_unaligned_alloc (pfile, len * 2 + 3);
|
||||
result = buf;
|
||||
@@ -304,6 +364,7 @@ _cpp_builtin_macro_text (cpp_reader *pfi
|
||||
buf = cpp_quote_string (buf + 1, (const unsigned char *) name, len);
|
||||
*buf++ = '"';
|
||||
*buf = '\0';
|
||||
+ free (tmp_name);
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in a new issue