[PATCH] Fix PR84645, -flto -g0 vs. -g issue

Richard Biener rguenther@suse.de
Thu Mar 1 11:10:00 GMT 2018


The following fixes an ICE that occurs when with -flto you disable
debug at compile-time but enable it at link-time.  Then we end up
adding a second DW_AT_type to VLA DIEs - the following guards against
this.

Bootstrap and regtest running on x86_64-unknown-linux-gnu, testing in
progress.

Darwin support might be the vehicle exercising this -g0 vs. -g
combination a lot...

Richard.

2018-03-01  Richard Biener  <rguenther@suse.de>

	PR debug/84645
	* dwarf2out.c (gen_variable_die): Properly handle late VLA
	type annotation with LTO when debug was disabled at compile-time.

	* gfortran.dg/lto/pr84645_0.f90: New testcase.

Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 258097)
+++ gcc/dwarf2out.c	(working copy)
@@ -23527,10 +23527,12 @@ gen_variable_die (tree decl, tree origin
 
 	  /* ???  In LTRANS we cannot annotate early created variably
 	     modified type DIEs without copying them and adjusting all
-	     references to them.  Thus we dumped them again, also add a
-	     reference to them.  */
+	     references to them.  Thus we dumped them again.  Also add a
+	     reference to them but beware of -g0 compile and -g link
+	     in which case the reference will be already present.  */
 	  tree type = TREE_TYPE (decl_or_origin);
 	  if (in_lto_p
+	      && ! get_AT (var_die, DW_AT_type)
 	      && variably_modified_type_p
 		   (type, decl_function_context (decl_or_origin)))
 	    {
Index: gcc/testsuite/gfortran.dg/lto/pr84645_0.f90
===================================================================
--- gcc/testsuite/gfortran.dg/lto/pr84645_0.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/lto/pr84645_0.f90	(working copy)
@@ -0,0 +1,17 @@
+! { dg-lto-do link }
+! { dg-lto-options { { -flto -g0 } } }
+! { dg-extra-ld-options { -g } }
+program nml_test
+  implicit none
+  type t
+    integer :: c1
+    integer :: c2(3)
+  end type t
+  call test2(2) 
+contains
+  subroutine test2(n)
+    integer :: n
+    type(t) :: x12(n)
+    namelist /nml2/ x12
+  end subroutine test2
+end program nml_test



More information about the Gcc-patches mailing list