prettyprinters.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. def __init__(self, val):
  38. self.val = val
  39. def children(self):
  40. t = self.val.type.template_argument(0).pointer()
  41. begin = self.val['BeginX'].cast(t)
  42. end = self.val['EndX'].cast(t)
  43. return self._iterator(begin, end)
  44. def to_string(self):
  45. t = self.val.type.template_argument(0).pointer()
  46. begin = self.val['BeginX'].cast(t)
  47. end = self.val['EndX'].cast(t)
  48. capacity = self.val['CapacityX'].cast(t)
  49. return 'llvm::SmallVector of length %d, capacity %d' % (end - begin, capacity - begin)
  50. def display_hint (self):
  51. return 'array'
  52. class ArrayRefPrinter:
  53. """Print an llvm::ArrayRef object."""
  54. class _iterator:
  55. def __init__(self, begin, end):
  56. self.cur = begin
  57. self.end = end
  58. self.count = 0
  59. def __iter__(self):
  60. return self
  61. def next(self):
  62. if self.cur == self.end:
  63. raise StopIteration
  64. count = self.count
  65. self.count = self.count + 1
  66. cur = self.cur
  67. self.cur = self.cur + 1
  68. return '[%d]' % count, cur.dereference()
  69. def __init__(self, val):
  70. self.val = val
  71. def children(self):
  72. data = self.val['Data']
  73. return self._iterator(data, data + self.val['Length'])
  74. def to_string(self):
  75. return 'llvm::ArrayRef of length %d' % (self.val['Length'])
  76. def display_hint (self):
  77. return 'array'
  78. pp = gdb.printing.RegexpCollectionPrettyPrinter("LLVMSupport")
  79. pp.add_printer('llvm::SmallString', '^llvm::SmallString<.*>$', SmallStringPrinter)
  80. pp.add_printer('llvm::StringRef', '^llvm::StringRef$', StringRefPrinter)
  81. pp.add_printer('llvm::SmallVectorImpl', '^llvm::SmallVector(Impl)?<.*>$', SmallVectorPrinter)
  82. pp.add_printer('llvm::ArrayRef', '^llvm::(Const)?ArrayRef<.*>$', ArrayRefPrinter)
  83. gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)