summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2013-05-03 11:28:49 +0200
committerMark Wielaard <mjw@redhat.com>2013-05-05 22:15:13 +0200
commit9affad3d2314de1bacbabae453a7261cc02feac4 (patch)
tree7fef6e5b20e0fc12e3116a79685ab36184a7b1f5
parent904aec2c2f62b729a536c2259274fdd440b0d923 (diff)
downloadelfutils-9affad3d2314de1bacbabae453a7261cc02feac4.tar.gz
libdw: dwarf_getsrclines don't set end_sequence when there are no lines.
Some CUs might only have a file list, but no actual source lines in their statement list. Only set end_sequence at the end of the source lines list if there are actually lines. Signed-off-by: Mark Wielaard <mjw@redhat.com>
-rw-r--r--libdw/ChangeLog5
-rw-r--r--libdw/dwarf_getsrclines.c3
-rw-r--r--tests/ChangeLog6
-rw-r--r--tests/Makefile.am3
-rwxr-xr-xtests/run-get-lines.sh31
-rwxr-xr-xtests/testfilenolines.bz2bin0 -> 2855 bytes
6 files changed, 44 insertions, 4 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index ef9b3acd..59b6c63a 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,8 @@
+2013-05-03 Mark Wielaard <mjw@redhat.com>
+
+ * dwarf_getsrclines.c (dwarf_getsrclines): Only set end_sequence
+ when nlinelist > 0.
+
2013-04-28 Jan Kratochvil <jan.kratochvil@redhat.com>
* libdw.map (ELFUTILS_0.156): New.
diff --git a/libdw/dwarf_getsrclines.c b/libdw/dwarf_getsrclines.c
index 5a58b783..fa4dd18c 100644
--- a/libdw/dwarf_getsrclines.c
+++ b/libdw/dwarf_getsrclines.c
@@ -715,7 +715,8 @@ dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
/* Make sure the highest address for the CU is marked as end_sequence.
This is required by the DWARF spec, but some compilers forget and
dwfl_module_getsrc depends on it. */
- cu->lines->info[nlinelist - 1].end_sequence = 1;
+ if (nlinelist > 0)
+ cu->lines->info[nlinelist - 1].end_sequence = 1;
/* Success. */
res = 0;
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 4003851f..6df580a7 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,9 @@
+2013-05-03 Mark Wielaard <mjw@redhat.com>
+
+ * testfilenolines.bz2: New test file.
+ * Makefile.am (EXTRA_DIST): Add testfilenolines.bz2.
+ * run-get-lines.sh: Run testrun_compare on testfilenolines.
+
2013-04-30 Jan Kratochvil <jan.kratochvil@redhat.com>
* dwfl-report-elf-align.c: Use false add_p_vaddr for dwfl_report_elf.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 4b577035..6327edbb 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -198,7 +198,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
testfile69.core.bz2 testfile69.so.bz2 \
testfile70.core.bz2 testfile70.exec.bz2 \
run-dwfllines.sh run-dwfl-report-elf-align.sh \
- testfile-dwfl-report-elf-align-shlib.so.bz2
+ testfile-dwfl-report-elf-align-shlib.so.bz2 \
+ testfilenolines
if USE_VALGRIND
valgrind_cmd='valgrind -q --trace-children=yes --error-exitcode=1 --run-libc-freeres=no'
diff --git a/tests/run-get-lines.sh b/tests/run-get-lines.sh
index 5a220cab..fb48c77d 100755
--- a/tests/run-get-lines.sh
+++ b/tests/run-get-lines.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 1999, 2000, 2002, 2004, 2005 Red Hat, Inc.
+# Copyright (C) 1999, 2000, 2002, 2004, 2005, 2013 Red Hat, Inc.
# This file is part of elfutils.
# Written by Ulrich Drepper <drepper@redhat.com>, 1999.
#
@@ -18,7 +18,7 @@
. $srcdir/test-subr.sh
-testfiles testfile testfile2
+testfiles testfile testfile2 testfilenolines
testrun_compare ${abs_builddir}/get-lines testfile testfile2 <<\EOF
cuhl = 11, o = 0, asz = 4, osz = 4, ncu = 191
@@ -61,4 +61,31 @@ cuhl = 11, o = 267, asz = 4, osz = 4, ncu = 2680
10000514: /shoggoth/drepper/m.c:8:0: is_stmt:yes, end_seq:yes, bb:no, prologue:no, epilogue:no
EOF
+# - lines.c
+# int ft;
+#
+# int
+# main (int argc, char **argv)
+# {
+# return ft - 42;
+# }
+#
+# - nolines.c
+# int ft = 42;
+#
+# gcc -g -c lines.c
+# gcc -g -c nolines.c
+# gcc -g -o testfilenolines lines.o nolines.o
+
+testrun_compare ${abs_builddir}/get-lines testfilenolines <<\EOF
+cuhl = 11, o = 0, asz = 8, osz = 4, ncu = 169
+ 4 lines
+400474: /home/mark/src/tests/lines.c:5:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+40047f: /home/mark/src/tests/lines.c:6:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+400488: /home/mark/src/tests/lines.c:7:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+40048a: /home/mark/src/tests/lines.c:7:0: is_stmt:yes, end_seq:yes, bb:no, prologue:no, epilogue:no
+cuhl = 11, o = 125, asz = 8, osz = 4, ncu = 243
+ 0 lines
+EOF
+
exit 0
diff --git a/tests/testfilenolines.bz2 b/tests/testfilenolines.bz2
new file mode 100755
index 00000000..23cd7223
--- /dev/null
+++ b/tests/testfilenolines.bz2
Binary files differ