[rtems-tools commit] Add printers to stage.

Chris Johns chrisj at rtems.org
Sun Aug 24 23:45:33 UTC 2014


Module:    rtems-tools
Branch:    master
Commit:    a785e254f2360e946baa14a11fbd3f403047b880
Changeset: http://git.rtems.org/rtems-tools/commit/?id=a785e254f2360e946baa14a11fbd3f403047b880

Author:    Dhananjay Balan <mb.dhananjay at gmail.com>
Date:      Fri Jul 12 19:25:46 2013 +0530

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(+), 0 deletions(-)

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



More information about the vc mailing list