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