summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/dwarf2.c16
-rw-r--r--ld/testsuite/ChangeLog8
-rw-r--r--ld/testsuite/ld-ia64/line.exp57
-rw-r--r--ld/testsuite/ld-ia64/undefined.s152
-rw-r--r--ld/testsuite/ld-x86-64/line.exp6
6 files changed, 237 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 26508d8a89..1a08ba98e2 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2007-09-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/4986
+ * dwarf2.c (new_line_sorts_after): Undo the last change.
+ (add_line_info): Only keep the last entry with the same address
+ and end sequence.
+
2007-08-31 H.J. Lu <hongjiu.lu@intel.com>
PR ld/4986
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index 7f5f3974a3..e873e8c3f7 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -917,8 +917,7 @@ new_line_sorts_after (struct line_info *new_line, struct line_info *line)
{
return (new_line->address > line->address
|| (new_line->address == line->address
- && (new_line->line > line->line
- || new_line->end_sequence < line->end_sequence)));
+ && new_line->end_sequence < line->end_sequence));
}
@@ -968,7 +967,18 @@ add_line_info (struct line_info_table *table,
Note: we may receive duplicate entries from 'decode_line_info'. */
- if (!table->last_line
+ if (table->last_line
+ && table->last_line->address == address
+ && table->last_line->end_sequence == end_sequence)
+ {
+ /* We only keep the last entry with the same address and end
+ sequence. See PR ld/4986. */
+ if (table->lcl_head == table->last_line)
+ table->lcl_head = info;
+ info->prev_line = table->last_line->prev_line;
+ table->last_line = info;
+ }
+ else if (!table->last_line
|| new_line_sorts_after (info, table->last_line))
{
/* Normal case: add 'info' to the beginning of the list */
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index c145f09c59..9abfc40bcd 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2007-09-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/4986
+ * ld-ia64/line.exp: New.
+ * ld-ia64/undefined.s: Likewise.
+
+ * ld-x86-64/line.exp: Don't check CC.
+
2007-08-31 H.J. Lu <hongjiu.lu@intel.com>
PR ld/4986
diff --git a/ld/testsuite/ld-ia64/line.exp b/ld/testsuite/ld-ia64/line.exp
new file mode 100644
index 0000000000..2ebc7d6b3d
--- /dev/null
+++ b/ld/testsuite/ld-ia64/line.exp
@@ -0,0 +1,57 @@
+# Test that the linker reports undefined symbol line number correctly.
+#
+# Copyright 2007 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+if { !([istarget "ia64-*-elf*"]
+ || [istarget "ia64-*-linux*"]) } {
+ return
+}
+
+set testline "undefined line"
+
+if ![ld_assemble $as "-x $srcdir/$subdir/undefined.s" tmpdir/undefined.o] {
+ verbose "Unable to assemble test file!" 1
+ unresolved $testline
+ return
+}
+
+remote_file host delete "tmpdir/undefined"
+
+# Using -e start prevents the SunOS linker from trying to build a
+# shared library.
+send_log "$ld -e start -o tmpdir/undefined tmpdir/undefined.o\n"
+set exec_output [run_host_cmd "$ld" "-e start -o tmpdir/undefined tmpdir/undefined.o"]
+
+send_log "$exec_output\n"
+verbose "$exec_output"
+
+proc checkund { string testname } {
+ global exec_output
+
+ if [string match "*$string*" $exec_output] {
+ pass $testname
+ } else {
+ fail $testname
+ }
+}
+
+set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"
+
+checkund $ml $testline
diff --git a/ld/testsuite/ld-ia64/undefined.s b/ld/testsuite/ld-ia64/undefined.s
new file mode 100644
index 0000000000..d563c62131
--- /dev/null
+++ b/ld/testsuite/ld-ia64/undefined.s
@@ -0,0 +1,152 @@
+ .file "undefined.c"
+ .pred.safe_across_calls p1-p5,p16-p63
+ .section .debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+ .section .debug_info,"",@progbits
+.Ldebug_info0:
+ .section .debug_line,"",@progbits
+.Ldebug_line0:
+ .text
+.Ltext0:
+ .align 16
+ .global function#
+ .proc function#
+function:
+[.LFB2:]
+ .file 1 "undefined.c"
+ .loc 1 8 0
+ .prologue 12, 32
+ .mii
+ .save ar.pfs, r33
+ alloc r33 = ar.pfs, 0, 3, 0, 0
+ .save rp, r32
+ mov r32 = b0
+ mov r34 = r1
+ .body
+ .loc 1 9 0
+ ;;
+ .mib
+ nop 0
+ nop 0
+ br.call.sptk.many b0 = this_function_is_not_defined#
+ .loc 1 10 0
+ ;;
+ .loc 1 9 0
+ .mmi
+ nop 0
+ mov r1 = r34
+ .loc 1 10 0
+ mov b0 = r32
+ .mib
+ nop 0
+ mov ar.pfs = r33
+ br.ret.sptk.many b0
+.LFE2:
+ .endp function#
+.Letext0:
+ .section .debug_info
+ data4.ua 0x4c
+ data2.ua 0x2
+ data4.ua @secrel(.Ldebug_abbrev0)
+ data1 0x8
+ .uleb128 0x1
+ data4.ua @secrel(.Ldebug_line0)
+ data8.ua .Letext0
+ data8.ua .Ltext0
+ data4.ua @secrel(.LASF0)
+ data1 0x1
+ data4.ua @secrel(.LASF1)
+ .uleb128 0x2
+ data1 0x1
+ data4.ua @secrel(.LASF2)
+ data1 0x1
+ data1 0x8
+ data4.ua 0x48
+ data8.ua .LFB2
+ data8.ua .LFE2
+ data1 0x2
+ data1 0x7c
+ .sleb128 16
+ .uleb128 0x3
+ stringz "int"
+ data1 0x4
+ data1 0x5
+ data1 0x0
+ .section .debug_abbrev
+ .uleb128 0x1
+ .uleb128 0x11
+ data1 0x1
+ .uleb128 0x10
+ .uleb128 0x6
+ .uleb128 0x12
+ .uleb128 0x1
+ .uleb128 0x11
+ .uleb128 0x1
+ .uleb128 0x25
+ .uleb128 0xe
+ .uleb128 0x13
+ .uleb128 0xb
+ .uleb128 0x3
+ .uleb128 0xe
+ data1 0x0
+ data1 0x0
+ .uleb128 0x2
+ .uleb128 0x2e
+ data1 0x0
+ .uleb128 0x3f
+ .uleb128 0xc
+ .uleb128 0x3
+ .uleb128 0xe
+ .uleb128 0x3a
+ .uleb128 0xb
+ .uleb128 0x3b
+ .uleb128 0xb
+ .uleb128 0x49
+ .uleb128 0x13
+ .uleb128 0x11
+ .uleb128 0x1
+ .uleb128 0x12
+ .uleb128 0x1
+ .uleb128 0x40
+ .uleb128 0xa
+ data1 0x0
+ data1 0x0
+ .uleb128 0x3
+ .uleb128 0x24
+ data1 0x0
+ .uleb128 0x3
+ .uleb128 0x8
+ .uleb128 0xb
+ .uleb128 0xb
+ .uleb128 0x3e
+ .uleb128 0xb
+ data1 0x0
+ data1 0x0
+ data1 0x0
+ .section .debug_pubnames,"",@progbits
+ data4.ua 0x1b
+ data2.ua 0x2
+ data4.ua @secrel(.Ldebug_info0)
+ data4.ua 0x50
+ data4.ua 0x29
+ stringz "function"
+ data4.ua 0x0
+ .section .debug_aranges,"",@progbits
+ data4.ua 0x2c
+ data2.ua 0x2
+ data4.ua @secrel(.Ldebug_info0)
+ data1 0x8
+ data1 0x0
+ data2.ua 0x0
+ data2.ua 0x0
+ data8.ua .Ltext0
+ data8.ua .Letext0-.Ltext0
+ data8.ua 0x0
+ data8.ua 0x0
+ .section .debug_str,"MS",@progbits,1
+.LASF0:
+ stringz "GNU C 4.1.2"
+.LASF1:
+ stringz "undefined.c"
+.LASF2:
+ stringz "function"
diff --git a/ld/testsuite/ld-x86-64/line.exp b/ld/testsuite/ld-x86-64/line.exp
index 0d9248905a..c68daaa671 100644
--- a/ld/testsuite/ld-x86-64/line.exp
+++ b/ld/testsuite/ld-x86-64/line.exp
@@ -26,12 +26,6 @@ if { !([istarget "x86_64-*-elf*"]
set testline "undefined line"
-if { ![is_remote host] && [which $CC] == 0 } {
- verbose "Could not find C compiler!" 1
- untested $testline
- return
-}
-
if ![ld_assemble $as "--64 $srcdir/$subdir/undefined.s" tmpdir/undefined.o] {
verbose "Unable to assemble test file!" 1
unresolved $testline
OpenPOWER on IntegriCloud