Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pythonbpf/expr/ir_ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
28 changes: 24 additions & 4 deletions pythonbpf/helper/bpf_helper_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())

Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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())

Expand Down
14 changes: 14 additions & 0 deletions pythonbpf/helper/helper_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down Expand Up @@ -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
)
Expand Down
Loading