Looks fine.
On Fri, Feb 17, 2017 at 1:59 PM, Jakub Jelinek <ja...@redhat.com> wrote: > 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