Skip to content

Commit 1ea44dd

Browse files
committed
Use pointer arithmetic to resolve vmlinux struct fields
1 parent 96216d4 commit 1ea44dd

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

pythonbpf/vmlinux_parser/vmlinux_exports_handler.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,24 @@ def handle_vmlinux_struct_field(
9797
globvar_ir, field_data = self.get_field_type(
9898
python_type.__name__, field_name
9999
)
100-
# field_index = self.get_field_index(python_type.__name__, field_name)
100+
101+
# Load the offset value
101102
offset = builder.load(globvar_ir)
103+
104+
# Convert pointer to integer
105+
i64_type = ir.IntType(64)
106+
ptr_as_int = builder.ptrtoint(var_info.var, i64_type)
107+
108+
# Add the offset
109+
field_addr = builder.add(ptr_as_int, offset)
110+
111+
# Convert back to pointer
102112
i8_ptr_type = ir.IntType(8).as_pointer()
103-
byte_ptr = builder.bitcast(var_info.var, i8_ptr_type)
104-
print(byte_ptr)
105-
# Step 3: GEP with the offset to get field pointer
106-
field_ptr_i8 = builder.gep(
107-
byte_ptr, [ir.Constant(ir.IntType(32), 0), offset], inbounds=False
108-
)
109-
print(field_ptr_i8)
113+
field_ptr_i8 = builder.inttoptr(field_addr, i8_ptr_type)
114+
logger.info(f"field_ptr_i8: {field_ptr_i8}")
115+
110116
# Return pointer to field and field type
111-
return None
117+
return field_ptr_i8, field_data
112118
else:
113119
raise RuntimeError("Variable accessed not found in symbol table")
114120

0 commit comments

Comments
 (0)