Blob Blame History Raw
From be7b691756ff334705eb6faf51a196540e02e96c Mon Sep 17 00:00:00 2001
Message-Id: <be7b691756ff334705eb6faf51a196540e02e96c.1470234136.git.crobinso@redhat.com>
From: Arnaldo Carvalho de Melo <acme@redhat.com>
Date: Thu, 16 Aug 2012 14:55:14 -0300
Subject: [PATCH] dwarf_loader: Don't stop processing after finding unsupported
 tag

After emitting a warning that a tag is not supported __die__process_tag
was returning NULL, making die__process_unit think that the problem
was insufficient memory.

Introduce a global variable 'unsupported_tag' and return it instead,
that way die__process_unit can distinguish ENOMEM from unsupported tags.

Reported-by: Thiago Macieira <thiago.macieira@intel.com>
Tested-by: Thiago Macieira <thiago.macieira@intel.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 dwarf_loader.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/dwarf_loader.c b/dwarf_loader.c
index e034237..e9e1671 100644
--- a/dwarf_loader.c
+++ b/dwarf_loader.c
@@ -1539,6 +1539,8 @@ static struct tag *die__create_new_function(Dwarf_Die *die, struct cu *cu)
 	return function ? &function->proto.tag : NULL;
 }
 
+static struct tag unsupported_tag;
+
 static struct tag *__die__process_tag(Dwarf_Die *die, struct cu *cu,
 				      int top_level, const char *fn)
 {
@@ -1578,7 +1580,7 @@ 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 = &unsupported_tag;
 		break;
 	}
 
@@ -1595,6 +1597,9 @@ static int die__process_unit(Dwarf_Die *die, struct cu *cu)
 		if (tag == NULL)
 			return -ENOMEM;
 
+		if (tag == &unsupported_tag)
+			continue;
+
 		long id = -1;
 		cu__add_tag(cu, tag, &id);
 		cu__hash(cu, tag);
-- 
2.7.4