public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] d: Fix ICE in in force_decl_die, at dwarf2out.c with -gdwarf-2 -gstrict-dwarf [PR98067]
@ 2020-12-16  0:15 Iain Buclaw
  2020-12-16 21:54 ` Jason Merrill
  0 siblings, 1 reply; 2+ messages in thread
From: Iain Buclaw @ 2020-12-16  0:15 UTC (permalink / raw)
  To: gcc-patches; +Cc: iain, jason, Iain Buclaw

Hi,

This patch fixes an ICE in dwarf2out.c that occurs when compiling a
selective import declaration in D with strict dwarf2 in effect.

Manifest constants in D are represented as CONST_DECLs, which can be
imported from one module to another.  However, when compiling on strict
dwarf2 targets such as *-*darwin10, importing CONST_DECLs cannot be
represented in debug as D did not exist as an AT_language until dwarf3,
and the only available fallback being DW_LANG_C.  As CONST_DECLs are
treated as enumerators in C, and not outputted individually in
gen_decl_die, this causes an internal error in force_decl_die to occur.

To handle this, similar to other places in dwarf2out, if a CONST_DECL is
seen in dwarf2out_imported_module_or_decl_1, then we simply return early
if the language is not one of Ada, D, or Fortran.

The new files and tests added are boilerplate for introducing
gdc.dg/debug and gdc.dg/debug/dwarf2 test directories, as well as two
extra tests - langdw2.d and langdw3.d - that verify that DW_LANG_D is
set except for strict dwarf2.

This has been bootstrapped, and the D testsuite regression tested on
x86_64-linux-gnu/-m32/-mx32.

OK for mainline?

Iain.

---
gcc/ChangeLog:

	PR d/98067
	* dwarf2out.c (dwarf2out_imported_module_or_decl_1): Handle
	  CONST_DECL only if is_fortran, is_ada, or is_dlang.

gcc/testsuite/ChangeLog:

	PR d/98067
	* gdc.dg/debug/debug.exp: New test.
	* gdc.dg/debug/dwarf2/dwarf2.exp: New test.
	* gdc.dg/debug/dwarf2/imports/pr98067.d: New test.
	* gdc.dg/debug/dwarf2/langdw2.d: New test.
	* gdc.dg/debug/dwarf2/langdw3.d: New test.
	* gdc.dg/debug/dwarf2/pr98067.d: New test.
	* gdc.dg/debug/trivial.d: New test.
---
 gcc/dwarf2out.c                               |  7 ++++
 gcc/testsuite/gdc.dg/debug/debug.exp          | 28 ++++++++++++++
 gcc/testsuite/gdc.dg/debug/dwarf2/dwarf2.exp  | 38 +++++++++++++++++++
 .../gdc.dg/debug/dwarf2/imports/pr98067.d     |  3 ++
 gcc/testsuite/gdc.dg/debug/dwarf2/langdw2.d   |  7 ++++
 gcc/testsuite/gdc.dg/debug/dwarf2/langdw3.d   |  6 +++
 gcc/testsuite/gdc.dg/debug/dwarf2/pr98067.d   |  6 +++
 gcc/testsuite/gdc.dg/debug/trivial.d          |  6 +++
 8 files changed, 101 insertions(+)
 create mode 100644 gcc/testsuite/gdc.dg/debug/debug.exp
 create mode 100644 gcc/testsuite/gdc.dg/debug/dwarf2/dwarf2.exp
 create mode 100644 gcc/testsuite/gdc.dg/debug/dwarf2/imports/pr98067.d
 create mode 100644 gcc/testsuite/gdc.dg/debug/dwarf2/langdw2.d
 create mode 100644 gcc/testsuite/gdc.dg/debug/dwarf2/langdw3.d
 create mode 100644 gcc/testsuite/gdc.dg/debug/dwarf2/pr98067.d
 create mode 100644 gcc/testsuite/gdc.dg/debug/trivial.d

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 0baa056447c..027f327c1a1 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -26705,6 +26705,13 @@ dwarf2out_imported_module_or_decl_1 (tree decl,
 	      gen_type_die_for_member (type, decl,
 				       get_context_die (TYPE_CONTEXT (type)));
 	    }
+	  if (TREE_CODE (decl) == CONST_DECL)
+	    {
+	      /* Individual enumerators of an enum type do not get output here
+		 (see gen_decl_die), so we cannot call force_decl_die.  */
+	      if (!is_fortran () && !is_ada () && !is_dlang ())
+		return;
+	    }
 	  if (TREE_CODE (decl) == NAMELIST_DECL)
 	    at_import_die = gen_namelist_decl (DECL_NAME (decl),
 					 get_context_die (DECL_CONTEXT (decl)),
diff --git a/gcc/testsuite/gdc.dg/debug/debug.exp b/gcc/testsuite/gdc.dg/debug/debug.exp
new file mode 100644
index 00000000000..1607c4d6d44
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/debug.exp
@@ -0,0 +1,28 @@
+# Copyright (C) 2020 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Load support procs.
+load_lib gdc-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+gcc-dg-debug-runtest gdc_target_compile trivial.d [list -O -O3] \
+    [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/gdc.dg/debug/dwarf2/dwarf2.exp b/gcc/testsuite/gdc.dg/debug/dwarf2/dwarf2.exp
new file mode 100644
index 00000000000..11711e197b9
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/dwarf2/dwarf2.exp
@@ -0,0 +1,38 @@
+#   Copyright (C) 2020 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Load support procs.
+load_lib gdc-dg.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_DFLAGS
+if ![info exists DEFAULT_DFLAGS] then {
+    set DEFAULT_DFLAGS "-gdwarf"
+}
+
+# Main loop.
+set comp_output [gdc_target_compile \
+    "$srcdir/$subdir/../trivial.d" "trivial.S" assembly \
+    "additional_flags=-gdwarf"]
+if { ! [string match "*: target system does not support the * debug format*" \
+    $comp_output] } {
+    remove-build-file "trivial.S"
+    gdc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.d ] ] "" \
+	$DEFAULT_DFLAGS
+}
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/gdc.dg/debug/dwarf2/imports/pr98067.d b/gcc/testsuite/gdc.dg/debug/dwarf2/imports/pr98067.d
new file mode 100644
index 00000000000..d740d71a3e4
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/dwarf2/imports/pr98067.d
@@ -0,0 +1,3 @@
+module imports.pr98067;
+
+enum MAP_ANON = 0x10;
diff --git a/gcc/testsuite/gdc.dg/debug/dwarf2/langdw2.d b/gcc/testsuite/gdc.dg/debug/dwarf2/langdw2.d
new file mode 100644
index 00000000000..61c39279d8d
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/dwarf2/langdw2.d
@@ -0,0 +1,7 @@
+// DW_LANG_D is not available in dwarf2, so we should produce DW_LANG_C (0x2)
+// as AT_language.
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -gstrict-dwarf -dA" }
+// { dg-final { scan-assembler "0x2\[^\n\r\]*AT_language" } }
+
+module langdw2;
diff --git a/gcc/testsuite/gdc.dg/debug/dwarf2/langdw3.d b/gcc/testsuite/gdc.dg/debug/dwarf2/langdw3.d
new file mode 100644
index 00000000000..7bdc68c4607
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/dwarf2/langdw3.d
@@ -0,0 +1,6 @@
+// We should produce DW_LANG_D (0x13) as AT_language.
+// { dg-do compile }
+// { dg-options "-gdwarf-3 -dA" }
+// { dg-final { scan-assembler "0x13\[^\n\r\]*AT_language" } }
+
+module langdw3;
diff --git a/gcc/testsuite/gdc.dg/debug/dwarf2/pr98067.d b/gcc/testsuite/gdc.dg/debug/dwarf2/pr98067.d
new file mode 100644
index 00000000000..4beb268e41d
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/dwarf2/pr98067.d
@@ -0,0 +1,6 @@
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98067
+// { dg-options "-gdwarf-2 -gstrict-dwarf -I $srcdir/gdc.dg/debug/dwarf2" }
+// { dg-do compile }
+module pr98067;
+
+import imports.pr98067 : MAP_ANON;
diff --git a/gcc/testsuite/gdc.dg/debug/trivial.d b/gcc/testsuite/gdc.dg/debug/trivial.d
new file mode 100644
index 00000000000..dab2b683a49
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/debug/trivial.d
@@ -0,0 +1,6 @@
+/* { dg-do run } */
+
+int main()
+{
+    return 0;
+}
-- 
2.27.0


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] d: Fix ICE in in force_decl_die, at dwarf2out.c with -gdwarf-2 -gstrict-dwarf [PR98067]
  2020-12-16  0:15 [PATCH] d: Fix ICE in in force_decl_die, at dwarf2out.c with -gdwarf-2 -gstrict-dwarf [PR98067] Iain Buclaw
@ 2020-12-16 21:54 ` Jason Merrill
  0 siblings, 0 replies; 2+ messages in thread
From: Jason Merrill @ 2020-12-16 21:54 UTC (permalink / raw)
  To: Iain Buclaw, gcc-patches; +Cc: iain

On 12/15/20 7:15 PM, Iain Buclaw wrote:
> Hi,
> 
> This patch fixes an ICE in dwarf2out.c that occurs when compiling a
> selective import declaration in D with strict dwarf2 in effect.
> 
> Manifest constants in D are represented as CONST_DECLs, which can be
> imported from one module to another.  However, when compiling on strict
> dwarf2 targets such as *-*darwin10, importing CONST_DECLs cannot be
> represented in debug as D did not exist as an AT_language until dwarf3,
> and the only available fallback being DW_LANG_C.  As CONST_DECLs are
> treated as enumerators in C, and not outputted individually in
> gen_decl_die, this causes an internal error in force_decl_die to occur.
> 
> To handle this, similar to other places in dwarf2out, if a CONST_DECL is
> seen in dwarf2out_imported_module_or_decl_1, then we simply return early
> if the language is not one of Ada, D, or Fortran.
> 
> The new files and tests added are boilerplate for introducing
> gdc.dg/debug and gdc.dg/debug/dwarf2 test directories, as well as two
> extra tests - langdw2.d and langdw3.d - that verify that DW_LANG_D is
> set except for strict dwarf2.
> 
> This has been bootstrapped, and the D testsuite regression tested on
> x86_64-linux-gnu/-m32/-mx32.
> 
> OK for mainline?

OK.

> Iain.
> 
> ---
> gcc/ChangeLog:
> 
> 	PR d/98067
> 	* dwarf2out.c (dwarf2out_imported_module_or_decl_1): Handle
> 	  CONST_DECL only if is_fortran, is_ada, or is_dlang.
> 
> gcc/testsuite/ChangeLog:
> 
> 	PR d/98067
> 	* gdc.dg/debug/debug.exp: New test.
> 	* gdc.dg/debug/dwarf2/dwarf2.exp: New test.
> 	* gdc.dg/debug/dwarf2/imports/pr98067.d: New test.
> 	* gdc.dg/debug/dwarf2/langdw2.d: New test.
> 	* gdc.dg/debug/dwarf2/langdw3.d: New test.
> 	* gdc.dg/debug/dwarf2/pr98067.d: New test.
> 	* gdc.dg/debug/trivial.d: New test.
> ---
>   gcc/dwarf2out.c                               |  7 ++++
>   gcc/testsuite/gdc.dg/debug/debug.exp          | 28 ++++++++++++++
>   gcc/testsuite/gdc.dg/debug/dwarf2/dwarf2.exp  | 38 +++++++++++++++++++
>   .../gdc.dg/debug/dwarf2/imports/pr98067.d     |  3 ++
>   gcc/testsuite/gdc.dg/debug/dwarf2/langdw2.d   |  7 ++++
>   gcc/testsuite/gdc.dg/debug/dwarf2/langdw3.d   |  6 +++
>   gcc/testsuite/gdc.dg/debug/dwarf2/pr98067.d   |  6 +++
>   gcc/testsuite/gdc.dg/debug/trivial.d          |  6 +++
>   8 files changed, 101 insertions(+)
>   create mode 100644 gcc/testsuite/gdc.dg/debug/debug.exp
>   create mode 100644 gcc/testsuite/gdc.dg/debug/dwarf2/dwarf2.exp
>   create mode 100644 gcc/testsuite/gdc.dg/debug/dwarf2/imports/pr98067.d
>   create mode 100644 gcc/testsuite/gdc.dg/debug/dwarf2/langdw2.d
>   create mode 100644 gcc/testsuite/gdc.dg/debug/dwarf2/langdw3.d
>   create mode 100644 gcc/testsuite/gdc.dg/debug/dwarf2/pr98067.d
>   create mode 100644 gcc/testsuite/gdc.dg/debug/trivial.d
> 
> diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
> index 0baa056447c..027f327c1a1 100644
> --- a/gcc/dwarf2out.c
> +++ b/gcc/dwarf2out.c
> @@ -26705,6 +26705,13 @@ dwarf2out_imported_module_or_decl_1 (tree decl,
>   	      gen_type_die_for_member (type, decl,
>   				       get_context_die (TYPE_CONTEXT (type)));
>   	    }
> +	  if (TREE_CODE (decl) == CONST_DECL)
> +	    {
> +	      /* Individual enumerators of an enum type do not get output here
> +		 (see gen_decl_die), so we cannot call force_decl_die.  */
> +	      if (!is_fortran () && !is_ada () && !is_dlang ())
> +		return;
> +	    }
>   	  if (TREE_CODE (decl) == NAMELIST_DECL)
>   	    at_import_die = gen_namelist_decl (DECL_NAME (decl),
>   					 get_context_die (DECL_CONTEXT (decl)),
> diff --git a/gcc/testsuite/gdc.dg/debug/debug.exp b/gcc/testsuite/gdc.dg/debug/debug.exp
> new file mode 100644
> index 00000000000..1607c4d6d44
> --- /dev/null
> +++ b/gcc/testsuite/gdc.dg/debug/debug.exp
> @@ -0,0 +1,28 @@
> +# Copyright (C) 2020 Free Software Foundation, Inc.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with GCC; see the file COPYING3.  If not see
> +# <http://www.gnu.org/licenses/>.
> +
> +# Load support procs.
> +load_lib gdc-dg.exp
> +
> +# Initialize `dg'.
> +dg-init
> +
> +# Main loop.
> +gcc-dg-debug-runtest gdc_target_compile trivial.d [list -O -O3] \
> +    [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
> +
> +# All done.
> +dg-finish
> diff --git a/gcc/testsuite/gdc.dg/debug/dwarf2/dwarf2.exp b/gcc/testsuite/gdc.dg/debug/dwarf2/dwarf2.exp
> new file mode 100644
> index 00000000000..11711e197b9
> --- /dev/null
> +++ b/gcc/testsuite/gdc.dg/debug/dwarf2/dwarf2.exp
> @@ -0,0 +1,38 @@
> +#   Copyright (C) 2020 Free Software Foundation, Inc.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with GCC; see the file COPYING3.  If not see
> +# <http://www.gnu.org/licenses/>.
> +
> +# Load support procs.
> +load_lib gdc-dg.exp
> +
> +# If a testcase doesn't have special options, use these.
> +global DEFAULT_DFLAGS
> +if ![info exists DEFAULT_DFLAGS] then {
> +    set DEFAULT_DFLAGS "-gdwarf"
> +}
> +
> +# Main loop.
> +set comp_output [gdc_target_compile \
> +    "$srcdir/$subdir/../trivial.d" "trivial.S" assembly \
> +    "additional_flags=-gdwarf"]
> +if { ! [string match "*: target system does not support the * debug format*" \
> +    $comp_output] } {
> +    remove-build-file "trivial.S"
> +    gdc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.d ] ] "" \
> +	$DEFAULT_DFLAGS
> +}
> +
> +# All done.
> +dg-finish
> diff --git a/gcc/testsuite/gdc.dg/debug/dwarf2/imports/pr98067.d b/gcc/testsuite/gdc.dg/debug/dwarf2/imports/pr98067.d
> new file mode 100644
> index 00000000000..d740d71a3e4
> --- /dev/null
> +++ b/gcc/testsuite/gdc.dg/debug/dwarf2/imports/pr98067.d
> @@ -0,0 +1,3 @@
> +module imports.pr98067;
> +
> +enum MAP_ANON = 0x10;
> diff --git a/gcc/testsuite/gdc.dg/debug/dwarf2/langdw2.d b/gcc/testsuite/gdc.dg/debug/dwarf2/langdw2.d
> new file mode 100644
> index 00000000000..61c39279d8d
> --- /dev/null
> +++ b/gcc/testsuite/gdc.dg/debug/dwarf2/langdw2.d
> @@ -0,0 +1,7 @@
> +// DW_LANG_D is not available in dwarf2, so we should produce DW_LANG_C (0x2)
> +// as AT_language.
> +// { dg-do compile }
> +// { dg-options "-gdwarf-2 -gstrict-dwarf -dA" }
> +// { dg-final { scan-assembler "0x2\[^\n\r\]*AT_language" } }
> +
> +module langdw2;
> diff --git a/gcc/testsuite/gdc.dg/debug/dwarf2/langdw3.d b/gcc/testsuite/gdc.dg/debug/dwarf2/langdw3.d
> new file mode 100644
> index 00000000000..7bdc68c4607
> --- /dev/null
> +++ b/gcc/testsuite/gdc.dg/debug/dwarf2/langdw3.d
> @@ -0,0 +1,6 @@
> +// We should produce DW_LANG_D (0x13) as AT_language.
> +// { dg-do compile }
> +// { dg-options "-gdwarf-3 -dA" }
> +// { dg-final { scan-assembler "0x13\[^\n\r\]*AT_language" } }
> +
> +module langdw3;
> diff --git a/gcc/testsuite/gdc.dg/debug/dwarf2/pr98067.d b/gcc/testsuite/gdc.dg/debug/dwarf2/pr98067.d
> new file mode 100644
> index 00000000000..4beb268e41d
> --- /dev/null
> +++ b/gcc/testsuite/gdc.dg/debug/dwarf2/pr98067.d
> @@ -0,0 +1,6 @@
> +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98067
> +// { dg-options "-gdwarf-2 -gstrict-dwarf -I $srcdir/gdc.dg/debug/dwarf2" }
> +// { dg-do compile }
> +module pr98067;
> +
> +import imports.pr98067 : MAP_ANON;
> diff --git a/gcc/testsuite/gdc.dg/debug/trivial.d b/gcc/testsuite/gdc.dg/debug/trivial.d
> new file mode 100644
> index 00000000000..dab2b683a49
> --- /dev/null
> +++ b/gcc/testsuite/gdc.dg/debug/trivial.d
> @@ -0,0 +1,6 @@
> +/* { dg-do run } */
> +
> +int main()
> +{
> +    return 0;
> +}
> 


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-12-16 21:54 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-16  0:15 [PATCH] d: Fix ICE in in force_decl_die, at dwarf2out.c with -gdwarf-2 -gstrict-dwarf [PR98067] Iain Buclaw
2020-12-16 21:54 ` Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).