diff options
author | Doug Evans <dje@google.com> | 2010-10-13 20:08:46 +0000 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2010-10-13 20:08:46 +0000 |
commit | 0e3509dbced8d51a4293ab311eac20a2aee8cfdf (patch) | |
tree | aeb24174c6105a11cf8d6e78fd6d2682065190c6 /gdb/python/lib | |
parent | 577ce03a7c7132afb57ce6ebd2ce2c155110ccd4 (diff) | |
download | gdb-0e3509dbced8d51a4293ab311eac20a2aee8cfdf.zip gdb-0e3509dbced8d51a4293ab311eac20a2aee8cfdf.tar.gz gdb-0e3509dbced8d51a4293ab311eac20a2aee8cfdf.tar.bz2 |
New python module gdb.types.
* NEWS: Document it.
* data-directory/Makefile.in (PYTHON_FILES): Add gdb/types.py.
* python/lib/gdb/types.py: New file.
testsuite/
* lib/gdb-python.exp (gdb_check_python_config): New function.
* gdb.python/Makefile.in (EXECUTABLES): Add lib-types.
* gdb.python/lib-types.cc: New file.
* gdb.python/lib-types.exp: New file.
doc/
* gdb.texinfo (Python): Add "Python modules".
(Types in Python): Add reference to gdb.types section.
(Python modules): New node.
Diffstat (limited to 'gdb/python/lib')
-rw-r--r-- | gdb/python/lib/gdb/types.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/gdb/python/lib/gdb/types.py b/gdb/python/lib/gdb/types.py new file mode 100644 index 0000000..e45ea4c --- /dev/null +++ b/gdb/python/lib/gdb/types.py @@ -0,0 +1,91 @@ +# Type utilities. +# Copyright (C) 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +"""Utilities for working with gdb.Types.""" + +import gdb + + +def get_basic_type(type_): + """Return the "basic" type of a type. + + Arguments: + type_: The type to reduce to its basic type. + + Returns: + type_ with const/volatile is stripped away, + and typedefs/references converted to the underlying type. + """ + + while (type_.code == gdb.TYPE_CODE_REF or + type_.code == gdb.TYPE_CODE_TYPEDEF): + if type_.code == gdb.TYPE_CODE_REF: + type_ = type_.target() + else: + type_ = type_.strip_typedefs() + return type_.unqualified() + + +def has_field(type_, field): + """Return True if a type has the specified field. + + Arguments: + type_: The type to examine. + It must be one of gdb.TYPE_CODE_STRUCT, gdb.TYPE_CODE_UNION. + field: The name of the field to look up. + + Returns: + True if the field is present either in type_ or any baseclass. + + Raises: + TypeError: The type is not a struct or union. + """ + + type_ = get_basic_type(type_) + if (type_.code != gdb.TYPE_CODE_STRUCT and + type_.code != gdb.TYPE_CODE_UNION): + raise TypeError("not a struct or union") + for f in type_.fields(): + if f.is_base_class: + if has_field(f.type, field): + return True + else: + # NOTE: f.name could be None + if f.name == field: + return True + return False + + +def make_enum_dict(enum_type): + """Return a dictionary from a program's enum type. + + Arguments: + enum_type: The enum to compute the dictionary for. + + Returns: + The dictionary of the enum. + + Raises: + TypeError: The type is not an enum. + """ + + if enum_type.code != gdb.TYPE_CODE_ENUM: + raise TypeError("not an enum type") + enum_dict = {} + for field in enum_type.fields(): + # The enum's value is stored in "bitpos". + enum_dict[field.name] = field.bitpos + return enum_dict |