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 ;; }