@@ -55,53 +55,15 @@ def create_bpf_map(module, map_name, map_params):
5555
5656def 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