generate IR partly

This commit is contained in:
2025-10-25 04:40:58 +05:30
parent c6b5ecb47e
commit 028d9c2c08
3 changed files with 46 additions and 4 deletions

View File

@ -245,13 +245,17 @@ def _allocate_for_attribute(builder, var_name, rval, local_sym_tab, structs_sym_
# loaded_value = builder.load(field_ir, align=8)
# #TODO: fatal flaw that this always assumes first argument of function to be the context of what this gets.
# base_ptr = builder.function.args[0]
base_ptr = builder.function.args[0]
local_sym_tab[
struct_var
].var = base_ptr # This is repurposing of var to store the pointer of the base type
local_sym_tab[struct_var].ir_type = field_ir
# gep_result = builder.gep(
# base_ptr,
# [loaded_value],
# inbounds=False, # Not using inbounds GEP
# )
# print("DEBB", loaded_value, base_ptr, gep_result)
# print("DEBUG", loaded_value, base_ptr, gep_result)
# Use i64 for allocation since that's what the global variable contains
actual_ir_type = ir.IntType(64)

View File

@ -97,7 +97,16 @@ class VmlinuxHandler:
globvar_ir, field_data = self.get_field_type(
python_type.__name__, field_name
)
# field_index = self.get_field_index(python_type.__name__, field_name)
offset = builder.load(globvar_ir)
i8_ptr_type = ir.IntType(8).as_pointer()
byte_ptr = builder.bitcast(var_info.var, i8_ptr_type)
print(byte_ptr)
# Step 3: GEP with the offset to get field pointer
field_ptr_i8 = builder.gep(
byte_ptr, [ir.Constant(ir.IntType(32), 0), offset], inbounds=False
)
print(field_ptr_i8)
# Return pointer to field and field type
return None
else:
@ -122,3 +131,18 @@ class VmlinuxHandler:
)
else:
raise ValueError(f"{vmlinux_struct_name} is not a vmlinux struct")
def get_field_index(self, vmlinux_struct_name, field_name):
"""Get the type of a field in a vmlinux struct"""
if self.is_vmlinux_struct(vmlinux_struct_name):
python_type = self.vmlinux_symtab[vmlinux_struct_name]["python_type"]
if hasattr(python_type, field_name):
return list(
self.vmlinux_symtab[vmlinux_struct_name]["members"].keys()
).index(field_name)
else:
raise ValueError(
f"Field {field_name} not found in vmlinux struct {vmlinux_struct_name}"
)
else:
raise ValueError(f"{vmlinux_struct_name} is not a vmlinux struct")