@@ -232,7 +232,7 @@ def handle_assign(
232232 else :
233233 logger .info ("Unsupported assignment call function type" )
234234 elif isinstance (rval , ast .BinOp ):
235- handle_binary_op (rval , module , builder , var_name , local_sym_tab )
235+ handle_binary_op (rval , builder , var_name , local_sym_tab )
236236 else :
237237 logger .info ("Unsupported assignment value type" )
238238
@@ -384,24 +384,49 @@ def process_stmt(
384384 )
385385 elif isinstance (stmt , ast .Return ):
386386 if stmt .value is None :
387- builder .ret (ir .Constant (ir .IntType (32 ), 0 ))
387+ builder .ret (ir .Constant (ir .IntType (64 ), 0 ))
388388 did_return = True
389389 elif (
390390 isinstance (stmt .value , ast .Call )
391391 and isinstance (stmt .value .func , ast .Name )
392392 and len (stmt .value .args ) == 1
393- and isinstance (stmt .value .args [0 ], ast .Constant )
394- and isinstance (stmt .value .args [0 ].value , int )
395393 ):
396- call_type = stmt .value .func .id
397- if ctypes_to_ir (call_type ) != ret_type :
398- raise ValueError (
399- "Return type mismatch: expected"
400- f"{ ctypes_to_ir (call_type )} , got { call_type } "
401- )
402- else :
403- builder .ret (ir .Constant (ret_type , stmt .value .args [0 ].value ))
394+ if isinstance (stmt .value .args [0 ], ast .Constant ) and isinstance (
395+ stmt .value .args [0 ].value , int
396+ ):
397+ call_type = stmt .value .func .id
398+ if ctypes_to_ir (call_type ) != ret_type :
399+ raise ValueError (
400+ "Return type mismatch: expected"
401+ f"{ ctypes_to_ir (call_type )} , got { call_type } "
402+ )
403+ else :
404+ builder .ret (ir .Constant (ret_type , stmt .value .args [0 ].value ))
405+ did_return = True
406+ elif isinstance (stmt .value .args [0 ], ast .BinOp ):
407+ # TODO: Should be routed through eval_expr
408+ val = handle_binary_op (stmt .value .args [0 ], builder , None , local_sym_tab )
409+ if val is None :
410+ raise ValueError ("Failed to evaluate return expression" )
411+ if val [1 ] != ret_type :
412+ raise ValueError (
413+ "Return type mismatch: expected " f"{ ret_type } , got { val [1 ]} "
414+ )
415+ builder .ret (val [0 ])
404416 did_return = True
417+ elif isinstance (stmt .value .args [0 ], ast .Name ):
418+ if stmt .value .args [0 ].id in local_sym_tab :
419+ var = local_sym_tab [stmt .value .args [0 ].id ].var
420+ val = builder .load (var )
421+ if val .type != ret_type :
422+ raise ValueError (
423+ "Return type mismatch: expected"
424+ f"{ ret_type } , got { val .type } "
425+ )
426+ builder .ret (val )
427+ did_return = True
428+ else :
429+ raise ValueError ("Failed to evaluate return expression" )
405430 elif isinstance (stmt .value , ast .Name ):
406431 if stmt .value .id == "XDP_PASS" :
407432 builder .ret (ir .Constant (ret_type , 2 ))
@@ -454,6 +479,9 @@ def allocate_mem(
454479 continue
455480 var_name = target .id
456481 rval = stmt .value
482+ if var_name in local_sym_tab :
483+ logger .info (f"Variable { var_name } already allocated" )
484+ continue
457485 if isinstance (rval , ast .Call ):
458486 if isinstance (rval .func , ast .Name ):
459487 call_type = rval .func .id
@@ -566,7 +594,7 @@ def process_func_body(
566594 )
567595
568596 if not did_return :
569- builder .ret (ir .Constant (ir .IntType (32 ), 0 ))
597+ builder .ret (ir .Constant (ir .IntType (64 ), 0 ))
570598
571599
572600def process_bpf_chunk (func_node , module , return_type , map_sym_tab , structs_sym_tab ):
0 commit comments