Branch data Line data Source code
1 : : /* Peel type aliases and qualifier tags from a type DIE.
2 : : Copyright (C) 2014, 2015, 2016 Red Hat, Inc.
3 : : This file is part of elfutils.
4 : :
5 : : This file is free software; you can redistribute it and/or modify
6 : : it under the terms of either
7 : :
8 : : * the GNU Lesser General Public License as published by the Free
9 : : Software Foundation; either version 3 of the License, or (at
10 : : your option) any later version
11 : :
12 : : or
13 : :
14 : : * the GNU General Public License as published by the Free
15 : : Software Foundation; either version 2 of the License, or (at
16 : : your option) any later version
17 : :
18 : : or both in parallel, as here.
19 : :
20 : : elfutils is distributed in the hope that it will be useful, but
21 : : WITHOUT ANY WARRANTY; without even the implied warranty of
22 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 : : General Public License for more details.
24 : :
25 : : You should have received copies of the GNU General Public License and
26 : : the GNU Lesser General Public License along with this program. If
27 : : not, see <http://www.gnu.org/licenses/>. */
28 : :
29 : : #ifdef HAVE_CONFIG_H
30 : : # include <config.h>
31 : : #endif
32 : :
33 : : #include "libdwP.h"
34 : : #include <dwarf.h>
35 : : #include <string.h>
36 : :
37 : :
38 : : int
39 : 167222 : dwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result)
40 : : {
41 : 167222 : int tag;
42 : :
43 : : /* Ignore previous errors. */
44 [ + + ]: 167222 : if (die == NULL)
45 : : return -1;
46 : :
47 : 9616 : *result = *die;
48 : 9616 : tag = INTUSE (dwarf_tag) (result);
49 : :
50 : : /* Stack 8 of all these modifiers, after that it gets silly. */
51 : : #define MAX_DEPTH (8 * 8)
52 : 9616 : int max_depth = MAX_DEPTH;
53 : 9616 : while ((tag == DW_TAG_typedef
54 [ + + ]: 12787 : || tag == DW_TAG_const_type
55 : 9637 : || tag == DW_TAG_volatile_type
56 [ + + ]: 9637 : || tag == DW_TAG_restrict_type
57 : 9616 : || tag == DW_TAG_atomic_type
58 [ + - ]: 9616 : || tag == DW_TAG_immutable_type
59 : 9616 : || tag == DW_TAG_packed_type
60 [ - + ]: 9616 : || tag == DW_TAG_shared_type)
61 [ + - ]: 3171 : && max_depth-- > 0)
62 : : {
63 : 3171 : Dwarf_Attribute attr_mem;
64 : 3171 : Dwarf_Attribute *attr = INTUSE (dwarf_attr_integrate) (result, DW_AT_type,
65 : : &attr_mem);
66 [ + - ]: 3171 : if (attr == NULL)
67 : 0 : return 1;
68 : :
69 [ + - ]: 3171 : if (INTUSE (dwarf_formref_die) (attr, result) == NULL)
70 : : return -1;
71 : :
72 : 3171 : tag = INTUSE (dwarf_tag) (result);
73 : : }
74 : :
75 [ - + ]: 9616 : if (tag == DW_TAG_invalid || max_depth <= 0)
76 : 0 : return -1;
77 : :
78 : : return 0;
79 : : }
80 : : INTDEF(dwarf_peel_type)
|