make pointer allocation feasible but subverting LLC

This commit is contained in:
2025-11-21 20:21:24 +05:30
parent 25394059a6
commit 9ee821c7f6
2 changed files with 17 additions and 13 deletions

View File

@ -121,10 +121,10 @@ def _allocate_for_call(
elif VmlinuxHandlerRegistry.is_vmlinux_struct(call_type): elif VmlinuxHandlerRegistry.is_vmlinux_struct(call_type):
# When calling struct_name(pointer), we're doing a cast, not construction # When calling struct_name(pointer), we're doing a cast, not construction
# So we allocate as a pointer (i64) not as the actual struct # So we allocate as a pointer (i64) not as the actual struct
var = builder.alloca(ir.PointerType(), name=var_name) var = builder.alloca(ir.IntType(64), name=var_name)
var.align = 8 var.align = 8
local_sym_tab[var_name] = LocalSymbol( local_sym_tab[var_name] = LocalSymbol(
var, ir.PointerType(), VmlinuxHandlerRegistry.get_struct_type(call_type) var, ir.IntType(64), VmlinuxHandlerRegistry.get_struct_type(call_type)
) )
logger.info( logger.info(
f"Pre-allocated {var_name} for vmlinux struct pointer cast to {call_type}" f"Pre-allocated {var_name} for vmlinux struct pointer cast to {call_type}"

View File

@ -524,20 +524,22 @@ def _handle_boolean_op(
logger.error(f"Unsupported boolean operator: {type(expr.op).__name__}") logger.error(f"Unsupported boolean operator: {type(expr.op).__name__}")
return None return None
# ============================================================================ # ============================================================================
# VMLinux casting # VMLinux casting
# ============================================================================ # ============================================================================
def _handle_vmlinux_cast( def _handle_vmlinux_cast(
func, func,
module, module,
builder, builder,
expr, expr,
local_sym_tab, local_sym_tab,
map_sym_tab, map_sym_tab,
structs_sym_tab=None, structs_sym_tab=None,
): ):
# handle expressions such as struct_request(ctx.di) where struct_request is a vmlinux # handle expressions such as struct_request(ctx.di) where struct_request is a vmlinux
# struct and ctx.di is a pointer to a struct but is actually represented as a c_uint64 # struct and ctx.di is a pointer to a struct but is actually represented as a c_uint64
# which needs to be cast to a pointer. This is also a field of another vmlinux struct # which needs to be cast to a pointer. This is also a field of another vmlinux struct
"""Handle vmlinux struct cast expressions like struct_request(ctx.di).""" """Handle vmlinux struct cast expressions like struct_request(ctx.di)."""
@ -572,7 +574,7 @@ def _handle_vmlinux_cast(
# Cast the integer/value to a pointer to the struct # Cast the integer/value to a pointer to the struct
# If arg_val is an integer type, we need to inttoptr it # If arg_val is an integer type, we need to inttoptr it
ptr_type = ir.PointerType() ptr_type = ir.PointerType()
#TODO: add a integer check here later # TODO: add a integer check here later
if ctypes_to_ir(arg_type.type.__name__): if ctypes_to_ir(arg_type.type.__name__):
# Cast integer to pointer # Cast integer to pointer
casted_ptr = builder.inttoptr(arg_val, ptr_type) casted_ptr = builder.inttoptr(arg_val, ptr_type)
@ -603,8 +605,10 @@ def eval_expr(
elif isinstance(expr, ast.Constant): elif isinstance(expr, ast.Constant):
return _handle_constant_expr(module, builder, expr) return _handle_constant_expr(module, builder, expr)
elif isinstance(expr, ast.Call): elif isinstance(expr, ast.Call):
if isinstance(expr.func, ast.Name) and VmlinuxHandlerRegistry.is_vmlinux_struct(expr.func.id): if isinstance(expr.func, ast.Name) and VmlinuxHandlerRegistry.is_vmlinux_struct(
return _handle_vmlinux_cast( expr.func.id
):
return _handle_vmlinux_cast(
func, func,
module, module,
builder, builder,