This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch] Add support of AIX response files in collect2


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.

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]