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>