xref: /aosp_15_r20/prebuilts/rust/linux-x86/1.80.1/lib/rustlib/etc/lldb_lookup.py (revision b40554a23088fb75aa6945dfe8e65169c8484da3)
1import lldb
2
3from lldb_providers import *
4from rust_types import RustType, classify_struct, classify_union
5
6
7# BACKCOMPAT: rust 1.35
8def is_hashbrown_hashmap(hash_map):
9    return len(hash_map.type.fields) == 1
10
11
12def classify_rust_type(type):
13    type_class = type.GetTypeClass()
14    if type_class == lldb.eTypeClassStruct:
15        return classify_struct(type.name, type.fields)
16    if type_class == lldb.eTypeClassUnion:
17        return classify_union(type.fields)
18
19    return RustType.OTHER
20
21
22def summary_lookup(valobj, dict):
23    # type: (SBValue, dict) -> str
24    """Returns the summary provider for the given value"""
25    rust_type = classify_rust_type(valobj.GetType())
26
27    if rust_type == RustType.STD_STRING:
28        return StdStringSummaryProvider(valobj, dict)
29    if rust_type == RustType.STD_OS_STRING:
30        return StdOsStringSummaryProvider(valobj, dict)
31    if rust_type == RustType.STD_STR:
32        return StdStrSummaryProvider(valobj, dict)
33
34    if rust_type == RustType.STD_VEC:
35        return SizeSummaryProvider(valobj, dict)
36    if rust_type == RustType.STD_VEC_DEQUE:
37        return SizeSummaryProvider(valobj, dict)
38    if rust_type == RustType.STD_SLICE:
39        return SizeSummaryProvider(valobj, dict)
40
41    if rust_type == RustType.STD_HASH_MAP:
42        return SizeSummaryProvider(valobj, dict)
43    if rust_type == RustType.STD_HASH_SET:
44        return SizeSummaryProvider(valobj, dict)
45
46    if rust_type == RustType.STD_RC:
47        return StdRcSummaryProvider(valobj, dict)
48    if rust_type == RustType.STD_ARC:
49        return StdRcSummaryProvider(valobj, dict)
50
51    if rust_type == RustType.STD_REF:
52        return StdRefSummaryProvider(valobj, dict)
53    if rust_type == RustType.STD_REF_MUT:
54        return StdRefSummaryProvider(valobj, dict)
55    if rust_type == RustType.STD_REF_CELL:
56        return StdRefSummaryProvider(valobj, dict)
57
58    if rust_type == RustType.STD_NONZERO_NUMBER:
59        return StdNonZeroNumberSummaryProvider(valobj, dict)
60
61    if rust_type == RustType.STD_PATHBUF:
62        return StdPathBufSummaryProvider(valobj, dict)
63    if rust_type == RustType.STD_PATH:
64        return StdPathSummaryProvider(valobj, dict)
65
66    return ""
67
68
69def synthetic_lookup(valobj, dict):
70    # type: (SBValue, dict) -> object
71    """Returns the synthetic provider for the given value"""
72    rust_type = classify_rust_type(valobj.GetType())
73
74    if rust_type == RustType.STRUCT:
75        return StructSyntheticProvider(valobj, dict)
76    if rust_type == RustType.STRUCT_VARIANT:
77        return StructSyntheticProvider(valobj, dict, is_variant=True)
78    if rust_type == RustType.TUPLE:
79        return TupleSyntheticProvider(valobj, dict)
80    if rust_type == RustType.TUPLE_VARIANT:
81        return TupleSyntheticProvider(valobj, dict, is_variant=True)
82    if rust_type == RustType.EMPTY:
83        return EmptySyntheticProvider(valobj, dict)
84    if rust_type == RustType.REGULAR_ENUM:
85        discriminant = valobj.GetChildAtIndex(0).GetChildAtIndex(0).GetValueAsUnsigned()
86        return synthetic_lookup(valobj.GetChildAtIndex(discriminant), dict)
87    if rust_type == RustType.SINGLETON_ENUM:
88        return synthetic_lookup(valobj.GetChildAtIndex(0), dict)
89    if rust_type == RustType.ENUM:
90        return ClangEncodedEnumProvider(valobj, dict)
91    if rust_type == RustType.STD_VEC:
92        return StdVecSyntheticProvider(valobj, dict)
93    if rust_type == RustType.STD_VEC_DEQUE:
94        return StdVecDequeSyntheticProvider(valobj, dict)
95    if rust_type == RustType.STD_SLICE or rust_type == RustType.STD_STR:
96        return StdSliceSyntheticProvider(valobj, dict)
97
98    if rust_type == RustType.STD_HASH_MAP:
99        if is_hashbrown_hashmap(valobj):
100            return StdHashMapSyntheticProvider(valobj, dict)
101        else:
102            return StdOldHashMapSyntheticProvider(valobj, dict)
103    if rust_type == RustType.STD_HASH_SET:
104        hash_map = valobj.GetChildAtIndex(0)
105        if is_hashbrown_hashmap(hash_map):
106            return StdHashMapSyntheticProvider(valobj, dict, show_values=False)
107        else:
108            return StdOldHashMapSyntheticProvider(hash_map, dict, show_values=False)
109
110    if rust_type == RustType.STD_RC:
111        return StdRcSyntheticProvider(valobj, dict)
112    if rust_type == RustType.STD_ARC:
113        return StdRcSyntheticProvider(valobj, dict, is_atomic=True)
114
115    if rust_type == RustType.STD_CELL:
116        return StdCellSyntheticProvider(valobj, dict)
117    if rust_type == RustType.STD_REF:
118        return StdRefSyntheticProvider(valobj, dict)
119    if rust_type == RustType.STD_REF_MUT:
120        return StdRefSyntheticProvider(valobj, dict)
121    if rust_type == RustType.STD_REF_CELL:
122        return StdRefSyntheticProvider(valobj, dict, is_cell=True)
123
124    return DefaultSyntheticProvider(valobj, dict)
125