Skip to content

Commit b88888f

Browse files
Add DebugInfoGenerator functions instead of obscene looking debug information directly
1 parent e804869 commit b88888f

1 file changed

Lines changed: 18 additions & 98 deletions

File tree

pythonbpf/maps/maps_pass.py

Lines changed: 18 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -55,53 +55,15 @@ def create_bpf_map(module, map_name, map_params):
5555

5656
def create_map_debug_info(module, map_global, map_name, map_params):
5757
"""Generate debug information metadata for BPF map"""
58-
file_metadata = module._file_metadata
59-
compile_unit = module._debug_compile_unit
60-
61-
# Create basic type for unsigned int (32-bit)
62-
uint_type = module.add_debug_info("DIBasicType", {
63-
"name": "unsigned int",
64-
"size": 32,
65-
"encoding": dc.DW_ATE_unsigned
66-
})
67-
68-
# Create basic type for unsigned long long (64-bit)
69-
ulong_type = module.add_debug_info("DIBasicType", {
70-
"name": "unsigned long long",
71-
"size": 64,
72-
"encoding": dc.DW_ATE_unsigned
73-
})
74-
75-
# Create array type for map type field (array of 1 unsigned int)
76-
array_subrange = module.add_debug_info(
77-
"DISubrange", {"count": map_params.get("type", BPFMapType.HASH).value})
78-
array_type = module.add_debug_info("DICompositeType", {
79-
"tag": dc.DW_TAG_array_type,
80-
"baseType": uint_type,
81-
"size": 32,
82-
"elements": [array_subrange]
83-
})
84-
85-
# Create pointer types
86-
type_ptr = module.add_debug_info("DIDerivedType", {
87-
"tag": dc.DW_TAG_pointer_type,
88-
"baseType": array_type,
89-
"size": 64
90-
})
91-
92-
key_ptr = module.add_debug_info("DIDerivedType", {
93-
"tag": dc.DW_TAG_pointer_type,
94-
# Adjust based on actual key type
95-
"baseType": array_type if "key_size" in map_params else uint_type,
96-
"size": 64
97-
})
98-
99-
value_ptr = module.add_debug_info("DIDerivedType", {
100-
"tag": dc.DW_TAG_pointer_type,
101-
# Adjust based on actual value type
102-
"baseType": array_type if "value_size" in map_params else ulong_type,
103-
"size": 64
104-
})
58+
generator = DebugInfoGenerator(module)
59+
60+
uint_type = generator.get_uint32_type()
61+
ulong_type = generator.get_uint64_type()
62+
array_type = generator.create_array_type(uint_type, map_params.get("type", BPFMapType.HASH).value)
63+
type_ptr = generator.create_pointer_type(array_type, 64)
64+
key_ptr = generator.create_pointer_type(array_type if "key_size" in map_params else ulong_type, 64)
65+
value_ptr = generator.create_pointer_type(array_type if "value_size" in map_params else ulong_type, 64)
66+
10567

10668
elements_arr = []
10769

@@ -117,69 +79,27 @@ def create_map_debug_info(module, map_global, map_name, map_params):
11779
ptr = key_ptr
11880
else:
11981
ptr = value_ptr
120-
member = module.add_debug_info("DIDerivedType", {
121-
"tag": dc.DW_TAG_member,
122-
"name": elem,
123-
"file": file_metadata,
124-
"baseType": ptr,
125-
"size": 64,
126-
"offset": cnt * 64
127-
})
82+
# TODO: the best way to do this is not 64, but get the size each time. this will not work for structs.
83+
member = generator.create_struct_member(elem, ptr, cnt * 64)
12884
elements_arr.append(member)
12985
cnt += 1
13086

13187
if "max_entries" in map_params:
132-
array_subrange_max_entries = module.add_debug_info(
133-
"DISubrange", {"count": map_params["max_entries"]})
134-
array_type_max_entries = module.add_debug_info("DICompositeType", {
135-
"tag": dc.DW_TAG_array_type,
136-
"baseType": uint_type,
137-
"size": 32,
138-
"elements": [array_subrange_max_entries]
139-
})
140-
max_entries_ptr = module.add_debug_info("DIDerivedType", {
141-
"tag": dc.DW_TAG_pointer_type,
142-
"baseType": array_type_max_entries,
143-
"size": 64
144-
})
145-
max_entries_member = module.add_debug_info("DIDerivedType", {
146-
"tag": dc.DW_TAG_member,
147-
"name": "max_entries",
148-
"file": file_metadata,
149-
"baseType": max_entries_ptr,
150-
"size": 64,
151-
"offset": cnt * 64
152-
})
88+
max_entries_array = generator.create_array_type(uint_type, map_params["max_entries"])
89+
max_entries_ptr = generator.create_pointer_type(max_entries_array, 64)
90+
max_entries_member = generator.create_struct_member("max_entries", max_entries_ptr, cnt * 64)
15391
elements_arr.append(max_entries_member)
15492

15593
# Create the struct type
156-
struct_type = module.add_debug_info("DICompositeType", {
157-
"tag": dc.DW_TAG_structure_type,
158-
"file": file_metadata,
159-
"size": 64 * len(elements_arr), # 4 * 64-bit pointers
160-
"elements": elements_arr,
161-
}, is_distinct=True)
94+
struct_type = generator.create_struct_type(elements_arr, 64 * len(elements_arr), is_distinct=True)
16295

16396
# Create global variable debug info
164-
global_var = module.add_debug_info("DIGlobalVariable", {
165-
"name": map_name,
166-
"scope": compile_unit,
167-
"file": file_metadata,
168-
"type": struct_type,
169-
"isLocal": False,
170-
"isDefinition": True
171-
}, is_distinct=True)
172-
173-
# Create global variable expression
174-
global_var_expr = module.add_debug_info("DIGlobalVariableExpression", {
175-
"var": global_var,
176-
"expr": module.add_debug_info("DIExpression", {})
177-
})
97+
global_var = generator.create_global_var_debug_info(map_name, struct_type, is_local=False)
17898

17999
# Attach debug info to the global variable
180-
map_global.set_metadata("dbg", global_var_expr)
100+
map_global.set_metadata("dbg", global_var)
181101

182-
return global_var_expr
102+
return global_var
183103

184104

185105
@MapProcessorRegistry.register("HashMap")

0 commit comments

Comments
 (0)