Skip to content

Commit d66e6a6

Browse files
committed
Allow struct members as helper args
1 parent cd74e89 commit d66e6a6

File tree

2 files changed

+19
-13
lines changed

2 files changed

+19
-13
lines changed

pythonbpf/helper/bpf_helper_handler.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ def bpf_map_lookup_elem_emitter(
6464
raise ValueError(
6565
f"Map lookup expects exactly one argument (key), got {len(call.args)}"
6666
)
67-
key_ptr = get_or_create_ptr_from_arg(call.args[0], builder, local_sym_tab)
67+
key_ptr = get_or_create_ptr_from_arg(
68+
func, module, call.args[0], builder, local_sym_tab, struct_sym_tab
69+
)
6870
map_void_ptr = builder.bitcast(map_ptr, ir.PointerType())
6971

7072
fn_type = ir.FunctionType(
@@ -152,8 +154,12 @@ def bpf_map_update_elem_emitter(
152154
value_arg = call.args[1]
153155
flags_arg = call.args[2] if len(call.args) > 2 else None
154156

155-
key_ptr = get_or_create_ptr_from_arg(key_arg, builder, local_sym_tab)
156-
value_ptr = get_or_create_ptr_from_arg(value_arg, builder, local_sym_tab)
157+
key_ptr = get_or_create_ptr_from_arg(
158+
func, module, key_arg, builder, local_sym_tab, struct_sym_tab
159+
)
160+
value_ptr = get_or_create_ptr_from_arg(
161+
func, module, value_arg, builder, local_sym_tab, struct_sym_tab
162+
)
157163
flags_val = get_flags_val(flags_arg, builder, local_sym_tab)
158164

159165
map_void_ptr = builder.bitcast(map_ptr, ir.PointerType())
@@ -197,7 +203,9 @@ def bpf_map_delete_elem_emitter(
197203
raise ValueError(
198204
f"Map delete expects exactly one argument (key), got {len(call.args)}"
199205
)
200-
key_ptr = get_or_create_ptr_from_arg(call.args[0], builder, local_sym_tab)
206+
key_ptr = get_or_create_ptr_from_arg(
207+
func, module, call.args[0], builder, local_sym_tab, struct_sym_tab
208+
)
201209
map_void_ptr = builder.bitcast(map_ptr, ir.PointerType())
202210

203211
# Define function type for bpf_map_delete_elem

pythonbpf/helper/helper_utils.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,23 +87,25 @@ def create_int_constant_ptr(value, builder, local_sym_tab, int_width=64):
8787
return ptr
8888

8989

90-
def get_or_create_ptr_from_arg(arg, builder, local_sym_tab):
90+
def get_or_create_ptr_from_arg(
91+
func, module, arg, builder, local_sym_tab, struct_sym_tab=None
92+
):
9193
"""Extract or create pointer from the call arguments."""
9294

9395
if isinstance(arg, ast.Name):
9496
ptr = get_var_ptr_from_name(arg.id, local_sym_tab)
9597
elif isinstance(arg, ast.Constant) and isinstance(arg.value, int):
9698
ptr = create_int_constant_ptr(arg.value, builder, local_sym_tab)
97-
elif isinstance(arg, ast.BinOp):
99+
else:
98100
# Evaluate the expression and store the result in a temp variable
99101
val, _ = eval_expr(
100-
None,
101-
None,
102+
func,
103+
module,
102104
builder,
103105
arg,
104106
local_sym_tab,
105107
None,
106-
None,
108+
struct_sym_tab,
107109
)
108110
if val is None:
109111
raise ValueError("Failed to evaluate expression for helper arg.")
@@ -113,10 +115,6 @@ def get_or_create_ptr_from_arg(arg, builder, local_sym_tab):
113115
logger.debug(f"Using temp variable '{temp_name}' for expression result")
114116
builder.store(val, ptr)
115117

116-
else:
117-
raise NotImplementedError(
118-
"Only simple variable names are supported as args in map helpers."
119-
)
120118
return ptr
121119

122120

0 commit comments

Comments
 (0)