Hi!

And here is incremental patch to provide column information even in
.debug_line (whether through .loc directives or custom .debug_line).
The patch looks large, because I had to adjust the two hooks to pass
through the column information, but beyond that it is actually very simple.

If the earlier patch is ok, would this be ok too (not bootstrapped yet,
going to regtest it soon)?

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

        * final.c (last_columnnum, override_columnnum): New variables.
        (final_start_function): Set last_columnnum, pass it to begin_prologue
        hook and pass 0 to dwarf2out_begin_prologue.
        (final_scan_insn): Update override_columnnum.  Pass last_columnnum
        to source_line debug hook.
        (notice_source_line): Compute last_columnnum and for debug_column_info
        return true on column changes.
        * debug.h (struct gcc_debug_hooks): Add column argument to
        source_line and begin_prologue hooks.
        (debug_nothing_int_charstar_int_bool): Remove prototype.
        (debug_nothing_int_int_charstar,
        debug_nothing_int_int_charstar_int_bool): New prototypes.
        (dwarf2out_begin_prologue): Add column argument.
        * debug.c (do_nothing_debug_hooks): Adjust source_line and
        begin_prologue hooks.
        (debug_nothing_int_charstar_int_bool): Remove.
        (debug_nothing_int_int_charstar,
        debug_nothing_int_int_charstar_int_bool): New functions.
        * dwarf2out.c (dwarf2out_begin_prologue): Add column argument, pass it
        through to dwarf2out_source_line.
        (dwarf2_lineno_debug_hooks): Adjust begin_prologue hook.
        (dwarf2out_source_line): Add column argument, emit it if requested.
        * sdbout.c (sdbout_source_line, sdbout_begin_prologue): Add column
        arguments.
        * xcoffout.h (xcoffout_begin_prologue, xcoffout_source_line): Likewise.
        * xcoffout.c (xcoffout_begin_prologue, xcoffout_source_line): Likewise.
        * vmsdbgout.c (vmsdbgout_begin_prologue): Add column argument, pass it
        through to dwarf2out_begin_prologue.
        (vmsdbgout_source_line): Add column argument, pass it through to
        dwarf2out_source_line.
        * dbxout.c (dbxout_begin_prologue): Add column argument, adjust
        dbxout_source_line caller.
        (dbxout_source_line): Add column argument.

--- gcc/final.c.jj      2017-01-24 23:29:07.000000000 +0100
+++ gcc/final.c 2017-02-17 19:13:39.504406149 +0100
@@ -118,6 +118,9 @@ rtx_insn *current_output_insn;
 /* Line number of last NOTE.  */
 static int last_linenum;
 
+/* Column number of last NOTE.  */
+static int last_columnnum;
+
 /* Last discriminator written to assembly.  */
 static int last_discriminator;
 
@@ -133,9 +136,10 @@ static int high_function_linenum;
 /* Filename of last NOTE.  */
 static const char *last_filename;
 
-/* Override filename and line number.  */
+/* Override filename, line and column number.  */
 static const char *override_filename;
 static int override_linenum;
+static int override_columnnum;
 
 /* Whether to force emission of a line note before the next insn.  */
 static bool force_source_line = false;
@@ -1763,6 +1767,7 @@ final_start_function (rtx_insn *first, F
 
   last_filename = LOCATION_FILE (prologue_location);
   last_linenum = LOCATION_LINE (prologue_location);
+  last_columnnum = LOCATION_COLUMN (prologue_location);
   last_discriminator = discriminator = 0;
 
   high_block_linenum = high_function_linenum = last_linenum;
@@ -1771,10 +1776,10 @@ final_start_function (rtx_insn *first, F
     asan_function_start ();
 
   if (!DECL_IGNORED_P (current_function_decl))
-    debug_hooks->begin_prologue (last_linenum, last_filename);
+    debug_hooks->begin_prologue (last_linenum, last_columnnum, last_filename);
 
   if (!dwarf2_debug_info_emitted_p (current_function_decl))
-    dwarf2out_begin_prologue (0, NULL);
+    dwarf2out_begin_prologue (0, 0, NULL);
 
 #ifdef LEAF_REG_REMAP
   if (crtl->uses_only_leaf_regs)
@@ -2335,6 +2340,7 @@ final_scan_insn (rtx_insn *insn, FILE *f
                {
                  override_filename = LOCATION_FILE (*locus_ptr);
                  override_linenum = LOCATION_LINE (*locus_ptr);
+                 override_columnnum = LOCATION_COLUMN (*locus_ptr);
                }
            }
          break;
@@ -2370,11 +2376,13 @@ final_scan_insn (rtx_insn *insn, FILE *f
                {
                  override_filename = LOCATION_FILE (*locus_ptr);
                  override_linenum = LOCATION_LINE (*locus_ptr);
+                 override_columnnum = LOCATION_COLUMN (*locus_ptr);
                }
              else
                {
                  override_filename = NULL;
                  override_linenum = 0;
+                 override_columnnum = 0;
                }
            }
          break;
@@ -2592,8 +2600,9 @@ final_scan_insn (rtx_insn *insn, FILE *f
          {
            if (flag_verbose_asm)
              asm_show_source (last_filename, last_linenum);
-           (*debug_hooks->source_line) (last_linenum, last_filename,
-                                        last_discriminator, is_stmt);
+           (*debug_hooks->source_line) (last_linenum, last_columnnum,
+                                        last_filename, last_discriminator,
+                                        is_stmt);
          }
 
        if (GET_CODE (body) == PARALLEL
@@ -3078,23 +3087,26 @@ static bool
 notice_source_line (rtx_insn *insn, bool *is_stmt)
 {
   const char *filename;
-  int linenum;
+  int linenum, columnnum;
 
   if (override_filename)
     {
       filename = override_filename;
       linenum = override_linenum;
+      columnnum = override_columnnum;
     }
   else if (INSN_HAS_LOCATION (insn))
     {
       expanded_location xloc = insn_location (insn);
       filename = xloc.file;
       linenum = xloc.line;
+      columnnum = xloc.column;
     }
   else
     {
       filename = NULL;
       linenum = 0;
+      columnnum = 0;
     }
 
   if (filename == NULL)
@@ -3102,11 +3114,13 @@ notice_source_line (rtx_insn *insn, bool
 
   if (force_source_line
       || filename != last_filename
-      || last_linenum != linenum)
+      || last_linenum != linenum
+      || (debug_column_info && last_columnnum != columnnum))
     {
       force_source_line = false;
       last_filename = filename;
       last_linenum = linenum;
+      last_columnnum = columnnum;
       last_discriminator = discriminator;
       *is_stmt = true;
       high_block_linenum = MAX (last_linenum, high_block_linenum);
--- gcc/debug.h.jj      2017-01-01 12:45:37.000000000 +0100
+++ gcc/debug.h 2017-02-17 19:10:55.919495624 +0100
@@ -65,13 +65,14 @@ struct gcc_debug_hooks
      though the BLOCK information is messed up.  Defaults to true.  */
   bool (* ignore_block) (const_tree);
 
-  /* Record a source file location at (FILE, LINE, DISCRIMINATOR).  */
-  void (* source_line) (unsigned int line, const char *file,
-                        int discriminator, bool is_stmt);
+  /* Record a source file location at (FILE, LINE, COLUMN, DISCRIMINATOR).  */
+  void (* source_line) (unsigned int line, unsigned int column,
+                       const char *file, int discriminator, bool is_stmt);
 
   /* Called at start of prologue code.  LINE is the first line in the
      function.  */
-  void (* begin_prologue) (unsigned int line, const char *file);
+  void (* begin_prologue) (unsigned int line, unsigned int column,
+                          const char *file);
 
   /* Called at end of prologue code.  LINE is the first line in the
      function.  */
@@ -193,9 +194,13 @@ extern const struct gcc_debug_hooks *deb
 /* The do-nothing hooks.  */
 extern void debug_nothing_void (void);
 extern void debug_nothing_charstar (const char *);
+extern void debug_nothing_int_int_charstar (unsigned int, unsigned int,
+                                           const char *);
 extern void debug_nothing_int_charstar (unsigned int, const char *);
-extern void debug_nothing_int_charstar_int_bool (unsigned int, const char *,
-                                                 int, bool);
+extern void debug_nothing_int_int_charstar_int_bool (unsigned int,
+                                                    unsigned int,
+                                                    const char *,
+                                                    int, bool);
 extern void debug_nothing_int (unsigned int);
 extern void debug_nothing_int_int (unsigned int, unsigned int);
 extern void debug_nothing_tree (tree);
@@ -217,7 +222,8 @@ extern const struct gcc_debug_hooks vmsd
 
 /* Dwarf2 frame information.  */
 
-extern void dwarf2out_begin_prologue (unsigned int, const char *);
+extern void dwarf2out_begin_prologue (unsigned int, unsigned int,
+                                     const char *);
 extern void dwarf2out_vms_end_prologue (unsigned int, const char *);
 extern void dwarf2out_vms_begin_epilogue (unsigned int, const char *);
 extern void dwarf2out_end_epilogue (unsigned int, const char *);
--- gcc/debug.c.jj      2017-01-01 12:45:35.000000000 +0100
+++ gcc/debug.c 2017-02-17 19:14:10.010016500 +0100
@@ -35,8 +35,8 @@ const struct gcc_debug_hooks do_nothing_
   debug_nothing_int_int,                /* begin_block */
   debug_nothing_int_int,                /* end_block */
   debug_true_const_tree,                /* ignore_block */
-  debug_nothing_int_charstar_int_bool,  /* source_line */
-  debug_nothing_int_charstar,           /* begin_prologue */
+  debug_nothing_int_int_charstar_int_bool, /* source_line */
+  debug_nothing_int_int_charstar,       /* begin_prologue */
   debug_nothing_int_charstar,           /* end_prologue */
   debug_nothing_int_charstar,           /* begin_epilogue */
   debug_nothing_int_charstar,           /* end_epilogue */
@@ -115,10 +115,18 @@ debug_nothing_int_charstar (unsigned int
 }
 
 void
-debug_nothing_int_charstar_int_bool (unsigned int line ATTRIBUTE_UNUSED,
-                                    const char *text ATTRIBUTE_UNUSED,
-                                    int discriminator ATTRIBUTE_UNUSED,
-                                    bool is_stmt ATTRIBUTE_UNUSED)
+debug_nothing_int_int_charstar (unsigned int line ATTRIBUTE_UNUSED,
+                               unsigned int column ATTRIBUTE_UNUSED,
+                               const char *text ATTRIBUTE_UNUSED)
+{
+}
+
+void
+debug_nothing_int_int_charstar_int_bool (unsigned int line ATTRIBUTE_UNUSED,
+                                        unsigned int column ATTRIBUTE_UNUSED,
+                                        const char *text ATTRIBUTE_UNUSED,
+                                        int discriminator ATTRIBUTE_UNUSED,
+                                        bool is_stmt ATTRIBUTE_UNUSED)
 {
 }
 
--- gcc/dwarf2out.c.jj  2017-02-17 18:29:53.000000000 +0100
+++ gcc/dwarf2out.c     2017-02-17 19:10:26.481871631 +0100
@@ -93,7 +93,8 @@ along with GCC; see the file COPYING3.
 #include "gdb/gdb-index.h"
 #include "rtl-iter.h"
 
-static void dwarf2out_source_line (unsigned int, const char *, int, bool);
+static void dwarf2out_source_line (unsigned int, unsigned int, const char *,
+                                  int, bool);
 static rtx_insn *last_var_location_insn;
 static rtx_insn *cached_next_real_insn;
 static void dwarf2out_decl (tree);
@@ -1023,6 +1024,7 @@ dwarf2out_alloc_current_fde (void)
 
 void
 dwarf2out_begin_prologue (unsigned int line ATTRIBUTE_UNUSED,
+                         unsigned int column ATTRIBUTE_UNUSED,
                          const char *file ATTRIBUTE_UNUSED)
 {
   char label[MAX_ARTIFICIAL_LABEL_BYTES];
@@ -1073,7 +1075,7 @@ dwarf2out_begin_prologue (unsigned int l
      prologue case, not the eh frame case.  */
 #ifdef DWARF2_DEBUGGING_INFO
   if (file)
-    dwarf2out_source_line (line, file, 0, true);
+    dwarf2out_source_line (line, column, file, 0, true);
 #endif
 
   if (dwarf2out_do_cfi_asm ())
@@ -1099,7 +1101,7 @@ dwarf2out_begin_prologue (unsigned int l
 
 void
 dwarf2out_vms_end_prologue (unsigned int line ATTRIBUTE_UNUSED,
-                       const char *file ATTRIBUTE_UNUSED)
+                           const char *file ATTRIBUTE_UNUSED)
 {
   char label[MAX_ARTIFICIAL_LABEL_BYTES];
 
@@ -2733,7 +2735,7 @@ const struct gcc_debug_hooks dwarf2_line
   debug_nothing_int_int,                /* end_block */
   debug_true_const_tree,                /* ignore_block */
   dwarf2out_source_line,                /* source_line */
-  debug_nothing_int_charstar,           /* begin_prologue */
+  debug_nothing_int_int_charstar,       /* begin_prologue */
   debug_nothing_int_charstar,           /* end_prologue */
   debug_nothing_int_charstar,           /* begin_epilogue */
   debug_nothing_int_charstar,           /* end_epilogue */
@@ -26534,7 +26536,8 @@ push_dw_line_info_entry (dw_line_info_ta
 /* ??? The discriminator parameter ought to be unsigned.  */
 
 static void
-dwarf2out_source_line (unsigned int line, const char *filename,
+dwarf2out_source_line (unsigned int line, unsigned int column,
+                      const char *filename,
                        int discriminator, bool is_stmt)
 {
   unsigned int file_num;
@@ -26548,6 +26551,9 @@ dwarf2out_source_line (unsigned int line
   if (dwarf_version < 4 && dwarf_strict)
     discriminator = 0;
 
+  if (!debug_column_info)
+    column = 0;
+
   table = cur_line_info_table;
   file_num = maybe_emit_file (lookup_filename (filename));
 
@@ -26567,6 +26573,7 @@ dwarf2out_source_line (unsigned int line
 
   if (0 && file_num == table->file_num
       && line == table->line_num
+      && column == table->column_num
       && discriminator == table->discrim_num
       && is_stmt == table->is_stmt)
     return;
@@ -26575,7 +26582,14 @@ dwarf2out_source_line (unsigned int line
 
   /* If requested, emit something human-readable.  */
   if (flag_debug_asm)
-    fprintf (asm_out_file, "\t%s %s:%d\n", ASM_COMMENT_START, filename, line);
+    {
+      if (debug_column_info)
+       fprintf (asm_out_file, "\t%s %s:%d:%d\n", ASM_COMMENT_START,
+                filename, line, column);
+      else
+       fprintf (asm_out_file, "\t%s %s:%d\n", ASM_COMMENT_START,
+                filename, line);
+    }
 
   if (DWARF2_ASM_LINE_DEBUG_INFO)
     {
@@ -26587,7 +26601,10 @@ dwarf2out_source_line (unsigned int line
       putc (' ', asm_out_file);
       fprint_ul (asm_out_file, line);
       putc (' ', asm_out_file);
-      putc ('0', asm_out_file);
+      if (debug_column_info)
+       fprint_ul (asm_out_file, column);
+      else
+       putc ('0', asm_out_file);
 
       if (is_stmt != table->is_stmt)
        {
@@ -26616,10 +26633,13 @@ dwarf2out_source_line (unsigned int line
       if (is_stmt != table->is_stmt)
        push_dw_line_info_entry (table, LI_negate_stmt, 0);
       push_dw_line_info_entry (table, LI_set_line, line);
+      if (debug_column_info)
+       push_dw_line_info_entry (table, LI_set_column, column);
     }
 
   table->file_num = file_num;
   table->line_num = line;
+  table->column_num = column;
   table->discrim_num = discriminator;
   table->is_stmt = is_stmt;
   table->in_use = true;
--- gcc/sdbout.c.jj     2017-01-01 12:45:35.000000000 +0100
+++ gcc/sdbout.c        2017-02-17 19:12:27.526325527 +0100
@@ -116,11 +116,13 @@ static void sdbout_start_source_file      (un
 static void sdbout_end_source_file     (unsigned int);
 static void sdbout_begin_block         (unsigned int, unsigned int);
 static void sdbout_end_block           (unsigned int, unsigned int);
-static void sdbout_source_line         (unsigned int, const char *, int, bool);
+static void sdbout_source_line         (unsigned int, unsigned int,
+                                        const char *, int, bool);
 static void sdbout_end_epilogue                (unsigned int, const char *);
 static void sdbout_early_global_decl   (tree);
 static void sdbout_late_global_decl    (tree);
-static void sdbout_begin_prologue      (unsigned int, const char *);
+static void sdbout_begin_prologue      (unsigned int, unsigned int,
+                                        const char *);
 static void sdbout_end_prologue                (unsigned int, const char *);
 static void sdbout_begin_function      (tree);
 static void sdbout_end_function                (unsigned int);
@@ -1519,7 +1521,8 @@ sdbout_end_block (unsigned int line, uns
    number LINE.  */
 
 static void
-sdbout_source_line (unsigned int line, const char *filename ATTRIBUTE_UNUSED,
+sdbout_source_line (unsigned int line, unsigned int column ATTRIBUTE_UNUSED,
+                   const char *filename ATTRIBUTE_UNUSED,
                     int discriminator ATTRIBUTE_UNUSED,
                     bool is_stmt ATTRIBUTE_UNUSED)
 {
@@ -1551,7 +1554,8 @@ sdbout_begin_function (tree decl ATTRIBU
    describe the parameter list.  */
 
 static void
-sdbout_begin_prologue (unsigned int line, const char *file ATTRIBUTE_UNUSED)
+sdbout_begin_prologue (unsigned int line, unsigned int column ATTRIBUTE_UNUSED,
+                      const char *file ATTRIBUTE_UNUSED)
 {
   sdbout_end_prologue (line, file);
 }
--- gcc/xcoffout.h.jj   2017-01-01 12:45:34.000000000 +0100
+++ gcc/xcoffout.h      2017-02-17 18:31:11.961331304 +0100
@@ -181,13 +181,14 @@ do {                                                      
\
 /* Prototype functions in xcoffout.c.  */
 
 extern int stab_to_sclass (int);
-extern void xcoffout_begin_prologue (unsigned int, const char *);
+extern void xcoffout_begin_prologue (unsigned int, unsigned int, const char *);
 extern void xcoffout_begin_block (unsigned, unsigned);
 extern void xcoffout_end_epilogue (unsigned int, const char *);
 extern void xcoffout_end_function (unsigned int);
 extern void xcoffout_end_block (unsigned, unsigned);
 extern int xcoff_assign_fundamental_type_number (tree);
 extern void xcoffout_declare_function (FILE *, tree, const char *);
-extern void xcoffout_source_line (unsigned int, const char *, int, bool);
+extern void xcoffout_source_line (unsigned int, unsigned int, const char *,
+                                 int, bool);
 
 #endif /* GCC_XCOFFOUT_H */
--- gcc/xcoffout.c.jj   2017-01-01 12:45:39.000000000 +0100
+++ gcc/xcoffout.c      2017-02-17 18:36:30.399361015 +0100
@@ -327,8 +327,8 @@ xcoffout_source_file (FILE *file, const
 /* Output a line number symbol entry for location (FILENAME, LINE).  */
 
 void
-xcoffout_source_line (unsigned int line, const char *filename,
-                      int discriminator ATTRIBUTE_UNUSED,
+xcoffout_source_line (unsigned int line, unsigned int column ATTRIBUTE_UNUSED,
+                     const char *filename, int discriminator ATTRIBUTE_UNUSED,
                       bool is_stmt ATTRIBUTE_UNUSED)
 {
   bool inline_p = (strcmp (xcoff_current_function_file, filename) != 0
@@ -446,6 +446,7 @@ xcoffout_declare_function (FILE *file, t
 
 void
 xcoffout_begin_prologue (unsigned int line,
+                        unsigned int column ATTRIBUTE_UNUSED,
                         const char *file ATTRIBUTE_UNUSED)
 {
   ASM_OUTPUT_LFB (asm_out_file, line);
--- gcc/vmsdbgout.c.jj  2017-01-01 12:45:39.000000000 +0100
+++ gcc/vmsdbgout.c     2017-02-17 19:13:08.489802300 +0100
@@ -155,9 +155,11 @@ static void vmsdbgout_end_source_file (u
 static void vmsdbgout_begin_block (unsigned int, unsigned int);
 static void vmsdbgout_end_block (unsigned int, unsigned int);
 static bool vmsdbgout_ignore_block (const_tree);
-static void vmsdbgout_source_line (unsigned int, const char *, int, bool);
+static void vmsdbgout_source_line (unsigned int, unsigned int, const char *,
+                                  int, bool);
 static void vmsdbgout_write_source_line (unsigned, const char *, int , bool);
-static void vmsdbgout_begin_prologue (unsigned int, const char *);
+static void vmsdbgout_begin_prologue (unsigned int, unsigned int,
+                                     const char *);
 static void vmsdbgout_end_prologue (unsigned int, const char *);
 static void vmsdbgout_end_function (unsigned int);
 static void vmsdbgout_begin_epilogue (unsigned int, const char *);
@@ -1114,12 +1116,13 @@ write_srccorrs (int dosizeonly)
    the prologue.  */
 
 static void
-vmsdbgout_begin_prologue (unsigned int line, const char *file)
+vmsdbgout_begin_prologue (unsigned int line, unsigned int column,
+                         const char *file)
 {
   char label[MAX_ARTIFICIAL_LABEL_BYTES];
 
   if (write_symbols == VMS_AND_DWARF2_DEBUG)
-    (*dwarf2_debug_hooks.begin_prologue) (line, file);
+    (*dwarf2_debug_hooks.begin_prologue) (line, column, file);
 
   if (debug_info_level > DINFO_LEVEL_NONE)
     {
@@ -1397,11 +1400,13 @@ vmsdbgout_write_source_line (unsigned li
 }
 
 static void
-vmsdbgout_source_line (register unsigned line, register const char *filename,
+vmsdbgout_source_line (register unsigned line, unsigned int column,
+                      register const char *filename,
                        int discriminator, bool is_stmt)
 {
   if (write_symbols == VMS_AND_DWARF2_DEBUG)
-    (*dwarf2_debug_hooks.source_line) (line, filename, discriminator, is_stmt);
+    (*dwarf2_debug_hooks.source_line) (line, column, filename, discriminator,
+                                      is_stmt);
 
   if (debug_info_level >= DINFO_LEVEL_TERSE)
     vmsdbgout_write_source_line (line, filename, discriminator, is_stmt);
--- gcc/dbxout.c.jj     2017-01-01 12:45:36.000000000 +0100
+++ gcc/dbxout.c        2017-02-17 19:09:20.718711626 +0100
@@ -332,8 +332,9 @@ static void debug_free_queue (void);
 /* The debug hooks structure.  */
 #if defined (DBX_DEBUGGING_INFO)
 
-static void dbxout_source_line (unsigned int, const char *, int, bool);
-static void dbxout_begin_prologue (unsigned int, const char *);
+static void dbxout_source_line (unsigned int, unsigned int, const char *,
+                               int, bool);
+static void dbxout_begin_prologue (unsigned int, unsigned int, const char *);
 static void dbxout_source_file (const char *);
 static void dbxout_function_end (tree);
 static void dbxout_begin_function (tree);
@@ -1241,7 +1242,9 @@ dbxout_source_file (const char *filename
    function scope  */
 
 static void
-dbxout_begin_prologue (unsigned int lineno, const char *filename)
+dbxout_begin_prologue (unsigned int lineno,
+                      unsigned int column ATTRIBUTE_UNUSED,
+                      const char *filename)
 {
   if (use_gnu_debug_info_extensions
       && !NO_DBX_FUNCTION_END
@@ -1252,7 +1255,7 @@ dbxout_begin_prologue (unsigned int line
   /* pre-increment the scope counter */
   scope_labelno++;
 
-  dbxout_source_line (lineno, filename, 0, true);
+  dbxout_source_line (lineno, 0, filename, 0, true);
   /* Output function begin block at function scope, referenced
      by dbxout_block, dbxout_source_line and dbxout_function_end.  */
   emit_pending_bincls_if_required ();
@@ -1263,8 +1266,8 @@ dbxout_begin_prologue (unsigned int line
    number LINENO.  */
 
 static void
-dbxout_source_line (unsigned int lineno, const char *filename,
-                    int discriminator ATTRIBUTE_UNUSED,
+dbxout_source_line (unsigned int lineno, unsigned int column ATTRIBUTE_UNUSED,
+                   const char *filename, int discriminator ATTRIBUTE_UNUSED,
                     bool is_stmt ATTRIBUTE_UNUSED)
 {
   dbxout_source_file (filename);

        Jakub

Reply via email to