This is the mail archive of the 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] Make LTO link pick up compile-time -g

Currently when you compile with -g -flto and then link without
repeating -g you'll get a binary that has all early debug
but none of the late because the driver doesn't pass -g along
to the LTRANS stage.

This has always been the case and as with other options
"guessing" correctly is hard.  The following goes a very
simple way of recording debug_info_level > DINFO_LEVEL_NONE
at compile-time into lto-opts.c as -g and picking that one
up in lto-wrapper.

So if _any_ object was compiled with debug-info (of any kind)
then we'll now get -g (sic!) enabled at LTRANS time.

The patch also re-instantiates the support for -g0 at link-time,
dropping the early created debug as well.

There are a gazillion different -g options we'd need to handle
if we try to do better like if all compile-time objects had
-gdwarf5 enabled then do so at link time.  But then there's
no change to consistently carry diferent settings to the link
stage if you consider inlining and partitioning.

So this is really a very poor mans solution that also might
uncover issues with -g0 at compile-time vs. -g at link-time
if there are mixed -g0/g TUs in the LTO link.

We've run into this "issue" with openSUSE packages now built
with -flto which in turn means some objects (those linked w/o -g)
ended up without the LTRANS debug part...

Any opinions welcome.


2019-09-09  Richard Biener  <>

	* lto-opts.c (lto_write_options): Stream -g when debug is enabled.
	* lto-wrapper.c (merge_and_complain): Pick up -g.
	(append_compiler_options): Likewise.
	(run_gcc): Re-instantiate handling -g0 at link-time.

Index: gcc/lto-opts.c
--- gcc/lto-opts.c	(revision 275454)
+++ gcc/lto-opts.c	(working copy)
@@ -94,6 +94,10 @@ lto_write_options (void)
 				      : "-fno-pie");
+  /* If debug info is enabled append -g.  */
+  if (debug_info_level > DINFO_LEVEL_NONE)
+    append_to_collect_gcc_options (&temporary_obstack, &first_p, "-g");
   /* Append options from target hook and store them to offload_lto section.  */
   if (lto_stream_offload_p)
Index: gcc/lto-wrapper.c
--- gcc/lto-wrapper.c	(revision 275454)
+++ gcc/lto-wrapper.c	(working copy)
@@ -265,6 +265,7 @@ merge_and_complain (struct cl_decoded_op
 	case OPT_fshow_column:
 	case OPT_fcommon:
 	case OPT_fgnu_tm:
+	case OPT_g:
 	  /* Do what the old LTO code did - collect exactly one option
 	     setting per OPT code, we pick the first we encounter.
 	     ???  This doesn't make too much sense, but when it doesn't
@@ -617,6 +618,7 @@ append_compiler_options (obstack *argv_o
 	case OPT_fopenacc:
 	case OPT_fopenacc_dim_:
 	case OPT_foffload_abi_:
+	case OPT_g:
 	case OPT_O:
 	case OPT_Ofast:
 	case OPT_Og:
@@ -1399,6 +1401,10 @@ run_gcc (unsigned argc, char *argv[])
 	  linker_output_rel = !strcmp (option->arg, "rel");
+	case OPT_g:
+	  /* Recognize -g0.  */
+	  skip_debug = option->arg && !strcmp (option->arg, "0");
+	  break;

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