public inbox for binutils-cvs@sourceware.org
 help / color / mirror / Atom feed
* [binutils-gdb] Gas generated incorrect debug info (top-level DW_TAG_unspecified_type DIE)
@ 2022-09-08 11:44 Nick Clifton
  0 siblings, 0 replies; only message in thread
From: Nick Clifton @ 2022-09-08 11:44 UTC (permalink / raw)
  To: bfd-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0ee31dffb8202dcd1f867b7144db9a8bd69a7499

commit 0ee31dffb8202dcd1f867b7144db9a8bd69a7499
Author: Nick Clifton <nickc@redhat.com>
Date:   Thu Sep 8 12:43:33 2022 +0100

    Gas generated incorrect debug info (top-level DW_TAG_unspecified_type DIE)
    
            PR 29559
            * dwarf2dbg.c (out_debug_info): Place DW_TAG_unspecified_type at
            the end of the list of children, not at the start of the CU
            information.
            * testsuite/gas/elf/dwarf-3-func.d: Update expected output.
            * testsuite/gas/elf/dwarf-5-func-global.d: Likewise.
            * testsuite/gas/elf/dwarf-5-func-local.d: Likewise.
            * testsuite/gas/elf/dwarf-5-func.d: Likewise.

Diff:
---
 gas/ChangeLog                               | 11 +++++++++
 gas/dwarf2dbg.c                             | 37 ++++++++++++++++++-----------
 gas/testsuite/gas/elf/dwarf-3-func.d        | 10 ++++----
 gas/testsuite/gas/elf/dwarf-5-func-global.d |  6 ++---
 gas/testsuite/gas/elf/dwarf-5-func-local.d  |  6 ++---
 gas/testsuite/gas/elf/dwarf-5-func.d        | 10 ++++----
 6 files changed, 50 insertions(+), 30 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index a54e5e2c680..6bca7add8f9 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,14 @@
+2022-09-08  Nick Clifton  <nickc@redhat.com>
+
+	PR 29559
+	* dwarf2dbg.c (out_debug_info): Place DW_TAG_unspecified_type at
+	the end of the list of children, not at the start of the CU
+	information.
+	* testsuite/gas/elf/dwarf-3-func.d: Update expected output.
+	* testsuite/gas/elf/dwarf-5-func-global.d: Likewise.
+	* testsuite/gas/elf/dwarf-5-func-local.d: Likewise.
+	* testsuite/gas/elf/dwarf-5-func.d: Likewise.
+
 2022-08-31  Frederic Cambus  <fred@statdns.com>
 
 	* configure.tgt (aarch64*-*-openbsd*): Add target.
diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
index dbcf9cf7226..612d8103438 100644
--- a/gas/dwarf2dbg.c
+++ b/gas/dwarf2dbg.c
@@ -2817,7 +2817,6 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg,
   expressionS exp;
   symbolS *info_end;
   int sizeof_offset;
-  valueT no_type_die = 0;
 
   memset (&exp, 0, sizeof exp);
   sizeof_offset = out_header (info_seg, &exp);
@@ -2846,16 +2845,6 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg,
       TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
     }
 
-  if (func_form && DWARF2_VERSION > 2)
-    {
-      /* PR 29517: Generate a DIE for the unspecified type abbrev.
-	 We do it here so that the offset from the start of the
-	 section is fixed.  */
-      subseg_set (info_seg, 0);
-      no_type_die = frag_now_fix_octets ();
-      out_uleb128 (GAS_ABBREV_NO_TYPE);
-    }
-
   /* DW_TAG_compile_unit DIE abbrev */
   out_uleb128 (GAS_ABBREV_COMP_UNIT);
 
@@ -2908,6 +2897,12 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg,
   if (func_form)
     {
       symbolS *symp;
+      symbolS *no_type_tag;
+
+      if (DWARF2_VERSION > 2)
+	no_type_tag = symbol_make (".Ldebug_no_type_tag");
+      else
+	no_type_tag = NULL;
 
       for (symp = symbol_rootP; symp; symp = symbol_next (symp))
 	{
@@ -2957,10 +2952,15 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg,
 	  if (func_form == DW_FORM_flag)
 	    out_byte (S_IS_EXTERNAL (symp));
 
-	  /* PR 29517: Let consumers know that we do not
-	     have return type information for this function.  */
+	  /* PR 29517: Let consumers know that we do not have
+	     return type information for this function.  */
 	  if (DWARF2_VERSION > 2)
-	    out_uleb128 (no_type_die);
+	    {
+	      exp.X_op = O_symbol;
+	      exp.X_add_symbol = no_type_tag;
+	      exp.X_add_number = 0;
+	      emit_leb128_expr (&exp, 0);
+	    }
 
 	  /* DW_AT_low_pc */
 	  exp.X_op = O_symbol;
@@ -2982,6 +2982,15 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT str_seg,
 	    emit_leb128_expr (symbol_get_value_expression (size.X_op_symbol), 0);
 	}
 
+      if (DWARF2_VERSION > 2)
+	{
+	  /* PR 29517: Generate a DIE for the unspecified type abbrev.
+	     We do it here because it cannot be part of the top level DIE.   */
+	  subseg_set (info_seg, 0);
+	  symbol_set_value_now (no_type_tag);
+	  out_uleb128 (GAS_ABBREV_NO_TYPE);
+	}
+
       /* End of children.  */
       out_leb128 (0);
     }
diff --git a/gas/testsuite/gas/elf/dwarf-3-func.d b/gas/testsuite/gas/elf/dwarf-3-func.d
index d084518aba1..c92b0d311c0 100644
--- a/gas/testsuite/gas/elf/dwarf-3-func.d
+++ b/gas/testsuite/gas/elf/dwarf-3-func.d
@@ -10,34 +10,34 @@ Contents of the .debug_info section:
  +Version: +3
  +Abbrev Offset: +(0x)?0
  +Pointer Size: .*
- <0><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\)
 #...
  <0><[0-9a-f]+>: Abbrev Number: 1 \(DW_TAG_compile_unit\)
 #...
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc1
  +<[0-9a-f]+> +DW_AT_external +: \(flag\) 1
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?0
  +<[0-9a-f]+> +DW_AT_high_pc +: \(addr\) (0x)?2
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc1
  +<[0-9a-f]+> +DW_AT_external +: \(flag\) 0
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?2
  +<[0-9a-f]+> +DW_AT_high_pc +: \(addr\) (0x)?13
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc2
  +<[0-9a-f]+> +DW_AT_external +: \(flag\) 1
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?13
  +<[0-9a-f]+> +DW_AT_high_pc +: \(addr\) (0x)?35
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc2
  +<[0-9a-f]+> +DW_AT_external +: \(flag\) 0
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?35
  +<[0-9a-f]+> +DW_AT_high_pc +: \(addr\) (0x)?38
+ <1><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\)
  <1><[0-9a-f]+>: Abbrev Number: 0
 
 Contents of the .debug_abbrev section:
diff --git a/gas/testsuite/gas/elf/dwarf-5-func-global.d b/gas/testsuite/gas/elf/dwarf-5-func-global.d
index 65c2ab0f512..090b8dabce3 100644
--- a/gas/testsuite/gas/elf/dwarf-5-func-global.d
+++ b/gas/testsuite/gas/elf/dwarf-5-func-global.d
@@ -12,22 +12,22 @@ Contents of the .debug_info section:
  +Unit Type: +DW_UT_compile \(1\)
  +Abbrev Offset: +(0x)?0
  +Pointer Size: .*
- <0><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\)
 #...
  <0><[0-9a-f]+>: Abbrev Number: 1 \(DW_TAG_compile_unit\)
 #...
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc1
  +<[0-9a-f]+> +DW_AT_external +: \(flag_present\) 1
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?0
  +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 2
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc2
  +<[0-9a-f]+> +DW_AT_external +: \(flag_present\) 1
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?2
  +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 34
+ <1><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\)
  <1><[0-9a-f]+>: Abbrev Number: 0
 
 Contents of the .debug_abbrev section:
diff --git a/gas/testsuite/gas/elf/dwarf-5-func-local.d b/gas/testsuite/gas/elf/dwarf-5-func-local.d
index ac666ea93e1..7580c3e66db 100644
--- a/gas/testsuite/gas/elf/dwarf-5-func-local.d
+++ b/gas/testsuite/gas/elf/dwarf-5-func-local.d
@@ -12,20 +12,20 @@ Contents of the .debug_info section:
  +Unit Type: +DW_UT_compile \(1\)
  +Abbrev Offset: +(0x)?0
  +Pointer Size: .*
- <0><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\)
 #...
  <0><[0-9a-f]+>: Abbrev Number: 1 \(DW_TAG_compile_unit\)
 #...
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc1
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?0
  +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 17
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc2
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?11
  +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 3
+ <1><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\)
  <1><[0-9a-f]+>: Abbrev Number: 0
 
 Contents of the .debug_abbrev section:
diff --git a/gas/testsuite/gas/elf/dwarf-5-func.d b/gas/testsuite/gas/elf/dwarf-5-func.d
index 612c9f23b16..df5cfc7882d 100644
--- a/gas/testsuite/gas/elf/dwarf-5-func.d
+++ b/gas/testsuite/gas/elf/dwarf-5-func.d
@@ -12,34 +12,34 @@ Contents of the .debug_info section:
  +Unit Type: +DW_UT_compile \(1\)
  +Abbrev Offset: +(0x)?0
  +Pointer Size: .*
- <0><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\)
 #...
  <0><[0-9a-f]+>: Abbrev Number: 1 \(DW_TAG_compile_unit\)
 #...
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc1
  +<[0-9a-f]+> +DW_AT_external +: \(flag\) 1
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?0
  +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 2
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc1
  +<[0-9a-f]+> +DW_AT_external +: \(flag\) 0
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?2
  +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 17
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): efunc2
  +<[0-9a-f]+> +DW_AT_external +: \(flag\) 1
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?13
  +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 34
  <1><[0-9a-f]+>: Abbrev Number: 2 \(DW_TAG_subprogram\)
  +<[0-9a-f]+> +DW_AT_name +: \(strp\) \(offset: (0x)?[0-9a-f]+\): lfunc2
  +<[0-9a-f]+> +DW_AT_external +: \(flag\) 0
- +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x.>
+ +<[0-9a-f]+> +DW_AT_type +: \(ref_udata\) <0x[0-9a-f]+>
  +<[0-9a-f]+> +DW_AT_low_pc +: \(addr\) (0x)?35
  +<[0-9a-f]+> +DW_AT_high_pc +: \(udata\) 3
+ <1><[0-9a-f]+>: Abbrev Number: 3 \(DW_TAG_unspecified_type\)
  <1><[0-9a-f]+>: Abbrev Number: 0
 
 Contents of the .debug_abbrev section:

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-09-08 11:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-08 11:44 [binutils-gdb] Gas generated incorrect debug info (top-level DW_TAG_unspecified_type DIE) Nick Clifton

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).