From 07580dabf22da004dce3f4ea29c425a308ed9862 Mon Sep 17 00:00:00 2001 From: varun-r-mallya Date: Mon, 27 Oct 2025 03:28:16 +0530 Subject: [PATCH] revert struct reference pointer sizes to i8 to ensure that compiler does not optimize --- pythonbpf/codegen.py | 2 +- .../vmlinux_parser/vmlinux_exports_handler.py | 21 +++++++++---------- .../vmlinux/struct_field_access.py | 4 ++-- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/pythonbpf/codegen.py b/pythonbpf/codegen.py index 61bb5fe..60628e6 100644 --- a/pythonbpf/codegen.py +++ b/pythonbpf/codegen.py @@ -39,7 +39,7 @@ def finalize_module(original_str): def bpf_passthrough_gen(module): i32_ty = ir.IntType(32) - ptr_ty = ir.PointerType(ir.IntType(64)) + ptr_ty = ir.PointerType(ir.IntType(8)) fnty = ir.FunctionType(ptr_ty, [i32_ty, ptr_ty]) # Declare the intrinsic diff --git a/pythonbpf/vmlinux_parser/vmlinux_exports_handler.py b/pythonbpf/vmlinux_parser/vmlinux_exports_handler.py index 5caa593..62c0327 100644 --- a/pythonbpf/vmlinux_parser/vmlinux_exports_handler.py +++ b/pythonbpf/vmlinux_parser/vmlinux_exports_handler.py @@ -97,7 +97,7 @@ class VmlinuxHandler: globvar_ir, field_data = self.get_field_type( python_type.__name__, field_name ) - builder.function.args[0].type = ir.PointerType(ir.IntType(64)) + builder.function.args[0].type = ir.PointerType(ir.IntType(8)) print(builder.function.args[0]) field_ptr = self.load_ctx_field( builder, builder.function.args[0], globvar_ir @@ -125,19 +125,18 @@ class VmlinuxHandler: # Load the offset value offset = builder.load(offset_global) - # # Ensure ctx_arg is treated as i8* (byte pointer) - # # i8_type = ir.IntType(8) - # i8_ptr_type = ir.PointerType() + # Ensure ctx_arg is treated as i8* (byte pointer) + i8_ptr_type = ir.PointerType() # Cast ctx_arg to i8* if it isn't already - # if str(ctx_arg.type) != str(i8_ptr_type): - # ctx_i8_ptr = builder.bitcast(ctx_arg, i8_ptr_type) - # else: - # ctx_i8_ptr = ctx_arg + if str(ctx_arg.type) != str(i8_ptr_type): + ctx_i8_ptr = builder.bitcast(ctx_arg, i8_ptr_type) + else: + ctx_i8_ptr = ctx_arg # GEP with explicit type - this is the key fix field_ptr = builder.gep( - ctx_arg, + ctx_i8_ptr, [offset], inbounds=False, ) @@ -151,8 +150,8 @@ class VmlinuxHandler: raise KeyError except (KeyError, AttributeError): passthrough_type = ir.FunctionType( - ir.PointerType(), - [ir.IntType(32), ir.PointerType()], + i8_ptr_type, + [ir.IntType(32), i8_ptr_type], ) passthrough_fn = ir.Function( module, diff --git a/tests/failing_tests/vmlinux/struct_field_access.py b/tests/failing_tests/vmlinux/struct_field_access.py index 64405fa..e7ebccb 100644 --- a/tests/failing_tests/vmlinux/struct_field_access.py +++ b/tests/failing_tests/vmlinux/struct_field_access.py @@ -13,10 +13,10 @@ from ctypes import c_int64, c_int32, c_void_p # noqa: F401 @bpf @section("tracepoint/syscalls/sys_enter_execve") -def hello_world(ctx: struct_trace_event_raw_sys_enter) -> c_int32: +def hello_world(ctx: struct_trace_event_raw_sys_enter) -> c_int64: b = ctx.id print(f"This is context field {b}") - return c_int32(0) + return c_int64(0) @bpf