OSDN Git Service

2010-04-23 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Apr 2010 15:49:10 +0000 (15:49 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 04:47:16 +0000 (13:47 +0900)
PR lto/41550
* lto-plugin.c (parse_table_entry): Use xstrdup and xrealloc.
(translate): Likewise.
(all_symbols_read_handler): Likewise.
(claim_file_handler): Likewise.
(process_option): Likewise.
(add_output_files): Likewise.  Remove filename length limit.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158673 138bc75d-0d04-0410-961f-82ee72b054a4

lto-plugin/ChangeLog
lto-plugin/lto-plugin.c

index 6b51bea..42e5022 100644 (file)
@@ -1,3 +1,13 @@
+2010-04-23  Richard Guenther  <rguenther@suse.de>
+
+       PR lto/41550
+       * lto-plugin.c (parse_table_entry): Use xstrdup and xrealloc.
+       (translate): Likewise.
+       (all_symbols_read_handler): Likewise.
+       (claim_file_handler): Likewise.
+       (process_option): Likewise.
+       (add_output_files): Likewise.  Remove filename length limit.
+
 2010-04-02  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
        * Makefile.in: Regenerate.
index 4f0f833..d0266ff 100644 (file)
@@ -294,6 +294,12 @@ free_2 (void)
   if (arguments_file_name)
     free (arguments_file_name);
   arguments_file_name = NULL;
+
+  if (resolution_file)
+    {
+      free (resolution_file);
+      resolution_file = NULL;
+    }
 }
 
 /*  Writes the relocations to disk. */
@@ -304,7 +310,6 @@ write_resolution (void)
   unsigned int i;
   FILE *f;
 
-  check (resolution_file, LDPL_FATAL, "resolution file not specified");
   f = fopen (resolution_file, "w");
   check (f, LDPL_FATAL, "could not open file");
 
@@ -317,6 +322,7 @@ write_resolution (void)
       struct ld_plugin_symbol *syms = symtab->syms;
       unsigned j;
 
+      assert (syms);
       get_symbols (info->handle, symtab->nsyms, syms);
 
       fprintf (f, "%s %d\n", info->name, info->symtab.nsyms);
@@ -461,7 +467,7 @@ static enum ld_plugin_status
 all_symbols_read_handler (void)
 {
   unsigned i;
-  unsigned num_lto_args = num_claimed_files + lto_wrapper_num_args + 1;
+  unsigned num_lto_args = num_claimed_files + lto_wrapper_num_args + 2 + 1;
   char **lto_argv;
   const char **lto_arg_ptr;
   if (num_claimed_files == 0)
@@ -477,6 +483,8 @@ all_symbols_read_handler (void)
   lto_arg_ptr = (const char **) lto_argv;
   assert (lto_wrapper_argv);
 
+  resolution_file = make_temp_file ("");
+
   write_resolution ();
 
   free_1 ();
@@ -484,6 +492,9 @@ all_symbols_read_handler (void)
   for (i = 0; i < lto_wrapper_num_args; i++)
     *lto_arg_ptr++ = lto_wrapper_argv[i];
 
+  *lto_arg_ptr++ = "-fresolution";
+  *lto_arg_ptr++ = resolution_file;
+
   for (i = 0; i < num_claimed_files; i++)
     {
       struct plugin_file_info *info = &claimed_files[i];
@@ -532,10 +543,10 @@ cleanup_handler (void)
       check (t == 0, LDPL_FATAL, "could not unlink arguments file");
     }
 
-  for (i = 0; i < num_output_files; i++)
+  if (resolution_file)
     {
-      t = unlink (output_files[i]);
-      check (t == 0, LDPL_FATAL, "could not unlink output file");
+      t = unlink (resolution_file);
+      check (t == 0, LDPL_FATAL, "could not unlink resolution file");
     }
 
   for (i = 0; i < num_output_files; i++)
@@ -646,13 +657,10 @@ process_option (const char *option)
   else
     {
       int size;
-      char *opt = xstrdup (option);
       lto_wrapper_num_args += 1;
       size = lto_wrapper_num_args * sizeof (char *);
       lto_wrapper_argv = (char **) xrealloc (lto_wrapper_argv, size);
-      lto_wrapper_argv[lto_wrapper_num_args - 1] = opt;
-      if (strncmp (option, "-fresolution=", sizeof ("-fresolution=") - 1) == 0)
-       resolution_file = opt + sizeof ("-fresolution=") - 1;
+      lto_wrapper_argv[lto_wrapper_num_args - 1] = xstrdup(option);
     }
 }