This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] fix DWARF for ia64
- From: Bob Wilson <bwilson at tensilica dot com>
- To: binutils at sources dot redhat dot com
- Date: Tue, 13 Nov 2007 11:57:41 -0800
- Subject: [PATCH] fix DWARF for ia64
While fixing up some DWARF line number issues for Xtensa, I discovered a problem
with the ia64 port of GAS. Basically, the features tested by the lns-common-1
test are broken but no one noticed because that test doesn't run on ia64.
I've included an ia64-specific variant of the lns-common-1 test that
demonstrates the problem. (I'm not at all familiar with ia64 assembly code, so
I just made this up by looking at some other ia64 tests.)
The cause of the problem is that GAS for ia64 collects the line number
information, stores it in association with machine instructions, and then later
calls dwarf2_gen_line_info. It does not use dwarf2_emit_insn, which is
responsible for clearing the loc_directive_seen flag and several other flags
associated with the line information.
The patch fixes this by providing a new function to clear these flags, and by
using that function in the ia64 port. I have a patch to make the Xtensa port
handle line numbers in the same way as ia64, and I would also like to use this
new function there.
The patch also fixes a minor issue related to clearing the loc_directive_seen
flag. That flag is not cleared when debug_type is set to DEBUG_DWARF2. Daniel
J. recently added a check for consecutive .loc directives, and I believe that
check will not cause a lot of extra calls to dwarf2_emit_insn with DEBUG_DWARF2,
since the flag never gets cleared.
Is this OK?
gas/
* dwarf2dbg.c (dwarf2_consume_line_info): New.
(dwarf2_emit_insn): Use it here.
(dwarf2_directive_loc): Fix check for consecutive .loc directives
when debug_type is DEBUG_DWARF2.
* dwarf2dbg.h (dwarf2_consume_line_info): New prototype.
* config/tc-ia64.c (ia64_flush_insns): Call dwarf2_consume_line_info.
(md_assemble): Likewise.
gas/testsuite/
* gas/lns/lns.exp: Run lns-common-1 with alternate source for ia64.
* gas/lns/lns-common-1-ia64.s: New file.
Index: dwarf2dbg.c
===================================================================
RCS file: /cvs/src/src/gas/dwarf2dbg.c,v
retrieving revision 1.91
diff -u -p -r1.91 dwarf2dbg.c
--- dwarf2dbg.c 29 Aug 2007 20:03:43 -0000 1.91
+++ dwarf2dbg.c 13 Nov 2007 19:32:27 -0000
@@ -373,11 +373,6 @@ dwarf2_emit_insn (int size)
or the physical input file name (foo.s) and not the file name
specified in the most recent .loc directive (eg foo.h). */
loc = current;
-
- /* Unless we generate DWARF2 debugging information for each
- assembler line, we only emit one line symbol for one LOC. */
- if (debug_type != DEBUG_DWARF2)
- loc_directive_seen = FALSE;
}
else if (debug_type != DEBUG_DWARF2)
return;
@@ -385,6 +380,21 @@ dwarf2_emit_insn (int size)
dwarf2_where (&loc);
dwarf2_gen_line_info (frag_now_fix () - size, &loc);
+ dwarf2_consume_line_info ();
+}
+
+/* Called after the current line information has been either used with
+ dwarf2_gen_line_info or saved with a machine instruction for later use.
+ This resets the state of the line number information to reflect that
+ it has been used. */
+
+void
+dwarf2_consume_line_info (void)
+{
+ /* Unless we generate DWARF2 debugging information for each
+ assembler line, we only emit one line symbol for one LOC. */
+ if (debug_type != DEBUG_DWARF2)
+ loc_directive_seen = FALSE;
current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
| DWARF2_FLAG_PROLOGUE_END
@@ -572,7 +582,7 @@ dwarf2_directive_loc (int dummy ATTRIBUT
/* If we see two .loc directives in a row, force the first one to be
output now. */
- if (loc_directive_seen)
+ if (loc_directive_seen && debug_type != DEBUG_DWARF2)
dwarf2_emit_insn (0);
filenum = get_absolute_expression ();
Index: dwarf2dbg.h
===================================================================
RCS file: /cvs/src/src/gas/dwarf2dbg.h,v
retrieving revision 1.19
diff -u -p -r1.19 dwarf2dbg.h
--- dwarf2dbg.h 3 Jul 2007 11:01:03 -0000 1.19
+++ dwarf2dbg.h 13 Nov 2007 19:32:27 -0000
@@ -72,6 +72,10 @@ extern void dwarf2_gen_line_info (addres
/* Must be called for each generated instruction. */
extern void dwarf2_emit_insn (int);
+/* Reset the state of the line number information to reflect that
+ it has been used. */
+extern void dwarf2_consume_line_info (void);
+
/* Should be called for each code label. */
extern void dwarf2_emit_label (symbolS *);
Index: config/tc-ia64.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-ia64.c,v
retrieving revision 1.197
diff -u -p -r1.197 tc-ia64.c
--- config/tc-ia64.c 17 Oct 2007 16:45:55 -0000 1.197
+++ config/tc-ia64.c 13 Nov 2007 19:32:29 -0000
@@ -1131,6 +1131,7 @@ ia64_flush_insns ()
dwarf2_where (&CURR_SLOT.debug_line);
CURR_SLOT.debug_line.flags |= DWARF2_FLAG_BASIC_BLOCK;
dwarf2_gen_line_info (frag_now_fix (), &CURR_SLOT.debug_line);
+ dwarf2_consume_line_info ();
}
CURR_SLOT.label_fixups = 0;
@@ -10967,6 +10968,7 @@ md_assemble (str)
CURR_SLOT.idesc = idesc;
as_where (&CURR_SLOT.src_file, &CURR_SLOT.src_line);
dwarf2_where (&CURR_SLOT.debug_line);
+ dwarf2_consume_line_info ();
/* Add unwind entries, if there are any. */
if (unwind.current_entry)
Index: testsuite/gas/lns/lns.exp
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/lns/lns.exp,v
retrieving revision 1.7
diff -u -p -r1.7 lns.exp
--- testsuite/gas/lns/lns.exp 29 Aug 2007 20:03:43 -0000 1.7
+++ testsuite/gas/lns/lns.exp 13 Nov 2007 19:32:33 -0000
@@ -13,7 +13,6 @@ run_dump_test "lns-duplicate"
# information (d10v).
if {
![istarget d10v-*-*]
- && ![istarget ia64*-*-*]
&& ![istarget i370-*-*]
&& ![istarget i960-*-*]
&& ![istarget mcore-*-*]
@@ -23,6 +22,8 @@ if {
# Use alternate file for targets using DW_LNS_fixed_advance_pc opcodes.
if { [istarget xtensa-*-*] } {
run_dump_test "lns-common-1-alt"
+ } elseif { [istarget ia64*-*-*] } {
+ run_dump_test "lns-common-1" { { source "lns-common-1-ia64.s" } }
} else {
run_dump_test "lns-common-1"
}
--- /dev/null 2007-04-16 22:20:02.000000000 -0700
+++ testsuite/gas/lns/lns-common-1-ia64.s 2007-11-13 10:38:21.000000000 -0800
@@ -0,0 +1,16 @@
+ .file 1 "foo.c"
+ .loc 1 1
+ .explicit
+ { .mii; nop 0; nop 0; nop 0 ;; }
+ .loc 1 2 3
+ { .mii; nop 0; nop 0; nop 0 ;; }
+ .loc 1 3 prologue_end
+ { .mii; nop 0; nop 0; nop 0 ;; }
+ .loc 1 4 0 epilogue_begin
+ { .mii; nop 0; nop 0; nop 0 ;; }
+ .loc 1 5 isa 1 basic_block
+ { .mii; nop 0; nop 0; nop 0 ;; }
+ .loc 1 6 is_stmt 0
+ { .mii; nop 0; nop 0; nop 0 ;; }
+ .loc 1 7 is_stmt 1
+ { .mii; nop 0; nop 0; nop 0 ;; }