dwarves.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mark Wielaard <mjw-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: dwarves-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: [patch] Don't die when encountering unknown tags, just warn
Date: Sat, 26 Mar 2011 22:23:06 +0100	[thread overview]
Message-ID: <1301174586.8262.8.camel@springer.wildebeest.org> (raw)

[-- Attachment #1: Type: text/plain, Size: 664 bytes --]

Hi,

I was playing with pahole against a binary compiled with an unreleased
gcc. This version outputs some DW_TAGs that pahole doesn't know about.
These tags have been added to elftuils git, but aren't yet in any
release.

The problem was that all errors from die__process_tag () are treated the
same (it returns NULL and then all callers interpret that as out of
memory). So this patch adds an explicit UNKNOWN_TAG return value so
callers can decide to ignore it and just carry on instead of terminating
the program where appropriate.

With this patch in place pahole will just print a warning when
encountering an unknown tag and ignore that die.

Cheers,

Mark

[-- Attachment #2: 0001-dwarf_loader-Warn-on-unknown-tags.patch --]
[-- Type: text/x-patch, Size: 3410 bytes --]

From 59311550b8b2355c9a2f74e00d9ccf1317c5efd2 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mjw-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Date: Sat, 26 Mar 2011 20:39:32 +0100
Subject: [PATCH] dwarf_loader: Warn on unknown tags.

Don't die when encountering unknown tags, just warn.
---
 dwarf_loader.c |   30 ++++++++++++++++++++++--------
 1 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/dwarf_loader.c b/dwarf_loader.c
index 9b4a500..5db1e45 100644
--- a/dwarf_loader.c
+++ b/dwarf_loader.c
@@ -905,6 +905,8 @@ static void __cu__tag_not_handled(Dwarf_Die *die, const char *fn)
 
 #define cu__tag_not_handled(die) __cu__tag_not_handled(die, __FUNCTION__)
 
+#define UNKNOWN_TAG ((struct tag *) -1L)
+
 static struct tag *__die__process_tag(Dwarf_Die *die, struct cu *cu,
 				      int toplevel, const char *fn);
 
@@ -1132,7 +1134,7 @@ static struct tag *die__create_new_subroutine_type(Dwarf_Die *die,
 			continue;
 		default:
 			tag = die__process_tag(die, cu, 0);
-			if (tag == NULL)
+			if (tag == NULL || tag == UNKNOWN_TAG)
 				goto out_delete;
 
 			if (cu__add_tag(cu, tag, &id) < 0)
@@ -1244,6 +1246,9 @@ static int die__process_class(Dwarf_Die *die, struct type *class,
 			if (tag == NULL)
 				return -ENOMEM;
 
+			if (tag == UNKNOWN_TAG)
+				return -EINVAL;
+
 			long id = -1;
 
 			if (cu__table_add_tag(cu, tag, &id) < 0) {
@@ -1276,10 +1281,11 @@ static int die__process_namespace(Dwarf_Die *die, struct namespace *namespace,
 	struct tag *tag;
 	do {
 		tag = die__process_tag(die, cu, 0);
-		if (tag == NULL)
-			goto out_enomem;
+		if (tag == NULL || tag == UNKNOWN_TAG)
+			goto out_bad;
 
 		long id = -1;
+
 		if (cu__table_add_tag(cu, tag, &id) < 0)
 			goto out_delete_tag;
 
@@ -1293,8 +1299,8 @@ static int die__process_namespace(Dwarf_Die *die, struct namespace *namespace,
 	return 0;
 out_delete_tag:
 	tag__delete(tag, cu);
-out_enomem:
-	return -ENOMEM;
+out_bad:
+	return tag ? -EINVAL : -ENOMEM;
 }
 
 static int die__process_function(Dwarf_Die *die, struct ftype *ftype,
@@ -1358,6 +1364,8 @@ static int die__process_inline_expansion(Dwarf_Die *die, struct cu *cu)
 			tag = die__process_tag(die, cu, 0);
 			if (tag == NULL)
 				goto out_enomem;
+			if (tag == UNKNOWN_TAG)
+				continue;
 
 			if (cu__add_tag(cu, tag, &id) < 0)
 				goto out_delete_tag;
@@ -1447,6 +1455,11 @@ static int die__process_function(Dwarf_Die *die, struct ftype *ftype,
 			continue;
 		default:
 			tag = die__process_tag(die, cu, 0);
+			if (tag == UNKNOWN_TAG) {
+				tag__print_not_supported(dwarf_tag(die));
+				continue;
+			}
+
 			if (tag == NULL)
 				goto out_enomem;
 
@@ -1455,7 +1468,6 @@ static int die__process_function(Dwarf_Die *die, struct ftype *ftype,
 
 			goto hash;
 		}
-
 		if (tag == NULL)
 			goto out_enomem;
 
@@ -1527,11 +1539,11 @@ static struct tag *__die__process_tag(Dwarf_Die *die, struct cu *cu,
 		tag = die__create_new_variable(die, cu);	break;
 	default:
 		__cu__tag_not_handled(die, fn);
-		tag = NULL;
+		tag = UNKNOWN_TAG;
 		break;
 	}
 
-	if (tag != NULL)
+	if (tag != NULL && tag != UNKNOWN_TAG)
 		tag->top_level = top_level;
 
 	return tag;
@@ -1543,6 +1555,8 @@ static int die__process_unit(Dwarf_Die *die, struct cu *cu)
 		struct tag *tag = die__process_tag(die, cu, 1);
 		if (tag == NULL)
 			return -ENOMEM;
+		if (tag == UNKNOWN_TAG)
+			return -EINVAL;
 
 		long id = -1;
 		cu__add_tag(cu, tag, &id);
-- 
1.7.4


             reply	other threads:[~2011-03-26 21:23 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-26 21:23 Mark Wielaard [this message]
     [not found] ` <1301174586.8262.8.camel-OO0OHOuVXW89n/EXqpbZ8ns8WZQLr0HW@public.gmane.org>
2011-05-18 15:07   ` [patch] Don't die when encountering unknown tags, just warn Mark Wielaard
     [not found]     ` <1305731220.3497.15.camel-OO0OHOuVXW89n/EXqpbZ8ns8WZQLr0HW@public.gmane.org>
2011-05-18 16:13       ` Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1301174586.8262.8.camel@springer.wildebeest.org \
    --to=mjw-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
    --cc=dwarves-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).