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