Merge pull request #52 from pythonbpf/vmlinux-ir-gen

Dependency tree functionality to semantic analyser
This commit is contained in:
varunrmallya
2025-10-14 02:37:43 +05:30
committed by GitHub
5 changed files with 24 additions and 17 deletions

View File

@ -112,7 +112,11 @@ def process_vmlinux_post_ast(
type_length = elem_type._length_ type_length = elem_type._length_
if containing_type.__module__ == "vmlinux": if containing_type.__module__ == "vmlinux":
pass new_dep_node.add_dependent(
elem_type._type_.__name__
if hasattr(elem_type._type_, "__name__")
else str(elem_type._type_)
)
elif containing_type.__module__ == ctypes.__name__: elif containing_type.__module__ == ctypes.__name__:
if isinstance(elem_type, type): if isinstance(elem_type, type):
if issubclass(elem_type, ctypes.Array): if issubclass(elem_type, ctypes.Array):
@ -149,6 +153,11 @@ def process_vmlinux_post_ast(
"Module not supported in recursive resolution" "Module not supported in recursive resolution"
) )
else: else:
new_dep_node.add_dependent(
elem_type.__name__
if hasattr(elem_type, "__name__")
else str(elem_type)
)
process_vmlinux_post_ast( process_vmlinux_post_ast(
elem_type, llvm_handler, handler, processing_stack elem_type, llvm_handler, handler, processing_stack
) )

View File

@ -106,6 +106,7 @@ class DependencyNode:
""" """
name: str name: str
depends_on: Optional[list[str]] = None
fields: Dict[str, Field] = field(default_factory=dict) fields: Dict[str, Field] = field(default_factory=dict)
_ready_cache: Optional[bool] = field(default=None, repr=False) _ready_cache: Optional[bool] = field(default=None, repr=False)
@ -121,6 +122,8 @@ class DependencyNode:
ready: bool = False, ready: bool = False,
) -> None: ) -> None:
"""Add a field to the node with an optional initial value and readiness state.""" """Add a field to the node with an optional initial value and readiness state."""
if self.depends_on is None:
self.depends_on = []
self.fields[name] = Field( self.fields[name] = Field(
name=name, name=name,
type=field_type, type=field_type,
@ -235,3 +238,9 @@ class DependencyNode:
def get_not_ready_fields(self) -> Dict[str, Field]: def get_not_ready_fields(self) -> Dict[str, Field]:
"""Get all fields that are marked as not ready.""" """Get all fields that are marked as not ready."""
return {name: elem for name, elem in self.fields.items() if not elem.ready} return {name: elem for name, elem in self.fields.items() if not elem.ready}
def add_dependent(self, dep_type):
if dep_type in self.depends_on:
return
else:
self.depends_on.append(dep_type)

View File

@ -12,3 +12,6 @@ class IRGenerator:
raise ImportError( raise ImportError(
"Semantic analysis of vmlinux imports failed. Cannot generate IR" "Semantic analysis of vmlinux imports failed. Cannot generate IR"
) )
for struct in handler:
print(struct)
print()

View File

@ -1,23 +1,9 @@
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
#include <linux/bpf.h> #include "vmlinux.h"
#include <bpf/bpf_helpers.h> #include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h> #include <bpf/bpf_tracing.h>
struct trace_entry {
short unsigned int type;
unsigned char flags;
unsigned char preempt_count;
int pid;
};
struct trace_event_raw_sys_enter {
struct trace_entry ent;
long int id;
long unsigned int args[6];
char __data[0];
};
struct event { struct event {
__u32 pid; __u32 pid;
__u32 uid; __u32 uid;

View File

@ -2,7 +2,7 @@ from pythonbpf import bpf, map, section, bpfglobal, compile_to_ir
from pythonbpf.maps import HashMap from pythonbpf.maps import HashMap
from pythonbpf.helper import XDP_PASS from pythonbpf.helper import XDP_PASS
from vmlinux import struct_xdp_md from vmlinux import struct_xdp_md
from vmlinux import struct_xdp_buff # noqa: F401 from vmlinux import struct_trace_event_raw_sys_enter # noqa: F401
from vmlinux import struct_ring_buffer_per_cpu # noqa: F401 from vmlinux import struct_ring_buffer_per_cpu # noqa: F401
from ctypes import c_int64 from ctypes import c_int64