From 0b2b7366a87700ba08fa10be6a8d5b5b0f219ddc Mon Sep 17 00:00:00 2001 From: Stan H Date: Wed, 2 Mar 2022 20:23:07 +0100 Subject: [PATCH 1/3] backport fix for .debug_line head generation and add flag for restoring old behavior --- gcc/dwarf2out.c | 38 ++++++++++++++++++++++++++++++++++++-- gcc/flags.h | 4 ++++ gcc/toplev.c | 5 +++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 03555d57..98e7e7b9 100755 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -232,6 +232,10 @@ static unsigned reg_number (rtx); #define FDE_AFTER_SIZE_LABEL "LSFDE" #define FDE_END_LABEL "LEFDE" #define FDE_LENGTH_LABEL "LLFDE" +#define LINE_NUMBER_BEGIN_LABEL "LSLT" +#define LINE_NUMBER_END_LABEL "LELT" +#define LN_PROLOG_AS_LABEL "LASLTP" +#define LN_PROLOG_END_LABEL "LELTP" /* Definitions of defaults for various types of primitive assembly language output operations. These may be overridden from within the tm.h file, @@ -4301,6 +4305,7 @@ output_aranges () static void output_line_info () { + char l1[20], l2[20], p1[20], p2[20]; char line_label[MAX_ARTIFICIAL_LABEL_BYTES]; char prev_line_label[MAX_ARTIFICIAL_LABEL_BYTES]; register unsigned opc; @@ -4313,22 +4318,44 @@ output_line_info () register unsigned long current_file; register unsigned long function; - ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_info ()); + ASM_GENERATE_INTERNAL_LABEL (l1, LINE_NUMBER_BEGIN_LABEL, 0); + ASM_GENERATE_INTERNAL_LABEL (l2, LINE_NUMBER_END_LABEL, 0); + ASM_GENERATE_INTERNAL_LABEL (p1, LN_PROLOG_AS_LABEL, 0); + ASM_GENERATE_INTERNAL_LABEL (p2, LN_PROLOG_END_LABEL, 0); + + if (flag_legacy_debug_info) + ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_info ()); + else + ASM_OUTPUT_DWARF_DELTA (asm_out_file, l2, l1); + if (flag_debug_asm) fprintf (asm_out_file, "\t%s Length of Source Line Info.", ASM_COMMENT_START); fputc ('\n', asm_out_file); + + if (!flag_legacy_debug_info) + ASM_OUTPUT_LABEL(asm_out_file, l1); + ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION); if (flag_debug_asm) fprintf (asm_out_file, "\t%s DWARF Version", ASM_COMMENT_START); fputc ('\n', asm_out_file); - ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_prolog ()); + + if (flag_legacy_debug_info) + ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_prolog ()); + else + ASM_OUTPUT_DWARF_DELTA (asm_out_file, p2, p1); + if (flag_debug_asm) fprintf (asm_out_file, "\t%s Prolog Length", ASM_COMMENT_START); fputc ('\n', asm_out_file); + + if (!flag_legacy_debug_info) + ASM_OUTPUT_LABEL(asm_out_file, p1); + ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DWARF_LINE_MIN_INSTR_LENGTH); if (flag_debug_asm) fprintf (asm_out_file, "\t%s Minimum Instruction Length", @@ -4423,6 +4450,9 @@ output_line_info () ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); fputc ('\n', asm_out_file); + if (!flag_legacy_debug_info) + ASM_OUTPUT_LABEL (asm_out_file, p2); + /* Set the address register to the first location in the text section */ ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); if (flag_debug_asm) @@ -4738,6 +4768,10 @@ output_line_info () fputc ('\n', asm_out_file); } } + + if (!flag_legacy_debug_info) + /* Output the marker for the end of the line number info. */ + ASM_OUTPUT_LABEL (asm_out_file, l2); } /* Given a pointer to a BLOCK node return non-zero if (and only if) the node diff --git a/gcc/flags.h b/gcc/flags.h index 754096f7..cf2931ff 100755 --- a/gcc/flags.h +++ b/gcc/flags.h @@ -450,3 +450,7 @@ extern enum graph_dump_types graph_dump_format; /* Nonzero if ASM output should use hex instead of decimal. */ extern int flag_hex_asm; + +/* Nonzero if generated DWARF debug info should match (buggy) original + GCC 2.95.x behavior. */ +extern int flag_legacy_debug_info; diff --git a/gcc/toplev.c b/gcc/toplev.c index e80ed20c..b748a1a5 100755 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -585,6 +585,9 @@ int flag_instrument_function_entry_exit = 0; /* Use hex instead of decimal in ASM output. */ int flag_hex_asm = 0; +/* Use old (buggy) DWARF line info generator. */ +int flag_legacy_debug_info = 0; + typedef struct { char *string; @@ -724,6 +727,8 @@ lang_independent_options f_options[] = "Instrument function entry/exit with profiling calls"}, {"hex-asm", &flag_hex_asm, 1, "Use hex instead of decimal in assembly output"}, + {"legacy-debug-line-info", &flag_legacy_debug_info, 1, + "Generate old (buggy) DWARF line info"}, }; #define NUM_ELEM(a) (sizeof (a) / sizeof ((a)[0])) From 7b2372d922b6f76eac6166b270e421ce21eb583c Mon Sep 17 00:00:00 2001 From: Stan H Date: Tue, 4 Apr 2023 09:33:02 +0200 Subject: [PATCH 2/3] rename debug_line fix flag and revert behavior --- gcc/dwarf2out.c | 25 ++++++++++++++----------- gcc/flags.h | 6 +++--- gcc/toplev.c | 6 +++--- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 98e7e7b9..6b8cedf4 100755 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -4323,10 +4323,10 @@ output_line_info () ASM_GENERATE_INTERNAL_LABEL (p1, LN_PROLOG_AS_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (p2, LN_PROLOG_END_LABEL, 0); - if (flag_legacy_debug_info) - ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_info ()); - else + if (flag_fixed_debug_line_info) ASM_OUTPUT_DWARF_DELTA (asm_out_file, l2, l1); + else + ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_info ()); if (flag_debug_asm) fprintf (asm_out_file, "\t%s Length of Source Line Info.", @@ -4334,7 +4334,8 @@ output_line_info () fputc ('\n', asm_out_file); - if (!flag_legacy_debug_info) + if (flag_fixed_debug_line_info) + /* start of .debug_line */ ASM_OUTPUT_LABEL(asm_out_file, l1); ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION); @@ -4343,17 +4344,18 @@ output_line_info () fputc ('\n', asm_out_file); - if (flag_legacy_debug_info) - ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_prolog ()); - else + if (flag_fixed_debug_line_info) ASM_OUTPUT_DWARF_DELTA (asm_out_file, p2, p1); + else + ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_prolog ()); if (flag_debug_asm) fprintf (asm_out_file, "\t%s Prolog Length", ASM_COMMENT_START); fputc ('\n', asm_out_file); - if (!flag_legacy_debug_info) + if (flag_fixed_debug_line_info) + /* start of .debug_line prologue */ ASM_OUTPUT_LABEL(asm_out_file, p1); ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DWARF_LINE_MIN_INSTR_LENGTH); @@ -4450,7 +4452,8 @@ output_line_info () ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); fputc ('\n', asm_out_file); - if (!flag_legacy_debug_info) + if (flag_fixed_debug_line_info) + /* end of .debug_line prologue */ ASM_OUTPUT_LABEL (asm_out_file, p2); /* Set the address register to the first location in the text section */ @@ -4769,8 +4772,8 @@ output_line_info () } } - if (!flag_legacy_debug_info) - /* Output the marker for the end of the line number info. */ + if (flag_fixed_debug_line_info) + /* end of .debug_line */ ASM_OUTPUT_LABEL (asm_out_file, l2); } diff --git a/gcc/flags.h b/gcc/flags.h index cf2931ff..52f5228a 100755 --- a/gcc/flags.h +++ b/gcc/flags.h @@ -451,6 +451,6 @@ extern enum graph_dump_types graph_dump_format; /* Nonzero if ASM output should use hex instead of decimal. */ extern int flag_hex_asm; -/* Nonzero if generated DWARF debug info should match (buggy) original - GCC 2.95.x behavior. */ -extern int flag_legacy_debug_info; +/* Nonzero if generated DWARF debug info should be corrected rather than + match the original (buggy) GCC 2.95.x output. */ +extern int flag_fixed_debug_line_info; diff --git a/gcc/toplev.c b/gcc/toplev.c index b748a1a5..72b35a86 100755 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -586,7 +586,7 @@ int flag_instrument_function_entry_exit = 0; int flag_hex_asm = 0; /* Use old (buggy) DWARF line info generator. */ -int flag_legacy_debug_info = 0; +int flag_fixed_debug_line_info = 0; typedef struct { @@ -727,8 +727,8 @@ lang_independent_options f_options[] = "Instrument function entry/exit with profiling calls"}, {"hex-asm", &flag_hex_asm, 1, "Use hex instead of decimal in assembly output"}, - {"legacy-debug-line-info", &flag_legacy_debug_info, 1, - "Generate old (buggy) DWARF line info"}, + {"fix-debug-line", &flag_fixed_debug_line_info, 1, + "Generate fixed DWARF line info"}, }; #define NUM_ELEM(a) (sizeof (a) / sizeof ((a)[0])) From 0cd8f470fc15ab41ff29fd6a9d01af4cf6d260f0 Mon Sep 17 00:00:00 2001 From: Stan H Date: Wed, 5 Apr 2023 08:28:02 +0200 Subject: [PATCH 3/3] fix comment --- gcc/toplev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/toplev.c b/gcc/toplev.c index 72b35a86..0629081e 100755 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -585,7 +585,7 @@ int flag_instrument_function_entry_exit = 0; /* Use hex instead of decimal in ASM output. */ int flag_hex_asm = 0; -/* Use old (buggy) DWARF line info generator. */ +/* Fix buggy DWARF line info generation. */ int flag_fixed_debug_line_info = 0; typedef struct