@@ -232,7 +232,7 @@ def handle_assign(
232
232
else :
233
233
logger .info ("Unsupported assignment call function type" )
234
234
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 )
236
236
else :
237
237
logger .info ("Unsupported assignment value type" )
238
238
@@ -384,24 +384,49 @@ def process_stmt(
384
384
)
385
385
elif isinstance (stmt , ast .Return ):
386
386
if stmt .value is None :
387
- builder .ret (ir .Constant (ir .IntType (32 ), 0 ))
387
+ builder .ret (ir .Constant (ir .IntType (64 ), 0 ))
388
388
did_return = True
389
389
elif (
390
390
isinstance (stmt .value , ast .Call )
391
391
and isinstance (stmt .value .func , ast .Name )
392
392
and len (stmt .value .args ) == 1
393
- and isinstance (stmt .value .args [0 ], ast .Constant )
394
- and isinstance (stmt .value .args [0 ].value , int )
395
393
):
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 ])
404
416
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" )
405
430
elif isinstance (stmt .value , ast .Name ):
406
431
if stmt .value .id == "XDP_PASS" :
407
432
builder .ret (ir .Constant (ret_type , 2 ))
@@ -454,6 +479,9 @@ def allocate_mem(
454
479
continue
455
480
var_name = target .id
456
481
rval = stmt .value
482
+ if var_name in local_sym_tab :
483
+ logger .info (f"Variable { var_name } already allocated" )
484
+ continue
457
485
if isinstance (rval , ast .Call ):
458
486
if isinstance (rval .func , ast .Name ):
459
487
call_type = rval .func .id
@@ -566,7 +594,7 @@ def process_func_body(
566
594
)
567
595
568
596
if not did_return :
569
- builder .ret (ir .Constant (ir .IntType (32 ), 0 ))
597
+ builder .ret (ir .Constant (ir .IntType (64 ), 0 ))
570
598
571
599
572
600
def process_bpf_chunk (func_node , module , return_type , map_sym_tab , structs_sym_tab ):
0 commit comments