]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/python/lib/gdb/types.py
run copyright.sh for 2011.
[thirdparty/binutils-gdb.git] / gdb / python / lib / gdb / types.py
1 # Type utilities.
2 # Copyright (C) 2010, 2011 Free Software Foundation, Inc.
3
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17 """Utilities for working with gdb.Types."""
18
19 import gdb
20
21
22 def get_basic_type(type_):
23 """Return the "basic" type of a type.
24
25 Arguments:
26 type_: The type to reduce to its basic type.
27
28 Returns:
29 type_ with const/volatile is stripped away,
30 and typedefs/references converted to the underlying type.
31 """
32
33 while (type_.code == gdb.TYPE_CODE_REF or
34 type_.code == gdb.TYPE_CODE_TYPEDEF):
35 if type_.code == gdb.TYPE_CODE_REF:
36 type_ = type_.target()
37 else:
38 type_ = type_.strip_typedefs()
39 return type_.unqualified()
40
41
42 def has_field(type_, field):
43 """Return True if a type has the specified field.
44
45 Arguments:
46 type_: The type to examine.
47 It must be one of gdb.TYPE_CODE_STRUCT, gdb.TYPE_CODE_UNION.
48 field: The name of the field to look up.
49
50 Returns:
51 True if the field is present either in type_ or any baseclass.
52
53 Raises:
54 TypeError: The type is not a struct or union.
55 """
56
57 type_ = get_basic_type(type_)
58 if (type_.code != gdb.TYPE_CODE_STRUCT and
59 type_.code != gdb.TYPE_CODE_UNION):
60 raise TypeError("not a struct or union")
61 for f in type_.fields():
62 if f.is_base_class:
63 if has_field(f.type, field):
64 return True
65 else:
66 # NOTE: f.name could be None
67 if f.name == field:
68 return True
69 return False
70
71
72 def make_enum_dict(enum_type):
73 """Return a dictionary from a program's enum type.
74
75 Arguments:
76 enum_type: The enum to compute the dictionary for.
77
78 Returns:
79 The dictionary of the enum.
80
81 Raises:
82 TypeError: The type is not an enum.
83 """
84
85 if enum_type.code != gdb.TYPE_CODE_ENUM:
86 raise TypeError("not an enum type")
87 enum_dict = {}
88 for field in enum_type.fields():
89 # The enum's value is stored in "bitpos".
90 enum_dict[field.name] = field.bitpos
91 return enum_dict