gas/
authorRichard Sandiford <rdsandiford@googlemail.com>
Mon, 5 Sep 2011 19:19:01 +0000 (19:19 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Mon, 5 Sep 2011 19:19:01 +0000 (19:19 +0000)
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
gas/dwarf2dbg.c
gas/testsuite/ChangeLog
gas/testsuite/gas/mips/loc-swap-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/loc-swap-2.s [new file with mode: 0644]
gas/testsuite/gas/mips/micromips@loc-swap-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/mips16@loc-swap-2.d [new file with mode: 0644]

index 7c40c34..35550ec 100644 (file)
@@ -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.
index 31bf310..e95f748 100644 (file)
@@ -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;
 \f
@@ -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 ();
index a4de754..e1af12a 100644 (file)
@@ -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 (file)
index 0000000..b573445
--- /dev/null
@@ -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 (file)
index 0000000..03314e9
--- /dev/null
@@ -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 (file)
index 0000000..79da514
--- /dev/null
@@ -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
index a2b8f6c..b6fa3f0 100644 (file)
@@ -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 (file)
index 0000000..b00736c
--- /dev/null
@@ -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