diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 3334de7eb95..6cb9ff43732 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,9 @@ +2009-11-12 Rafael Avila de Espindola + + * 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 Rafael Avila de Espindola diff --git a/gcc/lto/lang.opt b/gcc/lto/lang.opt index f383d7ce18a..a8b791663eb 100644 --- a/gcc/lto/lang.opt +++ b/gcc/lto/lang.opt @@ -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 diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c index 04d42307656..486338f6b66 100644 --- a/gcc/lto/lto-lang.c +++ b/gcc/lto/lto-lang.c @@ -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; diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index d8c49cf729f..323f6b34006 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -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); diff --git a/lto-plugin/ChangeLog b/lto-plugin/ChangeLog index 27713cad3d9..d95cf05d9d0 100644 --- a/lto-plugin/ChangeLog +++ b/lto-plugin/ChangeLog @@ -1,3 +1,12 @@ +2009-11-12 Rafael Avila de Espindola + + * 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 * lto-plugin.c (temp_obj_dir_name): Remove. diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c index e8e88cbb3c7..8cbafbc46cd 100644 --- a/lto-plugin/lto-plugin.c +++ b/lto-plugin/lto-plugin.c @@ -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++;