Skip to content

Commit 11e8e72

Browse files
add base for ir gen
1 parent d3f0e3b commit 11e8e72

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

pythonbpf/vmlinux_parser/dependency_handler.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,23 @@ def __len__(self) -> int:
147147
int: The number of nodes
148148
"""
149149
return len(self._nodes)
150+
151+
def __getitem__(self, name: str) -> DependencyNode:
152+
"""
153+
Get a node by name using dictionary-style access.
154+
155+
Args:
156+
name: The name of the node to retrieve
157+
158+
Returns:
159+
DependencyNode: The node with the given name
160+
161+
Raises:
162+
KeyError: If no node with the given name exists
163+
164+
Example:
165+
node = handler["some-dep_node_name"]
166+
"""
167+
if name not in self._nodes:
168+
raise KeyError(f"No node with name '{name}' found")
169+
return self._nodes[name]

pythonbpf/vmlinux_parser/ir_gen/ir_generation.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,28 @@ class IRGenerator:
88
def __init__(self, module, handler: DependencyHandler):
99
self.module = module
1010
self.handler: DependencyHandler = handler
11+
self.generated: list[str] = []
1112
if not handler.is_ready:
1213
raise ImportError(
1314
"Semantic analysis of vmlinux imports failed. Cannot generate IR"
1415
)
1516
for struct in handler:
16-
print(struct)
17+
self.struct_processor(struct)
1718
print()
19+
20+
def struct_processor(self, struct):
21+
if struct.name not in self.generated:
22+
print(f"IR generating for {struct.name}")
23+
print(f"Struct is {struct}")
24+
for dependency in struct.depends_on:
25+
if dependency not in self.generated:
26+
dep_node_from_dependency = self.handler[dependency]
27+
self.struct_processor(dep_node_from_dependency)
28+
self.generated.append(dependency)
29+
# write actual processor logic here after assuming all dependencies are resolved
30+
# this part cannot yet resolve circular dependencies. Gets stuck on an infinite loop during that.
31+
self.generated.append(struct.name)
32+
33+
34+
def struct_name_generator(self, ):
35+
pass

tests/failing_tests/xdp_pass.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from pythonbpf import bpf, map, section, bpfglobal, compile_to_ir
22
from pythonbpf.maps import HashMap
33
from pythonbpf.helper import XDP_PASS
4+
# from vmlinux import struct_request
5+
from vmlinux import struct_trace_event_raw_sys_enter
46
from vmlinux import struct_xdp_md
5-
from vmlinux import struct_trace_event_raw_sys_enter # noqa: F401
6-
from vmlinux import struct_ring_buffer_per_cpu # noqa: F401
7+
# from vmlinux import struct_trace_event_raw_sys_enter # noqa: F401
8+
# from vmlinux import struct_ring_buffer_per_cpu # noqa: F401
79

810
from ctypes import c_int64
911

0 commit comments

Comments
 (0)