lede-packages-rs

git clone git://archive.git.mtrnord.blog/MTRNord/lede-packages-rs.git
Log | Files | Refs | README | LICENSE

950-cpp_file_path_translation.patch (5796B)


      1 Forward ported from attachment to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47047
      2 
      3 --- a/gcc/c-family/c-opts.c
      4 +++ b/gcc/c-family/c-opts.c
      5 @@ -581,6 +581,10 @@ c_common_handle_option (size_t scode, co
      6        add_path (xstrdup (arg), SYSTEM, 0, true);
      7        break;
      8  
      9 +    case OPT_iremap:
     10 +      add_cpp_remap_path (arg);
     11 +      break;
     12 +
     13      case OPT_iwithprefix:
     14        add_prefixed_path (arg, SYSTEM);
     15        break;
     16 --- a/gcc/c-family/c.opt
     17 +++ b/gcc/c-family/c.opt
     18 @@ -1528,6 +1528,10 @@ iquote
     19  C ObjC C++ ObjC++ Joined Separate MissingArgError(missing path after %qs)
     20  -iquote <dir>	Add <dir> to the end of the quote include path
     21  
     22 +iremap
     23 +C ObjC C++ ObjC++ Joined Separate
     24 +-iremap <src:dst>  Convert <src> to <dst> if it occurs as prefix in __FILE__.
     25 +
     26  iwithprefix
     27  C ObjC C++ ObjC++ Joined Separate
     28  -iwithprefix <dir>	Add <dir> to the end of the system include path
     29 --- a/gcc/doc/cpp.texi
     30 +++ b/gcc/doc/cpp.texi
     31 @@ -4441,6 +4441,7 @@ without notice.
     32  @c man begin SYNOPSIS
     33  cpp [@option{-D}@var{macro}[=@var{defn}]@dots{}] [@option{-U}@var{macro}]
     34      [@option{-I}@var{dir}@dots{}] [@option{-iquote}@var{dir}@dots{}]
     35 +    [@option{-iremap}@var{src}:@var{dst}]
     36      [@option{-W}@var{warn}@dots{}]
     37      [@option{-M}|@option{-MM}] [@option{-MG}] [@option{-MF} @var{filename}]
     38      [@option{-MP}] [@option{-MQ} @var{target}@dots{}]
     39 --- a/gcc/doc/cppopts.texi
     40 +++ b/gcc/doc/cppopts.texi
     41 @@ -532,6 +532,12 @@ Search @var{dir} only for header files r
     42  If @var{dir} begins with @code{=}, then the @code{=} will be replaced
     43  by the sysroot prefix; see @option{--sysroot} and @option{-isysroot}.
     44  
     45 +@item -iremap @var{src}:@var{dst}
     46 +@opindex iremap
     47 +Replace the prefix @var{src} in __FILE__ with @var{dst} at expansion time.
     48 +This option can be specified more than once.  Processing stops at the first
     49 +match.
     50 +
     51  @item -fdirectives-only
     52  @opindex fdirectives-only
     53  When preprocessing, handle directives, but do not expand macros.
     54 --- a/gcc/doc/invoke.texi
     55 +++ b/gcc/doc/invoke.texi
     56 @@ -494,8 +494,8 @@ Objective-C and Objective-C++ Dialects}.
     57  @item Directory Options
     58  @xref{Directory Options,,Options for Directory Search}.
     59  @gccoptlist{-B@var{prefix} -I@var{dir} -iplugindir=@var{dir} @gol
     60 --iquote@var{dir} -L@var{dir} -specs=@var{file} -I- @gol
     61 ---sysroot=@var{dir} --no-sysroot-suffix}
     62 +-iquote@var{dir} -iremap@var{src}:@var{dst} -L@var{dir} -specs=@var{file} @gol
     63 +-I- --sysroot=@var{dir} --no-sysroot-suffix}
     64  
     65  @item Machine Dependent Options
     66  @xref{Submodel Options,,Hardware Models and Configurations}.
     67 @@ -11479,6 +11479,12 @@ be searched for header files only for th
     68  "@var{file}"}; they are not searched for @code{#include <@var{file}>},
     69  otherwise just like @option{-I}.
     70  
     71 +@item -iremap @var{src}:@var{dst}
     72 +@opindex iremap
     73 +Replace the prefix @var{src} in __FILE__ with @var{dst} at expansion time.
     74 +This option can be specified more than once.  Processing stops at the first
     75 +match.
     76 +
     77  @item -L@var{dir}
     78  @opindex L
     79  Add directory @var{dir} to the list of directories to be searched
     80 --- a/libcpp/include/cpplib.h
     81 +++ b/libcpp/include/cpplib.h
     82 @@ -751,6 +751,9 @@ extern void cpp_set_lang (cpp_reader *,
     83  /* Set the include paths.  */
     84  extern void cpp_set_include_chains (cpp_reader *, cpp_dir *, cpp_dir *, int);
     85  
     86 +/* Provide src:dst pair for __FILE__ remapping.  */
     87 +extern void add_cpp_remap_path (const char *);
     88 +
     89  /* Call these to get pointers to the options, callback, and deps
     90     structures for a given reader.  These pointers are good until you
     91     call cpp_finish on that reader.  You can either edit the callbacks
     92 --- a/libcpp/macro.c
     93 +++ b/libcpp/macro.c
     94 @@ -224,6 +224,64 @@ static const char * const monthnames[] =
     95    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
     96  };
     97  
     98 +static size_t remap_pairs;
     99 +static char **remap_src;
    100 +static char **remap_dst;
    101 +
    102 +void
    103 +add_cpp_remap_path (const char *arg)
    104 +{
    105 +  const char *arg_dst;
    106 +  size_t len;
    107 +
    108 +  arg_dst = strchr(arg, ':');
    109 +  if (arg_dst == NULL)
    110 +    {
    111 +      fprintf(stderr, "Invalid argument for -iremap\n");
    112 +      exit(1);
    113 +    }
    114 +
    115 +  len = arg_dst - arg;
    116 +  ++arg_dst;
    117 +
    118 +  remap_src = (char **) xrealloc(remap_src, sizeof(char *) * (remap_pairs + 1));
    119 +  remap_dst = (char **) xrealloc(remap_dst, sizeof(char *) * (remap_pairs + 1));
    120 +
    121 +  remap_src[remap_pairs] = (char *) xmalloc(len + 1);
    122 +  memcpy(remap_src[remap_pairs], arg, len);
    123 +  remap_src[remap_pairs][len] = '\0';
    124 +  remap_dst[remap_pairs] = xstrdup(arg_dst);
    125 +  ++remap_pairs;
    126 +}
    127 +
    128 +static const char *
    129 +cpp_remap_file (const char *arg, char **tmp_name)
    130 +{
    131 +  char *result;
    132 +  size_t i, len;
    133 +
    134 +  for (i = 0; i < remap_pairs; ++i)
    135 +    {
    136 +      len = strlen (remap_src[i]);
    137 +      if (strncmp (remap_src[i], arg, len))
    138 +	continue;
    139 +      if (arg[len] == '\0')
    140 +	return xstrdup (remap_dst[i]);
    141 +      if (arg[len] != '/')
    142 +	continue;
    143 +      arg += len;
    144 +      len = strlen (remap_dst[i]);
    145 +      result = (char *) xmalloc (len + strlen (arg) + 1);
    146 +      memcpy(result, remap_dst[i], len);
    147 +      strcpy(result + len, arg);
    148 +      *tmp_name = result;
    149 +
    150 +      return result;
    151 +    }
    152 +
    153 +   return arg;
    154 +}
    155 +
    156  /* Helper function for builtin_macro.  Returns the text generated by
    157     a builtin macro. */
    158  const uchar *
    159 @@ -286,6 +344,7 @@ _cpp_builtin_macro_text (cpp_reader *pfi
    160        {
    161  	unsigned int len;
    162  	const char *name;
    163 +	char *tmp_name = NULL;
    164  	uchar *buf;
    165  	
    166  	if (node->value.builtin == BT_FILE)
    167 @@ -297,6 +356,7 @@ _cpp_builtin_macro_text (cpp_reader *pfi
    168  	    if (!name)
    169  	      abort ();
    170  	  }
    171 +	name = cpp_remap_file (name, &tmp_name);
    172  	len = strlen (name);
    173  	buf = _cpp_unaligned_alloc (pfile, len * 2 + 3);
    174  	result = buf;
    175 @@ -304,6 +364,7 @@ _cpp_builtin_macro_text (cpp_reader *pfi
    176  	buf = cpp_quote_string (buf + 1, (const unsigned char *) name, len);
    177  	*buf++ = '"';
    178  	*buf = '\0';
    179 +	free (tmp_name);
    180        }
    181        break;
    182