@@ -13,7 +13,7 @@ def bpf_ktime_get_ns_emitter(call, map_ptr, module, builder, func, local_sym_tab
1313 fn_ptr_type = ir .PointerType (fn_type )
1414 fn_ptr = builder .inttoptr (helper_id , fn_ptr_type )
1515 result = builder .call (fn_ptr , [], tail = False )
16- return result
16+ return result , ir . IntType ( 64 )
1717
1818
1919def bpf_map_lookup_elem_emitter (call , map_ptr , module , builder , func , local_sym_tab = None , struct_sym_tab = None , local_var_metadata = None ):
@@ -60,7 +60,7 @@ def bpf_map_lookup_elem_emitter(call, map_ptr, module, builder, func, local_sym_
6060
6161 result = builder .call (fn_ptr , [map_void_ptr , key_ptr ], tail = False )
6262
63- return result
63+ return result , ir . PointerType ()
6464
6565
6666def bpf_printk_emitter (call , map_ptr , module , builder , func , local_sym_tab = None , local_var_metadata = None ):
@@ -75,6 +75,7 @@ def bpf_printk_emitter(call, map_ptr, module, builder, func, local_sym_tab=None,
7575 exprs = []
7676
7777 for value in call .args [0 ].values :
78+ print ("Value in f-string:" , ast .dump (value ))
7879 if isinstance (value , ast .Constant ):
7980 if isinstance (value .value , str ):
8081 fmt_parts .append (value .value )
@@ -86,10 +87,24 @@ def bpf_printk_emitter(call, map_ptr, module, builder, func, local_sym_tab=None,
8687 "Only string and integer constants are supported in f-string." )
8788 elif isinstance (value , ast .FormattedValue ):
8889 print ("Formatted value:" , ast .dump (value ))
89- # Assume int for now
90- fmt_parts .append ("%lld" )
90+ # TODO: Dirty handling here, only checks for int or str
9191 if isinstance (value .value , ast .Name ):
92- exprs .append (value .value )
92+ if local_sym_tab and value .value .id in local_sym_tab :
93+ var_ptr , var_type = local_sym_tab [value .value .id ]
94+ if isinstance (var_type , ir .IntType ):
95+ fmt_parts .append ("%lld" )
96+ exprs .append (value .value )
97+ elif var_type == ir .PointerType (ir .IntType (8 )):
98+ # Case with string
99+ fmt_parts .append ("%s" )
100+ exprs .append (value .value )
101+ else :
102+ raise NotImplementedError (
103+ "Only integer and pointer types are supported in formatted values." )
104+ print ("Formatted value variable:" , var_ptr , var_type )
105+ else :
106+ raise ValueError (
107+ f"Variable { value .value .id } not found in local symbol table." )
93108 else :
94109 raise NotImplementedError (
95110 "Only simple variable names are supported in formatted values." )
@@ -121,7 +136,8 @@ def bpf_printk_emitter(call, map_ptr, module, builder, func, local_sym_tab=None,
121136 "Warning: bpf_printk supports up to 3 arguments, extra arguments will be ignored." )
122137
123138 for expr in exprs [:3 ]:
124- val = eval_expr (func , module , builder , expr , local_sym_tab , None )
139+ val , _ = eval_expr (func , module , builder ,
140+ expr , local_sym_tab , None )
125141 if val :
126142 if isinstance (val .type , ir .PointerType ):
127143 val = builder .ptrtoint (val , ir .IntType (64 ))
@@ -137,7 +153,6 @@ def bpf_printk_emitter(call, map_ptr, module, builder, func, local_sym_tab=None,
137153 print (
138154 "Warning: Failed to evaluate expression for bpf_printk argument. It will be converted to 0." )
139155 args .append (ir .Constant (ir .IntType (64 ), 0 ))
140-
141156 fn_type = ir .FunctionType (ir .IntType (
142157 64 ), [ir .PointerType (), ir .IntType (32 )], var_arg = True )
143158 fn_ptr_type = ir .PointerType (fn_type )
@@ -266,7 +281,7 @@ def bpf_map_update_elem_emitter(call, map_ptr, module, builder, func, local_sym_
266281 result = builder .call (
267282 fn_ptr , [map_void_ptr , key_ptr , value_ptr , flags_const ], tail = False )
268283
269- return result
284+ return result , None
270285
271286
272287def bpf_map_delete_elem_emitter (call , map_ptr , module , builder , func , local_sym_tab = None , struct_sym_tab = None , local_var_metadata = None ):
@@ -321,7 +336,7 @@ def bpf_map_delete_elem_emitter(call, map_ptr, module, builder, func, local_sym_
321336 # Call the helper function
322337 result = builder .call (fn_ptr , [map_void_ptr , key_ptr ], tail = False )
323338
324- return result
339+ return result , None
325340
326341
327342def bpf_get_current_pid_tgid_emitter (call , map_ptr , module , builder , func , local_sym_tab = None , local_var_metadata = None ):
@@ -338,7 +353,7 @@ def bpf_get_current_pid_tgid_emitter(call, map_ptr, module, builder, func, local
338353 # Extract the lower 32 bits (PID) using bitwise AND with 0xFFFFFFFF
339354 mask = ir .Constant (ir .IntType (64 ), 0xFFFFFFFF )
340355 pid = builder .and_ (result , mask )
341- return pid
356+ return pid , ir . IntType ( 64 )
342357
343358
344359def bpf_perf_event_output_handler (call , map_ptr , module , builder , func , local_sym_tab = None , struct_sym_tab = None , local_var_metadata = None ):
@@ -387,7 +402,7 @@ def bpf_perf_event_output_handler(call, map_ptr, module, builder, func, local_sy
387402
388403 result = builder .call (
389404 fn_ptr , [ctx_ptr , map_void_ptr , flags_val , data_void_ptr , size_val ], tail = False )
390- return result
405+ return result , None
391406 else :
392407 raise NotImplementedError (
393408 "Only simple object names are supported as data in perf event output." )
0 commit comments