Skip to content

Commit eee2127

Browse files
add assignment dict handling to class_handler.py
1 parent 8da50b7 commit eee2127

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

pythonbpf/codegen.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ def processor(source_code, filename, module):
5555
for func_node in bpf_chunks:
5656
logger.info(f"Found BPF function/struct: {func_node.name}")
5757

58-
vmlinux_proc(tree, module)
58+
vmlinux_symtab = vmlinux_proc(tree, module)
5959
populate_global_symbol_table(tree, module)
6060
license_processing(tree, module)
6161
globals_processing(tree, module)
62-
62+
print("DEBUG:", vmlinux_symtab)
6363
structs_sym_tab = structs_proc(tree, module, bpf_chunks)
6464
map_sym_tab = maps_proc(tree, module, bpf_chunks)
6565
func_proc(tree, module, bpf_chunks, map_sym_tab, structs_sym_tab)

pythonbpf/vmlinux_parser/class_handler.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
from functools import lru_cache
33
import importlib
44

5-
from .assignment_info import AssignmentInfo
5+
from .assignment_info import AssignmentInfo, AssignmentType
66
from .dependency_handler import DependencyHandler
7-
from .dependency_node import DependencyNode
7+
from .dependency_node import DependencyNode, Field
88
import ctypes
99
from typing import Optional, Any, Dict
1010

@@ -103,12 +103,21 @@ def process_vmlinux_post_ast(
103103
else:
104104
raise TypeError("Could not get required class and definition")
105105

106+
# Create a members dictionary for AssignmentInfo
107+
members_dict: Dict[str, tuple[str, Field]] = {}
108+
106109
logger.debug(f"Extracted fields for {current_symbol_name}: {field_table}")
107110
for elem in field_table.items():
108111
elem_name, elem_temp_list = elem
109112
[elem_type, elem_bitfield_size] = elem_temp_list
110113
local_module_name = getattr(elem_type, "__module__", None)
111114
new_dep_node.add_field(elem_name, elem_type, ready=False)
115+
116+
# Store field reference for struct assignment info
117+
field_ref = new_dep_node.get_field(elem_name)
118+
if field_ref:
119+
members_dict[elem_name] = (elem_name, field_ref)
120+
112121
if local_module_name == ctypes.__name__:
113122
# TODO: need to process pointer to ctype and also CFUNCTYPES here recursively. Current processing is a single dereference
114123
new_dep_node.set_field_bitfield_size(elem_name, elem_bitfield_size)
@@ -220,6 +229,7 @@ def process_vmlinux_post_ast(
220229
containing_type,
221230
llvm_handler,
222231
handler,
232+
assignments, # Pass assignments to recursive call
223233
processing_stack,
224234
)
225235
new_dep_node.set_field_ready(elem_name, True)
@@ -237,18 +247,33 @@ def process_vmlinux_post_ast(
237247
else str(elem_type)
238248
)
239249
process_vmlinux_post_ast(
240-
elem_type, llvm_handler, handler, processing_stack
250+
elem_type,
251+
llvm_handler,
252+
handler,
253+
assignments,
254+
processing_stack,
241255
)
242256
new_dep_node.set_field_ready(elem_name, True)
243257
else:
244258
raise ValueError(
245259
f"{elem_name} with type {elem_type} from module {module_name} not supported in recursive resolver"
246260
)
247261

262+
# Add struct to assignments dictionary
263+
assignments[current_symbol_name] = AssignmentInfo(
264+
value_type=AssignmentType.STRUCT,
265+
python_type=elem_type_class,
266+
value=None,
267+
pointer_level=None,
268+
signature=None,
269+
members=members_dict,
270+
)
271+
logger.info(f"Added struct assignment info for {current_symbol_name}")
272+
248273
else:
249274
raise ImportError("UNSUPPORTED Module")
250275

251-
logging.info(
276+
logger.info(
252277
f"{current_symbol_name} processed and handler readiness {handler.is_ready}"
253278
)
254279
return True

0 commit comments

Comments
 (0)