mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
add debug info storage on assignment_info.py dataclass
This commit is contained in:
@ -39,6 +39,12 @@ class VmlinuxHandlerRegistry:
|
|||||||
)
|
)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_struct_debug_info(cls, name):
|
||||||
|
if cls._handler is None:
|
||||||
|
return False
|
||||||
|
return cls._handler.get_struct_debug_info(name)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_vmlinux_struct(cls, name):
|
def is_vmlinux_struct(cls, name):
|
||||||
"""Check if a name refers to a vmlinux struct"""
|
"""Check if a name refers to a vmlinux struct"""
|
||||||
|
|||||||
@ -2,8 +2,20 @@ import ast
|
|||||||
|
|
||||||
import llvmlite.ir as ir
|
import llvmlite.ir as ir
|
||||||
|
|
||||||
|
from pythonbpf.debuginfo import DebugInfoGenerator
|
||||||
|
from pythonbpf.expr import VmlinuxHandlerRegistry
|
||||||
|
|
||||||
|
|
||||||
def generate_function_debug_info(
|
def generate_function_debug_info(
|
||||||
func_node: ast.FunctionDef, module: ir.Module, func: ir.Function
|
func_node: ast.FunctionDef, module: ir.Module, func: ir.Function
|
||||||
):
|
):
|
||||||
|
generator = DebugInfoGenerator(module)
|
||||||
|
leading_argument = func_node.args.args[0]
|
||||||
|
leading_argument_name = leading_argument.arg
|
||||||
|
# TODO: add ctypes handling as well here
|
||||||
|
print(leading_argument.arg, leading_argument.annotation.id)
|
||||||
|
context_debug_info = VmlinuxHandlerRegistry.get_struct_debug_info(
|
||||||
|
name=leading_argument.annotation.id
|
||||||
|
)
|
||||||
|
print(context_debug_info)
|
||||||
pass
|
pass
|
||||||
|
|||||||
@ -33,3 +33,4 @@ class AssignmentInfo:
|
|||||||
# Value is a tuple that contains the global variable representing that field
|
# Value is a tuple that contains the global variable representing that field
|
||||||
# along with all the information about that field as a Field type.
|
# along with all the information about that field as a Field type.
|
||||||
members: Optional[Dict[str, tuple[ir.GlobalVariable, Field]]] # For structs.
|
members: Optional[Dict[str, tuple[ir.GlobalVariable, Field]]] # For structs.
|
||||||
|
debug_info: Any
|
||||||
|
|||||||
@ -148,6 +148,7 @@ def process_vmlinux_assign(node, module, assignments: dict[str, AssignmentInfo])
|
|||||||
pointer_level=None,
|
pointer_level=None,
|
||||||
signature=None,
|
signature=None,
|
||||||
members=None,
|
members=None,
|
||||||
|
debug_info=None,
|
||||||
)
|
)
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Added assignment: {target_name} = {node.value.value!r} of type {type(node.value.value)}"
|
f"Added assignment: {target_name} = {node.value.value!r} of type {type(node.value.value)}"
|
||||||
|
|||||||
@ -73,9 +73,8 @@ class IRGenerator:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Generate IR first to populate field names
|
# Generate IR first to populate field names
|
||||||
self.generated_debug_info.append(
|
struct_debug_info = self.gen_ir(struct, self.generated_debug_info)
|
||||||
(struct, self.gen_ir(struct, self.generated_debug_info))
|
self.generated_debug_info.append((struct, struct_debug_info))
|
||||||
)
|
|
||||||
|
|
||||||
# Fill the assignments dictionary with struct information
|
# Fill the assignments dictionary with struct information
|
||||||
if struct.name not in self.assignments:
|
if struct.name not in self.assignments:
|
||||||
@ -105,6 +104,7 @@ class IRGenerator:
|
|||||||
pointer_level=None,
|
pointer_level=None,
|
||||||
signature=None,
|
signature=None,
|
||||||
members=members_dict,
|
members=members_dict,
|
||||||
|
debug_info=struct_debug_info,
|
||||||
)
|
)
|
||||||
logger.info(f"Added struct assignment info for {struct.name}")
|
logger.info(f"Added struct assignment info for {struct.name}")
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
import logging
|
import logging
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
from llvmlite import ir
|
from llvmlite import ir
|
||||||
|
|
||||||
from pythonbpf.local_symbol import LocalSymbol
|
from pythonbpf.local_symbol import LocalSymbol
|
||||||
@ -40,6 +42,15 @@ class VmlinuxHandler:
|
|||||||
and self.vmlinux_symtab[name].value_type == AssignmentType.CONSTANT
|
and self.vmlinux_symtab[name].value_type == AssignmentType.CONSTANT
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_struct_debug_info(self, name: str) -> Any:
|
||||||
|
if (
|
||||||
|
name in self.vmlinux_symtab
|
||||||
|
and self.vmlinux_symtab[name].value_type == AssignmentType.STRUCT
|
||||||
|
):
|
||||||
|
return self.vmlinux_symtab[name].debug_info
|
||||||
|
else:
|
||||||
|
raise ValueError(f"{name} is not a vmlinux struct type")
|
||||||
|
|
||||||
def get_vmlinux_struct_type(self, name):
|
def get_vmlinux_struct_type(self, name):
|
||||||
"""Check if name is a vmlinux struct type"""
|
"""Check if name is a vmlinux struct type"""
|
||||||
if (
|
if (
|
||||||
|
|||||||
Reference in New Issue
Block a user