xref: /netbsd-src/external/bsd/elftoolchain/dist/libdwarf/dwarf_die.c (revision 5ac3bc719ce6e70593039505b491894133237d12)
1*5ac3bc71Schristos /*	$NetBSD: dwarf_die.c,v 1.5 2024/03/03 17:37:30 christos Exp $	*/
2e81373b4Schristos 
39dd9d0cfSchristos /*-
49dd9d0cfSchristos  * Copyright (c) 2007 John Birrell (jb@freebsd.org)
542bd3019Schristos  * Copyright (c) 2009,2011,2014 Kai Wang
69dd9d0cfSchristos  * All rights reserved.
79dd9d0cfSchristos  *
89dd9d0cfSchristos  * Redistribution and use in source and binary forms, with or without
99dd9d0cfSchristos  * modification, are permitted provided that the following conditions
109dd9d0cfSchristos  * are met:
119dd9d0cfSchristos  * 1. Redistributions of source code must retain the above copyright
129dd9d0cfSchristos  *    notice, this list of conditions and the following disclaimer.
139dd9d0cfSchristos  * 2. Redistributions in binary form must reproduce the above copyright
149dd9d0cfSchristos  *    notice, this list of conditions and the following disclaimer in the
159dd9d0cfSchristos  *    documentation and/or other materials provided with the distribution.
169dd9d0cfSchristos  *
179dd9d0cfSchristos  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
189dd9d0cfSchristos  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
199dd9d0cfSchristos  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
209dd9d0cfSchristos  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
219dd9d0cfSchristos  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
229dd9d0cfSchristos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
239dd9d0cfSchristos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
249dd9d0cfSchristos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
259dd9d0cfSchristos  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
269dd9d0cfSchristos  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
279dd9d0cfSchristos  * SUCH DAMAGE.
289dd9d0cfSchristos  */
299dd9d0cfSchristos 
309dd9d0cfSchristos #include "_libdwarf.h"
319dd9d0cfSchristos 
32*5ac3bc71Schristos __RCSID("$NetBSD: dwarf_die.c,v 1.5 2024/03/03 17:37:30 christos Exp $");
3342bd3019Schristos ELFTC_VCSID("Id: dwarf_die.c 3039 2014-05-18 15:10:56Z kaiwang27");
349dd9d0cfSchristos 
359dd9d0cfSchristos int
dwarf_child(Dwarf_Die die,Dwarf_Die * ret_die,Dwarf_Error * error)369dd9d0cfSchristos dwarf_child(Dwarf_Die die, Dwarf_Die *ret_die, Dwarf_Error *error)
379dd9d0cfSchristos {
389dd9d0cfSchristos 	Dwarf_Debug dbg;
3942bd3019Schristos 	Dwarf_Section *ds;
409dd9d0cfSchristos 	Dwarf_CU cu;
419dd9d0cfSchristos 	int ret;
429dd9d0cfSchristos 
439dd9d0cfSchristos 	dbg = die != NULL ? die->die_dbg : NULL;
449dd9d0cfSchristos 
459dd9d0cfSchristos 	if (die == NULL || ret_die == NULL) {
469dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
479dd9d0cfSchristos 		return (DW_DLV_ERROR);
489dd9d0cfSchristos 	}
499dd9d0cfSchristos 
509dd9d0cfSchristos 	if (die->die_ab->ab_children == DW_CHILDREN_no)
519dd9d0cfSchristos 		return (DW_DLV_NO_ENTRY);
529dd9d0cfSchristos 
539dd9d0cfSchristos 	dbg = die->die_dbg;
549dd9d0cfSchristos 	cu = die->die_cu;
5542bd3019Schristos 	ds = cu->cu_is_info ? dbg->dbg_info_sec : dbg->dbg_types_sec;
5642bd3019Schristos 	ret = _dwarf_die_parse(die->die_dbg, ds, cu, cu->cu_dwarf_size,
5742bd3019Schristos 	    die->die_next_off, cu->cu_next_offset, ret_die, 0, error);
589dd9d0cfSchristos 
599dd9d0cfSchristos 	if (ret == DW_DLE_NO_ENTRY) {
609dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
619dd9d0cfSchristos 		return (DW_DLV_NO_ENTRY);
629dd9d0cfSchristos 	} else if (ret != DW_DLE_NONE)
639dd9d0cfSchristos 		return (DW_DLV_ERROR);
649dd9d0cfSchristos 
659dd9d0cfSchristos 	return (DW_DLV_OK);
669dd9d0cfSchristos }
679dd9d0cfSchristos 
689dd9d0cfSchristos int
dwarf_siblingof_b(Dwarf_Debug dbg,Dwarf_Die die,Dwarf_Die * ret_die,Dwarf_Bool is_info,Dwarf_Error * error)6942bd3019Schristos dwarf_siblingof_b(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *ret_die,
7042bd3019Schristos     Dwarf_Bool is_info, Dwarf_Error *error)
719dd9d0cfSchristos {
729dd9d0cfSchristos 	Dwarf_CU cu;
739dd9d0cfSchristos 	Dwarf_Attribute at;
7442bd3019Schristos 	Dwarf_Section *ds;
759dd9d0cfSchristos 	uint64_t offset;
769dd9d0cfSchristos 	int ret, search_sibling;
779dd9d0cfSchristos 
789dd9d0cfSchristos 	if (dbg == NULL || ret_die == NULL) {
799dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
809dd9d0cfSchristos 		return (DW_DLV_ERROR);
819dd9d0cfSchristos 	}
829dd9d0cfSchristos 
8342bd3019Schristos 	ds = is_info ? dbg->dbg_info_sec : dbg->dbg_types_sec;
8442bd3019Schristos 	cu = is_info ? dbg->dbg_cu_current : dbg->dbg_tu_current;
8542bd3019Schristos 
8642bd3019Schristos 	if (cu == NULL) {
879dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_DIE_NO_CU_CONTEXT);
889dd9d0cfSchristos 		return (DW_DLV_ERROR);
899dd9d0cfSchristos 	}
909dd9d0cfSchristos 
919dd9d0cfSchristos 	/* Application requests the first DIE in this CU. */
929dd9d0cfSchristos 	if (die == NULL)
9342bd3019Schristos 		return (dwarf_offdie_b(dbg, cu->cu_1st_offset, is_info,
9442bd3019Schristos 		    ret_die, error));
9542bd3019Schristos 
9642bd3019Schristos 	/*
9742bd3019Schristos 	 * Check if the `is_info' flag matches the debug section the
9842bd3019Schristos 	 * DIE belongs to.
9942bd3019Schristos 	 */
10042bd3019Schristos 	if (is_info != die->die_cu->cu_is_info) {
10142bd3019Schristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
10242bd3019Schristos 		return (DW_DLV_ERROR);
10342bd3019Schristos 	}
1049dd9d0cfSchristos 
1059dd9d0cfSchristos 	/*
1069dd9d0cfSchristos 	 * If the DIE doesn't have any children, its sibling sits next
1079dd9d0cfSchristos 	 * right to it.
1089dd9d0cfSchristos 	 */
1099dd9d0cfSchristos 	search_sibling = 0;
1109dd9d0cfSchristos 	if (die->die_ab->ab_children == DW_CHILDREN_no)
1119dd9d0cfSchristos 		offset = die->die_next_off;
1129dd9d0cfSchristos 	else {
1139dd9d0cfSchristos 		/*
1149dd9d0cfSchristos 		 * Look for DW_AT_sibling attribute for the offset of
1159dd9d0cfSchristos 		 * its sibling.
1169dd9d0cfSchristos 		 */
1179dd9d0cfSchristos 		if ((at = _dwarf_attr_find(die, DW_AT_sibling)) != NULL) {
1189dd9d0cfSchristos 			if (at->at_form != DW_FORM_ref_addr)
1199dd9d0cfSchristos 				offset = at->u[0].u64 + cu->cu_offset;
1209dd9d0cfSchristos 			else
1219dd9d0cfSchristos 				offset = at->u[0].u64;
1229dd9d0cfSchristos 		} else {
1239dd9d0cfSchristos 			offset = die->die_next_off;
1249dd9d0cfSchristos 			search_sibling = 1;
1259dd9d0cfSchristos 		}
1269dd9d0cfSchristos 	}
1279dd9d0cfSchristos 
12842bd3019Schristos 	ret = _dwarf_die_parse(die->die_dbg, ds, cu, cu->cu_dwarf_size, offset,
12942bd3019Schristos 	    cu->cu_next_offset, ret_die, search_sibling, error);
1309dd9d0cfSchristos 
1319dd9d0cfSchristos 	if (ret == DW_DLE_NO_ENTRY) {
1329dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
1339dd9d0cfSchristos 		return (DW_DLV_NO_ENTRY);
1349dd9d0cfSchristos 	} else if (ret != DW_DLE_NONE)
1359dd9d0cfSchristos 		return (DW_DLV_ERROR);
1369dd9d0cfSchristos 
1379dd9d0cfSchristos 	return (DW_DLV_OK);
1389dd9d0cfSchristos }
1399dd9d0cfSchristos 
14042bd3019Schristos 
14142bd3019Schristos int
dwarf_siblingof(Dwarf_Debug dbg,Dwarf_Die die,Dwarf_Die * ret_die,Dwarf_Error * error)14242bd3019Schristos dwarf_siblingof(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *ret_die,
14342bd3019Schristos     Dwarf_Error *error)
14442bd3019Schristos {
14542bd3019Schristos 
14642bd3019Schristos 	return (dwarf_siblingof_b(dbg, die, ret_die, 1, error));
14742bd3019Schristos }
14842bd3019Schristos 
1499dd9d0cfSchristos static int
_dwarf_search_die_within_cu(Dwarf_Debug dbg,Dwarf_Section * s,Dwarf_CU cu,Dwarf_Off offset,Dwarf_Die * ret_die,Dwarf_Error * error)15042bd3019Schristos _dwarf_search_die_within_cu(Dwarf_Debug dbg, Dwarf_Section *s, Dwarf_CU cu,
15142bd3019Schristos     Dwarf_Off offset, Dwarf_Die *ret_die, Dwarf_Error *error)
1529dd9d0cfSchristos {
1539dd9d0cfSchristos 
1549dd9d0cfSchristos 	assert(dbg != NULL && cu != NULL && ret_die != NULL);
1559dd9d0cfSchristos 
15642bd3019Schristos 	return (_dwarf_die_parse(dbg, s, cu, cu->cu_dwarf_size,
1579dd9d0cfSchristos 	    offset, cu->cu_next_offset, ret_die, 0, error));
1589dd9d0cfSchristos }
1599dd9d0cfSchristos 
1609dd9d0cfSchristos int
dwarf_offdie_b(Dwarf_Debug dbg,Dwarf_Off offset,Dwarf_Bool is_info,Dwarf_Die * ret_die,Dwarf_Error * error)16142bd3019Schristos dwarf_offdie_b(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Bool is_info,
16242bd3019Schristos     Dwarf_Die *ret_die, Dwarf_Error *error)
1639dd9d0cfSchristos {
16442bd3019Schristos 	Dwarf_Section *ds;
1659dd9d0cfSchristos 	Dwarf_CU cu;
1669dd9d0cfSchristos 	int ret;
1679dd9d0cfSchristos 
1689dd9d0cfSchristos 	if (dbg == NULL || ret_die == NULL) {
1699dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
1709dd9d0cfSchristos 		return (DW_DLV_ERROR);
1719dd9d0cfSchristos 	}
1729dd9d0cfSchristos 
17342bd3019Schristos 	ds = is_info ? dbg->dbg_info_sec : dbg->dbg_types_sec;
17442bd3019Schristos 	cu = is_info ? dbg->dbg_cu_current : dbg->dbg_tu_current;
17542bd3019Schristos 
1769dd9d0cfSchristos 	/* First search the current CU. */
17742bd3019Schristos 	if (cu != NULL) {
1789dd9d0cfSchristos 		if (offset > cu->cu_offset && offset < cu->cu_next_offset) {
17942bd3019Schristos 			ret = _dwarf_search_die_within_cu(dbg, ds, cu, offset,
1809dd9d0cfSchristos 			    ret_die, error);
1819dd9d0cfSchristos 			if (ret == DW_DLE_NO_ENTRY) {
1829dd9d0cfSchristos 				DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
1839dd9d0cfSchristos 				return (DW_DLV_NO_ENTRY);
1849dd9d0cfSchristos 			} else if (ret != DW_DLE_NONE)
1859dd9d0cfSchristos 				return (DW_DLV_ERROR);
1869dd9d0cfSchristos 			return (DW_DLV_OK);
1879dd9d0cfSchristos 		}
1889dd9d0cfSchristos 	}
1899dd9d0cfSchristos 
1909dd9d0cfSchristos 	/* Search other CUs. */
19142bd3019Schristos 	ret = _dwarf_info_load(dbg, 1, is_info, error);
1929dd9d0cfSchristos 	if (ret != DW_DLE_NONE)
1939dd9d0cfSchristos 		return (DW_DLV_ERROR);
1949dd9d0cfSchristos 
19542bd3019Schristos 	if (is_info) {
1969dd9d0cfSchristos 		STAILQ_FOREACH(cu, &dbg->dbg_cu, cu_next) {
19742bd3019Schristos 			if (offset < cu->cu_offset ||
19842bd3019Schristos 			    offset > cu->cu_next_offset)
1999dd9d0cfSchristos 				continue;
20042bd3019Schristos 			ret = _dwarf_search_die_within_cu(dbg, ds, cu, offset,
2019dd9d0cfSchristos 			    ret_die, error);
2029dd9d0cfSchristos 			if (ret == DW_DLE_NO_ENTRY) {
2039dd9d0cfSchristos 				DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
2049dd9d0cfSchristos 				return (DW_DLV_NO_ENTRY);
2059dd9d0cfSchristos 			} else if (ret != DW_DLE_NONE)
2069dd9d0cfSchristos 				return (DW_DLV_ERROR);
2079dd9d0cfSchristos 			return (DW_DLV_OK);
2089dd9d0cfSchristos 		}
20942bd3019Schristos 	} else {
21042bd3019Schristos 		STAILQ_FOREACH(cu, &dbg->dbg_tu, cu_next) {
21142bd3019Schristos 			if (offset < cu->cu_offset ||
21242bd3019Schristos 			    offset > cu->cu_next_offset)
21342bd3019Schristos 				continue;
21442bd3019Schristos 			ret = _dwarf_search_die_within_cu(dbg, ds, cu, offset,
21542bd3019Schristos 			    ret_die, error);
21642bd3019Schristos 			if (ret == DW_DLE_NO_ENTRY) {
21742bd3019Schristos 				DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
21842bd3019Schristos 				return (DW_DLV_NO_ENTRY);
21942bd3019Schristos 			} else if (ret != DW_DLE_NONE)
22042bd3019Schristos 				return (DW_DLV_ERROR);
22142bd3019Schristos 			return (DW_DLV_OK);
22242bd3019Schristos 		}
22342bd3019Schristos 	}
2249dd9d0cfSchristos 
2259dd9d0cfSchristos 	DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
2269dd9d0cfSchristos 	return (DW_DLV_NO_ENTRY);
2279dd9d0cfSchristos }
2289dd9d0cfSchristos 
2299dd9d0cfSchristos int
dwarf_offdie(Dwarf_Debug dbg,Dwarf_Off offset,Dwarf_Die * ret_die,Dwarf_Error * error)23042bd3019Schristos dwarf_offdie(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Die *ret_die,
23142bd3019Schristos     Dwarf_Error *error)
23242bd3019Schristos {
23342bd3019Schristos 
23442bd3019Schristos 	return (dwarf_offdie_b(dbg, offset, 1, ret_die, error));
23542bd3019Schristos }
23642bd3019Schristos 
23742bd3019Schristos int
dwarf_tag(Dwarf_Die die,Dwarf_Half * tag,Dwarf_Error * error)2389dd9d0cfSchristos dwarf_tag(Dwarf_Die die, Dwarf_Half *tag, Dwarf_Error *error)
2399dd9d0cfSchristos {
2409dd9d0cfSchristos 	Dwarf_Debug dbg;
2419dd9d0cfSchristos 
2429dd9d0cfSchristos 	dbg = die != NULL ? die->die_dbg : NULL;
2439dd9d0cfSchristos 
2449dd9d0cfSchristos 	if (die == NULL || tag == NULL) {
2459dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
2469dd9d0cfSchristos 		return (DW_DLV_ERROR);
2479dd9d0cfSchristos 	}
2489dd9d0cfSchristos 
2499dd9d0cfSchristos 	assert(die->die_ab != NULL);
2509dd9d0cfSchristos 
2519dd9d0cfSchristos 	*tag = (Dwarf_Half) die->die_ab->ab_tag;
2529dd9d0cfSchristos 
2539dd9d0cfSchristos 	return (DW_DLV_OK);
2549dd9d0cfSchristos }
2559dd9d0cfSchristos 
2569dd9d0cfSchristos int
dwarf_dieoffset(Dwarf_Die die,Dwarf_Off * ret_offset,Dwarf_Error * error)2579dd9d0cfSchristos dwarf_dieoffset(Dwarf_Die die, Dwarf_Off *ret_offset, Dwarf_Error *error)
2589dd9d0cfSchristos {
2599dd9d0cfSchristos 	Dwarf_Debug dbg;
2609dd9d0cfSchristos 
2619dd9d0cfSchristos 	dbg = die != NULL ? die->die_dbg : NULL;
2629dd9d0cfSchristos 
2639dd9d0cfSchristos 	if (die == NULL || ret_offset == NULL) {
2649dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
2659dd9d0cfSchristos 		return (DW_DLV_ERROR);
2669dd9d0cfSchristos 	}
2679dd9d0cfSchristos 
2689dd9d0cfSchristos 	*ret_offset = die->die_offset;
2699dd9d0cfSchristos 
2709dd9d0cfSchristos 	return (DW_DLV_OK);
2719dd9d0cfSchristos }
2729dd9d0cfSchristos 
2739dd9d0cfSchristos int
dwarf_die_CU_offset(Dwarf_Die die,Dwarf_Off * ret_offset,Dwarf_Error * error)2749dd9d0cfSchristos dwarf_die_CU_offset(Dwarf_Die die, Dwarf_Off *ret_offset, Dwarf_Error *error)
2759dd9d0cfSchristos {
2769dd9d0cfSchristos 	Dwarf_Debug dbg;
2779dd9d0cfSchristos 	Dwarf_CU cu;
2789dd9d0cfSchristos 
2799dd9d0cfSchristos 	dbg = die != NULL ? die->die_dbg : NULL;
2809dd9d0cfSchristos 
2819dd9d0cfSchristos 	if (die == NULL || ret_offset == NULL) {
2829dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
2839dd9d0cfSchristos 		return (DW_DLV_ERROR);
2849dd9d0cfSchristos 	}
2859dd9d0cfSchristos 
2869dd9d0cfSchristos 	cu = die->die_cu;
2879dd9d0cfSchristos 	assert(cu != NULL);
2889dd9d0cfSchristos 
2899dd9d0cfSchristos 	*ret_offset = die->die_offset - cu->cu_offset;
2909dd9d0cfSchristos 
2919dd9d0cfSchristos 	return (DW_DLV_OK);
2929dd9d0cfSchristos }
2939dd9d0cfSchristos 
2949dd9d0cfSchristos int
dwarf_die_CU_offset_range(Dwarf_Die die,Dwarf_Off * cu_offset,Dwarf_Off * cu_length,Dwarf_Error * error)2959dd9d0cfSchristos dwarf_die_CU_offset_range(Dwarf_Die die, Dwarf_Off *cu_offset,
2969dd9d0cfSchristos     Dwarf_Off *cu_length, Dwarf_Error *error)
2979dd9d0cfSchristos {
2989dd9d0cfSchristos 	Dwarf_Debug dbg;
2999dd9d0cfSchristos 	Dwarf_CU cu;
3009dd9d0cfSchristos 
3019dd9d0cfSchristos 	dbg = die != NULL ? die->die_dbg : NULL;
3029dd9d0cfSchristos 
3039dd9d0cfSchristos 	if (die == NULL || cu_offset == NULL || cu_length == NULL) {
3049dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
3059dd9d0cfSchristos 		return (DW_DLV_ERROR);
3069dd9d0cfSchristos 	}
3079dd9d0cfSchristos 
3089dd9d0cfSchristos 	cu = die->die_cu;
3099dd9d0cfSchristos 	assert(cu != NULL);
3109dd9d0cfSchristos 
3119dd9d0cfSchristos 	*cu_offset = cu->cu_offset;
3129dd9d0cfSchristos 	*cu_length = cu->cu_length + cu->cu_length_size;
3139dd9d0cfSchristos 
3149dd9d0cfSchristos 	return (DW_DLV_OK);
3159dd9d0cfSchristos }
3169dd9d0cfSchristos 
3179dd9d0cfSchristos int
dwarf_diename(Dwarf_Die die,char ** ret_name,Dwarf_Error * error)3189dd9d0cfSchristos dwarf_diename(Dwarf_Die die, char **ret_name, Dwarf_Error *error)
3199dd9d0cfSchristos {
3209dd9d0cfSchristos 	Dwarf_Debug dbg;
3219dd9d0cfSchristos 
3229dd9d0cfSchristos 	dbg = die != NULL ? die->die_dbg : NULL;
3239dd9d0cfSchristos 
3249dd9d0cfSchristos 	if (die == NULL || ret_name == NULL) {
3259dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
3269dd9d0cfSchristos 		return (DW_DLV_ERROR);
3279dd9d0cfSchristos 	}
3289dd9d0cfSchristos 
3299dd9d0cfSchristos 	if (die->die_name == NULL) {
3309dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
3319dd9d0cfSchristos 		return (DW_DLV_NO_ENTRY);
3329dd9d0cfSchristos 	}
3339dd9d0cfSchristos 
3349dd9d0cfSchristos 	*ret_name = die->die_name;
3359dd9d0cfSchristos 
3369dd9d0cfSchristos 	return (DW_DLV_OK);
3379dd9d0cfSchristos }
3389dd9d0cfSchristos 
3399dd9d0cfSchristos int
dwarf_die_abbrev_code(Dwarf_Die die)3409dd9d0cfSchristos dwarf_die_abbrev_code(Dwarf_Die die)
3419dd9d0cfSchristos {
3429dd9d0cfSchristos 
3439dd9d0cfSchristos 	assert(die != NULL);
3449dd9d0cfSchristos 
3459dd9d0cfSchristos 	return (die->die_abnum);
3469dd9d0cfSchristos }
3479dd9d0cfSchristos 
3489dd9d0cfSchristos int
dwarf_get_cu_die_offset_given_cu_header_offset_b(Dwarf_Debug dbg,Dwarf_Off in_cu_header_offset,Dwarf_Bool is_info,Dwarf_Off * out_cu_die_offset,Dwarf_Error * error)34942bd3019Schristos dwarf_get_cu_die_offset_given_cu_header_offset_b(Dwarf_Debug dbg,
35042bd3019Schristos     Dwarf_Off in_cu_header_offset, Dwarf_Bool is_info,
35142bd3019Schristos     Dwarf_Off *out_cu_die_offset, Dwarf_Error *error)
3529dd9d0cfSchristos {
3539dd9d0cfSchristos 	Dwarf_CU cu;
3549dd9d0cfSchristos 
3559dd9d0cfSchristos 	if (dbg == NULL || out_cu_die_offset == NULL) {
3569dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
3579dd9d0cfSchristos 		return (DW_DLV_ERROR);
3589dd9d0cfSchristos 	}
3599dd9d0cfSchristos 
36042bd3019Schristos 	if (is_info) {
3619dd9d0cfSchristos 		STAILQ_FOREACH(cu, &dbg->dbg_cu, cu_next) {
3629dd9d0cfSchristos 			if (cu->cu_offset == in_cu_header_offset) {
3639dd9d0cfSchristos 				*out_cu_die_offset = cu->cu_1st_offset;
3649dd9d0cfSchristos 				break;
3659dd9d0cfSchristos 			}
3669dd9d0cfSchristos 		}
36742bd3019Schristos 	} else {
36842bd3019Schristos 		STAILQ_FOREACH(cu, &dbg->dbg_tu, cu_next) {
36942bd3019Schristos 			if (cu->cu_offset == in_cu_header_offset) {
37042bd3019Schristos 				*out_cu_die_offset = cu->cu_1st_offset;
37142bd3019Schristos 				break;
37242bd3019Schristos 			}
37342bd3019Schristos 		}
37442bd3019Schristos 	}
3759dd9d0cfSchristos 
3769dd9d0cfSchristos 	if (cu == NULL) {
3779dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
3789dd9d0cfSchristos 		return (DW_DLV_NO_ENTRY);
3799dd9d0cfSchristos 	}
3809dd9d0cfSchristos 
3819dd9d0cfSchristos 	return (DW_DLV_OK);
3829dd9d0cfSchristos }
3839dd9d0cfSchristos 
3849dd9d0cfSchristos int
dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug dbg,Dwarf_Off in_cu_header_offset,Dwarf_Off * out_cu_die_offset,Dwarf_Error * error)38542bd3019Schristos dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug dbg,
38642bd3019Schristos     Dwarf_Off in_cu_header_offset, Dwarf_Off *out_cu_die_offset,
38742bd3019Schristos     Dwarf_Error *error)
38842bd3019Schristos {
38942bd3019Schristos 
39042bd3019Schristos 	return (dwarf_get_cu_die_offset_given_cu_header_offset_b(dbg,
39142bd3019Schristos 	    in_cu_header_offset, 1, out_cu_die_offset, error));
39242bd3019Schristos }
39342bd3019Schristos 
39442bd3019Schristos int
dwarf_get_address_size(Dwarf_Debug dbg,Dwarf_Half * addr_size,Dwarf_Error * error)3959dd9d0cfSchristos dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Half *addr_size,
3969dd9d0cfSchristos     Dwarf_Error *error)
3979dd9d0cfSchristos {
3989dd9d0cfSchristos 
3999dd9d0cfSchristos 	if (dbg == NULL || addr_size == NULL) {
4009dd9d0cfSchristos 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
4019dd9d0cfSchristos 		return (DW_DLV_ERROR);
4029dd9d0cfSchristos 	}
4039dd9d0cfSchristos 
4049dd9d0cfSchristos 	*addr_size = dbg->dbg_pointer_size;
4059dd9d0cfSchristos 
4069dd9d0cfSchristos 	return (DW_DLV_OK);
4079dd9d0cfSchristos }
40842bd3019Schristos 
40942bd3019Schristos Dwarf_Bool
dwarf_get_die_infotypes_flag(Dwarf_Die die)41042bd3019Schristos dwarf_get_die_infotypes_flag(Dwarf_Die die)
41142bd3019Schristos {
41242bd3019Schristos 
41342bd3019Schristos 	assert(die != NULL);
41442bd3019Schristos 
41542bd3019Schristos 	return (die->die_cu->cu_is_info);
41642bd3019Schristos }
417