summaryrefslogtreecommitdiff
path: root/lto-plugin
diff options
context:
space:
mode:
authoriverbin <iverbin@138bc75d-0d04-0410-961f-82ee72b054a4>2014-12-09 22:44:16 +0000
committeriverbin <iverbin@138bc75d-0d04-0410-961f-82ee72b054a4>2014-12-09 22:44:16 +0000
commite02afbb7ce6c8b6f74e37feda9704335e4e6cf44 (patch)
treec794771581c3a03e67a31e87a7be71285b56b08d /lto-plugin
parent5573be4f7d0e63bbfec395c15988d59c4ca11e06 (diff)
gcc/
* lto-wrapper.c (compile_offload_image): Start processing in_argv from 0 instead of 1. (run_gcc): Put offload objects into offload_argv, put LTO objects and possible preceding arguments into lto_argv. Pass offload_argv to compile_images_for_offload_targets instead of argv. Use lto_argv for LTO recompilation instead of argv. lto-plugin/ * lto-plugin.c (offload_files, num_offload_files): New static variables. (free_1): Use arguments instead of global variables. (free_2): Free offload_files. (all_symbols_read_handler): Add names from offload_files to lto-wrapper arguments. (claim_file_handler): Do not add file to claimed_files if it contains offload sections without LTO sections. Add it to offload_files instead. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218543 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'lto-plugin')
-rw-r--r--lto-plugin/ChangeLog10
-rw-r--r--lto-plugin/lto-plugin.c65
2 files changed, 61 insertions, 14 deletions
diff --git a/lto-plugin/ChangeLog b/lto-plugin/ChangeLog
index 5307e478ef3d..e8ec05b40411 100644
--- a/lto-plugin/ChangeLog
+++ b/lto-plugin/ChangeLog
@@ -1,3 +1,13 @@
+2014-12-09 Ilya Verbin <ilya.verbin@intel.com>
+
+ * lto-plugin.c (offload_files, num_offload_files): New static variables.
+ (free_1): Use arguments instead of global variables.
+ (free_2): Free offload_files.
+ (all_symbols_read_handler): Add names from offload_files to lto-wrapper
+ arguments.
+ (claim_file_handler): Do not add file to claimed_files if it contains
+ offload sections without LTO sections. Add it to offload_files instead.
+
2014-11-21 H.J. Lu <hongjiu.lu@intel.com>
PR bootstrap/63784
diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c
index fb6555daf911..8d957402ba66 100644
--- a/lto-plugin/lto-plugin.c
+++ b/lto-plugin/lto-plugin.c
@@ -152,6 +152,9 @@ static ld_plugin_add_symbols add_symbols;
static struct plugin_file_info *claimed_files = NULL;
static unsigned int num_claimed_files = 0;
+static struct plugin_file_info *offload_files = NULL;
+static unsigned int num_offload_files = 0;
+
static char **output_files = NULL;
static unsigned int num_output_files = 0;
@@ -313,12 +316,12 @@ translate (char *data, char *end, struct plugin_symtab *out)
resolution. */
static void
-free_1 (void)
+free_1 (struct plugin_file_info *files, unsigned num_files)
{
unsigned int i;
- for (i = 0; i < num_claimed_files; i++)
+ for (i = 0; i < num_files; i++)
{
- struct plugin_file_info *info = &claimed_files[i];
+ struct plugin_file_info *info = &files[i];
struct plugin_symtab *symtab = &info->symtab;
unsigned int j;
for (j = 0; j < symtab->nsyms; j++)
@@ -346,6 +349,14 @@ free_2 (void)
free (info->name);
}
+ for (i = 0; i < num_offload_files; i++)
+ {
+ struct plugin_file_info *info = &offload_files[i];
+ struct plugin_symtab *symtab = &info->symtab;
+ free (symtab->aux);
+ free (info->name);
+ }
+
for (i = 0; i < num_output_files; i++)
free (output_files[i]);
free (output_files);
@@ -354,6 +365,10 @@ free_2 (void)
claimed_files = NULL;
num_claimed_files = 0;
+ free (offload_files);
+ offload_files = NULL;
+ num_offload_files = 0;
+
free (arguments_file_name);
arguments_file_name = NULL;
}
@@ -608,10 +623,11 @@ 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 + num_offload_files + lto_wrapper_num_args + 1;
char **lto_argv;
const char **lto_arg_ptr;
- if (num_claimed_files == 0)
+ if (num_claimed_files + num_offload_files == 0)
return LDPS_OK;
if (nop)
@@ -626,7 +642,8 @@ all_symbols_read_handler (void)
write_resolution ();
- free_1 ();
+ free_1 (claimed_files, num_claimed_files);
+ free_1 (offload_files, num_offload_files);
for (i = 0; i < lto_wrapper_num_args; i++)
*lto_arg_ptr++ = lto_wrapper_argv[i];
@@ -638,6 +655,13 @@ all_symbols_read_handler (void)
*lto_arg_ptr++ = info->name;
}
+ for (i = 0; i < num_offload_files; i++)
+ {
+ struct plugin_file_info *info = &offload_files[i];
+
+ *lto_arg_ptr++ = info->name;
+ }
+
*lto_arg_ptr++ = NULL;
exec_lto_wrapper (lto_argv);
@@ -949,16 +973,29 @@ claim_file_handler (const struct ld_plugin_input_file *file, int *claimed)
if (obj.found > 1)
resolve_conflicts (&lto_file.symtab, &lto_file.conflicts);
- status = add_symbols (file->handle, lto_file.symtab.nsyms,
- lto_file.symtab.syms);
- check (status == LDPS_OK, LDPL_FATAL, "could not add symbols");
+ if (obj.found > 0)
+ {
+ status = add_symbols (file->handle, lto_file.symtab.nsyms,
+ lto_file.symtab.syms);
+ check (status == LDPS_OK, LDPL_FATAL, "could not add symbols");
+
+ num_claimed_files++;
+ claimed_files =
+ xrealloc (claimed_files,
+ num_claimed_files * sizeof (struct plugin_file_info));
+ claimed_files[num_claimed_files - 1] = lto_file;
+ }
+
+ if (obj.found == 0 && obj.offload == 1)
+ {
+ num_offload_files++;
+ offload_files =
+ xrealloc (offload_files,
+ num_offload_files * sizeof (struct plugin_file_info));
+ offload_files[num_offload_files - 1] = lto_file;
+ }
*claimed = 1;
- num_claimed_files++;
- claimed_files =
- xrealloc (claimed_files,
- num_claimed_files * sizeof (struct plugin_file_info));
- claimed_files[num_claimed_files - 1] = lto_file;
goto cleanup;