This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Recognize .debug_macro/DW_AT_GNU_macros


Hi,

This adds minimal low-level support for .debug_macro/DW_AT_GNU_macros as
proposed here http://www.dwarfstd.org/ShowIssue.php?issue=110722.1 and
implemented in gcc 4.7 (-g3). It is just enough to not barf on it when
we encounter the new attribute and to sanity check the attribute form
offsets. I added two small testfiles one using .debug_macinfo and one
using the new .debug_macros.

I haven't yet added the new DW_MACRO values to interpret the actual
contents. We might not even want/need to if gor higher-level support we
just reuse the DW_MACINFO values with the dwarf_getmacros (),
dwarf_macro_opcode (), dwarf_macro_param1 () and dwarf_macro_param2 ()
interface.

The new define/undef and start_file/end_file opcodes encode the same
information (and use the same values). There is no vendor_ext. There are
three new opcodes define_indirect, undef_indirect and
transparent_include. The first two are identical to define/undef, but
take their arguments differently. And transparent_include makes it
possible to reuse opcodes from somewhere else in the section. These
seems to be just the kind of thing that our interface wants to hide from
the user. So we would just return the original DW_MACINFO_define opcode
numbers and provide the param1/2 as we do now (just fetch them from
different places). Does that sound like a plan?

Cheers,

Mark
From 5660f170b2194b35e0ed0040908d775a53553a2b Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mjw@redhat.com>
Date: Mon, 25 Jun 2012 17:18:53 +0200
Subject: [PATCH] Add low-level support for .debug_macro.

Signed-off-by: Mark Wielaard <mjw@redhat.com>
---
 libdw/ChangeLog            |    7 +++++
 libdw/dwarf.h              |    5 ++++
 libdw/dwarf_begin_elf.c    |    1 +
 libdw/dwarf_formudata.c    |   10 +++++++-
 libdw/libdwP.h             |    1 +
 libebl/ChangeLog           |    4 +++
 libebl/eblopenbackend.c    |    2 +
 src/ChangeLog              |    4 +++
 src/readelf.c              |    4 +++
 tests/ChangeLog            |    6 +++++
 tests/Makefile.am          |    6 +++-
 tests/run-macro-test.sh    |   53 ++++++++++++++++++++++++++++++++++++++++++++
 tests/testfile-macinfo.bz2 |  Bin 0 -> 6689 bytes
 tests/testfile-macros.bz2  |  Bin 0 -> 7882 bytes
 14 files changed, 100 insertions(+), 3 deletions(-)
 create mode 100755 tests/run-macro-test.sh
 create mode 100755 tests/testfile-macinfo.bz2
 create mode 100755 tests/testfile-macros.bz2

diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 3ff83e4..48bbaa0 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,10 @@
+2012-06-26  Mark Wielaard  <mjw@redhat.com>
+
+	* libdwP.h: Add IDX_debug_macro.
+	* dwarf.h: Add DW_AT_GNU_macros.
+	* dwarf_begin_elf.c (dwarf_scnnames): Add .debug_macro.
+	* dwarf_formudata.c (dwarf_formudata): Recognize DW_AT_GNU_macros.
+
 2012-04-27  Mark Wielaard  <mjw@redhat.com>
 
 	* libdw/dwarf_highpc.c (dwarf_highpc): Handle DW_AT_high_pc being
diff --git a/libdw/dwarf.h b/libdw/dwarf.h
index 38f663d..41a1024 100644
--- a/libdw/dwarf.h
+++ b/libdw/dwarf.h
@@ -267,6 +267,11 @@ enum
     DW_AT_GNU_all_call_sites = 0x2117,
     DW_AT_GNU_all_source_call_sites = 0x2118,
 
+    /* More compact macro information - .debug_macro section
+       http://www.dwarfstd.org/ShowIssue.php?issue=110722.1
+       offset into .debug_macro section. */
+    DW_AT_GNU_macros = 0x2119,
+
     DW_AT_hi_user = 0x3fff
   };
 
diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c
index fc6ac8d..3e01800 100644
--- a/libdw/dwarf_begin_elf.c
+++ b/libdw/dwarf_begin_elf.c
@@ -61,6 +61,7 @@ static const char dwarf_scnnames[IDX_last][17] =
   [IDX_debug_pubnames] = ".debug_pubnames",
   [IDX_debug_str] = ".debug_str",
   [IDX_debug_macinfo] = ".debug_macinfo",
+  [IDX_debug_macro] = ".debug_macro",
   [IDX_debug_ranges] = ".debug_ranges"
 };
 #define ndwarf_scnnames (sizeof (dwarf_scnnames) / sizeof (dwarf_scnnames[0]))
diff --git a/libdw/dwarf_formudata.c b/libdw/dwarf_formudata.c
index f5b2a1a..f08e0d8 100644
--- a/libdw/dwarf_formudata.c
+++ b/libdw/dwarf_formudata.c
@@ -140,13 +140,21 @@ dwarf_formudata (attr, return_uval)
 	      break;
 
 	    case DW_AT_macro_info:
-	      /* macptr */
+	      /* macptr into .debug_macinfo */
 	      if (__libdw_formptr (attr, IDX_debug_macinfo,
 				   DWARF_E_NO_ENTRY, NULL,
 				   return_uval) == NULL)
 		return -1;
 	      break;
 
+	    case DW_AT_GNU_macros:
+	      /* macptr into .debug_macro */
+	      if (__libdw_formptr (attr, IDX_debug_macro,
+				   DWARF_E_NO_ENTRY, NULL,
+				   return_uval) == NULL)
+		return -1;
+	      break;
+
 	    case DW_AT_ranges:
 	    case DW_AT_start_scope:
 	      /* rangelistptr */
diff --git a/libdw/libdwP.h b/libdw/libdwP.h
index 3c1925b..77e1b31 100644
--- a/libdw/libdwP.h
+++ b/libdw/libdwP.h
@@ -71,6 +71,7 @@ enum
     IDX_debug_pubnames,
     IDX_debug_str,
     IDX_debug_macinfo,
+    IDX_debug_macro,
     IDX_debug_ranges,
     IDX_last
   };
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
index ac2160d..941ed6f 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,7 @@
+2011-06-26  Mark Wielaard  <mjw@redhat.com>
+
+	* eblopenbackend.c (default_debugscn_p): Add .debug_macro.
+
 2011-04-26  Mark Wielaard  <mjw@redhat.com>
 
 	* libebl.h (ebl_object_note_type_name): Add const char *name arg.
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index 9789ef3..b39ab2e 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -646,6 +646,8 @@ default_debugscn_p (const char *name)
       ".debug_types",
       /* GDB DWARF 4 extension */
       ".gdb_index",
+      /* GNU/DWARF 5 extension/proposal */
+      ".debug_macro",
       /* SGI/MIPS DWARF 2 extensions */
       ".debug_weaknames",
       ".debug_funcnames",
diff --git a/src/ChangeLog b/src/ChangeLog
index 40905b8..2928ab1 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2012-06-26  Mark Wielaard  <mjw@redhat.com>
+
+	* readelf.c (dwarf_attr_string): Add DW_AT_GNU_macros.
+
 2012-06-22  Mark Wielaard  <mjw@redhat.com>
 
 	* readelf.c (print_ops): Cast printf PRIu/x64 arguments to uint64_t
diff --git a/src/readelf.c b/src/readelf.c
index d182ab5..eb1d469 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -3590,6 +3590,10 @@ dwarf_attr_string (unsigned int attrnum)
 	result = "GNU_all_source_call_sites";
 	break;
 
+      case DW_AT_GNU_macros:
+	result = "GNU_macros";
+	break;
+
       default:
 	if (attrnum < DW_AT_lo_user)
 	  snprintf (buf, sizeof buf, gettext ("unknown attribute %hx"),
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 6f5e458..9b64917 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,9 @@
+2012-06-26  Mark Wielaard  <mjw@redhat.com>
+
+	* run-macro-test.sh: New test.
+	* testfile-macinfo.bz2: New testfile.
+	* testfile-macros.bz2: Likewise.
+
 2012-05-07  Mark Wielaard  <mjw@redhat.com>
 
 	* low_high_pc.c: Use proper inttypes in printf formats.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index ced7831..39e58ae 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -79,7 +79,8 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \
 	run-early-offscn.sh run-dwarf-getmacros.sh \
 	run-test-flag-nobits.sh run-prelink-addr-test.sh \
 	run-dwarf-getstring.sh run-rerequest_tag.sh run-typeiter.sh \
-	run-readelf-d.sh run-unstrip-n.sh run-low_high_pc.sh
+	run-readelf-d.sh run-unstrip-n.sh run-low_high_pc.sh \
+	run-macro-test.sh
 
 if !STANDALONE
 noinst_PROGRAMS += msg_tst md5-sha1-test
@@ -157,7 +158,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
 	     run-typeiter.sh testfile59.bz2 \
 	     run-readelf-d.sh testlib_dynseg.so.bz2 \
 	     run-unstrip-n.sh testcore-rtlib.bz2 \
-	     run-low_high_pc.sh testfile_low_high_pc.bz2
+	     run-low_high_pc.sh testfile_low_high_pc.bz2 \
+	     run-macro-test.sh testfile-macinfo.bz2 testfile-macros.bz2
 
 installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir) \
 			      bindir=$(DESTDIR)$(bindir) \
diff --git a/tests/run-macro-test.sh b/tests/run-macro-test.sh
new file mode 100755
index 0000000..70a16ed
--- /dev/null
+++ b/tests/run-macro-test.sh
@@ -0,0 +1,53 @@
+#! /bin/sh
+# Copyright (C) 2012 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 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.
+#
+# 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 a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# #include <string.h>
+#
+# #define HELLO "world"
+#
+# int
+# main(int argc, char ** argv)
+# {
+#   return strlen (HELLO);
+# }
+#
+# gcc -gdwarf-4 -g3 -o testfile-macros macro.c
+# gcc -gstrict-dwarf -gdwarf-4 -g3 -o testfile-macinfo macro.c
+
+testfiles testfile-macinfo testfile-macros
+
+status=0
+
+testrun ../src/readelf --debug-dump=info testfile-macinfo \
+	| grep macro_info > readelf.macros.out ||
+  { echo "*** failure readelf --debug-dump=info testfile-macinfo"; status=1; }
+testrun_compare cat readelf.macros.out <<\EOF
+           macro_info           (sec_offset) 0
+EOF
+
+testrun ../src/readelf --debug-dump=info testfile-macros \
+	| grep GNU_macros > readelf.macros.out ||
+  { echo "*** failure readelf --debug-dump=info testfile-macros"; status=1; }
+testrun_compare cat readelf.macros.out <<\EOF
+           GNU_macros           (sec_offset) 0
+EOF
+
+rm -f readelf.macros.out
+
+exit $status
diff --git a/tests/testfile-macinfo.bz2 b/tests/testfile-macinfo.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..e6cc5f1c246de436dce5b8df176963887d27f7f7
GIT binary patch
literal 6689
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

literal 0
HcmV?d00001

diff --git a/tests/testfile-macros.bz2 b/tests/testfile-macros.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..d74df94c62c8f29a046ebea0aae8e2e3e9454f5a
GIT binary patch
literal 7882
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

literal 0
HcmV?d00001

-- 
1.7.7.6


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]