Skip to content

Commit 8c5069f

Browse files
authored
Merge pull request #85 from pythonbpf/fix/comprehensive-store-type-mismatch
Fix comprehensive test
2 parents c2de7da + 5a9c77f commit 8c5069f

3 files changed

Lines changed: 39 additions & 5 deletions

File tree

pythonbpf/expr/ir_ops.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def deref_to_depth(func, builder, val, target_depth):
1111
cur_type = val.type
1212

1313
for depth in range(target_depth):
14-
if not isinstance(val.type, ir.PointerType):
14+
if not isinstance(cur_type, ir.PointerType):
1515
logger.error("Cannot dereference further, non-pointer type")
1616
return None
1717

pythonbpf/helper/bpf_helper_handler.py

Lines changed: 24 additions & 4 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

@@ -267,7 +282,12 @@ def bpf_map_delete_elem_emitter(
267282
f"Map delete expects exactly one argument (key), got {len(call.args)}"
268283
)
269284
key_ptr = get_or_create_ptr_from_arg(
270-
func, compilation_context, call.args[0], builder, local_sym_tab
285+
func,
286+
compilation_context,
287+
call.args[0],
288+
builder,
289+
local_sym_tab,
290+
expected_type=ir.IntType(64),
271291
)
272292
map_void_ptr = builder.bitcast(map_ptr, ir.PointerType())
273293

pythonbpf/helper/helper_utils.py

Lines changed: 14 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,18 @@ 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+
if val is None:
115+
raise ValueError("Failed to dereference pointer to expected depth")
116+
else:
117+
logger.debug(
118+
"Expected Type not known / Not a pointer, skipping dereference"
119+
)
120+
107121
ptr, temp_name = compilation_context.scratch_pool.get_next_temp(
108122
local_sym_tab, expected_type
109123
)

0 commit comments

Comments
 (0)