|
2 | 2 | from llvmlite import ir |
3 | 3 | from pythonbpf.expr_pass import eval_expr |
4 | 4 | from enum import Enum |
5 | | -from .helper_utils import HelperHandlerRegistry, get_key_ptr |
| 5 | +from .helper_utils import HelperHandlerRegistry, get_or_create_ptr_from_arg |
6 | 6 |
|
7 | 7 |
|
8 | 8 | class BPFHelperID(Enum): |
@@ -41,7 +41,7 @@ def bpf_map_lookup_elem_emitter(call, map_ptr, module, builder, func, |
41 | 41 | if not call.args or len(call.args) != 1: |
42 | 42 | raise ValueError("Map lookup expects exactly one argument (key), got " |
43 | 43 | f"{len(call.args)}") |
44 | | - key_ptr = get_key_ptr(call.args[0], builder, local_sym_tab) |
| 44 | + key_ptr = get_or_create_ptr_from_arg(call.args[0], builder, local_sym_tab) |
45 | 45 | map_void_ptr = builder.bitcast(map_ptr, ir.PointerType()) |
46 | 46 |
|
47 | 47 | fn_type = ir.FunctionType( |
@@ -242,25 +242,8 @@ def bpf_map_update_elem_emitter(call, map_ptr, module, builder, func, |
242 | 242 | value_arg = call.args[1] |
243 | 243 | flags_arg = call.args[2] if len(call.args) > 2 else None |
244 | 244 |
|
245 | | - key_ptr = get_key_ptr(key_arg, builder, local_sym_tab) |
246 | | - # Handle value |
247 | | - if isinstance(value_arg, ast.Name): |
248 | | - value_name = value_arg.id |
249 | | - if local_sym_tab and value_name in local_sym_tab: |
250 | | - value_ptr = local_sym_tab[value_name][0] |
251 | | - else: |
252 | | - raise ValueError( |
253 | | - f"Value variable {value_name} not found in local symbol table.") |
254 | | - elif isinstance(value_arg, ast.Constant) and isinstance(value_arg.value, int): |
255 | | - # Handle constant integers |
256 | | - value_val = value_arg.value |
257 | | - value_type = ir.IntType(64) |
258 | | - value_ptr = builder.alloca(value_type) |
259 | | - value_ptr.align = value_type.width // 8 |
260 | | - builder.store(ir.Constant(value_type, value_val), value_ptr) |
261 | | - else: |
262 | | - raise NotImplementedError( |
263 | | - "Only simple variable names and integer constants are supported as values in map update.") |
| 245 | + key_ptr = get_or_create_ptr_from_arg(key_arg, builder, local_sym_tab) |
| 246 | + value_ptr = get_or_create_ptr_from_arg(value_arg, builder, local_sym_tab) |
264 | 247 |
|
265 | 248 | # Handle flags argument (defaults to 0) |
266 | 249 | if flags_arg is not None: |
@@ -319,7 +302,7 @@ def bpf_map_delete_elem_emitter(call, map_ptr, module, builder, func, |
319 | 302 | if not call.args or len(call.args) != 1: |
320 | 303 | raise ValueError("Map delete expects exactly one argument (key), got " |
321 | 304 | f"{len(call.args)}") |
322 | | - key_ptr = get_key_ptr(call.args[0], builder, local_sym_tab) |
| 305 | + key_ptr = get_or_create_ptr_from_arg(call.args[0], builder, local_sym_tab) |
323 | 306 | map_void_ptr = builder.bitcast(map_ptr, ir.PointerType()) |
324 | 307 |
|
325 | 308 | # Define function type for bpf_map_delete_elem |
|
0 commit comments