add global symbol table populate function

This commit is contained in:
2025-10-05 14:02:46 +05:30
parent a049796b81
commit ed196caebf
3 changed files with 40 additions and 8 deletions

View File

@ -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)

View File

@ -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")

View File

@ -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