xref: /freebsd/contrib/elftoolchain/libdwarf/dwarf_die.c (revision 98e0ffaefb0f241cda3a72395d3be04192ae0d47)
12de3b87aSKai Wang /*-
22de3b87aSKai Wang  * Copyright (c) 2007 John Birrell (jb@freebsd.org)
3*cf781b2eSEd Maste  * Copyright (c) 2009,2011,2014 Kai Wang
42de3b87aSKai Wang  * All rights reserved.
52de3b87aSKai Wang  *
62de3b87aSKai Wang  * Redistribution and use in source and binary forms, with or without
72de3b87aSKai Wang  * modification, are permitted provided that the following conditions
82de3b87aSKai Wang  * are met:
92de3b87aSKai Wang  * 1. Redistributions of source code must retain the above copyright
102de3b87aSKai Wang  *    notice, this list of conditions and the following disclaimer.
112de3b87aSKai Wang  * 2. Redistributions in binary form must reproduce the above copyright
122de3b87aSKai Wang  *    notice, this list of conditions and the following disclaimer in the
132de3b87aSKai Wang  *    documentation and/or other materials provided with the distribution.
142de3b87aSKai Wang  *
152de3b87aSKai Wang  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
162de3b87aSKai Wang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
172de3b87aSKai Wang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
182de3b87aSKai Wang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
192de3b87aSKai Wang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
202de3b87aSKai Wang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
212de3b87aSKai Wang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
222de3b87aSKai Wang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
232de3b87aSKai Wang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
242de3b87aSKai Wang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
252de3b87aSKai Wang  * SUCH DAMAGE.
262de3b87aSKai Wang  */
272de3b87aSKai Wang 
282de3b87aSKai Wang #include "_libdwarf.h"
292de3b87aSKai Wang 
30*cf781b2eSEd Maste ELFTC_VCSID("$Id: dwarf_die.c 3039 2014-05-18 15:10:56Z kaiwang27 $");
312de3b87aSKai Wang 
322de3b87aSKai Wang int
dwarf_child(Dwarf_Die die,Dwarf_Die * ret_die,Dwarf_Error * error)332de3b87aSKai Wang dwarf_child(Dwarf_Die die, Dwarf_Die *ret_die, Dwarf_Error *error)
342de3b87aSKai Wang {
352de3b87aSKai Wang 	Dwarf_Debug dbg;
36*cf781b2eSEd Maste 	Dwarf_Section *ds;
372de3b87aSKai Wang 	Dwarf_CU cu;
382de3b87aSKai Wang 	int ret;
392de3b87aSKai Wang 
402de3b87aSKai Wang 	dbg = die != NULL ? die->die_dbg : NULL;
412de3b87aSKai Wang 
422de3b87aSKai Wang 	if (die == NULL || ret_die == NULL) {
432de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
442de3b87aSKai Wang 		return (DW_DLV_ERROR);
452de3b87aSKai Wang 	}
462de3b87aSKai Wang 
472de3b87aSKai Wang 	if (die->die_ab->ab_children == DW_CHILDREN_no)
481201c6fdSKai Wang 		return (DW_DLV_NO_ENTRY);
492de3b87aSKai Wang 
502de3b87aSKai Wang 	dbg = die->die_dbg;
512de3b87aSKai Wang 	cu = die->die_cu;
52*cf781b2eSEd Maste 	ds = cu->cu_is_info ? dbg->dbg_info_sec : dbg->dbg_types_sec;
53*cf781b2eSEd Maste 	ret = _dwarf_die_parse(die->die_dbg, ds, cu, cu->cu_dwarf_size,
54*cf781b2eSEd Maste 	    die->die_next_off, cu->cu_next_offset, ret_die, 0, error);
552de3b87aSKai Wang 
562de3b87aSKai Wang 	if (ret == DW_DLE_NO_ENTRY) {
572de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
582de3b87aSKai Wang 		return (DW_DLV_NO_ENTRY);
592de3b87aSKai Wang 	} else if (ret != DW_DLE_NONE)
602de3b87aSKai Wang 		return (DW_DLV_ERROR);
612de3b87aSKai Wang 
622de3b87aSKai Wang 	return (DW_DLV_OK);
632de3b87aSKai Wang }
642de3b87aSKai Wang 
652de3b87aSKai Wang int
dwarf_siblingof_b(Dwarf_Debug dbg,Dwarf_Die die,Dwarf_Die * ret_die,Dwarf_Bool is_info,Dwarf_Error * error)66*cf781b2eSEd Maste dwarf_siblingof_b(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *ret_die,
67*cf781b2eSEd Maste     Dwarf_Bool is_info, Dwarf_Error *error)
682de3b87aSKai Wang {
692de3b87aSKai Wang 	Dwarf_CU cu;
702de3b87aSKai Wang 	Dwarf_Attribute at;
71*cf781b2eSEd Maste 	Dwarf_Section *ds;
722de3b87aSKai Wang 	uint64_t offset;
732de3b87aSKai Wang 	int ret, search_sibling;
742de3b87aSKai Wang 
752de3b87aSKai Wang 	if (dbg == NULL || ret_die == NULL) {
762de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
772de3b87aSKai Wang 		return (DW_DLV_ERROR);
782de3b87aSKai Wang 	}
792de3b87aSKai Wang 
80*cf781b2eSEd Maste 	ds = is_info ? dbg->dbg_info_sec : dbg->dbg_types_sec;
81*cf781b2eSEd Maste 	cu = is_info ? dbg->dbg_cu_current : dbg->dbg_tu_current;
82*cf781b2eSEd Maste 
83*cf781b2eSEd Maste 	if (cu == NULL) {
842de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_DIE_NO_CU_CONTEXT);
852de3b87aSKai Wang 		return (DW_DLV_ERROR);
862de3b87aSKai Wang 	}
872de3b87aSKai Wang 
882de3b87aSKai Wang 	/* Application requests the first DIE in this CU. */
892de3b87aSKai Wang 	if (die == NULL)
90*cf781b2eSEd Maste 		return (dwarf_offdie_b(dbg, cu->cu_1st_offset, is_info,
91*cf781b2eSEd Maste 		    ret_die, error));
92*cf781b2eSEd Maste 
93*cf781b2eSEd Maste 	/*
94*cf781b2eSEd Maste 	 * Check if the `is_info' flag matches the debug section the
95*cf781b2eSEd Maste 	 * DIE belongs to.
96*cf781b2eSEd Maste 	 */
97*cf781b2eSEd Maste 	if (is_info != die->die_cu->cu_is_info) {
98*cf781b2eSEd Maste 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
99*cf781b2eSEd Maste 		return (DW_DLV_ERROR);
100*cf781b2eSEd Maste 	}
1012de3b87aSKai Wang 
1022de3b87aSKai Wang 	/*
1032de3b87aSKai Wang 	 * If the DIE doesn't have any children, its sibling sits next
1042de3b87aSKai Wang 	 * right to it.
1052de3b87aSKai Wang 	 */
1062de3b87aSKai Wang 	search_sibling = 0;
1072de3b87aSKai Wang 	if (die->die_ab->ab_children == DW_CHILDREN_no)
1082de3b87aSKai Wang 		offset = die->die_next_off;
1092de3b87aSKai Wang 	else {
1102de3b87aSKai Wang 		/*
1112de3b87aSKai Wang 		 * Look for DW_AT_sibling attribute for the offset of
1122de3b87aSKai Wang 		 * its sibling.
1132de3b87aSKai Wang 		 */
1142de3b87aSKai Wang 		if ((at = _dwarf_attr_find(die, DW_AT_sibling)) != NULL) {
1152de3b87aSKai Wang 			if (at->at_form != DW_FORM_ref_addr)
1162de3b87aSKai Wang 				offset = at->u[0].u64 + cu->cu_offset;
1172de3b87aSKai Wang 			else
1182de3b87aSKai Wang 				offset = at->u[0].u64;
1192de3b87aSKai Wang 		} else {
1202de3b87aSKai Wang 			offset = die->die_next_off;
1212de3b87aSKai Wang 			search_sibling = 1;
1222de3b87aSKai Wang 		}
1232de3b87aSKai Wang 	}
1242de3b87aSKai Wang 
125*cf781b2eSEd Maste 	ret = _dwarf_die_parse(die->die_dbg, ds, cu, cu->cu_dwarf_size, offset,
126*cf781b2eSEd Maste 	    cu->cu_next_offset, ret_die, search_sibling, error);
1272de3b87aSKai Wang 
1282de3b87aSKai Wang 	if (ret == DW_DLE_NO_ENTRY) {
1292de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
1302de3b87aSKai Wang 		return (DW_DLV_NO_ENTRY);
1312de3b87aSKai Wang 	} else if (ret != DW_DLE_NONE)
1322de3b87aSKai Wang 		return (DW_DLV_ERROR);
1332de3b87aSKai Wang 
1342de3b87aSKai Wang 	return (DW_DLV_OK);
1352de3b87aSKai Wang }
1362de3b87aSKai Wang 
137*cf781b2eSEd Maste 
138*cf781b2eSEd Maste int
dwarf_siblingof(Dwarf_Debug dbg,Dwarf_Die die,Dwarf_Die * ret_die,Dwarf_Error * error)139*cf781b2eSEd Maste dwarf_siblingof(Dwarf_Debug dbg, Dwarf_Die die, Dwarf_Die *ret_die,
140*cf781b2eSEd Maste     Dwarf_Error *error)
141*cf781b2eSEd Maste {
142*cf781b2eSEd Maste 
143*cf781b2eSEd Maste 	return (dwarf_siblingof_b(dbg, die, ret_die, 1, error));
144*cf781b2eSEd Maste }
145*cf781b2eSEd Maste 
1462de3b87aSKai Wang 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)147*cf781b2eSEd Maste _dwarf_search_die_within_cu(Dwarf_Debug dbg, Dwarf_Section *s, Dwarf_CU cu,
148*cf781b2eSEd Maste     Dwarf_Off offset, Dwarf_Die *ret_die, Dwarf_Error *error)
1492de3b87aSKai Wang {
1502de3b87aSKai Wang 
1512de3b87aSKai Wang 	assert(dbg != NULL && cu != NULL && ret_die != NULL);
1522de3b87aSKai Wang 
153*cf781b2eSEd Maste 	return (_dwarf_die_parse(dbg, s, cu, cu->cu_dwarf_size,
1542de3b87aSKai Wang 	    offset, cu->cu_next_offset, ret_die, 0, error));
1552de3b87aSKai Wang }
1562de3b87aSKai Wang 
1572de3b87aSKai Wang int
dwarf_offdie_b(Dwarf_Debug dbg,Dwarf_Off offset,Dwarf_Bool is_info,Dwarf_Die * ret_die,Dwarf_Error * error)158*cf781b2eSEd Maste dwarf_offdie_b(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Bool is_info,
159*cf781b2eSEd Maste     Dwarf_Die *ret_die, Dwarf_Error *error)
1602de3b87aSKai Wang {
161*cf781b2eSEd Maste 	Dwarf_Section *ds;
1622de3b87aSKai Wang 	Dwarf_CU cu;
1632de3b87aSKai Wang 	int ret;
1642de3b87aSKai Wang 
1652de3b87aSKai Wang 	if (dbg == NULL || ret_die == NULL) {
1662de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
1672de3b87aSKai Wang 		return (DW_DLV_ERROR);
1682de3b87aSKai Wang 	}
1692de3b87aSKai Wang 
170*cf781b2eSEd Maste 	ds = is_info ? dbg->dbg_info_sec : dbg->dbg_types_sec;
171*cf781b2eSEd Maste 	cu = is_info ? dbg->dbg_cu_current : dbg->dbg_tu_current;
172*cf781b2eSEd Maste 
1732de3b87aSKai Wang 	/* First search the current CU. */
174*cf781b2eSEd Maste 	if (cu != NULL) {
1752de3b87aSKai Wang 		if (offset > cu->cu_offset && offset < cu->cu_next_offset) {
176*cf781b2eSEd Maste 			ret = _dwarf_search_die_within_cu(dbg, ds, cu, offset,
1772de3b87aSKai Wang 			    ret_die, error);
1782de3b87aSKai Wang 			if (ret == DW_DLE_NO_ENTRY) {
1792de3b87aSKai Wang 				DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
1802de3b87aSKai Wang 				return (DW_DLV_NO_ENTRY);
1812de3b87aSKai Wang 			} else if (ret != DW_DLE_NONE)
1822de3b87aSKai Wang 				return (DW_DLV_ERROR);
1832de3b87aSKai Wang 			return (DW_DLV_OK);
1842de3b87aSKai Wang 		}
1852de3b87aSKai Wang 	}
1862de3b87aSKai Wang 
1872de3b87aSKai Wang 	/* Search other CUs. */
188*cf781b2eSEd Maste 	ret = _dwarf_info_load(dbg, 1, is_info, error);
1892de3b87aSKai Wang 	if (ret != DW_DLE_NONE)
1902de3b87aSKai Wang 		return (DW_DLV_ERROR);
1912de3b87aSKai Wang 
192*cf781b2eSEd Maste 	if (is_info) {
1932de3b87aSKai Wang 		STAILQ_FOREACH(cu, &dbg->dbg_cu, cu_next) {
194*cf781b2eSEd Maste 			if (offset < cu->cu_offset ||
195*cf781b2eSEd Maste 			    offset > cu->cu_next_offset)
1962de3b87aSKai Wang 				continue;
197*cf781b2eSEd Maste 			ret = _dwarf_search_die_within_cu(dbg, ds, cu, offset,
1982de3b87aSKai Wang 			    ret_die, error);
1992de3b87aSKai Wang 			if (ret == DW_DLE_NO_ENTRY) {
2002de3b87aSKai Wang 				DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
2012de3b87aSKai Wang 				return (DW_DLV_NO_ENTRY);
2022de3b87aSKai Wang 			} else if (ret != DW_DLE_NONE)
2032de3b87aSKai Wang 				return (DW_DLV_ERROR);
2042de3b87aSKai Wang 			return (DW_DLV_OK);
2052de3b87aSKai Wang 		}
206*cf781b2eSEd Maste 	} else {
207*cf781b2eSEd Maste 		STAILQ_FOREACH(cu, &dbg->dbg_tu, cu_next) {
208*cf781b2eSEd Maste 			if (offset < cu->cu_offset ||
209*cf781b2eSEd Maste 			    offset > cu->cu_next_offset)
210*cf781b2eSEd Maste 				continue;
211*cf781b2eSEd Maste 			ret = _dwarf_search_die_within_cu(dbg, ds, cu, offset,
212*cf781b2eSEd Maste 			    ret_die, error);
213*cf781b2eSEd Maste 			if (ret == DW_DLE_NO_ENTRY) {
214*cf781b2eSEd Maste 				DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
215*cf781b2eSEd Maste 				return (DW_DLV_NO_ENTRY);
216*cf781b2eSEd Maste 			} else if (ret != DW_DLE_NONE)
217*cf781b2eSEd Maste 				return (DW_DLV_ERROR);
218*cf781b2eSEd Maste 			return (DW_DLV_OK);
219*cf781b2eSEd Maste 		}
220*cf781b2eSEd Maste 	}
2212de3b87aSKai Wang 
2222de3b87aSKai Wang 	DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
2232de3b87aSKai Wang 	return (DW_DLV_NO_ENTRY);
2242de3b87aSKai Wang }
2252de3b87aSKai Wang 
2262de3b87aSKai Wang int
dwarf_offdie(Dwarf_Debug dbg,Dwarf_Off offset,Dwarf_Die * ret_die,Dwarf_Error * error)227*cf781b2eSEd Maste dwarf_offdie(Dwarf_Debug dbg, Dwarf_Off offset, Dwarf_Die *ret_die,
228*cf781b2eSEd Maste     Dwarf_Error *error)
229*cf781b2eSEd Maste {
230*cf781b2eSEd Maste 
231*cf781b2eSEd Maste 	return (dwarf_offdie_b(dbg, offset, 1, ret_die, error));
232*cf781b2eSEd Maste }
233*cf781b2eSEd Maste 
234*cf781b2eSEd Maste int
dwarf_tag(Dwarf_Die die,Dwarf_Half * tag,Dwarf_Error * error)2352de3b87aSKai Wang dwarf_tag(Dwarf_Die die, Dwarf_Half *tag, Dwarf_Error *error)
2362de3b87aSKai Wang {
2372de3b87aSKai Wang 	Dwarf_Debug dbg;
2382de3b87aSKai Wang 
2392de3b87aSKai Wang 	dbg = die != NULL ? die->die_dbg : NULL;
2402de3b87aSKai Wang 
2412de3b87aSKai Wang 	if (die == NULL || tag == NULL) {
2422de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
2432de3b87aSKai Wang 		return (DW_DLV_ERROR);
2442de3b87aSKai Wang 	}
2452de3b87aSKai Wang 
2462de3b87aSKai Wang 	assert(die->die_ab != NULL);
2472de3b87aSKai Wang 
2482de3b87aSKai Wang 	*tag = (Dwarf_Half) die->die_ab->ab_tag;
2492de3b87aSKai Wang 
2502de3b87aSKai Wang 	return (DW_DLV_OK);
2512de3b87aSKai Wang }
2522de3b87aSKai Wang 
2532de3b87aSKai Wang int
dwarf_dieoffset(Dwarf_Die die,Dwarf_Off * ret_offset,Dwarf_Error * error)2542de3b87aSKai Wang dwarf_dieoffset(Dwarf_Die die, Dwarf_Off *ret_offset, Dwarf_Error *error)
2552de3b87aSKai Wang {
2562de3b87aSKai Wang 	Dwarf_Debug dbg;
2572de3b87aSKai Wang 
2582de3b87aSKai Wang 	dbg = die != NULL ? die->die_dbg : NULL;
2592de3b87aSKai Wang 
2602de3b87aSKai Wang 	if (die == NULL || ret_offset == NULL) {
2612de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
2622de3b87aSKai Wang 		return (DW_DLV_ERROR);
2632de3b87aSKai Wang 	}
2642de3b87aSKai Wang 
2652de3b87aSKai Wang 	*ret_offset = die->die_offset;
2662de3b87aSKai Wang 
2672de3b87aSKai Wang 	return (DW_DLV_OK);
2682de3b87aSKai Wang }
2692de3b87aSKai Wang 
2702de3b87aSKai Wang int
dwarf_die_CU_offset(Dwarf_Die die,Dwarf_Off * ret_offset,Dwarf_Error * error)2712de3b87aSKai Wang dwarf_die_CU_offset(Dwarf_Die die, Dwarf_Off *ret_offset, Dwarf_Error *error)
2722de3b87aSKai Wang {
2732de3b87aSKai Wang 	Dwarf_Debug dbg;
2742de3b87aSKai Wang 	Dwarf_CU cu;
2752de3b87aSKai Wang 
2762de3b87aSKai Wang 	dbg = die != NULL ? die->die_dbg : NULL;
2772de3b87aSKai Wang 
2782de3b87aSKai Wang 	if (die == NULL || ret_offset == NULL) {
2792de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
2802de3b87aSKai Wang 		return (DW_DLV_ERROR);
2812de3b87aSKai Wang 	}
2822de3b87aSKai Wang 
2832de3b87aSKai Wang 	cu = die->die_cu;
2842de3b87aSKai Wang 	assert(cu != NULL);
2852de3b87aSKai Wang 
2862de3b87aSKai Wang 	*ret_offset = die->die_offset - cu->cu_offset;
2872de3b87aSKai Wang 
2882de3b87aSKai Wang 	return (DW_DLV_OK);
2892de3b87aSKai Wang }
2902de3b87aSKai Wang 
2912de3b87aSKai Wang int
dwarf_die_CU_offset_range(Dwarf_Die die,Dwarf_Off * cu_offset,Dwarf_Off * cu_length,Dwarf_Error * error)2922de3b87aSKai Wang dwarf_die_CU_offset_range(Dwarf_Die die, Dwarf_Off *cu_offset,
2932de3b87aSKai Wang     Dwarf_Off *cu_length, Dwarf_Error *error)
2942de3b87aSKai Wang {
2952de3b87aSKai Wang 	Dwarf_Debug dbg;
2962de3b87aSKai Wang 	Dwarf_CU cu;
2972de3b87aSKai Wang 
2982de3b87aSKai Wang 	dbg = die != NULL ? die->die_dbg : NULL;
2992de3b87aSKai Wang 
3002de3b87aSKai Wang 	if (die == NULL || cu_offset == NULL || cu_length == NULL) {
3012de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
3022de3b87aSKai Wang 		return (DW_DLV_ERROR);
3032de3b87aSKai Wang 	}
3042de3b87aSKai Wang 
3052de3b87aSKai Wang 	cu = die->die_cu;
3062de3b87aSKai Wang 	assert(cu != NULL);
3072de3b87aSKai Wang 
3082de3b87aSKai Wang 	*cu_offset = cu->cu_offset;
3092de3b87aSKai Wang 	*cu_length = cu->cu_length + cu->cu_length_size;
3102de3b87aSKai Wang 
3112de3b87aSKai Wang 	return (DW_DLV_OK);
3122de3b87aSKai Wang }
3132de3b87aSKai Wang 
3142de3b87aSKai Wang int
dwarf_diename(Dwarf_Die die,char ** ret_name,Dwarf_Error * error)3152de3b87aSKai Wang dwarf_diename(Dwarf_Die die, char **ret_name, Dwarf_Error *error)
3162de3b87aSKai Wang {
3172de3b87aSKai Wang 	Dwarf_Debug dbg;
3182de3b87aSKai Wang 
3192de3b87aSKai Wang 	dbg = die != NULL ? die->die_dbg : NULL;
3202de3b87aSKai Wang 
3212de3b87aSKai Wang 	if (die == NULL || ret_name == NULL) {
3222de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
3232de3b87aSKai Wang 		return (DW_DLV_ERROR);
3242de3b87aSKai Wang 	}
3252de3b87aSKai Wang 
3262de3b87aSKai Wang 	if (die->die_name == NULL) {
3272de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
3282de3b87aSKai Wang 		return (DW_DLV_NO_ENTRY);
3292de3b87aSKai Wang 	}
3302de3b87aSKai Wang 
3312de3b87aSKai Wang 	*ret_name = die->die_name;
3322de3b87aSKai Wang 
3332de3b87aSKai Wang 	return (DW_DLV_OK);
3342de3b87aSKai Wang }
3352de3b87aSKai Wang 
3362de3b87aSKai Wang int
dwarf_die_abbrev_code(Dwarf_Die die)3372de3b87aSKai Wang dwarf_die_abbrev_code(Dwarf_Die die)
3382de3b87aSKai Wang {
3392de3b87aSKai Wang 
3402de3b87aSKai Wang 	assert(die != NULL);
3412de3b87aSKai Wang 
3422de3b87aSKai Wang 	return (die->die_abnum);
3432de3b87aSKai Wang }
3442de3b87aSKai Wang 
3452de3b87aSKai Wang 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)346*cf781b2eSEd Maste dwarf_get_cu_die_offset_given_cu_header_offset_b(Dwarf_Debug dbg,
347*cf781b2eSEd Maste     Dwarf_Off in_cu_header_offset, Dwarf_Bool is_info,
348*cf781b2eSEd Maste     Dwarf_Off *out_cu_die_offset, Dwarf_Error *error)
3492de3b87aSKai Wang {
3502de3b87aSKai Wang 	Dwarf_CU cu;
3512de3b87aSKai Wang 
3522de3b87aSKai Wang 	if (dbg == NULL || out_cu_die_offset == NULL) {
3532de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
3542de3b87aSKai Wang 		return (DW_DLV_ERROR);
3552de3b87aSKai Wang 	}
3562de3b87aSKai Wang 
357*cf781b2eSEd Maste 	if (is_info) {
3582de3b87aSKai Wang 		STAILQ_FOREACH(cu, &dbg->dbg_cu, cu_next) {
3592de3b87aSKai Wang 			if (cu->cu_offset == in_cu_header_offset) {
3602de3b87aSKai Wang 				*out_cu_die_offset = cu->cu_1st_offset;
3612de3b87aSKai Wang 				break;
3622de3b87aSKai Wang 			}
3632de3b87aSKai Wang 		}
364*cf781b2eSEd Maste 	} else {
365*cf781b2eSEd Maste 		STAILQ_FOREACH(cu, &dbg->dbg_tu, cu_next) {
366*cf781b2eSEd Maste 			if (cu->cu_offset == in_cu_header_offset) {
367*cf781b2eSEd Maste 				*out_cu_die_offset = cu->cu_1st_offset;
368*cf781b2eSEd Maste 				break;
369*cf781b2eSEd Maste 			}
370*cf781b2eSEd Maste 		}
371*cf781b2eSEd Maste 	}
3722de3b87aSKai Wang 
3732de3b87aSKai Wang 	if (cu == NULL) {
3742de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY);
3752de3b87aSKai Wang 		return (DW_DLV_NO_ENTRY);
3762de3b87aSKai Wang 	}
3772de3b87aSKai Wang 
3782de3b87aSKai Wang 	return (DW_DLV_OK);
3792de3b87aSKai Wang }
3802de3b87aSKai Wang 
3812de3b87aSKai Wang 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)382*cf781b2eSEd Maste dwarf_get_cu_die_offset_given_cu_header_offset(Dwarf_Debug dbg,
383*cf781b2eSEd Maste     Dwarf_Off in_cu_header_offset, Dwarf_Off *out_cu_die_offset,
384*cf781b2eSEd Maste     Dwarf_Error *error)
385*cf781b2eSEd Maste {
386*cf781b2eSEd Maste 
387*cf781b2eSEd Maste 	return (dwarf_get_cu_die_offset_given_cu_header_offset_b(dbg,
388*cf781b2eSEd Maste 	    in_cu_header_offset, 1, out_cu_die_offset, error));
389*cf781b2eSEd Maste }
390*cf781b2eSEd Maste 
391*cf781b2eSEd Maste int
dwarf_get_address_size(Dwarf_Debug dbg,Dwarf_Half * addr_size,Dwarf_Error * error)3922de3b87aSKai Wang dwarf_get_address_size(Dwarf_Debug dbg, Dwarf_Half *addr_size,
3932de3b87aSKai Wang     Dwarf_Error *error)
3942de3b87aSKai Wang {
3952de3b87aSKai Wang 
3962de3b87aSKai Wang 	if (dbg == NULL || addr_size == NULL) {
3972de3b87aSKai Wang 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
3982de3b87aSKai Wang 		return (DW_DLV_ERROR);
3992de3b87aSKai Wang 	}
4002de3b87aSKai Wang 
4012de3b87aSKai Wang 	*addr_size = dbg->dbg_pointer_size;
4022de3b87aSKai Wang 
4032de3b87aSKai Wang 	return (DW_DLV_OK);
4042de3b87aSKai Wang }
405*cf781b2eSEd Maste 
406*cf781b2eSEd Maste Dwarf_Bool
dwarf_get_die_infotypes_flag(Dwarf_Die die)407*cf781b2eSEd Maste dwarf_get_die_infotypes_flag(Dwarf_Die die)
408*cf781b2eSEd Maste {
409*cf781b2eSEd Maste 
410*cf781b2eSEd Maste 	assert(die != NULL);
411*cf781b2eSEd Maste 
412*cf781b2eSEd Maste 	return (die->die_cu->cu_is_info);
413*cf781b2eSEd Maste }
414