From ed196caebfaf8a9987403686618094d0c09bccdc Mon Sep 17 00:00:00 2001 From: varun-r-mallya Date: Sun, 5 Oct 2025 14:02:46 +0530 Subject: [PATCH] add global symbol table populate function --- pythonbpf/codegen.py | 7 ++++++- pythonbpf/globals_pass.py | 24 ++++++++++++++++++++++++ tests/failing_tests/globals.py | 17 ++++++++++------- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/pythonbpf/codegen.py b/pythonbpf/codegen.py index 7ccd49d..f1be840 100644 --- a/pythonbpf/codegen.py +++ b/pythonbpf/codegen.py @@ -4,7 +4,11 @@ from .license_pass import license_processing from .functions import func_proc from .maps import maps_proc from .structs import structs_proc -from .globals_pass import globals_list_creation, globals_processing +from .globals_pass import ( + globals_list_creation, + globals_processing, + populate_global_symbol_table, +) from .debuginfo import DW_LANG_C11, DwarfBehaviorEnum, DebugInfoGenerator import os import subprocess @@ -40,6 +44,7 @@ def processor(source_code, filename, module): for func_node in bpf_chunks: logger.info(f"Found BPF function/struct: {func_node.name}") + populate_global_symbol_table(tree, module) license_processing(tree, module) globals_processing(tree, module) diff --git a/pythonbpf/globals_pass.py b/pythonbpf/globals_pass.py index b73a072..1e97763 100644 --- a/pythonbpf/globals_pass.py +++ b/pythonbpf/globals_pass.py @@ -7,6 +7,30 @@ from .type_deducer import ctypes_to_ir logger: Logger = logging.getLogger(__name__) +# TODO: this is going to be a huge fuck of a headache in the future. +global_sym_tab = [] + + +def populate_global_symbol_table(tree, module: ir.Module): + for node in tree.body: + if isinstance(node, ast.FunctionDef): + for dec in node.decorator_list: + if ( + isinstance(dec, ast.Call) + and isinstance(dec.func, ast.Name) + and dec.func.id == "section" + and len(dec.args) == 1 + and isinstance(dec.args[0], ast.Constant) + and isinstance(dec.args[0].value, str) + ): + global_sym_tab.append(node) + elif isinstance(dec, ast.Name) and dec.id == "bpfglobal": + global_sym_tab.append(node) + + elif isinstance(dec, ast.Name) and dec.id == "map": + global_sym_tab.append(node) + return False + def emit_global(module: ir.Module, node, name): logger.info(f"global identifier {name} processing") diff --git a/tests/failing_tests/globals.py b/tests/failing_tests/globals.py index 02c604e..55d9740 100644 --- a/tests/failing_tests/globals.py +++ b/tests/failing_tests/globals.py @@ -25,7 +25,7 @@ def somevalue1() -> c_int32: @bpf @bpfglobal def g1() -> c_int64: - return 42 + return c_int64(42) # Constructor with one constant argument @bpf @@ -56,18 +56,18 @@ def g2() -> c_int64: # # Return is a variable reference # #TODO: maybe fix this sometime later. It defaults to 0 -CONST = 5 -@bpf -@bpfglobal -def g6() -> c_int64: - return c_int64(CONST) +# CONST = 5 +# @bpf +# @bpfglobal +# def g6() -> c_int64: +# return c_int64(CONST) # Constructor with multiple args #TODO: this is not working. should it work ? @bpf @bpfglobal def g7() -> c_int64: - return c_int64(1, 2) + return c_int64(1) # Dataclass call #TODO: fails with dataclass @@ -86,6 +86,9 @@ def g7() -> c_int64: @section("tracepoint/syscalls/sys_enter_execve") def sometag(ctx: c_void_p) -> c_int64: print("test") + global somevalue + somevalue = 2 + print(f"{somevalue}") return c_int64(1) @bpf