libdw: Add dwarf_getalt, dwarf_setalt
authorFlorian Weimer <fweimer@redhat.com>
Tue, 15 Apr 2014 12:31:55 +0000 (14:31 +0200)
committerMark Wielaard <mjw@redhat.com>
Thu, 24 Apr 2014 11:18:33 +0000 (13:18 +0200)
Signed-off-by: Florian Weimer <fweimer@redhat.com>
libdw/ChangeLog
libdw/Makefile.am
libdw/dwarf_getalt.c [new file with mode: 0644]
libdw/dwarf_setalt.c [new file with mode: 0644]
libdw/libdw.h
libdw/libdw.map
libdw/libdwP.h

index 1d0274b..0b9b649 100644 (file)
@@ -1,3 +1,12 @@
+2014-04-22  Florian Weimer  <fweimer@redhat.com>
+
+       * dwarf_getalt.c, dwarf_setalt.c: New files.
+       * Makefile.am (libdw_a_SOURCES): Add them.
+       * libdw.h (dwarf_getalt, dwarf_setalt): Add function declarations.
+       * libdwP.h (dwarf_getalt, dwarf_setalt): Add internal function
+       declarations.
+       * libdw.map (ELFUTILS_0.159): Export the two new functions.
+
 2014-04-15  Florian Weimer  <fweimer@redhat.com>
 
        * libdwP.h (enum IDX_gnu_debugaltlink): New.
index ca67f2c..8538d36 100644 (file)
@@ -85,7 +85,8 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
                  dwarf_cfi_addrframe.c \
                  dwarf_getcfi.c dwarf_getcfi_elf.c dwarf_cfi_end.c \
                  dwarf_aggregate_size.c dwarf_getlocation_implicit_pointer.c \
-                 dwarf_getlocation_die.c dwarf_getlocation_attr.c
+                 dwarf_getlocation_die.c dwarf_getlocation_attr.c \
+                 dwarf_getalt.c dwarf_setalt.c
 
 if MAINTAINER_MODE
 BUILT_SOURCES = $(srcdir)/known-dwarf.h
diff --git a/libdw/dwarf_getalt.c b/libdw/dwarf_getalt.c
new file mode 100644 (file)
index 0000000..cc434f0
--- /dev/null
@@ -0,0 +1,42 @@
+/* Retrieves the DWARF descriptor for debugaltlink data.
+   Copyright (C) 2014 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"
+
+Dwarf *
+dwarf_getalt (Dwarf *main)
+{
+  if (main == NULL)
+    return NULL;
+  return main->alt_dwarf;
+}
+INTDEF (dwarf_getalt)
diff --git a/libdw/dwarf_setalt.c b/libdw/dwarf_setalt.c
new file mode 100644 (file)
index 0000000..3b5b935
--- /dev/null
@@ -0,0 +1,43 @@
+/* Provides the data referenced by the .gnu_debugaltlink section.
+   Copyright (C) 2014 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"
+
+void
+dwarf_setalt (Dwarf *main, Dwarf *alt)
+{
+  if (main->free_alt)
+    INTUSE (dwarf_end) (main->alt_dwarf);
+  main->free_alt = false;
+  main->alt_dwarf = alt;
+}
+INTDEF (dwarf_setalt)
index 0d94c52..a4654c4 100644 (file)
@@ -260,6 +260,18 @@ extern Dwarf *dwarf_begin_elf (Elf *elf, Dwarf_Cmd cmd, Elf_Scn *scngrp);
 /* Retrieve ELF descriptor used for DWARF access.  */
 extern Elf *dwarf_getelf (Dwarf *dwarf);
 
+/* Retrieves the DWARF descriptor for debugaltlink data.  Returns NULL
+   if no alternate debug data has been supplied.  */
+extern Dwarf *dwarf_getalt (Dwarf *main);
+
+/* Provides the data referenced by the .gnu_debugaltlink section.  The
+   caller should check that MAIN and ALT match (i.e., they have the
+   same build ID).  It is the responsibility of the caller to ensure
+   that the data referenced by ALT stays valid while it is used by
+   MAIN, until dwarf_setalt is called on MAIN with a different
+   descriptor, or dwarf_end.  */
+extern void dwarf_setalt (Dwarf *main, Dwarf *alt);
+
 /* Release debugging handling context.  */
 extern int dwarf_end (Dwarf *dwarf);
 
index 0e75fcb..71247e3 100644 (file)
@@ -295,5 +295,7 @@ ELFUTILS_0.158 {
 
 ELFUTILS_0.159 {
   global:
+    dwarf_getalt;
+    dwarf_setalt;
     dwelf_elf_gnu_debuglink;
 } ELFUTILS_0.158;
index a688456..1c94767 100644 (file)
@@ -686,6 +686,7 @@ INTDECL (dwarf_formref_die)
 INTDECL (dwarf_formsdata)
 INTDECL (dwarf_formstring)
 INTDECL (dwarf_formudata)
+INTDECL (dwarf_getalt)
 INTDECL (dwarf_getarange_addr)
 INTDECL (dwarf_getarangeinfo)
 INTDECL (dwarf_getaranges)
@@ -701,6 +702,7 @@ INTDECL (dwarf_nextcu)
 INTDECL (dwarf_next_unit)
 INTDECL (dwarf_offdie)
 INTDECL (dwarf_ranges)
+INTDECL (dwarf_setalt)
 INTDECL (dwarf_siblingof)
 INTDECL (dwarf_srclang)
 INTDECL (dwarf_tag)