mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
fix nested pointers issue in array generation and also fix zero length array IR generation
This commit is contained in:
@ -86,6 +86,7 @@ class IRGenerator:
|
|||||||
members_dict = {}
|
members_dict = {}
|
||||||
for field_name, field in struct.fields.items():
|
for field_name, field in struct.fields.items():
|
||||||
# Get the generated field name from our dictionary, or use field_name if not found
|
# Get the generated field name from our dictionary, or use field_name if not found
|
||||||
|
print(f"DEBUG: {struct.name}, {field_name}")
|
||||||
if (
|
if (
|
||||||
struct.name in self.generated_field_names
|
struct.name in self.generated_field_names
|
||||||
and field_name in self.generated_field_names[struct.name]
|
and field_name in self.generated_field_names[struct.name]
|
||||||
@ -181,12 +182,25 @@ class IRGenerator:
|
|||||||
containing_type = field.containing_type
|
containing_type = field.containing_type
|
||||||
if containing_type.__module__ == "vmlinux":
|
if containing_type.__module__ == "vmlinux":
|
||||||
print(struct)
|
print(struct)
|
||||||
containing_type_size = self.handler[
|
# Unwrap all pointer layers to get the base struct type
|
||||||
containing_type.__name__
|
base_containing_type = containing_type
|
||||||
].current_offset
|
while hasattr(base_containing_type, "_type_"):
|
||||||
for i in range(0, array_size):
|
next_type = base_containing_type._type_
|
||||||
|
# Stop if _type_ is a string (like 'c' for c_char)
|
||||||
|
#TODO: stacked pointers not handl;ing ctypes check here as well
|
||||||
|
if isinstance(next_type, str):
|
||||||
|
break
|
||||||
|
base_containing_type = next_type
|
||||||
|
|
||||||
|
# Get the base struct name
|
||||||
|
base_struct_name = base_containing_type.__name__ if hasattr(base_containing_type, "__name__") else str(base_containing_type)
|
||||||
|
|
||||||
|
# Look up the size using the base struct name
|
||||||
|
containing_type_size = self.handler[base_struct_name].current_offset
|
||||||
|
print(f"GAY: {array_size}, {struct.name}, {field_name}")
|
||||||
|
if array_size == 0:
|
||||||
field_co_re_name, returned = self._struct_name_generator(
|
field_co_re_name, returned = self._struct_name_generator(
|
||||||
struct, field, field_index, True, i, containing_type_size
|
struct, field, field_index, True, 0, containing_type_size
|
||||||
)
|
)
|
||||||
globvar = ir.GlobalVariable(
|
globvar = ir.GlobalVariable(
|
||||||
self.llvm_module, ir.IntType(64), name=field_co_re_name
|
self.llvm_module, ir.IntType(64), name=field_co_re_name
|
||||||
@ -194,7 +208,19 @@ class IRGenerator:
|
|||||||
globvar.linkage = "external"
|
globvar.linkage = "external"
|
||||||
globvar.set_metadata("llvm.preserve.access.index", debug_info)
|
globvar.set_metadata("llvm.preserve.access.index", debug_info)
|
||||||
self.generated_field_names[struct.name][field_name] = globvar
|
self.generated_field_names[struct.name][field_name] = globvar
|
||||||
field_index += 1
|
field_index += 1
|
||||||
|
else:
|
||||||
|
for i in range(0, array_size):
|
||||||
|
field_co_re_name, returned = self._struct_name_generator(
|
||||||
|
struct, field, field_index, True, i, containing_type_size
|
||||||
|
)
|
||||||
|
globvar = ir.GlobalVariable(
|
||||||
|
self.llvm_module, ir.IntType(64), name=field_co_re_name
|
||||||
|
)
|
||||||
|
globvar.linkage = "external"
|
||||||
|
globvar.set_metadata("llvm.preserve.access.index", debug_info)
|
||||||
|
self.generated_field_names[struct.name][field_name] = globvar
|
||||||
|
field_index += 1
|
||||||
else:
|
else:
|
||||||
field_co_re_name, returned = self._struct_name_generator(
|
field_co_re_name, returned = self._struct_name_generator(
|
||||||
struct, field, field_index
|
struct, field, field_index
|
||||||
|
|||||||
Reference in New Issue
Block a user