Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 39 additions & 2 deletions gcc/dwarf2out.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand All @@ -4313,22 +4318,46 @@ 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_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.",
ASM_COMMENT_START);

fputc ('\n', asm_out_file);

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);
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_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_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);
if (flag_debug_asm)
fprintf (asm_out_file, "\t%s Minimum Instruction Length",
Expand Down Expand Up @@ -4423,6 +4452,10 @@ output_line_info ()
ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
fputc ('\n', asm_out_file);

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 */
ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
if (flag_debug_asm)
Expand Down Expand Up @@ -4738,6 +4771,10 @@ output_line_info ()
fputc ('\n', asm_out_file);
}
}

if (flag_fixed_debug_line_info)
/* end of .debug_line */
ASM_OUTPUT_LABEL (asm_out_file, l2);
}

/* Given a pointer to a BLOCK node return non-zero if (and only if) the node
Expand Down
4 changes: 4 additions & 0 deletions gcc/flags.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 be corrected rather than
match the original (buggy) GCC 2.95.x output. */
extern int flag_fixed_debug_line_info;
5 changes: 5 additions & 0 deletions gcc/toplev.c
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,9 @@ int flag_instrument_function_entry_exit = 0;
/* Use hex instead of decimal in ASM output. */
int flag_hex_asm = 0;

/* Fix buggy DWARF line info generation. */
int flag_fixed_debug_line_info = 0;

typedef struct
{
char *string;
Expand Down Expand Up @@ -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"},
{"fix-debug-line", &flag_fixed_debug_line_info, 1,
"Generate fixed DWARF line info"},
};

#define NUM_ELEM(a) (sizeof (a) / sizeof ((a)[0]))
Expand Down