mirror of
https://git.rtems.org/rtems-tools/
synced 2025-05-13 01:44:36 +08:00

This is a first pass at cleaning up the support. To use: $ waf configure --prefix=$HOME/development/rtems/4.11 $ waf build install Start GDB and break at Init: (gdb) py import rtems (gdb) rtems task will list the classic API tasks.
171 lines
4.8 KiB
Python
171 lines
4.8 KiB
Python
# RTEMS Tools Project (http://www.rtems.org/)
|
|
# All rights reserved.
|
|
#
|
|
# This file is part of the RTEMS Tools package in 'rtems-tools'.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions are met:
|
|
#
|
|
# 1. Redistributions of source code must retain the above copyright notice,
|
|
# this list of conditions and the following disclaimer.
|
|
#
|
|
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
# this list of conditions and the following disclaimer in the documentation
|
|
# and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
|
|
#
|
|
# RTEMS Supercore pretty printers for GDB
|
|
#
|
|
|
|
import objects
|
|
import itertools
|
|
import threads
|
|
|
|
class id:
|
|
"""Print an object given the ID. Print using the struct display hint and an
|
|
iterator."""
|
|
|
|
class iterator:
|
|
"""Use an iterator for each field expanded from the id so GDB output
|
|
is formatted correctly."""
|
|
|
|
def __init__(self, id):
|
|
self.id = id
|
|
self.count = 0
|
|
|
|
def __iter__(self):
|
|
return self
|
|
|
|
def next(self):
|
|
self.count += 1
|
|
if self.count == 1:
|
|
return int(self.id.value())
|
|
elif self.count == 2:
|
|
return self.id.node()
|
|
elif self.count == 3:
|
|
return self.id.api()
|
|
elif self.count == 4:
|
|
return self.id._class()
|
|
elif self.count == 5:
|
|
return self.id.index()
|
|
raise StopIteration
|
|
|
|
def __init__(self, id):
|
|
self.id = objects.ident(id)
|
|
|
|
def to_string(self):
|
|
return ''
|
|
|
|
@staticmethod
|
|
def key(i):
|
|
if i == 0:
|
|
return 'id'
|
|
elif i == 1:
|
|
return 'node'
|
|
elif i == 2:
|
|
return 'api'
|
|
elif i == 3:
|
|
return 'class'
|
|
elif i == 4:
|
|
return 'index'
|
|
return 'bad'
|
|
|
|
def children(self):
|
|
counter = itertools.imap (self.key, itertools.count())
|
|
return itertools.izip (counter, self.iterator(self.id))
|
|
|
|
def display_hint (self):
|
|
return 'struct'
|
|
|
|
class name:
|
|
"""Pretty printer for an object's name. It has to guess the type as no
|
|
information is available to help determine it."""
|
|
|
|
def __init__(self, nameval):
|
|
self.name = objects.name(nameval)
|
|
|
|
def to_string(self):
|
|
return str(self.name)
|
|
|
|
class control:
|
|
|
|
class iterator:
|
|
"""Use an iterator for each field expanded from the id so GDB output
|
|
is formatted correctly."""
|
|
|
|
def __init__(self, object):
|
|
self.object = object
|
|
self.count = 0
|
|
|
|
def __iter__(self):
|
|
return self
|
|
|
|
def next(self):
|
|
self.count += 1
|
|
if self.count == 1:
|
|
return self.object.node()
|
|
elif self.count == 2:
|
|
return self.object.id()
|
|
elif self.count == 3:
|
|
return self.object.name()
|
|
raise StopIteration
|
|
|
|
def to_string(self):
|
|
return ''
|
|
|
|
def __init__(self, object):
|
|
self.object = objects.control(object)
|
|
|
|
@staticmethod
|
|
def key(i):
|
|
if i == 0:
|
|
return 'Node'
|
|
elif i == 1:
|
|
return 'id'
|
|
elif i == 2:
|
|
return 'name'
|
|
return 'bad'
|
|
|
|
def children(self):
|
|
counter = itertools.imap (self.key, itertools.count())
|
|
return itertools.izip (counter, self.iterator(self.object))
|
|
|
|
def display_hint (self):
|
|
return 'struct'
|
|
|
|
|
|
class state:
|
|
|
|
def __init__(self, state):
|
|
self.state = threads.state(state)
|
|
def to_string(self):
|
|
return self.state.to_string()
|
|
|
|
class chains:
|
|
|
|
def __init__(self,chain):
|
|
self.chain = chains.control(chain)
|
|
|
|
def to_string(self):
|
|
return "First:"+str(self.chain.first())+"\n Last:"+str(self.chain.last())
|
|
|
|
class node:
|
|
def __init__(self, node):
|
|
self.node = chains.node(node)
|
|
|
|
def to_string(self):
|
|
return "Node: "+str(self.node)+" Next: "+str(self.node.next())+" Prev: "+str(self.node.previous())
|