22from llvmlite import ir
33from pythonbpf .expr_pass import eval_expr
44from enum import Enum
5- from .helper_utils import HelperHandlerRegistry
5+ from .helper_utils import HelperHandlerRegistry , get_key_ptr
66
77
88class BPFHelperID (Enum ):
@@ -38,31 +38,7 @@ def bpf_map_lookup_elem_emitter(call, map_ptr, module, builder, func,
3838 """
3939 Emit LLVM IR for bpf_map_lookup_elem helper function call.
4040 """
41- if call .args and len (call .args ) != 1 :
42- raise ValueError ("Map lookup expects exactly one argument, got "
43- f"{ len (call .args )} " )
44- key_arg = call .args [0 ]
45- if isinstance (key_arg , ast .Name ):
46- key_name = key_arg .id
47- if local_sym_tab and key_name in local_sym_tab :
48- key_ptr = local_sym_tab [key_name ][0 ]
49- else :
50- raise ValueError (
51- f"Key variable { key_name } not found in local symbol table." )
52- elif isinstance (key_arg , ast .Constant ) and isinstance (key_arg .value , int ):
53- # handle constant integer keys
54- key_val = key_arg .value
55- key_type = ir .IntType (64 )
56- key_ptr = builder .alloca (key_type )
57- key_ptr .align = key_type // 8
58- builder .store (ir .Constant (key_type , key_val ), key_ptr )
59- else :
60- raise NotImplementedError (
61- "Only simple variable names are supported as keys in map lookup." )
62-
63- if key_ptr is None :
64- raise ValueError ("Key pointer is None." )
65-
41+ key_ptr = get_key_ptr (call , builder , local_sym_tab )
6642 map_void_ptr = builder .bitcast (map_ptr , ir .PointerType ())
6743
6844 fn_type = ir .FunctionType (
@@ -72,7 +48,6 @@ def bpf_map_lookup_elem_emitter(call, map_ptr, module, builder, func,
7248 )
7349 fn_ptr_type = ir .PointerType (fn_type )
7450
75- # Helper ID 1 is bpf_map_lookup_elem
7651 fn_addr = ir .Constant (ir .IntType (
7752 64 ), BPFHelperID .BPF_MAP_LOOKUP_ELEM .value )
7853 fn_ptr = builder .inttoptr (fn_addr , fn_ptr_type )
0 commit comments