diff mbox

Emit column information in dwarf

Message ID 20170217185710.GR1849@tucnak
State New
Headers show

Commit Message

Jakub Jelinek Feb. 17, 2017, 6:57 p.m. UTC
Hi!

The GDB folks expressed interest in handling column information in
debug info, apparently clang emits it, but gcc does not.

I know we are late in the release cycle, so I'm not suggesting to
turn this on by default, but the following patch at least allows
users to request it through -gcolumn-info, so that GDB can be adjusted
to consume it and later on (GCC 8 or 9) we could perhaps switch the
default.

This patch handles just emitting DW_AT_decl_column and DW_AT_call_column
if requested (-gcolumn-info) and non-zero (i.e. the middle-end knows the
columns).

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2017-02-17  Jakub Jelinek  <jakub@redhat.com>

	* common.opt (gno-column-info, gcolumn-info): New options.
	* dwarf2out.c (dwarf2_lineno_debug_hooks): Formatting fix.
	(check_die): Also test for multiple DW_AT_decl_column attributes.
	(add_src_coords_attributes, dwarf2out_imported_module_or_decl_1): Add
	DW_AT_decl_column if requested.
	(gen_subprogram_die): Compare and/or add also DW_AT_decl_column
	if requested.
	(gen_variable_die): Likewise.
	(add_call_src_coords_attributes): Add DW_AT_call_column if requested.
	* doc/invoke.texi (-gcolumn-info, -gno-column-info): Document.


	Jakub

Comments

Jason Merrill Feb. 18, 2017, 2:29 a.m. UTC | #1
OK.

On Fri, Feb 17, 2017 at 1:57 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> The GDB folks expressed interest in handling column information in
> debug info, apparently clang emits it, but gcc does not.
>
> I know we are late in the release cycle, so I'm not suggesting to
> turn this on by default, but the following patch at least allows
> users to request it through -gcolumn-info, so that GDB can be adjusted
> to consume it and later on (GCC 8 or 9) we could perhaps switch the
> default.
>
> This patch handles just emitting DW_AT_decl_column and DW_AT_call_column
> if requested (-gcolumn-info) and non-zero (i.e. the middle-end knows the
> columns).
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2017-02-17  Jakub Jelinek  <jakub@redhat.com>
>
>         * common.opt (gno-column-info, gcolumn-info): New options.
>         * dwarf2out.c (dwarf2_lineno_debug_hooks): Formatting fix.
>         (check_die): Also test for multiple DW_AT_decl_column attributes.
>         (add_src_coords_attributes, dwarf2out_imported_module_or_decl_1): Add
>         DW_AT_decl_column if requested.
>         (gen_subprogram_die): Compare and/or add also DW_AT_decl_column
>         if requested.
>         (gen_variable_die): Likewise.
>         (add_call_src_coords_attributes): Add DW_AT_call_column if requested.
>         * doc/invoke.texi (-gcolumn-info, -gno-column-info): Document.
>
> --- gcc/common.opt.jj   2017-02-01 16:41:45.000000000 +0100
> +++ gcc/common.opt      2017-02-17 11:47:14.233098170 +0100
> @@ -2805,6 +2805,14 @@ gcoff
>  Common Driver JoinedOrMissing Negative(gdwarf)
>  Generate debug information in COFF format.
>
> +gno-column-info
> +Common Driver RejectNegative Var(debug_column_info,0) Init(0)
> +Don't record DW_AT_decl_column and DW_AT_call_column in DWARF.
> +
> +gcolumn-info
> +Common Driver RejectNegative Var(debug_column_info,1)
> +Record DW_AT_decl_column and DW_AT_call_column in DWARF.
> +
>  gdwarf
>  Common Driver JoinedOrMissing Negative(gdwarf-)
>  Generate debug information in default version of DWARF format.
> --- gcc/dwarf2out.c.jj  2017-02-09 23:01:46.000000000 +0100
> +++ gcc/dwarf2out.c     2017-02-17 11:56:13.471834354 +0100
> @@ -2732,7 +2732,7 @@ const struct gcc_debug_hooks dwarf2_line
>    debug_nothing_int_int,                /* begin_block */
>    debug_nothing_int_int,                /* end_block */
>    debug_true_const_tree,                /* ignore_block */
> -  dwarf2out_source_line,        /* source_line */
> +  dwarf2out_source_line,                /* source_line */
>    debug_nothing_int_charstar,           /* begin_prologue */
>    debug_nothing_int_charstar,           /* end_prologue */
>    debug_nothing_int_charstar,           /* begin_epilogue */
> @@ -6109,7 +6109,7 @@ check_die (dw_die_ref die)
>    dw_attr_node *a;
>    bool inline_found = false;
>    int n_location = 0, n_low_pc = 0, n_high_pc = 0, n_artificial = 0;
> -  int n_decl_line = 0, n_decl_file = 0;
> +  int n_decl_line = 0, n_decl_column = 0, n_decl_file = 0;
>    FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
>      {
>        switch (a->dw_attr)
> @@ -6130,6 +6130,9 @@ check_die (dw_die_ref die)
>         case DW_AT_artificial:
>           ++n_artificial;
>           break;
> +        case DW_AT_decl_column:
> +         ++n_decl_column;
> +         break;
>         case DW_AT_decl_line:
>           ++n_decl_line;
>           break;
> @@ -6141,7 +6144,7 @@ check_die (dw_die_ref die)
>         }
>      }
>    if (n_location > 1 || n_low_pc > 1 || n_high_pc > 1 || n_artificial > 1
> -      || n_decl_line > 1 || n_decl_file > 1)
> +      || n_decl_column > 1 || n_decl_line > 1 || n_decl_file > 1)
>      {
>        fprintf (stderr, "Duplicate attributes in DIE:\n");
>        debug_dwarf_die (die);
> @@ -20190,6 +20193,8 @@ add_src_coords_attributes (dw_die_ref di
>    s = expand_location (DECL_SOURCE_LOCATION (decl));
>    add_AT_file (die, DW_AT_decl_file, lookup_filename (s.file));
>    add_AT_unsigned (die, DW_AT_decl_line, s.line);
> +  if (debug_column_info && s.column)
> +    add_AT_unsigned (die, DW_AT_decl_column, s.column);
>  }
>
>  /* Add DW_AT_{,MIPS_}linkage_name attribute for the given decl.  */
> @@ -21936,7 +21941,11 @@ gen_subprogram_die (tree decl, dw_die_re
>            && (DECL_ARTIFICIAL (decl)
>                || (get_AT_file (old_die, DW_AT_decl_file) == file_index
>                    && (get_AT_unsigned (old_die, DW_AT_decl_line)
> -                      == (unsigned) s.line))))
> +                      == (unsigned) s.line)
> +                  && (!debug_column_info
> +                      || s.column == 0
> +                      || (get_AT_unsigned (old_die, DW_AT_decl_column)
> +                          == (unsigned) s.column)))))
>         {
>           subr_die = old_die;
>
> @@ -21963,10 +21972,15 @@ gen_subprogram_die (tree decl, dw_die_re
>             add_AT_file (subr_die, DW_AT_decl_file, file_index);
>           if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line)
>             add_AT_unsigned (subr_die, DW_AT_decl_line, s.line);
> +         if (debug_column_info
> +             && s.column
> +             && (get_AT_unsigned (old_die, DW_AT_decl_column)
> +                 != (unsigned) s.column))
> +           add_AT_unsigned (subr_die, DW_AT_decl_column, s.column);
>
>           /* If the prototype had an 'auto' or 'decltype(auto)' return type,
>              emit the real type on the definition die.  */
> -         if (is_cxx() && debug_info_level > DINFO_LEVEL_TERSE)
> +         if (is_cxx () && debug_info_level > DINFO_LEVEL_TERSE)
>             {
>               dw_die_ref die = get_AT_ref (old_die, DW_AT_type);
>               if (die == auto_die || die == decltype_auto_die)
> @@ -22838,6 +22852,12 @@ gen_variable_die (tree decl, tree origin
>           if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line)
>             add_AT_unsigned (var_die, DW_AT_decl_line, s.line);
>
> +         if (debug_column_info
> +             && s.column
> +             && (get_AT_unsigned (old_die, DW_AT_decl_column)
> +                 != (unsigned) s.column))
> +           add_AT_unsigned (var_die, DW_AT_decl_column, s.column);
> +
>           if (old_die->die_tag == DW_TAG_member)
>             add_linkage_name (var_die, decl);
>         }
> @@ -23011,6 +23031,8 @@ add_call_src_coords_attributes (tree stm
>      {
>        add_AT_file (die, DW_AT_call_file, lookup_filename (s.file));
>        add_AT_unsigned (die, DW_AT_call_line, s.line);
> +      if (debug_column_info && s.column)
> +       add_AT_unsigned (die, DW_AT_call_column, s.column);
>      }
>  }
>
> @@ -25547,6 +25569,8 @@ dwarf2out_imported_module_or_decl_1 (tre
>
>    add_AT_file (imported_die, DW_AT_decl_file, lookup_filename (xloc.file));
>    add_AT_unsigned (imported_die, DW_AT_decl_line, xloc.line);
> +  if (debug_column_info && xloc.column)
> +    add_AT_unsigned (imported_die, DW_AT_decl_column, xloc.column);
>    if (name)
>      add_AT_string (imported_die, DW_AT_name,
>                    IDENTIFIER_POINTER (name));
> @@ -27959,7 +27983,9 @@ move_linkage_attr (dw_die_ref die)
>      {
>        dw_attr_node *prev = &(*die->die_attr)[ix - 1];
>
> -      if (prev->dw_attr == DW_AT_decl_line || prev->dw_attr == DW_AT_name)
> +      if (prev->dw_attr == DW_AT_decl_line
> +         || prev->dw_attr == DW_AT_decl_column
> +         || prev->dw_attr == DW_AT_name)
>         break;
>      }
>
> --- gcc/doc/invoke.texi.jj      2017-02-17 11:31:38.000000000 +0100
> +++ gcc/doc/invoke.texi 2017-02-17 12:10:46.805110128 +0100
> @@ -338,6 +338,7 @@ Objective-C and Objective-C++ Dialects}.
>  @gccoptlist{-g  -g@var{level}  -gcoff  -gdwarf  -gdwarf-@var{version} @gol
>  -ggdb  -grecord-gcc-switches  -gno-record-gcc-switches @gol
>  -gstabs  -gstabs+  -gstrict-dwarf  -gno-strict-dwarf @gol
> +-gcolumn-info  -gno-column-info @gol
>  -gvms  -gxcoff  -gxcoff+  -gz@r{[}=@var{type}@r{]} @gol
>  -fdebug-prefix-map=@var{old}=@var{new}  -fdebug-types-section @gol
>  -feliminate-dwarf2-dups  -fno-eliminate-unused-debug-types @gol
> @@ -6822,6 +6823,14 @@ DWARF extensions from later standard ver
>  Allow using extensions of later DWARF standard version than selected with
>  @option{-gdwarf-@var{version}}.
>
> +@item -gcolumn-info
> +@item -gno-column-info
> +@opindex gcolumn-info
> +@opindex gno-column-info
> +Emit location column information into DWARF debugging information, rather
> +than just file and line.
> +This option is disabled by default.
> +
>  @item -gz@r{[}=@var{type}@r{]}
>  @opindex gz
>  Produce compressed debug sections in DWARF format, if that is supported.
>
>         Jakub
diff mbox

Patch

--- gcc/common.opt.jj	2017-02-01 16:41:45.000000000 +0100
+++ gcc/common.opt	2017-02-17 11:47:14.233098170 +0100
@@ -2805,6 +2805,14 @@  gcoff
 Common Driver JoinedOrMissing Negative(gdwarf)
 Generate debug information in COFF format.
 
+gno-column-info
+Common Driver RejectNegative Var(debug_column_info,0) Init(0)
+Don't record DW_AT_decl_column and DW_AT_call_column in DWARF.
+
+gcolumn-info
+Common Driver RejectNegative Var(debug_column_info,1)
+Record DW_AT_decl_column and DW_AT_call_column in DWARF.
+
 gdwarf
 Common Driver JoinedOrMissing Negative(gdwarf-)
 Generate debug information in default version of DWARF format.
--- gcc/dwarf2out.c.jj	2017-02-09 23:01:46.000000000 +0100
+++ gcc/dwarf2out.c	2017-02-17 11:56:13.471834354 +0100
@@ -2732,7 +2732,7 @@  const struct gcc_debug_hooks dwarf2_line
   debug_nothing_int_int,	         /* begin_block */
   debug_nothing_int_int,	         /* end_block */
   debug_true_const_tree,	         /* ignore_block */
-  dwarf2out_source_line,	 /* source_line */
+  dwarf2out_source_line,		 /* source_line */
   debug_nothing_int_charstar,	         /* begin_prologue */
   debug_nothing_int_charstar,	         /* end_prologue */
   debug_nothing_int_charstar,	         /* begin_epilogue */
@@ -6109,7 +6109,7 @@  check_die (dw_die_ref die)
   dw_attr_node *a;
   bool inline_found = false;
   int n_location = 0, n_low_pc = 0, n_high_pc = 0, n_artificial = 0;
-  int n_decl_line = 0, n_decl_file = 0;
+  int n_decl_line = 0, n_decl_column = 0, n_decl_file = 0;
   FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
     {
       switch (a->dw_attr)
@@ -6130,6 +6130,9 @@  check_die (dw_die_ref die)
 	case DW_AT_artificial:
 	  ++n_artificial;
 	  break;
+        case DW_AT_decl_column:
+	  ++n_decl_column;
+	  break;
 	case DW_AT_decl_line:
 	  ++n_decl_line;
 	  break;
@@ -6141,7 +6144,7 @@  check_die (dw_die_ref die)
 	}
     }
   if (n_location > 1 || n_low_pc > 1 || n_high_pc > 1 || n_artificial > 1
-      || n_decl_line > 1 || n_decl_file > 1)
+      || n_decl_column > 1 || n_decl_line > 1 || n_decl_file > 1)
     {
       fprintf (stderr, "Duplicate attributes in DIE:\n");
       debug_dwarf_die (die);
@@ -20190,6 +20193,8 @@  add_src_coords_attributes (dw_die_ref di
   s = expand_location (DECL_SOURCE_LOCATION (decl));
   add_AT_file (die, DW_AT_decl_file, lookup_filename (s.file));
   add_AT_unsigned (die, DW_AT_decl_line, s.line);
+  if (debug_column_info && s.column)
+    add_AT_unsigned (die, DW_AT_decl_column, s.column);
 }
 
 /* Add DW_AT_{,MIPS_}linkage_name attribute for the given decl.  */
@@ -21936,7 +21941,11 @@  gen_subprogram_die (tree decl, dw_die_re
 	   && (DECL_ARTIFICIAL (decl)
 	       || (get_AT_file (old_die, DW_AT_decl_file) == file_index
 		   && (get_AT_unsigned (old_die, DW_AT_decl_line)
-		       == (unsigned) s.line))))
+		       == (unsigned) s.line)
+		   && (!debug_column_info
+		       || s.column == 0
+		       || (get_AT_unsigned (old_die, DW_AT_decl_column)
+			   == (unsigned) s.column)))))
 	{
 	  subr_die = old_die;
 
@@ -21963,10 +21972,15 @@  gen_subprogram_die (tree decl, dw_die_re
 	    add_AT_file (subr_die, DW_AT_decl_file, file_index);
 	  if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line)
 	    add_AT_unsigned (subr_die, DW_AT_decl_line, s.line);
+	  if (debug_column_info
+	      && s.column
+	      && (get_AT_unsigned (old_die, DW_AT_decl_column)
+		  != (unsigned) s.column))
+	    add_AT_unsigned (subr_die, DW_AT_decl_column, s.column);
 
 	  /* If the prototype had an 'auto' or 'decltype(auto)' return type,
 	     emit the real type on the definition die.  */
-	  if (is_cxx() && debug_info_level > DINFO_LEVEL_TERSE)
+	  if (is_cxx () && debug_info_level > DINFO_LEVEL_TERSE)
 	    {
 	      dw_die_ref die = get_AT_ref (old_die, DW_AT_type);
 	      if (die == auto_die || die == decltype_auto_die)
@@ -22838,6 +22852,12 @@  gen_variable_die (tree decl, tree origin
 	  if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line)
 	    add_AT_unsigned (var_die, DW_AT_decl_line, s.line);
 
+	  if (debug_column_info
+	      && s.column
+	      && (get_AT_unsigned (old_die, DW_AT_decl_column)
+		  != (unsigned) s.column))
+	    add_AT_unsigned (var_die, DW_AT_decl_column, s.column);
+
 	  if (old_die->die_tag == DW_TAG_member)
 	    add_linkage_name (var_die, decl);
 	}
@@ -23011,6 +23031,8 @@  add_call_src_coords_attributes (tree stm
     {
       add_AT_file (die, DW_AT_call_file, lookup_filename (s.file));
       add_AT_unsigned (die, DW_AT_call_line, s.line);
+      if (debug_column_info && s.column)
+	add_AT_unsigned (die, DW_AT_call_column, s.column);
     }
 }
 
@@ -25547,6 +25569,8 @@  dwarf2out_imported_module_or_decl_1 (tre
 
   add_AT_file (imported_die, DW_AT_decl_file, lookup_filename (xloc.file));
   add_AT_unsigned (imported_die, DW_AT_decl_line, xloc.line);
+  if (debug_column_info && xloc.column)
+    add_AT_unsigned (imported_die, DW_AT_decl_column, xloc.column);
   if (name)
     add_AT_string (imported_die, DW_AT_name,
 		   IDENTIFIER_POINTER (name));
@@ -27959,7 +27983,9 @@  move_linkage_attr (dw_die_ref die)
     {
       dw_attr_node *prev = &(*die->die_attr)[ix - 1];
 
-      if (prev->dw_attr == DW_AT_decl_line || prev->dw_attr == DW_AT_name)
+      if (prev->dw_attr == DW_AT_decl_line
+	  || prev->dw_attr == DW_AT_decl_column
+	  || prev->dw_attr == DW_AT_name)
 	break;
     }
 
--- gcc/doc/invoke.texi.jj	2017-02-17 11:31:38.000000000 +0100
+++ gcc/doc/invoke.texi	2017-02-17 12:10:46.805110128 +0100
@@ -338,6 +338,7 @@  Objective-C and Objective-C++ Dialects}.
 @gccoptlist{-g  -g@var{level}  -gcoff  -gdwarf  -gdwarf-@var{version} @gol
 -ggdb  -grecord-gcc-switches  -gno-record-gcc-switches @gol
 -gstabs  -gstabs+  -gstrict-dwarf  -gno-strict-dwarf @gol
+-gcolumn-info  -gno-column-info @gol
 -gvms  -gxcoff  -gxcoff+  -gz@r{[}=@var{type}@r{]} @gol
 -fdebug-prefix-map=@var{old}=@var{new}  -fdebug-types-section @gol
 -feliminate-dwarf2-dups  -fno-eliminate-unused-debug-types @gol
@@ -6822,6 +6823,14 @@  DWARF extensions from later standard ver
 Allow using extensions of later DWARF standard version than selected with
 @option{-gdwarf-@var{version}}.
 
+@item -gcolumn-info
+@item -gno-column-info
+@opindex gcolumn-info
+@opindex gno-column-info
+Emit location column information into DWARF debugging information, rather
+than just file and line.
+This option is disabled by default.
+
 @item -gz@r{[}=@var{type}@r{]}
 @opindex gz
 Produce compressed debug sections in DWARF format, if that is supported.