Skip to content

Commit d4f1b5a

Browse files
r41k0uCopilot
andcommitted
Handle nested map lookup helper args
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent c2de7da commit d4f1b5a

2 files changed

Lines changed: 26 additions & 3 deletions

File tree

pythonbpf/helper/bpf_helper_handler.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,12 @@ def bpf_map_lookup_elem_emitter(
113113
f"Map lookup expects exactly one argument (key), got {len(call.args)}"
114114
)
115115
key_ptr = get_or_create_ptr_from_arg(
116-
func, compilation_context, call.args[0], builder, local_sym_tab
116+
func,
117+
compilation_context,
118+
call.args[0],
119+
builder,
120+
local_sym_tab,
121+
expected_type=ir.IntType(64),
117122
)
118123
map_void_ptr = builder.bitcast(map_ptr, ir.PointerType())
119124

@@ -215,10 +220,20 @@ def bpf_map_update_elem_emitter(
215220
flags_arg = call.args[2] if len(call.args) > 2 else None
216221

217222
key_ptr = get_or_create_ptr_from_arg(
218-
func, compilation_context, key_arg, builder, local_sym_tab
223+
func,
224+
compilation_context,
225+
key_arg,
226+
builder,
227+
local_sym_tab,
228+
expected_type=ir.IntType(64),
219229
)
220230
value_ptr = get_or_create_ptr_from_arg(
221-
func, compilation_context, value_arg, builder, local_sym_tab
231+
func,
232+
compilation_context,
233+
value_arg,
234+
builder,
235+
local_sym_tab,
236+
expected_type=ir.IntType(64),
222237
)
223238
flags_val = get_flags_val(flags_arg, builder, local_sym_tab)
224239

pythonbpf/helper/helper_utils.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
eval_expr,
77
access_struct_field,
88
)
9+
from pythonbpf.expr.ir_ops import deref_to_depth
10+
from pythonbpf.expr.type_normalization import get_base_type_and_depth
911

1012
logger = logging.getLogger(__name__)
1113

@@ -104,6 +106,12 @@ def get_or_create_ptr_from_arg(
104106
if val is None:
105107
raise ValueError("Failed to evaluate expression for helper arg.")
106108

109+
if expected_type and isinstance(val.type, ir.PointerType):
110+
_, val_depth = get_base_type_and_depth(val.type)
111+
_, expected_depth = get_base_type_and_depth(expected_type)
112+
if val_depth > expected_depth:
113+
val = deref_to_depth(func, builder, val, val_depth - expected_depth)
114+
107115
ptr, temp_name = compilation_context.scratch_pool.get_next_temp(
108116
local_sym_tab, expected_type
109117
)

0 commit comments

Comments
 (0)