diff options
author | David Blaikie <dblaikie@gmail.com> | 2016-06-01 01:02:32 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2016-06-01 01:02:32 +0000 |
commit | 09ec5756dc7d92c3a2f91313736c157bf3ffd848 (patch) | |
tree | 680ef5e25c0ca4dc65f99fe122509ea2bb4e8b82 /llvm/utils/gdb-scripts | |
parent | 5d06439c54a6d85fc518df159c40bf8dc5210a6a (diff) | |
download | bcm5719-llvm-09ec5756dc7d92c3a2f91313736c157bf3ffd848.tar.gz bcm5719-llvm-09ec5756dc7d92c3a2f91313736c157bf3ffd848.zip |
Reference gdb python type printer scripts from SmallString, SmallVector, ArrayRef, and StringRef
llvm-svn: 271357
Diffstat (limited to 'llvm/utils/gdb-scripts')
-rw-r--r-- | llvm/utils/gdb-scripts/prettyprinters.py | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/llvm/utils/gdb-scripts/prettyprinters.py b/llvm/utils/gdb-scripts/prettyprinters.py new file mode 100644 index 00000000000..0dbc7af3e46 --- /dev/null +++ b/llvm/utils/gdb-scripts/prettyprinters.py @@ -0,0 +1,107 @@ +import gdb.printing +class SmallStringPrinter: + """Print an llvm::SmallString object.""" + + def __init__(self, val): + self.val = val + + def to_string(self): + begin = self.val['BeginX'] + end = self.val['EndX'] + return begin.cast(gdb.lookup_type("char").pointer()).string(length = end - begin) + + def display_hint (self): + return 'string' + +class StringRefPrinter: + """Print an llvm::StringRef object.""" + + def __init__(self, val): + self.val = val + + def to_string(self): + return self.val['Data'].string(length = self.val['Length']) + + def display_hint (self): + return 'string' + +class SmallVectorPrinter: + """Print an llvm::SmallVector object.""" + + class _iterator: + def __init__(self, begin, end): + self.cur = begin + self.end = end + self.count = 0 + + def __iter__(self): + return self + + def next(self): + if self.cur == self.end: + raise StopIteration + count = self.count + self.count = self.count + 1 + cur = self.cur + self.cur = self.cur + 1 + return '[%d]' % count, cur.dereference() + + def __init__(self, val): + self.val = val + + def children(self): + t = self.val.type.template_argument(0).pointer() + begin = self.val['BeginX'].cast(t) + end = self.val['EndX'].cast(t) + return self._iterator(begin, end) + + def to_string(self): + t = self.val.type.template_argument(0).pointer() + begin = self.val['BeginX'].cast(t) + end = self.val['EndX'].cast(t) + capacity = self.val['CapacityX'].cast(t) + return 'llvm::SmallVector of length %d, capacity %d' % (end - begin, capacity - begin) + + def display_hint (self): + return 'array' + +class ArrayRefPrinter: + """Print an llvm::ArrayRef object.""" + + class _iterator: + def __init__(self, begin, end): + self.cur = begin + self.end = end + self.count = 0 + + def __iter__(self): + return self + + def next(self): + if self.cur == self.end: + raise StopIteration + count = self.count + self.count = self.count + 1 + cur = self.cur + self.cur = self.cur + 1 + return '[%d]' % count, cur.dereference() + + def __init__(self, val): + self.val = val + + def children(self): + data = self.val['Data'] + return self._iterator(data, data + self.val['Length']) + + def to_string(self): + return 'llvm::ArrayRef of length %d' % (self.val['Length']) + + def display_hint (self): + return 'array' + +pp = gdb.printing.RegexpCollectionPrettyPrinter("LLVMSupport") +pp.add_printer('llvm::SmallString', '^llvm::SmallString<.*>$', SmallStringPrinter) +pp.add_printer('llvm::StringRef', '^llvm::StringRef$', StringRefPrinter) +pp.add_printer('llvm::SmallVectorImpl', '^llvm::SmallVector(Impl)?<.*>$', SmallVectorPrinter) +pp.add_printer('llvm::ArrayRef', '^llvm::(Const)?ArrayRef<.*>$', ArrayRefPrinter) +gdb.printing.register_pretty_printer(gdb.current_objfile(), pp) |