From b9ddecd6b1a0e5c4d3b874285f53a18ede08cb46 Mon Sep 17 00:00:00 2001 From: Pragyansh Chaturvedi Date: Fri, 26 Sep 2025 04:44:38 +0530 Subject: [PATCH] Add string as a primitve to struct defs --- examples/execve5.py | 1 + pythonbpf/structs_pass.py | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/examples/execve5.py b/examples/execve5.py index 691f008..3f890d0 100644 --- a/examples/execve5.py +++ b/examples/execve5.py @@ -10,6 +10,7 @@ from ctypes import c_void_p, c_int64, c_int32, c_uint64 class data_t: pid: c_uint64 ts: c_uint64 + comm: str(16) @bpf diff --git a/pythonbpf/structs_pass.py b/pythonbpf/structs_pass.py index fbe06ed..65b8fcc 100644 --- a/pythonbpf/structs_pass.py +++ b/pythonbpf/structs_pass.py @@ -28,14 +28,25 @@ def process_bpf_struct(cls_node, module): for item in cls_node.body: if isinstance(item, ast.AnnAssign) and isinstance(item.target, ast.Name): + print(f"Field: {item.target.id}, Type: " + f"{ast.dump(item.annotation)}") field_names.append(item.target.id) - field_types.append(ctypes_to_ir(item.annotation.id)) + if isinstance(item.annotation, ast.Call) and isinstance(item.annotation.func, ast.Name) and item.annotation.func.id == "str": + # This is a char array with fixed length + # TODO: For now assuming str is always called with constant + field_types.append(ir.ArrayType( + ir.IntType(8), item.annotation.args[0].value)) + else: + field_types.append(ctypes_to_ir(item.annotation.id)) curr_offset = 0 for ftype in field_types: if isinstance(ftype, ir.IntType): fsize = ftype.width // 8 alignment = fsize + elif isinstance(ftype, ir.ArrayType): + fsize = ftype.count * (ftype.element.width // 8) + alignment = ftype.element.width // 8 elif isinstance(ftype, ir.PointerType): fsize = 8 alignment = 8