2 * Copyright (c) 2007 John Birrell (jb@freebsd.org)
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include "_libdwarf.h"
29 ELFTC_VCSID("$Id: dwarf_attrval.c 2072 2011-10-27 03:26:49Z jkoshy $");
32 dwarf_attrval_flag(Dwarf_Die die, Dwarf_Half attr, Dwarf_Bool *valp, Dwarf_Error *err)
37 dbg = die != NULL ? die->die_dbg : NULL;
39 if (die == NULL || valp == NULL) {
40 DWARF_SET_ERROR(dbg, err, DW_DLE_ARGUMENT);
41 return (DW_DLV_ERROR);
46 if ((at = _dwarf_attr_find(die, attr)) == NULL) {
47 DWARF_SET_ERROR(dbg, err, DW_DLE_NO_ENTRY);
48 return (DW_DLV_NO_ENTRY);
51 switch (at->at_form) {
53 case DW_FORM_flag_present:
54 *valp = (Dwarf_Bool) (!!at->u[0].u64);
57 DWARF_SET_ERROR(dbg, err, DW_DLE_ATTR_FORM_BAD);
58 return (DW_DLV_ERROR);
65 dwarf_attrval_string(Dwarf_Die die, Dwarf_Half attr, const char **strp, Dwarf_Error *err)
70 dbg = die != NULL ? die->die_dbg : NULL;
72 if (die == NULL || strp == NULL) {
73 DWARF_SET_ERROR(dbg, err, DW_DLE_ARGUMENT);
74 return (DW_DLV_ERROR);
79 if ((at = _dwarf_attr_find(die, attr)) == NULL) {
80 DWARF_SET_ERROR(dbg, err, DW_DLE_NO_ENTRY);
81 return (DW_DLV_NO_ENTRY);
84 switch (at->at_form) {
92 DWARF_SET_ERROR(dbg, err, DW_DLE_ATTR_FORM_BAD);
93 return (DW_DLV_ERROR);
100 dwarf_attrval_signed(Dwarf_Die die, Dwarf_Half attr, Dwarf_Signed *valp, Dwarf_Error *err)
105 dbg = die != NULL ? die->die_dbg : NULL;
107 if (die == NULL || valp == NULL) {
108 DWARF_SET_ERROR(dbg, err, DW_DLE_ARGUMENT);
109 return (DW_DLV_ERROR);
114 if ((at = _dwarf_attr_find(die, attr)) == NULL) {
115 DWARF_SET_ERROR(dbg, err, DW_DLE_NO_ENTRY);
116 return (DW_DLV_NO_ENTRY);
119 switch (at->at_form) {
121 *valp = (int8_t) at->u[0].s64;
124 *valp = (int16_t) at->u[0].s64;
127 *valp = (int32_t) at->u[0].s64;
130 *valp = at->u[0].s64;
133 DWARF_SET_ERROR(dbg, err, DW_DLE_ATTR_FORM_BAD);
134 return (DW_DLV_ERROR);
141 dwarf_attrval_unsigned(Dwarf_Die die, Dwarf_Half attr, Dwarf_Unsigned *valp, Dwarf_Error *err)
148 dbg = die != NULL ? die->die_dbg : NULL;
150 if (die == NULL || valp == NULL) {
151 DWARF_SET_ERROR(dbg, err, DW_DLE_ARGUMENT);
152 return (DW_DLV_ERROR);
157 if ((at = _dwarf_attr_find(die, attr)) == NULL && attr != DW_AT_type) {
158 DWARF_SET_ERROR(dbg, err, DW_DLE_NO_ENTRY);
159 return (DW_DLV_NO_ENTRY);
164 (at = _dwarf_attr_find(die, DW_AT_abstract_origin)) != NULL) {
165 switch (at->at_form) {
170 case DW_FORM_ref_udata:
172 if ((die1 = _dwarf_die_find(die, val)) == NULL ||
173 (at = _dwarf_attr_find(die1, attr)) == NULL) {
175 dwarf_dealloc(dbg, die1, DW_DLA_DIE);
176 DWARF_SET_ERROR(dbg, err, DW_DLE_NO_ENTRY);
177 return (DW_DLV_NO_ENTRY);
181 DWARF_SET_ERROR(dbg, err, DW_DLE_ATTR_FORM_BAD);
182 return (DW_DLV_ERROR);
186 switch (at->at_form) {
197 case DW_FORM_ref_udata:
198 *valp = at->u[0].u64;
202 dwarf_dealloc(dbg, die1, DW_DLA_DIE);
203 DWARF_SET_ERROR(dbg, err, DW_DLE_ATTR_FORM_BAD);
204 return (DW_DLV_ERROR);
208 dwarf_dealloc(dbg, die1, DW_DLA_DIE);