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] Move resolution file handling to gcc.c, fix PRs 43857, 43371


This moves handling of the resolution file to the gcc driver so that
-save-temps automatically preserves it.  I changed how -fresolution
is tied to its argument to also fix the mentioned PRs.  I had
to fix store_arg to queue the temporary file for deletion instead
of the whole argument (I didn't find a spec that would always
generate a temporary file like /tmp/ccXXXXX, so we now have
resolution files like 1.res).

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

I verified that I now can cut&paste and re-run all lto1 commands
after re-running WPA phase (that I can now cut&paste manually)
that -fwhopr/-flto -v -save-temps -fuse-linker-plugin outputs
and that the resolution file is still deleted w/o -save-temps.

Probably lto-plugin needlessly deletes the wpa objects as that is
done by lto-wrapper already.  That's for a followup to (maybe) fix.

Tested ontop of the previous patch to move LTRANS driving to lto-wrapper.

Ok for trunk?

Thanks,
Richard.

2010-05-06  Richard Guenther <rguenther@suse.de>

	* gcc.c (LINK_COMMAND_SPEC): Provide a resolution file to
	the linker plugin.
	(store_arg): Queue temp_filename for deletion instead of
	the whole argument.

	lto/
	PR lto/43857
	PR lto/43371
	* lang.opt (fresolution): Change to ...
	(fresolution=): ... this.
	* lto-lang.c (lto_handle_option): Adjust.

	lto-plugin/
	* lto-plugin.c (free_2): Do not free resolution_file.
	(write_resolution): Check that we were passed a resolution file.
	(all_symbols_read_handler): Adjust.
	(cleanup_handler): Do not remove the resolution file.
	(process_option): Handle -fresolution=.

Index: gcc/gcc.c
===================================================================
*** gcc/gcc.c	(revision 159097)
--- gcc/gcc.c	(working copy)
*************** proper position among the other output f
*** 782,787 ****
--- 782,788 ----
      -plugin %(linker_plugin_file) \
      -plugin-opt=%(lto_wrapper) \
      -plugin-opt=%(lto_gcc) \
+     -plugin-opt=-fresolution=%u.res \
      %{static|static-libgcc:-plugin-opt=-pass-through=%(lto_libgcc)}	\
      %{static:-plugin-opt=-pass-through=-lc}	\
      %{O*:-plugin-opt=-O%*} \
*************** static int signal_count;
*** 2044,2049 ****
--- 2045,2067 ----
  /* Name with which this program was invoked.  */
  
  static const char *programname;
+ 
+ /* This is the common prefix we use to make temp file names.
+    It is chosen once for each run of this program.
+    It is substituted into a spec by %g or %j.
+    Thus, all temp file names contain this prefix.
+    In practice, all temp file names start with this prefix.
+ 
+    This prefix comes from the envvar TMPDIR if it is defined;
+    otherwise, from the P_tmpdir macro if that is defined;
+    otherwise, in /usr/tmp or /tmp;
+    or finally the current directory if all else fails.  */
+ 
+ static const char *temp_filename;
+ 
+ /* Length of the prefix.  */
+ 
+ static int temp_filename_length;
  
  /* Allocate the argument vector.  */
  
*************** store_arg (const char *arg, int delete_a
*** 2081,2087 ****
    if (strcmp (arg, "-o") == 0)
      have_o_argbuf_index = argbuf_index;
    if (delete_always || delete_failure)
!     record_temp_file (arg, delete_always, delete_failure);
  }
  
  /* Load specs from a file name named FILENAME, replacing occurrences of
--- 2099,2105 ----
    if (strcmp (arg, "-o") == 0)
      have_o_argbuf_index = argbuf_index;
    if (delete_always || delete_failure)
!     record_temp_file (temp_filename, delete_always, delete_failure);
  }
  
  /* Load specs from a file name named FILENAME, replacing occurrences of
*************** read_specs (const char *filename, int ma
*** 2384,2406 ****
  /* Record the names of temporary files we tell compilers to write,
     and delete them at the end of the run.  */
  
- /* This is the common prefix we use to make temp file names.
-    It is chosen once for each run of this program.
-    It is substituted into a spec by %g or %j.
-    Thus, all temp file names contain this prefix.
-    In practice, all temp file names start with this prefix.
- 
-    This prefix comes from the envvar TMPDIR if it is defined;
-    otherwise, from the P_tmpdir macro if that is defined;
-    otherwise, in /usr/tmp or /tmp;
-    or finally the current directory if all else fails.  */
- 
- static const char *temp_filename;
- 
- /* Length of the prefix.  */
- 
- static int temp_filename_length;
- 
  /* Define the list of temporary files to delete.  */
  
  struct temp_file
--- 2402,2407 ----
Index: gcc/lto/lang.opt
===================================================================
*** gcc/lto/lang.opt	(revision 159097)
--- gcc/lto/lang.opt	(working copy)
*************** fwpa
*** 36,43 ****
  LTO Report Var(flag_wpa) Optimization
  Run the link-time optimizer in whole program analysis (WPA) mode.
  
! fresolution
! LTO Separate
  The resolution file
  
  ; This comment is to ensure we retain the blank line above.
--- 36,43 ----
  LTO Report Var(flag_wpa) Optimization
  Run the link-time optimizer in whole program analysis (WPA) mode.
  
! fresolution=
! LTO Joined
  The resolution file
  
  ; This comment is to ensure we retain the blank line above.
Index: gcc/lto/lto-lang.c
===================================================================
*** gcc/lto/lto-lang.c	(revision 159097)
--- gcc/lto/lto-lang.c	(working copy)
*************** lto_handle_option (size_t scode, const c
*** 623,629 ****
  
    switch (code)
      {
!     case OPT_fresolution:
        resolution_file_name = arg;
        result = 1;
        break;
--- 623,629 ----
  
    switch (code)
      {
!     case OPT_fresolution_:
        resolution_file_name = arg;
        result = 1;
        break;
Index: lto-plugin/lto-plugin.c
===================================================================
*** lto-plugin/lto-plugin.c	(revision 159097)
--- lto-plugin/lto-plugin.c	(working copy)
*************** free_2 (void)
*** 294,305 ****
    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. */
--- 294,299 ----
*************** write_resolution (void)
*** 310,315 ****
--- 304,310 ----
    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");
  
*************** static enum ld_plugin_status
*** 467,473 ****
  all_symbols_read_handler (void)
  {
    unsigned i;
!   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)
--- 462,468 ----
  all_symbols_read_handler (void)
  {
    unsigned i;
!   unsigned num_lto_args = num_claimed_files + lto_wrapper_num_args + 1;
    char **lto_argv;
    const char **lto_arg_ptr;
    if (num_claimed_files == 0)
*************** all_symbols_read_handler (void)
*** 483,490 ****
    lto_arg_ptr = (const char **) lto_argv;
    assert (lto_wrapper_argv);
  
-   resolution_file = make_temp_file ("");
- 
    write_resolution ();
  
    free_1 ();
--- 478,483 ----
*************** all_symbols_read_handler (void)
*** 492,500 ****
    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];
--- 485,490 ----
*************** cleanup_handler (void)
*** 543,554 ****
        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");
-     }
- 
    for (i = 0; i < num_output_files; i++)
      {
        t = unlink (output_files[i]);
--- 533,538 ----
*************** process_option (const char *option)
*** 657,666 ****
    else
      {
        int size;
        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] = xstrdup(option);
      }
  }
  
--- 641,653 ----
    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;
      }
  }
  


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