mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
Merge pull request #52 from pythonbpf/vmlinux-ir-gen
Dependency tree functionality to semantic analyser
This commit is contained in:
@ -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
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user