11import ctypes
22import logging
3+
4+ from ..dependency_node import Field
5+ from ..assignment_info import AssignmentInfo , AssignmentType
36from ..dependency_handler import DependencyHandler
47from .debug_info_gen import debug_info_generation
58from ..dependency_node import DependencyNode
1013
1114class IRGenerator :
1215 # get the assignments dict and add this stuff to it.
13- def __init__ (self , llvm_module , handler : DependencyHandler , assignment = None ):
16+ def __init__ (self , llvm_module , handler : DependencyHandler , assignments ):
1417 self .llvm_module = llvm_module
1518 self .handler : DependencyHandler = handler
1619 self .generated : list [str ] = []
1720 self .generated_debug_info : list = []
21+ self .generated_field_names : dict [Field , str ] = {}
22+ self .assignments : dict [str , AssignmentInfo ] = assignments
1823 if not handler .is_ready :
1924 raise ImportError (
2025 "Semantic analysis of vmlinux imports failed. Cannot generate IR"
@@ -67,6 +72,24 @@ def struct_processor(self, struct, processing_stack=None):
6772 f"Warning: Dependency { dependency } not found in handler"
6873 )
6974
75+ # Fill the assignments dictionary with struct information
76+ if struct .name not in self .assignments :
77+ # Create a members dictionary for AssignmentInfo
78+ members_dict = {}
79+ for field_name , field in struct .fields .items ():
80+ members_dict [field_name ] = (self .generated_field_names [field ], field )
81+
82+ # Add struct to assignments dictionary
83+ self .assignments [struct .name ] = AssignmentInfo (
84+ value_type = AssignmentType .STRUCT ,
85+ python_type = struct .ctype_struct ,
86+ value = None ,
87+ pointer_level = None ,
88+ signature = None ,
89+ members = members_dict ,
90+ )
91+ logger .info (f"Added struct assignment info for { struct .name } " )
92+
7093 # Actual processor logic here after dependencies are resolved
7194 self .generated_debug_info .append (
7295 (struct , self .gen_ir (struct , self .generated_debug_info ))
@@ -98,6 +121,7 @@ def gen_ir(self, struct, generated_debug_info):
98121 field_co_re_name = self ._struct_name_generator (
99122 struct , field , field_index , True , i , containing_type_size
100123 )
124+ self .generated_field_names [field ] = field_co_re_name
101125 globvar = ir .GlobalVariable (
102126 self .llvm_module , ir .IntType (64 ), name = field_co_re_name
103127 )
@@ -115,6 +139,7 @@ def gen_ir(self, struct, generated_debug_info):
115139 field_co_re_name = self ._struct_name_generator (
116140 struct , field , field_index , True , i , containing_type_size
117141 )
142+ self .generated_field_names [field ] = field_co_re_name
118143 globvar = ir .GlobalVariable (
119144 self .llvm_module , ir .IntType (64 ), name = field_co_re_name
120145 )
@@ -125,6 +150,7 @@ def gen_ir(self, struct, generated_debug_info):
125150 field_co_re_name = self ._struct_name_generator (
126151 struct , field , field_index
127152 )
153+ self .generated_field_names [field ] = field_co_re_name
128154 field_index += 1
129155 globvar = ir .GlobalVariable (
130156 self .llvm_module , ir .IntType (64 ), name = field_co_re_name
0 commit comments