aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2011-09-05 19:19:01 +0000
committerRichard Sandiford <rdsandiford@googlemail.com>2011-09-05 19:19:01 +0000
commit5045d766495cc896ba55ff3c9d683cb4d31a15e6 (patch)
tree11265daafe22eb4896f8acc2b843bfb01d7906d0 /gas
parentf1d90504dc71a1e66a1f17c71ec1cef2e594682d (diff)
downloadgdb-5045d766495cc896ba55ff3c9d683cb4d31a15e6.zip
gdb-5045d766495cc896ba55ff3c9d683cb4d31a15e6.tar.gz
gdb-5045d766495cc896ba55ff3c9d683cb4d31a15e6.tar.bz2
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.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog11
-rw-r--r--gas/dwarf2dbg.c59
-rw-r--r--gas/testsuite/ChangeLog7
-rw-r--r--gas/testsuite/gas/mips/loc-swap-2.d49
-rw-r--r--gas/testsuite/gas/mips/loc-swap-2.s21
-rw-r--r--gas/testsuite/gas/mips/micromips@loc-swap-2.d49
-rw-r--r--gas/testsuite/gas/mips/mips.exp1
-rw-r--r--gas/testsuite/gas/mips/mips16@loc-swap-2.d49
8 files changed, 233 insertions, 13 deletions
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 <rdsandiford@googlemail.com>
+
+ 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 <nickc@redhat.com>
* 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 (&current);
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 <rdsandiford@googlemail.com>
+
+ * 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 <sergeya.a.guriev@intel.com>
* 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