summaryrefslogtreecommitdiff
path: root/tools/gdb/python/supercore_printer.py
diff options
context:
space:
mode:
authorDhananjay Balan <mb.dhananjay@gmail.com>2013-07-12 19:07:46 +0530
committerChris Johns <chrisj@rtems.org>2014-08-25 09:52:40 +1000
commita785e254f2360e946baa14a11fbd3f403047b880 (patch)
treeb8ce0a76ca0340225d2b58f826ad9e2595cdcdba /tools/gdb/python/supercore_printer.py
parentb061a67742d58bedaa161970c5cae028aa440e1f (diff)
Add printers to stage.
Diffstat (limited to '')
-rw-r--r--tools/gdb/python/supercore_printer.py140
1 files changed, 140 insertions, 0 deletions
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