gcc.c (spec_function): Add remove-outfile.
authorJack Howarth <howarth@bromo.med.uc.edu>
Tue, 17 Aug 2010 13:22:28 +0000 (13:22 +0000)
committerIain Sandoe <iains@gcc.gnu.org>
Tue, 17 Aug 2010 13:22:28 +0000 (13:22 +0000)
2010-08-17  Jack Howarth <howarth@bromo.med.uc.edu>

* gcc.c (spec_function): Add remove-outfile.
(remove_outfile_spec_function): New function.
* config/darwin.h (LINK_SPEC): Add removal of
-ldl, -lm and -lpthread.
* invoke.texi (replace-outfile): Document.

From-SVN: r163305

gcc/ChangeLog
gcc/config/darwin.h
gcc/doc/invoke.texi
gcc/gcc.c

index 29e5007c1622a659161bfc00b4d9b329de1cdccb..ff72674c46b72d63d775a8adc0caa1c4e4423bc0 100644 (file)
@@ -1,3 +1,11 @@
+2010-08-17  Jack Howarth <howarth@bromo.med.uc.edu>
+
+       * gcc.c (spec_function): Add remove-outfile.
+       (remove_outfile_spec_function): New function.
+       * config/darwin.h (LINK_SPEC): Add removal of
+       -ldl, -lm and -lpthread.
+       * invoke.texi (replace-outfile): Document.
+
 2010-08-17  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/45296
index feb57c9feb7dc97f01dab99f78f922cf5571b498..c9354344e3b441991f1a764f10226c2dc177a18a 100644 (file)
@@ -303,6 +303,9 @@ extern GTY(()) int darwin_ms_struct;
    so put a * after their names so all of them get passed.  */
 #define LINK_SPEC  \
   "%{static}%{!static:-dynamic} \
+   %:remove-outfile(-ldl) \
+   %:remove-outfile(-lm) \
+   %:remove-outfile(-lpthread) \
    %{fgnu-runtime: %{static|static-libgcc: \
                      %:replace-outfile(-lobjc libobjc-gnu.a%s); \
                     :%:replace-outfile(-lobjc -lobjc-gnu ) } }\
index b321ccee951a8d13c9956509f69f9b8ba26c40ec..b2d72d9a9d0b4fe4c99857f3fe3d33be3338be06 100644 (file)
@@ -9629,6 +9629,15 @@ is a small example of its usage:
 %@{fgnu-runtime:%:replace-outfile(-lobjc -lobjc-gnu)@}
 @end smallexample
 
+@item @code{remove-outfile}
+The @code{remove-outfile} spec function takes one argument.  It looks for the
+first argument in the outfiles array and removes it.  Here is a small example
+its usage:
+
+@smallexample
+%:remove-outfile(-lm)
+@end smallexample
+
 @item @code{print-asm-header}
 The @code{print-asm-header} function takes no arguments and simply
 prints a banner like:
index c2c87fe0d859bfec91b690685e51350eba3137ce..a96d49785b2bb977774ffa3888e34c6a9c931bd0 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -317,6 +317,7 @@ static const char *getenv_spec_function (int, const char **);
 static const char *if_exists_spec_function (int, const char **);
 static const char *if_exists_else_spec_function (int, const char **);
 static const char *replace_outfile_spec_function (int, const char **);
+static const char *remove_outfile_spec_function (int, const char **);
 static const char *version_compare_spec_function (int, const char **);
 static const char *include_spec_function (int, const char **);
 static const char *find_file_spec_function (int, const char **);
@@ -1615,6 +1616,7 @@ static const struct spec_function static_spec_functions[] =
   { "if-exists",               if_exists_spec_function },
   { "if-exists-else",          if_exists_else_spec_function },
   { "replace-outfile",         replace_outfile_spec_function },
+  { "remove-outfile",          remove_outfile_spec_function },
   { "version-compare",         version_compare_spec_function },
   { "include",                 include_spec_function },
   { "find-file",               find_file_spec_function },
@@ -8274,6 +8276,27 @@ replace_outfile_spec_function (int argc, const char **argv)
   return NULL;
 }
 
+/* remove-outfile built-in spec function.
+ *
+ *    This looks for the first argument in the outfiles array's name and
+ *       removes it.  */
+
+static const char *
+remove_outfile_spec_function (int argc, const char **argv)
+{
+  int i;
+  /* Must have exactly one argument.  */
+  if (argc != 1)
+    abort ();
+
+  for (i = 0; i < n_infiles; i++)
+    {
+      if (outfiles[i] && !strcmp (outfiles[i], argv[0]))
+        outfiles[i] = NULL;
+    }
+  return NULL;
+}
+
 /* Given two version numbers, compares the two numbers.
    A version number must match the regular expression
    ([1-9][0-9]*|0)(\.([1-9][0-9]*|0))*