Patchwork Add support of AIX response files in collect2

login
register
mail settings
Submitter Tristan Gingold
Date Oct. 21, 2011, 10:39 a.m.
Message ID <CD63C416-956A-4C10-A6C7-46C924A15BA1@adacore.com>
Download mbox | patch
Permalink /patch/120982/
State New
Headers show

Comments

Tristan Gingold - Oct. 21, 2011, 10:39 a.m.
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.
David Edelsohn - Oct. 21, 2011, 3:51 p.m.
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

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':