From 5cd0e96b0e8248436fa6f743feb057114abd2f62 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 7 May 2010 15:53:40 +0000 Subject: [PATCH] re PR lto/43857 (-fresolution causes an ICE) 2010-05-07 Richard Guenther * 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=. From-SVN: r159159 --- gcc/ChangeLog | 7 +++++++ gcc/gcc.c | 37 +++++++++++++++++++------------------ gcc/lto/ChangeLog | 8 ++++++++ gcc/lto/lang.opt | 4 ++-- gcc/lto/lto-lang.c | 2 +- lto-plugin/ChangeLog | 8 ++++++++ lto-plugin/lto-plugin.c | 25 ++++++------------------- 7 files changed, 51 insertions(+), 40 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d334f639f51c..486a7137104d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-05-07 Richard Guenther + + * 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. + 2010-05-07 Richard Guenther * lto-wrapper.c (DUMPBASE_SUFFIX): Define. diff --git a/gcc/gcc.c b/gcc/gcc.c index a25077e24f76..7e4343de4ac4 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -782,6 +782,7 @@ proper position among the other output files. */ -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%*} \ @@ -2044,6 +2045,23 @@ static int signal_count; /* 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. */ @@ -2081,7 +2099,7 @@ store_arg (const char *arg, int delete_always, int delete_failure) if (strcmp (arg, "-o") == 0) have_o_argbuf_index = argbuf_index; if (delete_always || delete_failure) - record_temp_file (arg, delete_always, delete_failure); + record_temp_file (temp_filename, delete_always, delete_failure); } /* Load specs from a file name named FILENAME, replacing occurrences of @@ -2384,23 +2402,6 @@ read_specs (const char *filename, int main_p) /* 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 diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 5bbb2e31780c..2496d66d6238 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,11 @@ +2010-05-07 Richard Guenther + + PR lto/43857 + PR lto/43371 + * lang.opt (fresolution): Change to ... + (fresolution=): ... this. + * lto-lang.c (lto_handle_option): Adjust. + 2010-05-07 Richard Guenther * lto.c (DUMPBASE_SUFFIX): Remove. diff --git a/gcc/lto/lang.opt b/gcc/lto/lang.opt index a8b791663eb6..53ab8e808309 100644 --- a/gcc/lto/lang.opt +++ b/gcc/lto/lang.opt @@ -36,8 +36,8 @@ fwpa LTO Report Var(flag_wpa) Optimization Run the link-time optimizer in whole program analysis (WPA) mode. -fresolution -LTO Separate +fresolution= +LTO Joined The resolution file ; This comment is to ensure we retain the blank line above. diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c index 4c9072153acd..72149082d0a3 100644 --- a/gcc/lto/lto-lang.c +++ b/gcc/lto/lto-lang.c @@ -624,7 +624,7 @@ lto_handle_option (size_t scode, const char *arg, switch (code) { - case OPT_fresolution: + case OPT_fresolution_: resolution_file_name = arg; result = 1; break; diff --git a/lto-plugin/ChangeLog b/lto-plugin/ChangeLog index 338f58ce332a..df771284e673 100644 --- a/lto-plugin/ChangeLog +++ b/lto-plugin/ChangeLog @@ -1,3 +1,11 @@ +2010-05-07 Richard Guenther + + * 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=. + 2010-05-04 Ralf Wildenhues PR other/43620 diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c index d0266ffee6cd..cb785c428a8a 100644 --- a/lto-plugin/lto-plugin.c +++ b/lto-plugin/lto-plugin.c @@ -294,12 +294,6 @@ 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. */ @@ -310,6 +304,7 @@ 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"); @@ -467,7 +462,7 @@ static enum ld_plugin_status all_symbols_read_handler (void) { unsigned i; - unsigned num_lto_args = num_claimed_files + lto_wrapper_num_args + 2 + 1; + 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) @@ -483,8 +478,6 @@ 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 (); @@ -492,9 +485,6 @@ 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]; @@ -543,12 +533,6 @@ 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"); - } - for (i = 0; i < num_output_files; i++) { t = unlink (output_files[i]); @@ -657,10 +641,13 @@ 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] = xstrdup(option); + lto_wrapper_argv[lto_wrapper_num_args - 1] = opt; + if (strncmp (option, "-fresolution=", sizeof ("-fresolution=") - 1) == 0) + resolution_file = opt + sizeof ("-fresolution=") - 1; } }