mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
add vmlinux expressions to eval expr
This commit is contained in:
@ -2,6 +2,7 @@ from .expr_pass import eval_expr, handle_expr, get_operand_value
|
||||
from .type_normalization import convert_to_bool, get_base_type_and_depth
|
||||
from .ir_ops import deref_to_depth
|
||||
from .call_registry import CallHandlerRegistry
|
||||
from .vmlinux_registry import VmlinuxHandlerRegistry
|
||||
|
||||
__all__ = [
|
||||
"eval_expr",
|
||||
@ -11,4 +12,5 @@ __all__ = [
|
||||
"deref_to_depth",
|
||||
"get_operand_value",
|
||||
"CallHandlerRegistry",
|
||||
"VmlinuxHandlerRegistry",
|
||||
]
|
||||
|
||||
@ -12,6 +12,7 @@ from .type_normalization import (
|
||||
get_base_type_and_depth,
|
||||
deref_to_depth,
|
||||
)
|
||||
from .vmlinux_registry import VmlinuxHandlerRegistry
|
||||
|
||||
logger: Logger = logging.getLogger(__name__)
|
||||
|
||||
@ -27,8 +28,12 @@ def _handle_name_expr(expr: ast.Name, local_sym_tab: Dict, builder: ir.IRBuilder
|
||||
val = builder.load(var)
|
||||
return val, local_sym_tab[expr.id].ir_type
|
||||
else:
|
||||
logger.info(f"Undefined variable {expr.id}")
|
||||
return None
|
||||
# Check if it's a vmlinux enum/constant
|
||||
vmlinux_result = VmlinuxHandlerRegistry.handle_name(expr.id)
|
||||
if vmlinux_result is not None:
|
||||
return vmlinux_result
|
||||
|
||||
raise SyntaxError(f"Undefined variable {expr.id}")
|
||||
|
||||
|
||||
def _handle_constant_expr(module, builder, expr: ast.Constant):
|
||||
@ -74,6 +79,13 @@ def _handle_attribute_expr(
|
||||
val = builder.load(gep)
|
||||
field_type = metadata.field_type(attr_name)
|
||||
return val, field_type
|
||||
|
||||
# Try vmlinux handler as fallback
|
||||
vmlinux_result = VmlinuxHandlerRegistry.handle_attribute(
|
||||
expr, local_sym_tab, None, builder
|
||||
)
|
||||
if vmlinux_result is not None:
|
||||
return vmlinux_result
|
||||
return None
|
||||
|
||||
|
||||
|
||||
45
pythonbpf/expr/vmlinux_registry.py
Normal file
45
pythonbpf/expr/vmlinux_registry.py
Normal file
@ -0,0 +1,45 @@
|
||||
import ast
|
||||
|
||||
|
||||
class VmlinuxHandlerRegistry:
|
||||
"""Registry for vmlinux handler operations"""
|
||||
|
||||
_handler = None
|
||||
|
||||
@classmethod
|
||||
def set_handler(cls, handler):
|
||||
"""Set the vmlinux handler"""
|
||||
cls._handler = handler
|
||||
|
||||
@classmethod
|
||||
def get_handler(cls):
|
||||
"""Get the vmlinux handler"""
|
||||
return cls._handler
|
||||
|
||||
@classmethod
|
||||
def handle_name(cls, name):
|
||||
"""Try to handle a name as vmlinux enum/constant"""
|
||||
if cls._handler is None:
|
||||
return None
|
||||
return cls._handler.handle_vmlinux_enum(name)
|
||||
|
||||
@classmethod
|
||||
def handle_attribute(cls, expr, local_sym_tab, module, builder):
|
||||
"""Try to handle an attribute access as vmlinux struct field"""
|
||||
if cls._handler is None:
|
||||
return None
|
||||
|
||||
if isinstance(expr.value, ast.Name):
|
||||
var_name = expr.value.id
|
||||
field_name = expr.attr
|
||||
return cls._handler.handle_vmlinux_struct_field(
|
||||
var_name, field_name, module, builder, local_sym_tab
|
||||
)
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def is_vmlinux_struct(cls, name):
|
||||
"""Check if a name refers to a vmlinux struct"""
|
||||
if cls._handler is None:
|
||||
return False
|
||||
return cls._handler.is_vmlinux_struct(name)
|
||||
Reference in New Issue
Block a user