OSDN Git Service

2009-11-12 Rafael Avila de Espindola <espindola@google.com>
authorespindola <espindola@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Nov 2009 14:01:49 +0000 (14:01 +0000)
committerespindola <espindola@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Nov 2009 14:01:49 +0000 (14:01 +0000)
* lto-plugin.c (write_resolution): Assume resolution_file is set.
Print the symbol name.
(all_symbols_read_handler): Create a resolution file.
Pass it to gcc.
(cleanup_handler): Remove the resolution file.
(process_option): Drop the -resolution option.

2009-11-12  Rafael Avila de Espindola  <espindola@google.com>

* lang.opt (fresolution): Renamed from resolution.
* lto-lang.c (lto_handle_option): Handle new option name.
* lto.c (lto_resolution_read): Add more checks. Discard rest of line.

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

gcc/lto/ChangeLog
gcc/lto/lang.opt
gcc/lto/lto-lang.c
gcc/lto/lto.c
lto-plugin/ChangeLog
lto-plugin/lto-plugin.c

index 3334de7..6cb9ff4 100644 (file)
@@ -1,3 +1,9 @@
+2009-11-12  Rafael Avila de Espindola  <espindola@google.com>
+
+       * lang.opt (fresolution): Renamed from resolution.
+       * lto-lang.c (lto_handle_option): Handle new option name.
+       * lto.c (lto_resolution_read): Add more checks. Discard rest of line.
+
 2009-11-04  Richard Guenther  <rguenther@suse.de>
             Rafael Avila de Espindola  <espindola@google.com>
 
index f383d7c..a8b7916 100644 (file)
@@ -36,7 +36,7 @@ fwpa
 LTO Report Var(flag_wpa) Optimization
 Run the link-time optimizer in whole program analysis (WPA) mode.
 
-resolution
+fresolution
 LTO Separate
 The resolution file
 
index 04d4230..486338f 100644 (file)
@@ -622,7 +622,7 @@ lto_handle_option (size_t scode, const char *arg, int value ATTRIBUTE_UNUSED)
 
   switch (code)
     {
-    case OPT_resolution:
+    case OPT_fresolution:
       resolution_file_name = arg;
       result = 1;
       break;
index d8c49cf..323f6b3 100644 (file)
@@ -284,6 +284,7 @@ lto_resolution_read (FILE *resolution, const char *file_name)
 
   for (i = 0; i < num_symbols; i++)
     {
+      int t;
       unsigned index;
       char r_str[27];
       enum ld_plugin_symbol_resolution r;
@@ -291,7 +292,9 @@ lto_resolution_read (FILE *resolution, const char *file_name)
       unsigned int lto_resolution_str_len =
        sizeof (lto_resolution_str) / sizeof (char *);
 
-      fscanf (resolution, "%u %26s", &index, r_str);
+      t = fscanf (resolution, "%u %26s %*[^\n]\n", &index, r_str);
+      if (t != 2)
+        internal_error ("Invalid line in the resolution file.");
       if (index > max_index)
        max_index = index;
 
@@ -303,9 +306,8 @@ lto_resolution_read (FILE *resolution, const char *file_name)
              break;
            }
        }
-      if (j >= lto_resolution_str_len)
-       internal_error ("tried to read past the end of the linker resolution "
-                       "file");
+      if (j == lto_resolution_str_len)
+       internal_error ("Invalid resolution in the resolution file.");
 
       VEC_safe_grow_cleared (ld_plugin_symbol_resolution_t, heap, ret,
                             index + 1);
index 27713ca..d95cf05 100644 (file)
@@ -1,3 +1,12 @@
+2009-11-12  Rafael Avila de Espindola  <espindola@google.com>
+
+       * lto-plugin.c (write_resolution): Assume resolution_file is set.
+       Print the symbol name.
+       (all_symbols_read_handler): Create a resolution file.
+       Pass it to gcc.
+       (cleanup_handler): Remove the resolution file.
+       (process_option): Drop the -resolution option.
+
 2009-11-05  Rafael Avila de Espindola  <espindola@google.com>
 
        * lto-plugin.c (temp_obj_dir_name): Remove.
index e8e88cb..8cbafbc 100644 (file)
@@ -310,9 +310,6 @@ write_resolution (void)
   unsigned int i;
   FILE *f;
 
-  if (!resolution_file)
-    return;
-
   f = fopen (resolution_file, "w");
   check (f, LDPL_FATAL, "could not open file");
 
@@ -334,7 +331,7 @@ write_resolution (void)
        {
          uint32_t slot = symtab->slots[j];
          unsigned int resolution = syms[j].resolution;
-         fprintf (f, "%d %s\n", slot, lto_resolution_str[resolution]);
+         fprintf (f, "%d %s %s\n", slot, lto_resolution_str[resolution], syms[j].name);
        }
     }
   fclose (f);
@@ -452,7 +449,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)
@@ -468,6 +465,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 ();
@@ -475,6 +474,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];
@@ -522,6 +524,12 @@ cleanup_handler (void)
       check (t == 0, LDPL_FATAL, "could not unlink arguments file");
     }
 
+  if (resolution_file)
+    {
+      t = unlink (resolution_file);
+      check (t == 0, LDPL_FATAL, "could not unlink resolution file");
+    }
+
   free_2 ();
   return LDPS_OK;
 }
@@ -613,10 +621,6 @@ process_option (const char *option)
     debug = 1;
   else if (strcmp (option, "-nop") == 0)
     nop = 1;
-  else if (!strncmp (option, "-resolution=", strlen("-resolution=")))
-    {
-      resolution_file = strdup (option + strlen("-resolution="));
-    }
   else if (!strncmp (option, "-pass-through=", strlen("-pass-through=")))
     {
       num_pass_through_items++;