Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion pythonbpf/vmlinux_parser/class_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,11 @@ def process_vmlinux_post_ast(
type_length = elem_type._length_

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__:
if isinstance(elem_type, type):
if issubclass(elem_type, ctypes.Array):
Expand Down Expand Up @@ -149,6 +153,11 @@ def process_vmlinux_post_ast(
"Module not supported in recursive resolution"
)
else:
new_dep_node.add_dependent(
elem_type.__name__
if hasattr(elem_type, "__name__")
else str(elem_type)
)
process_vmlinux_post_ast(
elem_type, llvm_handler, handler, processing_stack
)
Expand Down
9 changes: 9 additions & 0 deletions pythonbpf/vmlinux_parser/dependency_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ class DependencyNode:
"""

name: str
depends_on: Optional[list[str]] = None
fields: Dict[str, Field] = field(default_factory=dict)
_ready_cache: Optional[bool] = field(default=None, repr=False)

Expand All @@ -121,6 +122,8 @@ def add_field(
ready: bool = False,
) -> None:
"""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(
name=name,
type=field_type,
Expand Down Expand Up @@ -235,3 +238,9 @@ def get_ready_fields(self) -> Dict[str, Field]:
def get_not_ready_fields(self) -> Dict[str, Field]:
"""Get all fields that are marked as not 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)
3 changes: 3 additions & 0 deletions pythonbpf/vmlinux_parser/ir_generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,6 @@ def __init__(self, module, handler: DependencyHandler):
raise ImportError(
"Semantic analysis of vmlinux imports failed. Cannot generate IR"
)
for struct in handler:
print(struct)
print()
16 changes: 1 addition & 15 deletions tests/c-form/ex7.bpf.c
Original file line number Diff line number Diff line change
@@ -1,23 +1,9 @@
// SPDX-License-Identifier: GPL-2.0

#include <linux/bpf.h>
#include "vmlinux.h"
#include <bpf/bpf_helpers.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 {
__u32 pid;
__u32 uid;
Expand Down
2 changes: 1 addition & 1 deletion tests/failing_tests/xdp_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from pythonbpf.maps import HashMap
from pythonbpf.helper import XDP_PASS
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 ctypes import c_int64
Expand Down