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