Branch data Line data Source code
1 : : /* Get specific attribute of abbreviation.
2 : : Copyright (C) 2003, 2004, 2005 Red Hat, Inc.
3 : : This file is part of elfutils.
4 : : Written by Ulrich Drepper <drepper@redhat.com>, 2003.
5 : :
6 : : This file is free software; you can redistribute it and/or modify
7 : : it under the terms of either
8 : :
9 : : * the GNU Lesser General Public License as published by the Free
10 : : Software Foundation; either version 3 of the License, or (at
11 : : your option) any later version
12 : :
13 : : or
14 : :
15 : : * the GNU General Public License as published by the Free
16 : : Software Foundation; either version 2 of the License, or (at
17 : : your option) any later version
18 : :
19 : : or both in parallel, as here.
20 : :
21 : : elfutils is distributed in the hope that it will be useful, but
22 : : WITHOUT ANY WARRANTY; without even the implied warranty of
23 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 : : General Public License for more details.
25 : :
26 : : You should have received copies of the GNU General Public License and
27 : : the GNU Lesser General Public License along with this program. If
28 : : not, see <http://www.gnu.org/licenses/>. */
29 : :
30 : : #ifdef HAVE_CONFIG_H
31 : : # include <config.h>
32 : : #endif
33 : :
34 : : #include <assert.h>
35 : : #include <dwarf.h>
36 : : #include "libdwP.h"
37 : :
38 : :
39 : : int
40 : 325154 : dwarf_getabbrevattr (abbrev, idx, namep, formp, offsetp)
41 : : Dwarf_Abbrev *abbrev;
42 : : size_t idx;
43 : : unsigned int *namep;
44 : : unsigned int *formp;
45 : : Dwarf_Off *offsetp;
46 : : {
47 [ + - ]: 325154 : if (abbrev == NULL)
48 : : return -1;
49 : :
50 : 325154 : size_t cnt = 0;
51 : 325154 : const unsigned char *attrp = abbrev->attrp;
52 : : const unsigned char *start_attrp;
53 : : unsigned int name;
54 : : unsigned int form;
55 : :
56 : : do
57 : : {
58 : 1134121 : start_attrp = attrp;
59 : :
60 : : /* Attribute code and form are encoded as ULEB128 values. */
61 [ + + ]: 1134121 : get_uleb128 (name, attrp);
62 [ - + ]: 1134121 : get_uleb128 (form, attrp);
63 : :
64 : : /* If both values are zero the index is out of range. */
65 [ + + ]: 1134121 : if (name == 0 && form == 0)
66 : : return -1;
67 : : }
68 [ + + ]: 1069339 : while (cnt++ < idx);
69 : :
70 : : /* Store the result if requested. */
71 [ + - ]: 260372 : if (namep != NULL)
72 : 260372 : *namep = name;
73 [ + - ]: 260372 : if (formp != NULL)
74 : 260372 : *formp = form;
75 [ + - ]: 260372 : if (offsetp != NULL)
76 : 325154 : *offsetp = (start_attrp - abbrev->attrp) + abbrev->offset;
77 : :
78 : : return 0;
79 : : }
|