]> git.lizzy.rs Git - rust.git/blob - src/etc/gdb_lookup.py
Add 'src/tools/rustfmt/' from commit '7872306edf2e11a69aaffb9434088fd66b46a863'
[rust.git] / src / etc / gdb_lookup.py
1 import gdb
2 import re
3
4 from gdb_providers import *
5 from rust_types import *
6
7
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 []
11
12 def register_printers(objfile):
13     objfile.pretty_printers.append(lookup)
14
15
16 # BACKCOMPAT: rust 1.35
17 def is_hashbrown_hashmap(hash_map):
18     return len(hash_map.type.fields()) == 1
19
20
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())
27
28     return RustType.OTHER
29
30
31 def check_enum_discriminant(valobj):
32     content = valobj[valobj.type.fields()[0]]
33     fields = content.type.fields()
34     if len(fields) > 1:
35         discriminant = int(content[fields[0]]) + 1
36         if discriminant > len(fields):
37             # invalid discriminant
38             return False
39     return True
40
41
42 def lookup(valobj):
43     rust_type = classify_rust_type(valobj.type)
44
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)
50
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)
57
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)
69         else:
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)
75         else:
76             return StdOldHashMapProvider(hash_map, show_values=False)
77
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)
82
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)
91
92     return None