11import logging
2+ from llvmlite import ir
23from pythonbpf .debuginfo import DebugInfoGenerator
34from .map_types import BPFMapType
45
89def create_map_debug_info (module , map_global , map_name , map_params , structs_sym_tab ):
910 """Generate debug info metadata for BPF maps HASH and PERF_EVENT_ARRAY"""
1011 generator = DebugInfoGenerator (module )
11-
12+ logger . info ( f"Creating debug info for map { map_name } with params { map_params } " )
1213 uint_type = generator .get_uint32_type ()
13- ulong_type = generator .get_uint64_type ()
1414 array_type = generator .create_array_type (
1515 uint_type , map_params .get ("type" , BPFMapType .UNSPEC ).value
1616 )
1717 type_ptr = generator .create_pointer_type (array_type , 64 )
1818 key_ptr = generator .create_pointer_type (
19- array_type if "key_size" in map_params else ulong_type , 64
19+ array_type
20+ if "key_size" in map_params
21+ else _get_key_val_dbg_type (map_params .get ("key" ), generator , structs_sym_tab ),
22+ 64 ,
2023 )
2124 value_ptr = generator .create_pointer_type (
22- array_type if "value_size" in map_params else ulong_type , 64
25+ array_type
26+ if "value_size" in map_params
27+ else _get_key_val_dbg_type (map_params .get ("value" ), generator , structs_sym_tab ),
28+ 64 ,
2329 )
2430
2531 elements_arr = []
@@ -104,6 +110,11 @@ def create_ringbuf_debug_info(
104110
105111def _get_key_val_dbg_type (name , generator , structs_sym_tab ):
106112 """Get the debug type for key/value based on type object"""
113+
114+ if not name :
115+ logger .warn ("No name provided for key/value type, defaulting to uint64" )
116+ return generator .get_uint64_type ()
117+
107118 type_obj = structs_sym_tab .get (name )
108119 if type_obj :
109120 return _get_struct_debug_type (type_obj , generator , structs_sym_tab )
@@ -120,4 +131,40 @@ def _get_key_val_dbg_type(name, generator, structs_sym_tab):
120131
121132
122133def _get_struct_debug_type (struct_obj , generator , structs_sym_tab ):
123- pass
134+ """Recursively create debug type for struct"""
135+ elements_arr = []
136+ for fld in struct_obj .fields .keys ():
137+ fld_type = struct_obj .field_type (fld )
138+ if isinstance (fld_type , ir .IntType ):
139+ if fld_type .width == 32 :
140+ fld_dbg_type = generator .get_uint32_type ()
141+ else :
142+ # NOTE: Assuming 64-bit for all other int types
143+ fld_dbg_type = generator .get_uint64_type ()
144+ elif isinstance (fld_type , ir .ArrayType ):
145+ # NOTE: Array types have u8 elements only for now
146+ # Debug info generation should fail for other types
147+ elem_type = fld_type .element
148+ if isinstance (elem_type , ir .IntType ) and elem_type .width == 8 :
149+ char_type = generator .get_uint8_type ()
150+ fld_dbg_type = generator .create_array_type (char_type , fld_type .count )
151+ else :
152+ logger .warning (
153+ f"Array element type { str (elem_type )} not supported for debug info, skipping"
154+ )
155+ continue
156+ else :
157+ # NOTE: Only handling int and char arrays for now
158+ logger .warning (
159+ f"Field type { str (fld_type )} not supported for debug info, skipping"
160+ )
161+ continue
162+
163+ member = generator .create_struct_member (
164+ fld , fld_dbg_type , struct_obj .field_size (fld )
165+ )
166+ elements_arr .append (member )
167+ struct_type = generator .create_struct_type (
168+ elements_arr , struct_obj .size , is_distinct = True
169+ )
170+ return struct_type
0 commit comments