summaryrefslogtreecommitdiff
path: root/lldb/examples
diff options
context:
space:
mode:
authorTodd Fiala <todd.fiala@gmail.com>2015-10-22 00:23:38 +0000
committerTodd Fiala <todd.fiala@gmail.com>2015-10-22 00:23:38 +0000
commit0c00aa436c3a9e96e140533228178ed171a4164e (patch)
tree9c2df6f2d7d71f9239dd46deb7d2f5680eab7811 /lldb/examples
parentf561e16a48c789b13a1e701dccf25b29a6cb0679 (diff)
Fix libstdc++ data formatters on Ubuntu 15.10 x86_64
See http://reviews.llvm.org/D13964 for details.
Diffstat (limited to 'lldb/examples')
-rw-r--r--lldb/examples/synthetic/gnu_libstdcpp.py28
1 files changed, 21 insertions, 7 deletions
diff --git a/lldb/examples/synthetic/gnu_libstdcpp.py b/lldb/examples/synthetic/gnu_libstdcpp.py
index 8c11770899f..0daa95f36d0 100644
--- a/lldb/examples/synthetic/gnu_libstdcpp.py
+++ b/lldb/examples/synthetic/gnu_libstdcpp.py
@@ -13,7 +13,7 @@ class StdListSynthProvider:
logger = lldb.formatters.Logger.Logger()
self.valobj = valobj
self.count = None
- logger >> "Providing synthetic children for a map named " + str(valobj.GetName())
+ logger >> "Providing synthetic children for a list named " + str(valobj.GetName())
def next_node(self,node):
logger = lldb.formatters.Logger.Logger()
@@ -21,11 +21,20 @@ class StdListSynthProvider:
def is_valid(self,node):
logger = lldb.formatters.Logger.Logger()
- return self.value(self.next_node(node)) != self.node_address
+ valid = self.value(self.next_node(node)) != self.node_address
+ if valid:
+ logger >> "%s is valid" % str(self.valobj.GetName())
+ else:
+ logger >> "synthetic value is not valid"
+ return valid
def value(self,node):
logger = lldb.formatters.Logger.Logger()
- return node.GetValueAsUnsigned()
+ value = node.GetValueAsUnsigned()
+ logger >> "synthetic value for {}: {}".format(
+ str(self.valobj.GetName()),
+ value)
+ return value
# Floyd's cycle-finding algorithm
# try to detect if this list has a loop
@@ -49,7 +58,12 @@ class StdListSynthProvider:
def num_children(self):
logger = lldb.formatters.Logger.Logger()
- if self.count == None:
+ if self.count is None:
+ # libstdc++ 6.0.21 added dedicated count field.
+ count_child = self.node.GetChildMemberWithName('_M_data')
+ if count_child and count_child.IsValid():
+ self.count = count_child.GetValueAsUnsigned(0)
+ if self.count is None:
self.count = self.num_children_impl()
return self.count
@@ -117,10 +131,10 @@ class StdListSynthProvider:
self.count = None
try:
impl = self.valobj.GetChildMemberWithName('_M_impl')
- node = impl.GetChildMemberWithName('_M_node')
+ self.node = impl.GetChildMemberWithName('_M_node')
self.node_address = self.valobj.AddressOf().GetValueAsUnsigned(0)
- self.next = node.GetChildMemberWithName('_M_next')
- self.prev = node.GetChildMemberWithName('_M_prev')
+ self.next = self.node.GetChildMemberWithName('_M_next')
+ self.prev = self.node.GetChildMemberWithName('_M_prev')
self.data_type = self.extract_type()
self.data_size = self.data_type.GetByteSize()
except: