1 /* $NetBSD: dwarf_attrval.c,v 1.3 2015/01/14 09:29:27 martin Exp $ */
4 * Copyright (c) 2007 John Birrell (jb@freebsd.org)
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #include "_libdwarf.h"
31 __RCSID("$NetBSD: dwarf_attrval.c,v 1.3 2015/01/14 09:29:27 martin Exp $");
32 ELFTC_VCSID("Id: dwarf_attrval.c 2072 2011-10-27 03:26:49Z jkoshy ");
35 dwarf_attrval_flag(Dwarf_Die die
, Dwarf_Half attr
, Dwarf_Bool
*valp
, Dwarf_Error
*err
)
40 dbg
= die
!= NULL
? die
->die_dbg
: NULL
;
42 if (die
== NULL
|| valp
== NULL
) {
43 DWARF_SET_ERROR(dbg
, err
, DW_DLE_ARGUMENT
);
44 return (DW_DLV_ERROR
);
49 if ((at
= _dwarf_attr_find(die
, attr
)) == NULL
) {
50 DWARF_SET_ERROR(dbg
, err
, DW_DLE_NO_ENTRY
);
51 return (DW_DLV_NO_ENTRY
);
54 switch (at
->at_form
) {
56 case DW_FORM_flag_present
:
57 *valp
= (Dwarf_Bool
) (!!at
->u
[0].u64
);
60 DWARF_SET_ERROR(dbg
, err
, DW_DLE_ATTR_FORM_BAD
);
61 return (DW_DLV_ERROR
);
68 dwarf_attrval_string(Dwarf_Die die
, Dwarf_Half attr
, const char **strp
, Dwarf_Error
*err
)
73 dbg
= die
!= NULL
? die
->die_dbg
: NULL
;
75 if (die
== NULL
|| strp
== NULL
) {
76 DWARF_SET_ERROR(dbg
, err
, DW_DLE_ARGUMENT
);
77 return (DW_DLV_ERROR
);
82 if ((at
= _dwarf_attr_find(die
, attr
)) == NULL
) {
83 DWARF_SET_ERROR(dbg
, err
, DW_DLE_NO_ENTRY
);
84 return (DW_DLV_NO_ENTRY
);
87 switch (at
->at_form
) {
95 DWARF_SET_ERROR(dbg
, err
, DW_DLE_ATTR_FORM_BAD
);
96 return (DW_DLV_ERROR
);
103 dwarf_attrval_signed(Dwarf_Die die
, Dwarf_Half attr
, Dwarf_Signed
*valp
, Dwarf_Error
*err
)
108 dbg
= die
!= NULL
? die
->die_dbg
: NULL
;
110 if (die
== NULL
|| valp
== NULL
) {
111 DWARF_SET_ERROR(dbg
, err
, DW_DLE_ARGUMENT
);
112 return (DW_DLV_ERROR
);
117 if ((at
= _dwarf_attr_find(die
, attr
)) == NULL
) {
118 DWARF_SET_ERROR(dbg
, err
, DW_DLE_NO_ENTRY
);
119 return (DW_DLV_NO_ENTRY
);
122 switch (at
->at_form
) {
124 *valp
= (int8_t) at
->u
[0].s64
;
127 *valp
= (int16_t) at
->u
[0].s64
;
130 *valp
= (int32_t) at
->u
[0].s64
;
134 *valp
= at
->u
[0].s64
;
137 DWARF_SET_ERROR(dbg
, err
, DW_DLE_ATTR_FORM_BAD
);
138 return (DW_DLV_ERROR
);
145 dwarf_attrval_unsigned(Dwarf_Die die
, Dwarf_Half attr
, Dwarf_Unsigned
*valp
, Dwarf_Error
*err
)
152 dbg
= die
!= NULL
? die
->die_dbg
: NULL
;
154 if (die
== NULL
|| valp
== NULL
) {
155 DWARF_SET_ERROR(dbg
, err
, DW_DLE_ARGUMENT
);
156 return (DW_DLV_ERROR
);
161 if ((at
= _dwarf_attr_find(die
, attr
)) == NULL
&& attr
!= DW_AT_type
) {
162 DWARF_SET_ERROR(dbg
, err
, DW_DLE_NO_ENTRY
);
163 return (DW_DLV_NO_ENTRY
);
168 (at
= _dwarf_attr_find(die
, DW_AT_abstract_origin
)) != NULL
) {
169 switch (at
->at_form
) {
174 case DW_FORM_ref_udata
:
176 if ((die1
= _dwarf_die_find(die
, val
)) == NULL
||
177 (at
= _dwarf_attr_find(die1
, attr
)) == NULL
) {
179 dwarf_dealloc(dbg
, die1
, DW_DLA_DIE
);
180 DWARF_SET_ERROR(dbg
, err
, DW_DLE_NO_ENTRY
);
181 return (DW_DLV_NO_ENTRY
);
185 DWARF_SET_ERROR(dbg
, err
, DW_DLE_ATTR_FORM_BAD
);
186 return (DW_DLV_ERROR
);
190 switch (at
->at_form
) {
201 case DW_FORM_ref_udata
:
202 *valp
= at
->u
[0].u64
;
206 dwarf_dealloc(dbg
, die1
, DW_DLA_DIE
);
207 DWARF_SET_ERROR(dbg
, err
, DW_DLE_ATTR_FORM_BAD
);
208 return (DW_DLV_ERROR
);
212 dwarf_dealloc(dbg
, die1
, DW_DLA_DIE
);