gcc.c (TARGET_OPTION_TRANSLATE_TABLE): New.
authorDJ Delorie <dj@redhat.com>
Thu, 5 Jul 2001 20:09:34 +0000 (16:09 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Thu, 5 Jul 2001 20:09:34 +0000 (16:09 -0400)
* gcc.c (TARGET_OPTION_TRANSLATE_TABLE): New.
(translate_options): If the above is defined, use it to map
given options to new options.
* doc/tm.texi: Document it.

From-SVN: r43787

gcc/ChangeLog
gcc/doc/tm.texi
gcc/gcc.c

index 2c8be244f8ebd793679eec7f4c7e6c1de9139a9c..9769799897ec520aa779ec3ccef256803950b311 100644 (file)
@@ -1,3 +1,10 @@
+2001-07-05  DJ Delorie  <dj@redhat.com>
+
+       * gcc.c (TARGET_OPTION_TRANSLATE_TABLE): New.
+       (translate_options): If the above is defined, use it to map
+       given options to new options.
+       * doc/tm.texi: Document it.
+
 2001-07-05  Brad Lucier <lucier@math.purdue.edu>
            Gerald Pfeifer  <pfeifer@dbai.tuwien.ac.at>
 
index 7a1d8bce34bbe8417618204b388994dc52a18c93..ad9e29cf71c1d46efbdd520d05e9a264ae67f1f8 100644 (file)
@@ -140,6 +140,26 @@ the linker needs a space between the option and its argument.
 
 If this macro is not defined, the default value is @code{""}.
 
+@findex TARGET_OPTION_TRANSLATE_TABLE
+@item TARGET_OPTION_TRANSLATE_TABLE
+If defined, a list of pairs of strings, the first of which is a
+potential command line target to the @file{gcc} driver program, and the
+second of which is a space-separated (tabs and other whitespace are not
+supported) list of options with which to replace the first option.  The
+target defining this list is responsible for assuring that the results
+are valid.  Replacement options may not be the @code{--opt} style, they
+must be the @code{-opt} style.  It is the intention of this macro to
+provide a mechanism for substitution that affects the multilibs chosen,
+such as one option that enables many options, some of which select
+multilibs.  Example nonsensical definition, where @code{-malt-abi},
+@code{-EB}, and @code{-mspoo} cause different multilibs to be chosen:
+
+@example
+#define TARGET_OPTION_TRANSLATE_TABLE \
+@{ "-fast",   "-march=fast-foo -malt-abi -I/usr/fast-foo" @}, \
+@{ "-compat", "-EB -malign=4 -mspoo" @}
+@end example
+
 @findex CPP_SPEC
 @item CPP_SPEC
 A C string constant that tells the GCC driver program options to
index cec9954caf1469975e1be124536f714ee019e96c..409ac2bbe9a3880ec508ddefe6c5145b6b91f896 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -952,6 +952,18 @@ struct option_map option_map[] =
    {"--", "-f", "*j"}
  };
 \f
+
+#ifdef TARGET_OPTION_TRANSLATE_TABLE
+static struct {
+  const char *option_found;
+  const char *replacements;
+} target_option_translations[] =
+{
+  TARGET_OPTION_TRANSLATE_TABLE,
+  { 0, 0 }
+};
+#endif
+
 /* Translate the options described by *ARGCP and *ARGVP.
    Make a new vector and store it back in *ARGVP,
    and store its length in *ARGVC.  */
@@ -964,8 +976,9 @@ translate_options (argcp, argvp)
   int i;
   int argc = *argcp;
   const char *const *argv = *argvp;
+  int newvsize = (argc + 2) * 2 * sizeof (const char *);
   const char **newv =
-    (const char **) xmalloc ((argc + 2) * 2 * sizeof (const char *));
+    (const char **) xmalloc (newvsize);
   int newindex = 0;
 
   i = 0;
@@ -973,6 +986,56 @@ translate_options (argcp, argvp)
 
   while (i < argc)
     {
+#ifdef TARGET_OPTION_TRANSLATE_TABLE
+      int tott_idx;
+
+      for (tott_idx = 0;
+          target_option_translations[tott_idx].option_found;
+          tott_idx++)
+       {
+         if (strcmp (target_option_translations[tott_idx].option_found,
+                     argv[i]) == 0)
+           {
+             int spaces = 1;
+             const char *sp;
+             char *np;
+
+             for (sp = target_option_translations[tott_idx].replacements;
+                  *sp; sp++)
+               {
+                 if (*sp == ' ')
+                   spaces ++;
+               }
+
+             newvsize += spaces * sizeof (const char *);
+             newv = (const char **) xrealloc (newv, newvsize);
+
+             sp = target_option_translations[tott_idx].replacements;
+             np = (char *) xmalloc (strlen (sp) + 1);
+             strcpy (np, sp);
+
+             while (1)
+               {
+                 while (*np == ' ')
+                   np++;
+                 if (*np == 0)
+                   break;
+                 newv[newindex++] = np;
+                 while (*np != ' ' && *np)
+                   np++;
+                 if (*np == 0)
+                   break;
+                 *np++ = 0;
+               }
+
+             i ++;
+             break;
+           }
+       }
+      if (target_option_translations[tott_idx].option_found)
+       continue;
+#endif
+
       /* Translate -- options.  */
       if (argv[i][0] == '-' && argv[i][1] == '-')
        {