Fix PR50602

Message ID Pine.LNX.4.64.1205041302310.23071@jbgna.fhfr.qr
State New
Headers show

Commit Message

Richard Biener May 4, 2012, 11:05 a.m.
-freg-struct-return and -fpcc-struct-return are two common ABI
options which have to be consistent in all input files when
doing LTO (inconsistencies may lead to ICEs and "miscompiles").
Their setting needs to be determined from the linker inputs
and its best to ignore those on the linker command line
(unless we want to bother diagnosing mismatches there).

The following implements this (we'll have a hard time diagnosing
frontend / target specific ABI option mismatches - at least without
a new magic option file annotation).

I'll commit this after some testing.


2012-05-04  Richard Guenther  <>

	PR lto/50602
	* lto-wrapper.c (merge_and_complain): Complain about mismatches
	of -freg-struct-return and -fpcc-struct-return.
	(run_gcc): Pass through -freg-struct-return and -fpcc-struct-return
	from the input file options and ignore those from the link
	command line.


Index: gcc/lto-wrapper.c
--- gcc/lto-wrapper.c	(revision 187148)
+++ gcc/lto-wrapper.c	(working copy)
@@ -414,6 +414,16 @@  merge_and_complain (struct cl_decoded_op
 	  if (j == *decoded_options_count)
 	    append_option (decoded_options, decoded_options_count, foption);
+	case OPT_freg_struct_return:
+	case OPT_fpcc_struct_return:
+	  for (j = 0; j < *decoded_options_count; ++j)
+	    if ((*decoded_options)[j].opt_index == foption->opt_index)
+	      break;
+	  if (j == *decoded_options_count)
+	    fatal ("Option %s not used consistently in all LTO input files",
+		   foption->orig_option_with_args_text);
+	  break;
@@ -558,6 +568,8 @@  run_gcc (unsigned argc, char *argv[])
 	case OPT_fcommon:
 	case OPT_fexceptions:
 	case OPT_fgnu_tm:
+	case OPT_freg_struct_return:
+	case OPT_fpcc_struct_return:
@@ -619,6 +631,12 @@  run_gcc (unsigned argc, char *argv[])
 	  /* We've handled these LTO options, do not pass them on.  */
+	case OPT_freg_struct_return:
+	case OPT_fpcc_struct_return:
+	  /* Ignore these, they are determined by the input files.
+	     ???  We fail to diagnose a possible mismatch here.  */
+	  continue;