mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
make pointer allocation feasible but subverting LLC
This commit is contained in:
@ -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}"
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user