Skip to content

Commit 3ad1b73

Browse files
committed
Add handle_struct_field_assignment to assign_pass
1 parent 105c5a7 commit 3ad1b73

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

pythonbpf/assign_pass.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,46 @@
66
logger = logging.getLogger(__name__)
77

88

9+
def handle_struct_field_assignment(
10+
func, module, builder, target, rval, local_sym_tab, structs_sym_tab
11+
):
12+
"""Handle struct field assignment (obj.field = value)."""
13+
14+
var_name = target.value.id
15+
field_name = target.attr
16+
17+
if var_name not in local_sym_tab:
18+
logger.error(f"Variable '{var_name}' not found in symbol table")
19+
return
20+
21+
struct_type = local_sym_tab[var_name].metadata
22+
struct_info = structs_sym_tab[struct_type]
23+
24+
if field_name not in struct_info.fields:
25+
logger.error(f"Field '{field_name}' not found in struct '{struct_type}'")
26+
return
27+
28+
# Get field pointer and evaluate value
29+
field_ptr = struct_info.gep(builder, local_sym_tab[var_name].var, field_name)
30+
val = eval_expr(func, module, builder, rval, local_sym_tab, None, structs_sym_tab)
31+
32+
if val is None:
33+
logger.error(f"Failed to evaluate value for {var_name}.{field_name}")
34+
return
35+
36+
# TODO: Handle string assignment to char array (not a priority)
37+
field_type = struct_info.field_type(field_name)
38+
if isinstance(field_type, ir.ArrayType) and val[1] == ir.PointerType(ir.IntType(8)):
39+
logger.warning(
40+
f"String to char array assignment not implemented for {var_name}.{field_name}"
41+
)
42+
return
43+
44+
# Store the value
45+
builder.store(val[0], field_ptr)
46+
logger.info(f"Assigned to struct field {var_name}.{field_name}")
47+
48+
949
def handle_variable_assignment(
1050
func, module, builder, var_name, rval, local_sym_tab, map_sym_tab, structs_sym_tab
1151
):

0 commit comments

Comments
 (0)