4 from gdb_providers import *
5 from rust_types import *
8 rust_enabled = 'set language rust' in gdb.execute('complete set language ru', to_string=True)
9 _gdb_version_matched = re.search('([0-9]+)\\.([0-9]+)', gdb.VERSION)
10 gdb_version = [int(num) for num in _gdb_version_matched.groups()] if _gdb_version_matched else []
12 def register_printers(objfile):
13 objfile.pretty_printers.append(lookup)
16 # BACKCOMPAT: rust 1.35
17 def is_hashbrown_hashmap(hash_map):
18 return len(hash_map.type.fields()) == 1
21 def classify_rust_type(type):
22 type_class = type.code
23 if type_class == gdb.TYPE_CODE_STRUCT:
24 return classify_struct(type.tag, type.fields())
25 if type_class == gdb.TYPE_CODE_UNION:
26 return classify_union(type.fields())
31 def check_enum_discriminant(valobj):
32 content = valobj[valobj.type.fields()[0]]
33 fields = content.type.fields()
35 discriminant = int(content[fields[0]]) + 1
36 if discriminant > len(fields):
37 # invalid discriminant
43 rust_type = classify_rust_type(valobj.type)
45 if rust_type == RustType.ENUM:
46 # use enum provider only for GDB <7.12
47 if gdb_version[0] < 7 or (gdb_version[0] == 7 and gdb_version[1] < 12):
48 if check_enum_discriminant(valobj):
49 return EnumProvider(valobj)
51 if rust_type == RustType.STD_STRING:
52 return StdStringProvider(valobj)
53 if rust_type == RustType.STD_OS_STRING:
54 return StdOsStringProvider(valobj)
55 if rust_type == RustType.STD_STR and not rust_enabled:
56 return StdStrProvider(valobj)
58 if rust_type == RustType.STD_VEC:
59 return StdVecProvider(valobj)
60 if rust_type == RustType.STD_VEC_DEQUE:
61 return StdVecDequeProvider(valobj)
62 if rust_type == RustType.STD_BTREE_SET:
63 return StdBTreeSetProvider(valobj)
64 if rust_type == RustType.STD_BTREE_MAP:
65 return StdBTreeMapProvider(valobj)
66 if rust_type == RustType.STD_HASH_MAP:
67 if is_hashbrown_hashmap(valobj):
68 return StdHashMapProvider(valobj)
70 return StdOldHashMapProvider(valobj)
71 if rust_type == RustType.STD_HASH_SET:
72 hash_map = valobj[valobj.type.fields()[0]]
73 if is_hashbrown_hashmap(hash_map):
74 return StdHashMapProvider(valobj, show_values=False)
76 return StdOldHashMapProvider(hash_map, show_values=False)
78 if rust_type == RustType.STD_RC:
79 return StdRcProvider(valobj)
80 if rust_type == RustType.STD_ARC:
81 return StdRcProvider(valobj, is_atomic=True)
83 if rust_type == RustType.STD_CELL:
84 return StdCellProvider(valobj)
85 if rust_type == RustType.STD_REF:
86 return StdRefProvider(valobj)
87 if rust_type == RustType.STD_REF_MUT:
88 return StdRefProvider(valobj)
89 if rust_type == RustType.STD_REF_CELL:
90 return StdRefCellProvider(valobj)