diff --git a/pythonbpf/expr/ir_ops.py b/pythonbpf/expr/ir_ops.py index df6f503..3f10d19 100644 --- a/pythonbpf/expr/ir_ops.py +++ b/pythonbpf/expr/ir_ops.py @@ -11,7 +11,7 @@ def deref_to_depth(func, builder, val, target_depth): cur_type = val.type for depth in range(target_depth): - if not isinstance(val.type, ir.PointerType): + if not isinstance(cur_type, ir.PointerType): logger.error("Cannot dereference further, non-pointer type") return None diff --git a/pythonbpf/helper/bpf_helper_handler.py b/pythonbpf/helper/bpf_helper_handler.py index f44f05f..9fde71f 100644 --- a/pythonbpf/helper/bpf_helper_handler.py +++ b/pythonbpf/helper/bpf_helper_handler.py @@ -113,7 +113,12 @@ def bpf_map_lookup_elem_emitter( f"Map lookup expects exactly one argument (key), got {len(call.args)}" ) key_ptr = get_or_create_ptr_from_arg( - func, compilation_context, call.args[0], builder, local_sym_tab + func, + compilation_context, + call.args[0], + builder, + local_sym_tab, + expected_type=ir.IntType(64), ) map_void_ptr = builder.bitcast(map_ptr, ir.PointerType()) @@ -215,10 +220,20 @@ def bpf_map_update_elem_emitter( flags_arg = call.args[2] if len(call.args) > 2 else None key_ptr = get_or_create_ptr_from_arg( - func, compilation_context, key_arg, builder, local_sym_tab + func, + compilation_context, + key_arg, + builder, + local_sym_tab, + expected_type=ir.IntType(64), ) value_ptr = get_or_create_ptr_from_arg( - func, compilation_context, value_arg, builder, local_sym_tab + func, + compilation_context, + value_arg, + builder, + local_sym_tab, + expected_type=ir.IntType(64), ) flags_val = get_flags_val(flags_arg, builder, local_sym_tab) @@ -267,7 +282,12 @@ def bpf_map_delete_elem_emitter( f"Map delete expects exactly one argument (key), got {len(call.args)}" ) key_ptr = get_or_create_ptr_from_arg( - func, compilation_context, call.args[0], builder, local_sym_tab + func, + compilation_context, + call.args[0], + builder, + local_sym_tab, + expected_type=ir.IntType(64), ) map_void_ptr = builder.bitcast(map_ptr, ir.PointerType()) diff --git a/pythonbpf/helper/helper_utils.py b/pythonbpf/helper/helper_utils.py index 211a925..dd00228 100644 --- a/pythonbpf/helper/helper_utils.py +++ b/pythonbpf/helper/helper_utils.py @@ -6,6 +6,8 @@ eval_expr, access_struct_field, ) +from pythonbpf.expr.ir_ops import deref_to_depth +from pythonbpf.expr.type_normalization import get_base_type_and_depth logger = logging.getLogger(__name__) @@ -104,6 +106,18 @@ def get_or_create_ptr_from_arg( if val is None: raise ValueError("Failed to evaluate expression for helper arg.") + if expected_type and isinstance(val.type, ir.PointerType): + _, val_depth = get_base_type_and_depth(val.type) + _, expected_depth = get_base_type_and_depth(expected_type) + if val_depth > expected_depth: + val = deref_to_depth(func, builder, val, val_depth - expected_depth) + if val is None: + raise ValueError("Failed to dereference pointer to expected depth") + else: + logger.debug( + "Expected Type not known / Not a pointer, skipping dereference" + ) + ptr, temp_name = compilation_context.scratch_pool.get_next_temp( local_sym_tab, expected_type )