11import ctypes
22import logging
33
4- from ..dependency_node import Field
54from ..assignment_info import AssignmentInfo , AssignmentType
65from ..dependency_handler import DependencyHandler
76from .debug_info_gen import debug_info_generation
@@ -18,7 +17,8 @@ def __init__(self, llvm_module, handler: DependencyHandler, assignments):
1817 self .handler : DependencyHandler = handler
1918 self .generated : list [str ] = []
2019 self .generated_debug_info : list = []
21- self .generated_field_names : dict [Field , str ] = {}
20+ # Use struct_name and field_name as key instead of Field object
21+ self .generated_field_names : dict [str , dict [str , str ]] = {}
2222 self .assignments : dict [str , AssignmentInfo ] = assignments
2323 if not handler .is_ready :
2424 raise ImportError (
@@ -72,12 +72,30 @@ def struct_processor(self, struct, processing_stack=None):
7272 f"Warning: Dependency { dependency } not found in handler"
7373 )
7474
75+ # Generate IR first to populate field names
76+ self .generated_debug_info .append (
77+ (struct , self .gen_ir (struct , self .generated_debug_info ))
78+ )
79+
7580 # Fill the assignments dictionary with struct information
7681 if struct .name not in self .assignments :
7782 # Create a members dictionary for AssignmentInfo
7883 members_dict = {}
7984 for field_name , field in struct .fields .items ():
80- members_dict [field_name ] = (self .generated_field_names [field ], field )
85+ # Get the generated field name from our dictionary, or use field_name if not found
86+ if (
87+ struct .name in self .generated_field_names
88+ and field_name in self .generated_field_names [struct .name ]
89+ ):
90+ field_co_re_name = self .generated_field_names [struct .name ][
91+ field_name
92+ ]
93+ members_dict [field_name ] = (field_co_re_name , field )
94+ else :
95+ raise ValueError (
96+ f"llvm global name not found for struct field { field_name } "
97+ )
98+ # members_dict[field_name] = (field_name, field)
8199
82100 # Add struct to assignments dictionary
83101 self .assignments [struct .name ] = AssignmentInfo (
@@ -90,10 +108,6 @@ def struct_processor(self, struct, processing_stack=None):
90108 )
91109 logger .info (f"Added struct assignment info for { struct .name } " )
92110
93- # Actual processor logic here after dependencies are resolved
94- self .generated_debug_info .append (
95- (struct , self .gen_ir (struct , self .generated_debug_info ))
96- )
97111 self .generated .append (struct .name )
98112
99113 finally :
@@ -108,6 +122,11 @@ def gen_ir(self, struct, generated_debug_info):
108122 struct , self .llvm_module , generated_debug_info
109123 )
110124 field_index = 0
125+
126+ # Make sure the struct has an entry in our field names dictionary
127+ if struct .name not in self .generated_field_names :
128+ self .generated_field_names [struct .name ] = {}
129+
111130 for field_name , field in struct .fields .items ():
112131 # does not take arrays and similar types into consideration yet.
113132 if field .ctype_complex_type is not None and issubclass (
@@ -117,11 +136,27 @@ def gen_ir(self, struct, generated_debug_info):
117136 containing_type = field .containing_type
118137 if containing_type .__module__ == ctypes .__name__ :
119138 containing_type_size = ctypes .sizeof (containing_type )
139+ if array_size == 0 :
140+ field_co_re_name = self ._struct_name_generator (
141+ struct , field , field_index , True , 0 , containing_type_size
142+ )
143+ self .generated_field_names [struct .name ][field_name ] = (
144+ field_co_re_name
145+ )
146+ globvar = ir .GlobalVariable (
147+ self .llvm_module , ir .IntType (64 ), name = field_co_re_name
148+ )
149+ globvar .linkage = "external"
150+ globvar .set_metadata ("llvm.preserve.access.index" , debug_info )
151+ field_index += 1
152+ continue
120153 for i in range (0 , array_size ):
121154 field_co_re_name = self ._struct_name_generator (
122155 struct , field , field_index , True , i , containing_type_size
123156 )
124- self .generated_field_names [field ] = field_co_re_name
157+ self .generated_field_names [struct .name ][field_name ] = (
158+ field_co_re_name
159+ )
125160 globvar = ir .GlobalVariable (
126161 self .llvm_module , ir .IntType (64 ), name = field_co_re_name
127162 )
@@ -139,7 +174,9 @@ def gen_ir(self, struct, generated_debug_info):
139174 field_co_re_name = self ._struct_name_generator (
140175 struct , field , field_index , True , i , containing_type_size
141176 )
142- self .generated_field_names [field ] = field_co_re_name
177+ self .generated_field_names [struct .name ][field_name ] = (
178+ field_co_re_name
179+ )
143180 globvar = ir .GlobalVariable (
144181 self .llvm_module , ir .IntType (64 ), name = field_co_re_name
145182 )
@@ -150,7 +187,7 @@ def gen_ir(self, struct, generated_debug_info):
150187 field_co_re_name = self ._struct_name_generator (
151188 struct , field , field_index
152189 )
153- self .generated_field_names [field ] = field_co_re_name
190+ self .generated_field_names [struct . name ][ field_name ] = field_co_re_name
154191 field_index += 1
155192 globvar = ir .GlobalVariable (
156193 self .llvm_module , ir .IntType (64 ), name = field_co_re_name
0 commit comments