Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Feb 2017 01:32:04 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r313132 - stable/11/contrib/elftoolchain/libdwarf
Message-ID:  <201702030132.v131W4Yt098849@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Fri Feb  3 01:32:04 2017
New Revision: 313132
URL: https://svnweb.freebsd.org/changeset/base/313132

Log:
  MFC r310724:
  Follow DW_AT_specification when looking up DW_AT_type attributes.
  
  PR:	215350, 215395

Modified:
  stable/11/contrib/elftoolchain/libdwarf/dwarf_attrval.c
  stable/11/contrib/elftoolchain/libdwarf/dwarf_attrval_signed.3
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/contrib/elftoolchain/libdwarf/dwarf_attrval.c
==============================================================================
--- stable/11/contrib/elftoolchain/libdwarf/dwarf_attrval.c	Fri Feb  3 01:30:51 2017	(r313131)
+++ stable/11/contrib/elftoolchain/libdwarf/dwarf_attrval.c	Fri Feb  3 01:32:04 2017	(r313132)
@@ -145,6 +145,7 @@ dwarf_attrval_unsigned(Dwarf_Die die, Dw
 	Dwarf_Die die1;
 	Dwarf_Unsigned val;
 	Dwarf_Debug dbg;
+	int first;
 
 	dbg = die != NULL ? die->die_dbg : NULL;
 
@@ -155,14 +156,16 @@ dwarf_attrval_unsigned(Dwarf_Die die, Dw
 
 	*valp = 0;
 
-	if ((at = _dwarf_attr_find(die, attr)) == NULL && attr != DW_AT_type) {
-		DWARF_SET_ERROR(dbg, err, DW_DLE_NO_ENTRY);
-		return (DW_DLV_NO_ENTRY);
-	}
-
 	die1 = NULL;
-	if (at == NULL &&
-	    (at = _dwarf_attr_find(die, DW_AT_abstract_origin)) != NULL) {
+	for (;;) {
+		if ((at = _dwarf_attr_find(die, attr)) != NULL ||
+		    attr != DW_AT_type)
+			break;
+		if ((at = _dwarf_attr_find(die, DW_AT_abstract_origin)) ==
+		    NULL &&
+		    (at = _dwarf_attr_find(die, DW_AT_specification)) == NULL)
+			break;
+
 		switch (at->at_form) {
 		case DW_FORM_ref1:
 		case DW_FORM_ref2:
@@ -170,13 +173,15 @@ dwarf_attrval_unsigned(Dwarf_Die die, Dw
 		case DW_FORM_ref8:
 		case DW_FORM_ref_udata:
 			val = at->u[0].u64;
-			if ((die1 = _dwarf_die_find(die, val)) == NULL ||
-			    (at = _dwarf_attr_find(die1, attr)) == NULL) {
-				if (die1 != NULL)
-					dwarf_dealloc(dbg, die1, DW_DLA_DIE);
+			first = (die1 == NULL);
+			die1 = _dwarf_die_find(die, val);
+			if (!first)
+				dwarf_dealloc(dbg, die, DW_DLA_DIE);
+			if (die1 == NULL) {
 				DWARF_SET_ERROR(dbg, err, DW_DLE_NO_ENTRY);
 				return (DW_DLV_NO_ENTRY);
 			}
+			die = die1;
 			break;
 		default:
 			DWARF_SET_ERROR(dbg, err, DW_DLE_ATTR_FORM_BAD);
@@ -184,6 +189,11 @@ dwarf_attrval_unsigned(Dwarf_Die die, Dw
 		}
 	}
 
+	if (at == NULL) {
+		DWARF_SET_ERROR(dbg, err, DW_DLE_NO_ENTRY);
+		return (DW_DLV_NO_ENTRY);
+	}
+
 	switch (at->at_form) {
 	case DW_FORM_addr:
 	case DW_FORM_data1:

Modified: stable/11/contrib/elftoolchain/libdwarf/dwarf_attrval_signed.3
==============================================================================
--- stable/11/contrib/elftoolchain/libdwarf/dwarf_attrval_signed.3	Fri Feb  3 01:30:51 2017	(r313131)
+++ stable/11/contrib/elftoolchain/libdwarf/dwarf_attrval_signed.3	Fri Feb  3 01:32:04 2017	(r313132)
@@ -24,7 +24,7 @@
 .\"
 .\" $Id: dwarf_attrval_signed.3 2980 2014-01-21 20:15:54Z kaiwang27 $
 .\"
-.Dd January 18, 2014
+.Dd December 26, 2016
 .Os
 .Dt DWARF_ATTRVAL_SIGNED 3
 .Sh NAME
@@ -168,17 +168,22 @@ or
 .Pp
 If the attribute named by argument
 .Ar attr
-is not present in the debugging information entry referenced by
-argument
+is
+.Dv DW_AT_type
+and is not present in the debugging information entry referenced by argument
 .Ar die ,
 and if a
 .Dv DW_AT_abstract_origin
+or
+.Dv DW_AT_specification
 attribute is present in the debugging information entry,
 function
 .Fn dwarf_attrval_unsigned
 will search for the named attribute in the debugging information entry
 referenced by the
 .Dv DW_AT_abstract_origin
+or
+.Dv DW_AT_specification
 attribute.
 .Sh RETURN VALUES
 On success, these functions returns



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201702030132.v131W4Yt098849>