From 5045d766495cc896ba55ff3c9d683cb4d31a15e6 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Mon, 5 Sep 2011 19:19:01 +0000 Subject: [PATCH] gas/ PR gas/13024 * dwarf2dbg.c (pending_lines, pending_lines_tail): New variables. (dwarf2_gen_line_info_1): Delete. (dwarf2_push_line, dwarf2_flush_pending_lines): New functions. (dwarf2_gen_line_info, dwarf2_emit_label): Use them. (dwarf2_consume_line_info): Call dwarf2_flush_pending_lines. (dwarf2_directive_loc): Push previous .locs instead of generating them immediately. gas/testsuite/ * gas/mips/loc-swap-2.s, gas/mips/loc-swap-2.d, gas/mips/micromips@loc-swap-2.d, gas/mips/mips16@loc-swap-2.d: New test. * gas/mips/mips.exp: Run it. --- gas/ChangeLog | 11 +++++ gas/dwarf2dbg.c | 59 +++++++++++++++++++++------ gas/testsuite/ChangeLog | 7 ++++ gas/testsuite/gas/mips/loc-swap-2.d | 49 ++++++++++++++++++++++ gas/testsuite/gas/mips/loc-swap-2.s | 21 ++++++++++ gas/testsuite/gas/mips/micromips@loc-swap-2.d | 49 ++++++++++++++++++++++ gas/testsuite/gas/mips/mips.exp | 1 + gas/testsuite/gas/mips/mips16@loc-swap-2.d | 49 ++++++++++++++++++++++ 8 files changed, 233 insertions(+), 13 deletions(-) create mode 100644 gas/testsuite/gas/mips/loc-swap-2.d create mode 100644 gas/testsuite/gas/mips/loc-swap-2.s create mode 100644 gas/testsuite/gas/mips/micromips@loc-swap-2.d create mode 100644 gas/testsuite/gas/mips/mips16@loc-swap-2.d diff --git a/gas/ChangeLog b/gas/ChangeLog index 7c40c34..35550ec 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2011-09-05 Richard Sandiford + + PR gas/13024 + * dwarf2dbg.c (pending_lines, pending_lines_tail): New variables. + (dwarf2_gen_line_info_1): Delete. + (dwarf2_push_line, dwarf2_flush_pending_lines): New functions. + (dwarf2_gen_line_info, dwarf2_emit_label): Use them. + (dwarf2_consume_line_info): Call dwarf2_flush_pending_lines. + (dwarf2_directive_loc): Push previous .locs instead of generating + them immediately. + 2011-08-26 Nick Clifton * po/es.po: Updated Spanish translation. diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index 31bf310..e95f748 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -207,6 +207,10 @@ static struct dwarf2_line_info current = { 0 }; +/* Lines that are at the same location as CURRENT, and which are waiting + for a label. */ +static struct line_entry *pending_lines, **pending_lines_tail = &pending_lines; + /* The size of an address on the target. */ static unsigned int sizeof_address; @@ -280,22 +284,47 @@ get_line_subseg (segT seg, subsegT subseg) return lss; } -/* Record an entry for LOC occurring at LABEL. */ +/* Push LOC onto the pending lines list. */ static void -dwarf2_gen_line_info_1 (symbolS *label, struct dwarf2_line_info *loc) +dwarf2_push_line (struct dwarf2_line_info *loc) { - struct line_subseg *lss; struct line_entry *e; e = (struct line_entry *) xmalloc (sizeof (*e)); e->next = NULL; - e->label = label; + e->label = NULL; e->loc = *loc; - lss = get_line_subseg (now_seg, now_subseg); - *lss->ptail = e; - lss->ptail = &e->next; + *pending_lines_tail = e; + pending_lines_tail = &(*pending_lines_tail)->next; +} + +/* Emit all pending line information. LABEL is the label with which the + lines should be associated, or null if they should be associated with + the current position. */ + +static void +dwarf2_flush_pending_lines (symbolS *label) +{ + if (pending_lines) + { + struct line_subseg *lss; + struct line_entry *e; + + if (!label) + label = symbol_temp_new (now_seg, 0, frag_now); + + for (e = pending_lines; e; e = e->next) + e->label = label; + + lss = get_line_subseg (now_seg, now_subseg); + *lss->ptail = pending_lines; + lss->ptail = pending_lines_tail; + + pending_lines = NULL; + pending_lines_tail = &pending_lines; + } } /* Record an entry for LOC occurring at OFS within the current fragment. */ @@ -306,8 +335,6 @@ dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc) static unsigned int line = -1; static unsigned int filenum = -1; - symbolS *sym; - /* Early out for as-yet incomplete location information. */ if (loc->filenum == 0 || loc->line == 0) return; @@ -323,8 +350,8 @@ dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc) line = loc->line; filenum = loc->filenum; - sym = symbol_temp_new (now_seg, ofs, frag_now); - dwarf2_gen_line_info_1 (sym, loc); + dwarf2_push_line (loc); + dwarf2_flush_pending_lines (symbol_temp_new (now_seg, ofs, frag_now)); } /* Returns the current source information. If .file directives have @@ -385,6 +412,11 @@ dwarf2_emit_insn (int size) void dwarf2_consume_line_info (void) { + /* If the consumer has stashed the current location away for later use, + assume that any earlier location information should be associated + with ".". */ + dwarf2_flush_pending_lines (NULL); + /* Unless we generate DWARF2 debugging information for each assembler line, we only emit one line symbol for one LOC. */ dwarf2_loc_directive_seen = FALSE; @@ -416,7 +448,8 @@ dwarf2_emit_label (symbolS *label) loc.flags |= DWARF2_FLAG_BASIC_BLOCK; - dwarf2_gen_line_info_1 (label, &loc); + dwarf2_push_line (&loc); + dwarf2_flush_pending_lines (label); dwarf2_consume_line_info (); } @@ -576,7 +609,7 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED) /* If we see two .loc directives in a row, force the first one to be output now. */ if (dwarf2_loc_directive_seen) - dwarf2_emit_insn (0); + dwarf2_push_line (¤t); filenum = get_absolute_expression (); SKIP_WHITESPACE (); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index a4de754..e1af12a 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2011-09-05 Richard Sandiford + + * gas/mips/loc-swap-2.s, gas/mips/loc-swap-2.d, + gas/mips/micromips@loc-swap-2.d, + gas/mips/mips16@loc-swap-2.d: New test. + * gas/mips/mips.exp: Run it. + 2011-08-19 Sergey A. Guriev * gas/i386/avx-gather-intel.d: Added missing vpgather tests. diff --git a/gas/testsuite/gas/mips/loc-swap-2.d b/gas/testsuite/gas/mips/loc-swap-2.d new file mode 100644 index 0000000..b573445 --- /dev/null +++ b/gas/testsuite/gas/mips/loc-swap-2.d @@ -0,0 +1,49 @@ +#PROG: readelf +#readelf: -wl +#name: MIPS DWARF-2 location information with branch swapping (2) +#as: -32 +#source: loc-swap-2.s + +Raw dump of debug contents of section .debug_line: + + Offset: 0x0 + Length: 60 + DWARF Version: 2 + Prologue Length: 35 + Minimum Instruction Length: 1 + Initial value of 'is_stmt': 1 + Line Base: -5 + Line Range: 14 + Opcode Base: 13 + + Opcodes: + Opcode 1 has 0 args + Opcode 2 has 1 args + Opcode 3 has 1 args + Opcode 4 has 1 args + Opcode 5 has 1 args + Opcode 6 has 0 args + Opcode 7 has 0 args + Opcode 8 has 0 args + Opcode 9 has 1 args + Opcode 10 has 0 args + Opcode 11 has 0 args + Opcode 12 has 1 args + + The Directory Table is empty. + + The File Name Table: + Entry Dir Time Size Name + 1 0 0 0 loc-swap-2.s + + Line Number Statements: + Extended opcode 2: set Address to 0x0 + Special opcode 11: advance Address by 0 to 0x0 and Line by 6 to 7 + Special opcode 7: advance Address by 0 to 0x0 and Line by 2 to 9 + Special opcode 6: advance Address by 0 to 0x0 and Line by 1 to 10 + Special opcode 120: advance Address by 8 to 0x8 and Line by 3 to 13 + Special opcode 62: advance Address by 4 to 0xc and Line by 1 to 14 + Special opcode 6: advance Address by 0 to 0xc and Line by 1 to 15 + Special opcode 119: advance Address by 8 to 0x14 and Line by 2 to 17 + Advance PC by 4 to 0x18 + Extended opcode 1: End of Sequence diff --git a/gas/testsuite/gas/mips/loc-swap-2.s b/gas/testsuite/gas/mips/loc-swap-2.s new file mode 100644 index 0000000..03314e9 --- /dev/null +++ b/gas/testsuite/gas/mips/loc-swap-2.s @@ -0,0 +1,21 @@ + .file 1 "loc-swap-2.s" + .cfi_startproc + .ent foo + .type foo,@function +foo: + .loc 1 7 + move $5,$6 + .loc 1 9 + .loc 1 10 + jr $4 + + .loc 1 13 + move $4,$7 + .loc 1 14 + .loc 1 15 + bnez $4,foo + + .loc 1 17 + li $5,1 + .end foo + .cfi_endproc diff --git a/gas/testsuite/gas/mips/micromips@loc-swap-2.d b/gas/testsuite/gas/mips/micromips@loc-swap-2.d new file mode 100644 index 0000000..79da514 --- /dev/null +++ b/gas/testsuite/gas/mips/micromips@loc-swap-2.d @@ -0,0 +1,49 @@ +#PROG: readelf +#readelf: -wl +#name: MIPS DWARF-2 location information with branch swapping (2) +#as: -32 +#source: loc-swap-2.s + +Raw dump of debug contents of section .debug_line: + + Offset: 0x0 + Length: 60 + DWARF Version: 2 + Prologue Length: 35 + Minimum Instruction Length: 1 + Initial value of 'is_stmt': 1 + Line Base: -5 + Line Range: 14 + Opcode Base: 13 + + Opcodes: + Opcode 1 has 0 args + Opcode 2 has 1 args + Opcode 3 has 1 args + Opcode 4 has 1 args + Opcode 5 has 1 args + Opcode 6 has 0 args + Opcode 7 has 0 args + Opcode 8 has 0 args + Opcode 9 has 1 args + Opcode 10 has 0 args + Opcode 11 has 0 args + Opcode 12 has 1 args + + The Directory Table is empty. + + The File Name Table: + Entry Dir Time Size Name + 1 0 0 0 loc-swap-2.s + + Line Number Statements: + Extended opcode 2: set Address to 0x1 + Special opcode 11: advance Address by 0 to 0x1 and Line by 6 to 7 + Special opcode 35: advance Address by 2 to 0x3 and Line by 2 to 9 + Special opcode 6: advance Address by 0 to 0x3 and Line by 1 to 10 + Special opcode 64: advance Address by 4 to 0x7 and Line by 3 to 13 + Special opcode 34: advance Address by 2 to 0x9 and Line by 1 to 14 + Special opcode 6: advance Address by 0 to 0x9 and Line by 1 to 15 + Special opcode 63: advance Address by 4 to 0xd and Line by 2 to 17 + Advance PC by 1 to 0xe + Extended opcode 1: End of Sequence diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp index a2b8f6c..b6fa3f0 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -889,6 +889,7 @@ if { [istarget mips*-*-vxworks*] } { run_dump_test_arches "loc-swap" [mips_arch_list_all] run_dump_test_arches "loc-swap-dis" \ [mips_arch_list_all] + run_dump_test_arches "loc-swap-2" [mips_arch_list_all] } if $has_newabi { diff --git a/gas/testsuite/gas/mips/mips16@loc-swap-2.d b/gas/testsuite/gas/mips/mips16@loc-swap-2.d new file mode 100644 index 0000000..b00736c --- /dev/null +++ b/gas/testsuite/gas/mips/mips16@loc-swap-2.d @@ -0,0 +1,49 @@ +#PROG: readelf +#readelf: -wl +#name: MIPS DWARF-2 location information with branch swapping (2) +#as: -32 +#source: loc-swap-2.s + +Raw dump of debug contents of section .debug_line: + + Offset: 0x0 + Length: 60 + DWARF Version: 2 + Prologue Length: 35 + Minimum Instruction Length: 1 + Initial value of 'is_stmt': 1 + Line Base: -5 + Line Range: 14 + Opcode Base: 13 + + Opcodes: + Opcode 1 has 0 args + Opcode 2 has 1 args + Opcode 3 has 1 args + Opcode 4 has 1 args + Opcode 5 has 1 args + Opcode 6 has 0 args + Opcode 7 has 0 args + Opcode 8 has 0 args + Opcode 9 has 1 args + Opcode 10 has 0 args + Opcode 11 has 0 args + Opcode 12 has 1 args + + The Directory Table is empty. + + The File Name Table: + Entry Dir Time Size Name + 1 0 0 0 loc-swap-2.s + + Line Number Statements: + Extended opcode 2: set Address to 0x1 + Special opcode 11: advance Address by 0 to 0x1 and Line by 6 to 7 + Special opcode 7: advance Address by 0 to 0x1 and Line by 2 to 9 + Special opcode 6: advance Address by 0 to 0x1 and Line by 1 to 10 + Special opcode 64: advance Address by 4 to 0x5 and Line by 3 to 13 + Special opcode 34: advance Address by 2 to 0x7 and Line by 1 to 14 + Special opcode 6: advance Address by 0 to 0x7 and Line by 1 to 15 + Special opcode 35: advance Address by 2 to 0x9 and Line by 2 to 17 + Advance PC by 1 to 0xa + Extended opcode 1: End of Sequence -- 2.7.4