summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2017-07-21 21:23:07 +0200
committerMark Wielaard <[email protected]>2017-07-26 23:22:38 +0200
commitc24b900cc9cf225e98372253cb02c77342634b6e (patch)
treebbc3b4085b66b6e0bf2e52de978d0b8351819588
parent55a471f5fe44945414af243613d4590c4e7cd8d1 (diff)
libdw: Add dwarf_line_file.
Signed-off-by: Mark Wielaard <[email protected]>
-rw-r--r--libdw/ChangeLog7
-rw-r--r--libdw/Makefile.am2
-rw-r--r--libdw/dwarf_line_file.c52
-rw-r--r--libdw/libdw.h5
-rw-r--r--libdw/libdw.map5
-rw-r--r--tests/ChangeLog4
-rw-r--r--tests/get-lines.c23
7 files changed, 97 insertions, 1 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 8eda70cd..8b2ef759 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,10 @@
+2017-07-21 Mark Wielaard <[email protected]>
+
+ * dwarf_line_file.c: New file.
+ * Makefile.am (libdw_a_SOURCES): Add dwarf_line_file.c.
+ * libdw.h (dwarf_line_file): New function declaration.
+ * libdw.map (ELFUTILS_0.170): New. Add dwarf_line_file.
+
2017-02-17 Ulf Hermann <[email protected]>
* Makefile.am: Add libdw_so_LIBS to specify the archives libdw is is
diff --git a/libdw/Makefile.am b/libdw/Makefile.am
index 634ac2ec..ad031b11 100644
--- a/libdw/Makefile.am
+++ b/libdw/Makefile.am
@@ -65,7 +65,7 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
dwarf_lineendsequence.c dwarf_lineblock.c \
dwarf_lineprologueend.c dwarf_lineepiloguebegin.c \
dwarf_lineisa.c dwarf_linediscriminator.c \
- dwarf_lineop_index.c \
+ dwarf_lineop_index.c dwarf_line_file.c \
dwarf_onesrcline.c dwarf_formblock.c \
dwarf_getsrcfiles.c dwarf_filesrc.c dwarf_getsrcdirs.c \
dwarf_getlocation.c dwarf_getstring.c dwarf_offabbrev.c \
diff --git a/libdw/dwarf_line_file.c b/libdw/dwarf_line_file.c
new file mode 100644
index 00000000..e2df642a
--- /dev/null
+++ b/libdw/dwarf_line_file.c
@@ -0,0 +1,52 @@
+/* Find line information for address.
+ Copyright (C) 2017 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils 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 copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libdwP.h"
+
+
+int
+dwarf_line_file (Dwarf_Line *line, Dwarf_Files **files, size_t *idx)
+{
+ if (line == NULL)
+ return -1;
+
+ if (line->file >= line->files->nfiles)
+ {
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return -1;
+ }
+
+ *files = line->files;
+ *idx = line->file;
+
+ return 0;
+}
diff --git a/libdw/libdw.h b/libdw/libdw.h
index 9ae80ebb..4903b55f 100644
--- a/libdw/libdw.h
+++ b/libdw/libdw.h
@@ -640,6 +640,11 @@ extern const char *dwarf_linesrc (Dwarf_Line *line,
extern const char *dwarf_filesrc (Dwarf_Files *file, size_t idx,
Dwarf_Word *mtime, Dwarf_Word *length);
+/* Return the Dwarf_Files and index associated with the given Dwarf_Line. */
+extern int dwarf_line_file (Dwarf_Line *line,
+ Dwarf_Files **files, size_t *idx)
+ __nonnull_attribute__ (2, 3);
+
/* Return the directory list used in the file information extracted.
(*RESULT)[0] is the CU's DW_AT_comp_dir value, and may be null.
(*RESULT)[0..*NDIRS-1] are the compile-time include directory path
diff --git a/libdw/libdw.map b/libdw/libdw.map
index 83cb1d97..44e096ae 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
@@ -338,3 +338,8 @@ ELFUTILS_0.167 {
dwelf_strent_str;
dwelf_strtab_free;
} ELFUTILS_0.165;
+
+ELFUTILS_0.170 {
+ global:
+ dwarf_line_file;
+} ELFUTILS_0.167;
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 0700e7ca..519f25a3 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,7 @@
+2017-07-21 Mark Wielaard <[email protected]>
+
+ * get-lines.c (main): Add dwarf_line_file test.
+
2017-07-19 Gustavo Romero <[email protected]>
* run-addrcfi.sh: Update generic SPRs names to HTM SPRs names
diff --git a/tests/get-lines.c b/tests/get-lines.c
index c361a2c3..188d0162 100644
--- a/tests/get-lines.c
+++ b/tests/get-lines.c
@@ -24,6 +24,7 @@
#include <libelf.h>
#include ELFUTILS_HEADER(dw)
#include <stdio.h>
+#include <string.h>
#include <unistd.h>
@@ -100,6 +101,28 @@ main (int argc, char *argv[])
printf ("%" PRIx64 ": %s:%d:", (uint64_t) addr,
file ?: "???", line);
+ /* Getting the file path through the Dwarf_Files should
+ result in the same path. */
+ Dwarf_Files *files;
+ size_t idx;
+ if (dwarf_line_file (l, &files, &idx) != 0)
+ {
+ printf ("%s: cannot get file from line (%zd): %s\n",
+ argv[cnt], i, dwarf_errmsg (-1));
+ result = 1;
+ break;
+ }
+ const char *path = dwarf_filesrc (files, idx, NULL, NULL);
+ if ((path == NULL && file != NULL)
+ || (path != NULL && file == NULL)
+ || (strcmp (file, path) != 0))
+ {
+ printf ("%s: line %zd srcline (%s) != file srcline (%s)\n",
+ argv[cnt], i, file ?: "???", path ?: "???");
+ result = 1;
+ break;
+ }
+
int column;
if (dwarf_linecol (l, &column) != 0)
column = 0;