Skip to content
Closed
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
46 changes: 44 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 @@ -3697,6 +3701,14 @@ output_abbrev_section ()

fprintf (asm_out_file, "\t%s\t0,0\n", ASM_BYTE_OP);
}

if (flag_legacy_debug_info)
{
/* We need to properly terminate the abbrev table for this
compilation unit, as per the standard, and not rely on
workarounds in e.g. gdb. */
fprintf (asm_out_file, "\t%s\t0\n", ASM_BYTE_OP);
}
}

/* Output location description stack opcode's operands (if any). */
Expand Down Expand Up @@ -4301,6 +4313,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 +4326,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",
Expand Down Expand Up @@ -4423,6 +4458,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)
Expand Down Expand Up @@ -4738,6 +4776,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
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 match (buggy) original
GCC 2.95.x behavior. */
extern int flag_legacy_debug_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;

/* Use old (buggy) DWARF line info generator. */
int flag_legacy_debug_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"},
{"legacy-debug-info", &flag_legacy_debug_info, 1,
"Generate old (buggy) DWARF info"},
};

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