Annotation of embedaddon/bird2/bird-gdb.py, revision 1.1
1.1 ! misho 1: class BIRDPrinter:
! 2: def __init__(self, val):
! 3: self.val = val
! 4:
! 5: @classmethod
! 6: def lookup(cls, val):
! 7: if val.type.code != cls.typeCode:
! 8: return None
! 9: if val.type.tag != cls.typeTag:
! 10: return None
! 11:
! 12: return cls(val)
! 13:
! 14:
! 15: class BIRDFValPrinter(BIRDPrinter):
! 16: "Print BIRD\s struct f_val"
! 17: typeCode = gdb.TYPE_CODE_STRUCT
! 18: typeTag = "f_val"
! 19:
! 20: codemap = {
! 21: "T_INT": "i",
! 22: "T_BOOL": "i",
! 23: "T_PAIR": "i",
! 24: "T_QUAD": "i",
! 25: "T_ENUM_RTS": "i",
! 26: "T_ENUM_BGP_ORIGIN": "i",
! 27: "T_ENUM_SCOPE": "i",
! 28: "T_ENUM_RTC": "i",
! 29: "T_ENUM_RTD": "i",
! 30: "T_ENUM_ROA": "i",
! 31: "T_ENUM_NETTYPE": "i",
! 32: "T_ENUM_RA_PREFERENCE": "i",
! 33: "T_IP": "ip",
! 34: "T_NET": "net",
! 35: "T_STRING": "s",
! 36: "T_PATH_MASK": "path_mask",
! 37: "T_PATH": "ad",
! 38: "T_CLIST": "ad",
! 39: "T_EC": "ec",
! 40: "T_ECLIST": "ad",
! 41: "T_LC": "lc",
! 42: "T_LCLIST": "ad",
! 43: "T_RD": "ec",
! 44: "T_PATH_MASK_ITEM": "pmi",
! 45: "T_SET": "t",
! 46: "T_PREFIX_SET": "ti",
! 47: }
! 48:
! 49: def to_string(self):
! 50: code = self.val['type']
! 51: if code.type.code != gdb.TYPE_CODE_ENUM or code.type.tag != "f_type":
! 52: raise Exception("Strange 'type' element in f_val")
! 53:
! 54: if str(code) == "T_VOID":
! 55: return "T_VOID"
! 56: else:
! 57: return "(%(c)s) %(v)s" % { "c": code, "v": self.val['val'][self.codemap[str(code)]] }
! 58:
! 59: def display_hint(self):
! 60: return "map"
! 61:
! 62: class BIRDFValStackPrinter(BIRDPrinter):
! 63: "Print BIRD's struct f_val_stack"
! 64: typeCode = gdb.TYPE_CODE_STRUCT
! 65: typeTag = "f_val_stack"
! 66:
! 67: def to_string(self):
! 68: cnt = self.val['cnt']
! 69: return ("Value stack (%(cnt)d):\n\t" % { "cnt": cnt }) + \
! 70: "\n\t".join([ (".val[%(n) 3d] = " % { "n": n}) + str(self.val['val'][n]) for n in range(cnt-1, -1, -1) ])
! 71:
! 72: def display_hint(self):
! 73: return "map"
! 74:
! 75: class BIRDFInstPrinter(BIRDPrinter):
! 76: "Print BIRD's struct f_inst"
! 77: typeCode = gdb.TYPE_CODE_STRUCT
! 78: typeTag = "f_inst"
! 79:
! 80: def to_string(self):
! 81: code = self.val['fi_code']
! 82: if str(code) == "FI_NOP":
! 83: return str(code) + ": " + str(self.val.cast(gdb.lookup_type("const char [%(siz)d]" % { "siz": self.val.type.sizeof })))
! 84: return "%(code)s:\t%(lineno) 6dL\t%(size)6dS\tnext = %(next)s: .i_%(code)s = %(union)s" % {
! 85: "code": str(code),
! 86: "lineno": self.val['lineno'],
! 87: "size": self.val['size'],
! 88: "next": str(self.val['next']),
! 89: "union": str(self.val['i_' + str(code)])
! 90: }
! 91:
! 92: # def children(self): # children iterator
! 93: def display_hint(self):
! 94: return "map"
! 95:
! 96: class BIRDFLineItemPrinter(BIRDPrinter):
! 97: "Print BIRD's struct f_line_item"
! 98: typeCode = gdb.TYPE_CODE_STRUCT
! 99: typeTag = "f_line_item"
! 100:
! 101: def to_string(self):
! 102: code = self.val['fi_code']
! 103: if str(code) == "FI_NOP":
! 104: return str(code) + ": " + str(self.val.cast(gdb.lookup_type("const char [%(siz)d]" % { "siz": self.val.type.sizeof })))
! 105: return "%(code)s:\t%(lineno) 6dL\t%(flags)2dF: .i_%(code)s = %(union)s" % {
! 106: "code": str(code),
! 107: "lineno": self.val['lineno'],
! 108: "flags": self.val['flags'],
! 109: "union": str(self.val['i_' + str(code)])
! 110: }
! 111:
! 112: class BIRDFLinePrinter(BIRDPrinter):
! 113: "Print BIRD's struct f_line"
! 114: typeCode = gdb.TYPE_CODE_STRUCT
! 115: typeTag = "f_line"
! 116:
! 117: def to_string(self):
! 118: cnt = self.val['len']
! 119: return ("FLine (%(cnt)d, args=%(args)d): " % { "cnt": cnt, "args" : self.val['args'] } + \
! 120: ", ".join([
! 121: ".items[%(n) 3d] = %(code)s" % {
! 122: "n": n,
! 123: "code": str(self.val['items'][n]['fi_code']),
! 124: } if n % 8 == 0 else str(self.val['items'][n]['fi_code']) for n in range(cnt)]))
! 125:
! 126:
! 127: class BIRDFExecStackPrinter(BIRDPrinter):
! 128: "Print BIRD's struct f_exec_stack"
! 129: typeCode = gdb.TYPE_CODE_STRUCT
! 130: typeTag = "f_exec_stack"
! 131:
! 132: def to_string(self):
! 133: cnt = self.val['cnt']
! 134: return ("Exec stack (%(cnt)d):\n\t" % { "cnt": cnt }) + \
! 135: "\n\t".join([ ".item[%(n) 3d] = %(retflag)d V%(ventry) 3d P%(pos) 4d %(line)s" % {
! 136: "retflag": self.val['item'][n]['emask'],
! 137: "ventry": self.val['item'][n]['ventry'],
! 138: "pos": self.val['item'][n]['pos'],
! 139: "line": str(self.val['item'][n]['line'].dereference()),
! 140: "n": n
! 141: } for n in range(cnt-1, -1, -1) ])
! 142:
! 143: def register_printers(objfile):
! 144: objfile.pretty_printers.append(BIRDFInstPrinter.lookup)
! 145: objfile.pretty_printers.append(BIRDFValPrinter.lookup)
! 146: objfile.pretty_printers.append(BIRDFValStackPrinter.lookup)
! 147: objfile.pretty_printers.append(BIRDFLineItemPrinter.lookup)
! 148: objfile.pretty_printers.append(BIRDFLinePrinter.lookup)
! 149: objfile.pretty_printers.append(BIRDFExecStackPrinter.lookup)
! 150:
! 151: register_printers(gdb.current_objfile())
! 152:
! 153: print("BIRD pretty printers loaded OK.")
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>