Commit b5327e50 by Iain Sandoe Committed by Iain Sandoe

LTO-wrapper, don't pre-link early debug objects.

Pass them to the final link, the pre-link wasn't effective.
Make the temp filenames easier to follow.
Also save them in the CWD when save-temps is given.

2018-12-23  Iain Sandoe  <iain@sandoe.co.uk>

	* lto-wrapper.c (tool_cleanup): Don’t report ficticious temp files.
	(debug_objcopy): Improve temp filenames.  Append the early
	debug objects to the outfiles.  Remove the phase prelinking the
	early debug. Emit the early debug filenames for ld.

From-SVN: r267373
parent d590d99a
2018-12-23 Iain Sandoe <iain@sandoe.co.uk> 2018-12-23 Iain Sandoe <iain@sandoe.co.uk>
* lto-wrapper.c (tool_cleanup): Don’t report ficticious temp files.
(debug_objcopy): Improve temp filenames. Append the early
debug objects to the outfiles. Remove the phase prelinking the
early debug. Emit the early debug filenames for ld.
2018-12-23 Iain Sandoe <iain@sandoe.co.uk>
* config/i386/darwin.h (TARGET_ASM_OUTPUT_IDENT): New. * config/i386/darwin.h (TARGET_ASM_OUTPUT_IDENT): New.
2018-12-23 Iain Sandoe <iain@sandoe.co.uk> 2018-12-23 Iain Sandoe <iain@sandoe.co.uk>
...@@ -71,7 +71,8 @@ static char **output_names; ...@@ -71,7 +71,8 @@ static char **output_names;
static char **offload_names; static char **offload_names;
static char *offload_objects_file_name; static char *offload_objects_file_name;
static char *makefile; static char *makefile;
static char *debug_obj; static unsigned int num_deb_objs;
static const char **early_debug_object_names;
const char tool_name[] = "lto-wrapper"; const char tool_name[] = "lto-wrapper";
...@@ -90,8 +91,10 @@ tool_cleanup (bool) ...@@ -90,8 +91,10 @@ tool_cleanup (bool)
maybe_unlink (offload_objects_file_name); maybe_unlink (offload_objects_file_name);
if (makefile) if (makefile)
maybe_unlink (makefile); maybe_unlink (makefile);
if (debug_obj) if (early_debug_object_names)
maybe_unlink (debug_obj); for (i = 0; i < num_deb_objs; ++i)
if (early_debug_object_names[i])
maybe_unlink (early_debug_object_names[i]);
for (i = 0; i < nr; ++i) for (i = 0; i < nr; ++i)
{ {
maybe_unlink (input_names[i]); maybe_unlink (input_names[i]);
...@@ -1036,7 +1039,7 @@ find_and_merge_options (int fd, off_t file_offset, const char *prefix, ...@@ -1036,7 +1039,7 @@ find_and_merge_options (int fd, off_t file_offset, const char *prefix,
const char * const char *
debug_objcopy (const char *infile, bool rename) debug_objcopy (const char *infile, bool rename)
{ {
const char *outfile; char *outfile;
const char *errmsg; const char *errmsg;
int err; int err;
...@@ -1075,7 +1078,15 @@ debug_objcopy (const char *infile, bool rename) ...@@ -1075,7 +1078,15 @@ debug_objcopy (const char *infile, bool rename)
return NULL; return NULL;
} }
outfile = make_temp_file ("debugobjtem"); if (save_temps)
{
outfile = (char *) xmalloc (strlen (infile)
+ sizeof (".debug.temp.o") + 1);
strcpy (outfile, infile);
strcat (outfile, ".debug.temp.o");
}
else
outfile = make_temp_file (".debug.temp.o");
errmsg = simple_object_copy_lto_debug_sections (inobj, outfile, &err, rename); errmsg = simple_object_copy_lto_debug_sections (inobj, outfile, &err, rename);
if (errmsg) if (errmsg)
{ {
...@@ -1412,9 +1423,16 @@ cont1: ...@@ -1412,9 +1423,16 @@ cont1:
if (lto_mode == LTO_MODE_LTO) if (lto_mode == LTO_MODE_LTO)
{ {
flto_out = make_temp_file (".lto.o");
if (linker_output) if (linker_output)
obstack_ptr_grow (&argv_obstack, linker_output); {
obstack_ptr_grow (&argv_obstack, linker_output);
flto_out = (char *) xmalloc (strlen (linker_output)
+ sizeof (".lto.o") + 1);
strcpy (flto_out, linker_output);
strcat (flto_out, ".lto.o");
}
else
flto_out = make_temp_file (".lto.o");
obstack_ptr_grow (&argv_obstack, "-o"); obstack_ptr_grow (&argv_obstack, "-o");
obstack_ptr_grow (&argv_obstack, flto_out); obstack_ptr_grow (&argv_obstack, flto_out);
} }
...@@ -1487,95 +1505,39 @@ cont1: ...@@ -1487,95 +1505,39 @@ cont1:
argv_ptr = &new_argv[new_head_argc]; argv_ptr = &new_argv[new_head_argc];
fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true); fork_execute (new_argv[0], CONST_CAST (char **, new_argv), true);
/* Handle early generated debug information. At compile-time
we output early DWARF debug info into .gnu.debuglto_ prefixed
sections. LTRANS object DWARF debug info refers to that.
So we need to transfer the .gnu.debuglto_ sections to the final
link. Ideally the linker plugin interface would allow us to
not claim those sections and instruct the linker to keep
them, renaming them in the process. For now we extract and
rename those sections via a simple-object interface to produce
regular objects containing only the early debug info. We
then partially link those to a single early debug info object
and pass that as additional output back to the linker plugin. */
/* Prepare the partial link to gather the compile-time generated
debug-info into a single input for the final link. */
debug_obj = make_temp_file ("debugobj");
obstack_ptr_grow (&argv_obstack, collect_gcc);
for (i = 1; i < decoded_options_count; ++i)
{
/* Retain linker choice and -B. */
if (decoded_options[i].opt_index == OPT_B
|| decoded_options[i].opt_index == OPT_fuse_ld_bfd
|| decoded_options[i].opt_index == OPT_fuse_ld_gold)
append_linker_options (&argv_obstack, &decoded_options[i-1], 2);
/* Retain all target options, this preserves -m32 for example. */
if (cl_options[decoded_options[i].opt_index].flags & CL_TARGET)
append_linker_options (&argv_obstack, &decoded_options[i-1], 2);
/* Recognize -g0. */
if (decoded_options[i].opt_index == OPT_g
&& strcmp (decoded_options[i].arg, "0") == 0)
skip_debug = true;
}
obstack_ptr_grow (&argv_obstack, "-r");
obstack_ptr_grow (&argv_obstack, "-nostdlib");
obstack_ptr_grow (&argv_obstack, "-o");
obstack_ptr_grow (&argv_obstack, debug_obj);
/* Copy the early generated debug info from the objects to temporary /* Copy the early generated debug info from the objects to temporary
files and append those to the partial link commandline. */ files and append those to the partial link commandline. */
n_debugobj = 0; n_debugobj = 0;
early_debug_object_names = NULL;
if (! skip_debug) if (! skip_debug)
for (i = 0; i < ltoobj_argc; ++i)
{
const char *tem;
if ((tem = debug_objcopy (ltoobj_argv[i], !linker_output_rel)))
{
obstack_ptr_grow (&argv_obstack, tem);
n_debugobj++;
}
}
/* Link them all into a single object. Ideally this would reduce
disk space usage mainly due to .debug_str merging but unfortunately
GNU ld doesn't perform this with -r. */
if (n_debugobj)
{ {
obstack_ptr_grow (&argv_obstack, NULL); early_debug_object_names = XCNEWVEC (const char *, ltoobj_argc+ 1);
const char **debug_link_argv = XOBFINISH (&argv_obstack, const char **); num_deb_objs = ltoobj_argc;
fork_execute (debug_link_argv[0], for (i = 0; i < ltoobj_argc; ++i)
CONST_CAST (char **, debug_link_argv), false);
/* And dispose the temporaries. */
for (i = 0; debug_link_argv[i]; ++i)
;
for (--i; i > 0; --i)
{ {
if (strcmp (debug_link_argv[i], debug_obj) == 0) const char *tem;
break; if ((tem = debug_objcopy (ltoobj_argv[i], !linker_output_rel)))
maybe_unlink (debug_link_argv[i]); {
early_debug_object_names[i] = tem;
n_debugobj++;
}
} }
} }
else
{
unlink_if_ordinary (debug_obj);
free (debug_obj);
debug_obj = NULL;
skip_debug = true;
}
if (lto_mode == LTO_MODE_LTO) if (lto_mode == LTO_MODE_LTO)
{ {
printf ("%s\n", flto_out); printf ("%s\n", flto_out);
if (!skip_debug) if (!skip_debug)
{ {
printf ("%s\n", debug_obj); for (i = 0; i < ltoobj_argc; ++i)
free (debug_obj); if (early_debug_object_names[i] != NULL)
debug_obj = NULL; printf ("%s\n", early_debug_object_names[i]);
} }
/* These now belong to collect2. */
free (flto_out); free (flto_out);
flto_out = NULL; flto_out = NULL;
free (early_debug_object_names);
early_debug_object_names = NULL;
} }
else else
{ {
...@@ -1739,21 +1701,24 @@ cont: ...@@ -1739,21 +1701,24 @@ cont:
for (i = 0; i < nr; ++i) for (i = 0; i < nr; ++i)
maybe_unlink (input_names[i]); maybe_unlink (input_names[i]);
} }
if (!skip_debug)
{
printf ("%s\n", debug_obj);
free (debug_obj);
debug_obj = NULL;
}
for (i = 0; i < nr; ++i) for (i = 0; i < nr; ++i)
{ {
fputs (output_names[i], stdout); fputs (output_names[i], stdout);
putc ('\n', stdout); putc ('\n', stdout);
free (input_names[i]); free (input_names[i]);
} }
if (!skip_debug)
{
for (i = 0; i < ltoobj_argc; ++i)
if (early_debug_object_names[i] != NULL)
printf ("%s\n", early_debug_object_names[i]);
}
nr = 0; nr = 0;
free (ltrans_priorities); free (ltrans_priorities);
free (output_names); free (output_names);
output_names = NULL;
free (early_debug_object_names);
early_debug_object_names = NULL;
free (input_names); free (input_names);
free (list_option_full); free (list_option_full);
obstack_free (&env_obstack, NULL); obstack_free (&env_obstack, NULL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment