prettyprinters.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import gdb.printing
  2. class SmallStringPrinter:
  3. """Print an llvm::SmallString object."""
  4. def __init__(self, val):
  5. self.val = val
  6. def to_string(self):
  7. begin = self.val['BeginX']
  8. end = self.val['EndX']
  9. return begin.cast(gdb.lookup_type("char").pointer()).string(length = end - begin)
  10. def display_hint (self):
  11. return 'string'
  12. class StringRefPrinter:
  13. """Print an llvm::StringRef object."""
  14. def __init__(self, val):
  15. self.val = val
  16. def to_string(self):
  17. return self.val['Data'].string(length = self.val['Length'])
  18. def display_hint (self):
  19. return 'string'
  20. class SmallVectorPrinter:
  21. """Print an llvm::SmallVector object."""
  22. class _iterator:
  23. def __init__(self, begin, end):
  24. self.cur = begin
  25. self.end = end
  26. self.count = 0
  27. def __iter__(self):
  28. return self
  29. def next(self):
  30. if self.cur == self.end:
  31. raise StopIteration
  32. count = self.count
  33. self.count = self.count + 1
  34. cur = self.cur
  35. self.cur = self.cur + 1
  36. return '[%d]' % count, cur.dereference()
  37. __next__ = next
  38. def __init__(self, val):
  39. self.val = val
  40. def children(self):
  41. t = self.val.type.template_argument(0).pointer()
  42. begin = self.val['BeginX'].cast(t)
  43. end = self.val['EndX'].cast(t)
  44. return self._iterator(begin, end)
  45. def to_string(self):
  46. t = self.val.type.template_argument(0).pointer()
  47. begin = self.val['BeginX'].cast(t)
  48. end = self.val['EndX'].cast(t)
  49. capacity = self.val['CapacityX'].cast(t)
  50. return 'llvm::SmallVector of length %d, capacity %d' % (end - begin, capacity - begin)
  51. def display_hint (self):
  52. return 'array'
  53. class ArrayRefPrinter:
  54. """Print an llvm::ArrayRef object."""
  55. class _iterator:
  56. def __init__(self, begin, end):
  57. self.cur = begin
  58. self.end = end
  59. self.count = 0
  60. def __iter__(self):
  61. return self
  62. def next(self):
  63. if self.cur == self.end:
  64. raise StopIteration
  65. count = self.count
  66. self.count = self.count + 1
  67. cur = self.cur
  68. self.cur = self.cur + 1
  69. return '[%d]' % count, cur.dereference()
  70. __next__ = next
  71. def __init__(self, val):
  72. self.val = val
  73. def children(self):
  74. data = self.val['Data']
  75. return self._iterator(data, data + self.val['Length'])
  76. def to_string(self):
  77. return 'llvm::ArrayRef of length %d' % (self.val['Length'])
  78. def display_hint (self):
  79. return 'array'
  80. class OptionalPrinter:
  81. """Print an llvm::Optional object."""
  82. def __init__(self, value):
  83. self.value = value
  84. class _iterator:
  85. def __init__(self, member, empty):
  86. self.member = member
  87. self.done = empty
  88. def __iter__(self):
  89. return self
  90. def next(self):
  91. if self.done:
  92. raise StopIteration
  93. self.done = True
  94. return ('value', self.member.dereference())
  95. def children(self):
  96. if not self.value['hasVal']:
  97. return self._iterator('', True)
  98. return self._iterator(self.value['storage']['buffer'].address.cast(self.value.type.template_argument(0).pointer()), False)
  99. def to_string(self):
  100. return 'llvm::Optional is %sinitialized' % ('' if self.value['hasVal'] else 'not ')
  101. pp = gdb.printing.RegexpCollectionPrettyPrinter("LLVMSupport")
  102. pp.add_printer('llvm::SmallString', '^llvm::SmallString<.*>$', SmallStringPrinter)
  103. pp.add_printer('llvm::StringRef', '^llvm::StringRef$', StringRefPrinter)
  104. pp.add_printer('llvm::SmallVectorImpl', '^llvm::SmallVector(Impl)?<.*>$', SmallVectorPrinter)
  105. pp.add_printer('llvm::ArrayRef', '^llvm::(Const)?ArrayRef<.*>$', ArrayRefPrinter)
  106. pp.add_printer('llvm::Optional', '^llvm::Optional<.*>$', OptionalPrinter)
  107. gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)