From 305a8ba9e3d05a1e7327c0cf06b41e6890410fad Mon Sep 17 00:00:00 2001 From: Pragyansh Chaturvedi Date: Sun, 29 Mar 2026 01:36:46 +0530 Subject: [PATCH] Core: Fix unnecessary args and changes in maps pass --- pythonbpf/maps/map_debug_info.py | 11 ++++---- pythonbpf/maps/maps_pass.py | 47 ++++++++++++-------------------- 2 files changed, 22 insertions(+), 36 deletions(-) diff --git a/pythonbpf/maps/map_debug_info.py b/pythonbpf/maps/map_debug_info.py index 431ab01..e879570 100644 --- a/pythonbpf/maps/map_debug_info.py +++ b/pythonbpf/maps/map_debug_info.py @@ -6,9 +6,10 @@ from .map_types import BPFMapType logger: logging.Logger = logging.getLogger(__name__) -def create_map_debug_info(module, map_global, map_name, map_params, structs_sym_tab): +def create_map_debug_info(compilation_context, map_global, map_name, map_params): """Generate debug info metadata for BPF maps HASH and PERF_EVENT_ARRAY""" - generator = DebugInfoGenerator(module) + generator = DebugInfoGenerator(compilation_context.module) + structs_sym_tab = compilation_context.structs_sym_tab logger.info(f"Creating debug info for map {map_name} with params {map_params}") uint_type = generator.get_uint32_type() array_type = generator.create_array_type( @@ -77,11 +78,9 @@ def create_map_debug_info(module, map_global, map_name, map_params, structs_sym_ # Ideally we should expose a single create_map_debug_info function that handles all map types. # We can probably use a registry pattern to register different map types and their debug info generators. # map_params["type"] will be used to determine which generator to use. -def create_ringbuf_debug_info( - module, map_global, map_name, map_params, structs_sym_tab -): +def create_ringbuf_debug_info(compilation_context, map_global, map_name, map_params): """Generate debug information metadata for BPF RINGBUF map""" - generator = DebugInfoGenerator(module) + generator = DebugInfoGenerator(compilation_context.module) int_type = generator.get_int32_type() diff --git a/pythonbpf/maps/maps_pass.py b/pythonbpf/maps/maps_pass.py index e02efb1..083b24a 100644 --- a/pythonbpf/maps/maps_pass.py +++ b/pythonbpf/maps/maps_pass.py @@ -31,7 +31,7 @@ def is_map(func_node): ) -def create_bpf_map(module, map_name, map_params): +def create_bpf_map(compilation_context, map_name, map_params): """Create a BPF map in the module with given parameters and debug info""" # Create the anonymous struct type for BPF map @@ -40,7 +40,9 @@ def create_bpf_map(module, map_name, map_params): ) # Create the global variable - map_global = ir.GlobalVariable(module, map_struct_type, name=map_name) + map_global = ir.GlobalVariable( + compilation_context.module, map_struct_type, name=map_name + ) map_global.linkage = "dso_local" map_global.global_constant = False map_global.initializer = ir.Constant(map_struct_type, None) @@ -51,11 +53,13 @@ def create_bpf_map(module, map_name, map_params): return MapSymbol(type=map_params["type"], sym=map_global, params=map_params) -def _parse_map_params(rval, compilation_context, expected_args=None): +def _parse_map_params(rval, expected_args=None): """Parse map parameters from call arguments and keywords.""" params = {} - handler = compilation_context.vmlinux_handler + + # TODO: Replace it with compilation_context.vmlinux_handler someday? + handler = VmlinuxHandlerRegistry.get_handler() # Parse positional arguments if expected_args: for i, arg_name in enumerate(expected_args): @@ -82,14 +86,6 @@ def _parse_map_params(rval, compilation_context, expected_args=None): def _get_vmlinux_enum(handler, name): if handler and handler.is_vmlinux_enum(name): return handler.get_vmlinux_enum_value(name) - - # Fallback to VmlinuxHandlerRegistry if handler invalid - # This is for backward compatibility or if refactoring isn't complete - if ( - VmlinuxHandlerRegistry.get_handler() - and VmlinuxHandlerRegistry.get_handler().is_vmlinux_enum(name) - ): - return VmlinuxHandlerRegistry.get_handler().get_vmlinux_enum_value(name) return None @@ -97,9 +93,7 @@ def _get_vmlinux_enum(handler, name): def process_ringbuf_map(map_name, rval, compilation_context): """Process a BPF_RINGBUF map declaration""" logger.info(f"Processing Ringbuf: {map_name}") - map_params = _parse_map_params( - rval, compilation_context, expected_args=["max_entries"] - ) + map_params = _parse_map_params(rval, expected_args=["max_entries"]) map_params["type"] = BPFMapType.RINGBUF # NOTE: constraints borrowed from https://docs.ebpf.io/linux/map-type/BPF_MAP_TYPE_RINGBUF/ @@ -115,13 +109,12 @@ def process_ringbuf_map(map_name, rval, compilation_context): logger.info(f"Ringbuf map parameters: {map_params}") - map_global = create_bpf_map(compilation_context.module, map_name, map_params) + map_global = create_bpf_map(compilation_context, map_name, map_params) create_ringbuf_debug_info( - compilation_context.module, + compilation_context, map_global.sym, map_name, map_params, - compilation_context.structs_sym_tab, ) return map_global @@ -130,20 +123,17 @@ def process_ringbuf_map(map_name, rval, compilation_context): def process_hash_map(map_name, rval, compilation_context): """Process a BPF_HASH map declaration""" logger.info(f"Processing HashMap: {map_name}") - map_params = _parse_map_params( - rval, compilation_context, expected_args=["key", "value", "max_entries"] - ) + map_params = _parse_map_params(rval, expected_args=["key", "value", "max_entries"]) map_params["type"] = BPFMapType.HASH logger.info(f"Map parameters: {map_params}") - map_global = create_bpf_map(compilation_context.module, map_name, map_params) + map_global = create_bpf_map(compilation_context, map_name, map_params) # Generate debug info for BTF create_map_debug_info( - compilation_context.module, + compilation_context, map_global.sym, map_name, map_params, - compilation_context.structs_sym_tab, ) return map_global @@ -152,20 +142,17 @@ def process_hash_map(map_name, rval, compilation_context): def process_perf_event_map(map_name, rval, compilation_context): """Process a BPF_PERF_EVENT_ARRAY map declaration""" logger.info(f"Processing PerfEventArray: {map_name}") - map_params = _parse_map_params( - rval, compilation_context, expected_args=["key_size", "value_size"] - ) + map_params = _parse_map_params(rval, expected_args=["key_size", "value_size"]) map_params["type"] = BPFMapType.PERF_EVENT_ARRAY logger.info(f"Map parameters: {map_params}") - map_global = create_bpf_map(compilation_context.module, map_name, map_params) + map_global = create_bpf_map(compilation_context, map_name, map_params) # Generate debug info for BTF create_map_debug_info( - compilation_context.module, + compilation_context, map_global.sym, map_name, map_params, - compilation_context.structs_sym_tab, ) return map_global