public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH][Revisedx2] Add remove-outfile and use on darwin
@ 2010-08-12 13:17 Jack Howarth
  2010-08-15 20:46 ` Jack Howarth
  0 siblings, 1 reply; 4+ messages in thread
From: Jack Howarth @ 2010-08-12 13:17 UTC (permalink / raw)
  To: gcc-patches; +Cc: mikestump, iains

   Currently on darwin, passing -ldl, -lm or -lpthread (which are
all aliases for -lSystem) results in the libSystem being promoted
earlier into the order of linkage. This interferes with the logic
behind libgcc_ext which expects libSystem to be linked last. The
attached patch adds the missing remove-outfile spec function and
uses it from LINK_SPEC to remove any instances of -ldl, -lm or 
Bootstrapped and regression tested on x86_64-apple-darwin10.
Okay for gcc trunk and gcc 4.5.2?
                Jack

2010-08-12  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.

Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	(revision 163182)
+++ gcc/doc/invoke.texi	(working copy)
@@ -9613,6 +9613,15 @@
 %@{fgnu-runtime:%:replace-outfile(-lobjc -lobjc-gnu)@}
 @end smallexample
 
+@item @code{remove-outfile}
+The @code{remove-outfile} spec function takes one argument.  It removes
+all occurrences of its argument from the outfiles array.  Here is a small
+example of 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: gcc/gcc.c
===================================================================
--- gcc/gcc.c	(revision 163182)
+++ gcc/gcc.c	(working copy)
@@ -379,6 +379,7 @@
 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 **);
@@ -1677,6 +1678,7 @@
   { "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 },
@@ -8357,6 +8359,27 @@
   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))*
Index: gcc/config/darwin.h
===================================================================
--- gcc/config/darwin.h	(revision 163182)
+++ gcc/config/darwin.h	(working copy)
@@ -303,6 +303,9 @@
    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 ) } }\

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH][Revisedx2] Add remove-outfile and use on darwin
  2010-08-12 13:17 [PATCH][Revisedx2] Add remove-outfile and use on darwin Jack Howarth
@ 2010-08-15 20:46 ` Jack Howarth
  2010-08-16 15:13   ` Richard Henderson
  0 siblings, 1 reply; 4+ messages in thread
From: Jack Howarth @ 2010-08-15 20:46 UTC (permalink / raw)
  To: gcc-patches; +Cc: rth

On Thu, Aug 12, 2010 at 09:04:03AM -0400, Jack Howarth wrote:
>    Currently on darwin, passing -ldl, -lm or -lpthread (which are
> all aliases for -lSystem) results in the libSystem being promoted
> earlier into the order of linkage. This interferes with the logic
> behind libgcc_ext which expects libSystem to be linked last. The
> attached patch adds the missing remove-outfile spec function and
> uses it from LINK_SPEC to remove any instances of -ldl, -lm or 
> Bootstrapped and regression tested on x86_64-apple-darwin10.
> Okay for gcc trunk and gcc 4.5.2?
>                 Jack
> 

Richard,
     We never got an explicit approval on this change (although the original
concept and implentation was entirely Andrew Pinksi's idea). It would be
very helpful to get this into gcc trunk and 4.5.2 so that there is coherency
to how libSystem is linked on darwin). Thanks in advance.
              Jack
ps I have corrected all of the documentation flaws in the second revision.


> 2010-08-12  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.
> 
> Index: gcc/doc/invoke.texi
> ===================================================================
> --- gcc/doc/invoke.texi	(revision 163182)
> +++ gcc/doc/invoke.texi	(working copy)
> @@ -9613,6 +9613,15 @@
>  %@{fgnu-runtime:%:replace-outfile(-lobjc -lobjc-gnu)@}
>  @end smallexample
>  
> +@item @code{remove-outfile}
> +The @code{remove-outfile} spec function takes one argument.  It removes
> +all occurrences of its argument from the outfiles array.  Here is a small
> +example of 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: gcc/gcc.c
> ===================================================================
> --- gcc/gcc.c	(revision 163182)
> +++ gcc/gcc.c	(working copy)
> @@ -379,6 +379,7 @@
>  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 **);
> @@ -1677,6 +1678,7 @@
>    { "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 },
> @@ -8357,6 +8359,27 @@
>    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))*
> Index: gcc/config/darwin.h
> ===================================================================
> --- gcc/config/darwin.h	(revision 163182)
> +++ gcc/config/darwin.h	(working copy)
> @@ -303,6 +303,9 @@
>     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 ) } }\

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH][Revisedx2] Add remove-outfile and use on darwin
  2010-08-15 20:46 ` Jack Howarth
@ 2010-08-16 15:13   ` Richard Henderson
  2010-08-17 13:31     ` IainS
  0 siblings, 1 reply; 4+ messages in thread
From: Richard Henderson @ 2010-08-16 15:13 UTC (permalink / raw)
  To: Jack Howarth; +Cc: gcc-patches

On 08/15/2010 01:29 PM, Jack Howarth wrote:
>> 2010-08-12  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.

Ok.


r~

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH][Revisedx2] Add remove-outfile and use on darwin
  2010-08-16 15:13   ` Richard Henderson
@ 2010-08-17 13:31     ` IainS
  0 siblings, 0 replies; 4+ messages in thread
From: IainS @ 2010-08-17 13:31 UTC (permalink / raw)
  To: Jack Howarth; +Cc: GCC Patches


On 16 Aug 2010, at 15:59, Richard Henderson wrote:

> On 08/15/2010 01:29 PM, Jack Howarth wrote:
>>> 2010-08-12  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.
>
> Ok.

ci r163305
Iain

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-08-17 13:24 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-08-12 13:17 [PATCH][Revisedx2] Add remove-outfile and use on darwin Jack Howarth
2010-08-15 20:46 ` Jack Howarth
2010-08-16 15:13   ` Richard Henderson
2010-08-17 13:31     ` IainS

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).