diff mbox

Add support of AIX response files in collect2

Message ID CD63C416-956A-4C10-A6C7-46C924A15BA1@adacore.com
State New
Headers show

Commit Message

Tristan Gingold Oct. 21, 2011, 10:39 a.m. UTC
Hi,

the AIX linker supports response files with the '-fFILE' command line option.
With this patch, collect2 reads the content of the response files and listed object files are handled.  Therefore these files are not forgotten by the collect2 machinery.

Although AIX ld supports glob(3) patterns, this isn't handled by this patch because glob() isn't available on all hosts, isn't present in libiberty and its use is not common.  To be considered for the future.

I haven't added a testcase for this because I think this is not possible with only one file.  But hints are welcome.

Reduced bootstrap on rs6000-aix

Ok for trunk ?

Tristan.

2011-10-21  Tristan Gingold  <gingold@adacore.com>

	* collect2.c (main): Add support of -f (response file) on AIX.

Comments

David Edelsohn Oct. 21, 2011, 3:51 p.m. UTC | #1
On Fri, Oct 21, 2011 at 6:39 AM, Tristan Gingold <gingold@adacore.com> wrote:
> Hi,
>
> the AIX linker supports response files with the '-fFILE' command line option.
> With this patch, collect2 reads the content of the response files and listed object files are handled.  Therefore these files are not forgotten by the collect2 machinery.
>
> Although AIX ld supports glob(3) patterns, this isn't handled by this patch because glob() isn't available on all hosts, isn't present in libiberty and its use is not common.  To be considered for the future.
>
> I haven't added a testcase for this because I think this is not possible with only one file.  But hints are welcome.
>
> Reduced bootstrap on rs6000-aix
>
> Ok for trunk ?
>
> Tristan.
>
> 2011-10-21  Tristan Gingold  <gingold@adacore.com>
>
>        * collect2.c (main): Add support of -f (response file) on AIX.

Okay.

Thanks, David
diff mbox

Patch

diff --git a/gcc/collect2.c b/gcc/collect2.c
index cf39693..fd747b5 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -1091,6 +1091,7 @@  main (int argc, char **argv)
   const char **ld2;
   char **object_lst;
   const char **object;
+  int object_nbr = argc;
   int first_file;
   int num_c_args;
   char **old_argv;
@@ -1440,6 +1441,57 @@  main (int argc, char **argv)
                         "configuration");
 #endif
                }
+#ifdef TARGET_AIX_VERSION
+             else
+               {
+                 /* File containing a list of input files to process.  */
+                 
+                 FILE *stream;
+                 char buf[MAXPATHLEN + 2];
+                 /* Number of additionnal object files.  */
+                 int add_nbr = 0;
+                 /* Maximum of additionnal object files before vector
+                    expansion.  */
+                 int add_max = 0;
+                 const char *list_filename = arg + 2;
+                 
+                 /* Accept -fFILENAME and -f FILENAME.  */
+                 if (*list_filename == '\0' && argv[1])
+                   {
+                     ++argv;
+                     list_filename = *argv;
+                     *ld1++ = *ld2++ = *argv;
+                   }
+                 
+                 stream = fopen (list_filename, "r");
+                 if (stream == NULL)
+                   fatal_error ("can't open %s: %m", list_filename);
+                 
+                 while (fgets (buf, sizeof buf, stream) != NULL)
+                   {
+                     /* Remove end of line.  */
+                     int len = strlen (buf);
+                     if (len >= 1 && buf[len - 1] =='\n')
+                       buf[len - 1] = '\0';
+                     
+                     /* Put on object vector.
+                        Note: we only expanse vector here, so we must keep
+                        extra space for remaining arguments.  */
+                     if (add_nbr >= add_max)
+                       {
+                         int pos = object - (const char **)object_lst;
+                         add_max = (add_max == 0) ? 16 : add_max * 2;
+                         object_lst = XRESIZEVEC(char *, object_lst,
+                                                 object_nbr + add_max);
+                         object = (const char **)object_lst + pos;
+                         object_nbr += add_max;
+                       }
+                     *object++ = xstrdup(buf);
+                     add_nbr++;
+                   }
+                 fclose (stream);
+               }
+#endif
               break;
 
            case 'l':