From a785e254f2360e946baa14a11fbd3f403047b880 Mon Sep 17 00:00:00 2001 From: Dhananjay Balan Date: Fri, 12 Jul 2013 19:07:46 +0530 Subject: Add printers to stage. --- tools/gdb/python/classic_printer.py | 62 +++++++++++++++ tools/gdb/python/supercore.py | 24 ++++++ tools/gdb/python/supercore_printer.py | 140 ++++++++++++++++++++++++++++++++++ 3 files changed, 226 insertions(+) create mode 100644 tools/gdb/python/classic_printer.py create mode 100644 tools/gdb/python/supercore.py create mode 100644 tools/gdb/python/supercore_printer.py diff --git a/tools/gdb/python/classic_printer.py b/tools/gdb/python/classic_printer.py new file mode 100644 index 0000000..e9d7cb8 --- /dev/null +++ b/tools/gdb/python/classic_printer.py @@ -0,0 +1,62 @@ +# +# RTEMS Classic pretty printers for GDB +# + +class attribute_printer: + + def __init__(self, attribute): + ''' ToDo: Verify - usage of all ''' + self.attr = classic.attribute(attribute,'all') + + def to_string(self): + return gdb.Value(self.attr.to_string()) + +class semaphore_printer: + """WIP: Print a Semaphore_Control object. 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, semaphore): + self.semaphore = semaphore + self.count = 0 + + def __iter__(self): + return self + + def next(self): + self.count += 1 + if self.count == 1: + return self.semaphore['Object'] + elif self.count == 2: + attr = attribute(self.semaphore['attribute_set'], + 'semaphore') + return attr.to_string() + elif self.count == 3: + return self.semaphore['Core_control'] + raise StopIteration + + def __init__(self, semaphore): + self.semaphore = semaphore + + def to_string(self): + return '' + + @staticmethod + def key(i): + if i == 0: + return 'Object' + elif i == 1: + return 'attribute_set' + elif i == 2: + return 'Core_control' + return 'bad' + + def children(self): + counter = itertools.imap (self.key, itertools.count()) + return itertools.izip (counter, self.iterator(self.semaphore)) + + def display_hint (self): + return 'struct' diff --git a/tools/gdb/python/supercore.py b/tools/gdb/python/supercore.py new file mode 100644 index 0000000..4378e12 --- /dev/null +++ b/tools/gdb/python/supercore.py @@ -0,0 +1,24 @@ +# +# RTEMS Supercore Objects +# + +import threads + +# ToDo: Move this to helper. +def tasks_printer_rotuine(wait_queue): + tasks = wait_queue.tasks() + print ' Queue: len = %d, state = %s' % (len(tasks),wait_queue.state()) + for t in range(0, len(tasks)): + print ' ', tasks[t].brief(), ' (%08x)' % (tasks[t].id()) + +class CORE_message_queue: + '''Manage a Supercore message_queue''' + + def __init__(self, message_queue): + self.queue = message_queue + self.wait_queue = threads.queue(self.queue['Wait_queue']) + # ToDo: self.attribute ='' + # self.buffer + + def show(self): + tasks_printer_rotuine(self.wait_queue) diff --git a/tools/gdb/python/supercore_printer.py b/tools/gdb/python/supercore_printer.py new file mode 100644 index 0000000..cee9097 --- /dev/null +++ b/tools/gdb/python/supercore_printer.py @@ -0,0 +1,140 @@ +# +# RTEMS Supercore pretty printers for GDB +# +import objects +import itertools + +class id_printer: + """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_printer: + """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_printer: + + 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_printer: + + def __init__(self, state): + self.state = threads.state(state) + def to_string(self): + return self.state.to_string() + +class chains_printer: + + 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_printer: + 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()) \ No newline at end of file -- cgit v1.2.3