mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
fix broken IR generation logic for globals
This commit is contained in:
@ -34,11 +34,11 @@ def emit_global(module: ir.Module, node, name):
|
|||||||
|
|
||||||
# constructor call like "return c_int64(0)" or dataclass(...)
|
# constructor call like "return c_int64(0)" or dataclass(...)
|
||||||
elif isinstance(init_val, ast.Call):
|
elif isinstance(init_val, ast.Call):
|
||||||
if len(init_val.args) == 1 and isinstance(init_val.args[0], ast.Constant):
|
if len(init_val.args) >= 1 and isinstance(init_val.args[0], ast.Constant):
|
||||||
llvm_init = ir.Constant(ty, init_val.args[0].value)
|
llvm_init = ir.Constant(ty, init_val.args[0].value)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Complex constructor not supported: {ast.dump(init_val)}")
|
logger.info("Defaulting to zero as no constant argument found")
|
||||||
|
llvm_init = ir.Constant(ty, 0)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Unsupported return expr {ast.dump(init_val)}")
|
raise ValueError(f"Unsupported return expr {ast.dump(init_val)}")
|
||||||
|
|
||||||
@ -49,7 +49,6 @@ def emit_global(module: ir.Module, node, name):
|
|||||||
gvar.global_constant = False
|
gvar.global_constant = False
|
||||||
return gvar
|
return gvar
|
||||||
|
|
||||||
|
|
||||||
def globals_processing(tree, module):
|
def globals_processing(tree, module):
|
||||||
"""Process stuff decorated with @bpf and @bpfglobal except license and return the section name"""
|
"""Process stuff decorated with @bpf and @bpfglobal except license and return the section name"""
|
||||||
globals_sym_tab = []
|
globals_sym_tab = []
|
||||||
|
|||||||
@ -18,6 +18,73 @@ def somevalue2() -> c_int64:
|
|||||||
def somevalue1() -> c_int32:
|
def somevalue1() -> c_int32:
|
||||||
return c_int32(0)
|
return c_int32(0)
|
||||||
|
|
||||||
|
import ast
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
# --- Passing examples ---
|
||||||
|
|
||||||
|
# Simple constant return
|
||||||
|
@bpf
|
||||||
|
@bpfglobal
|
||||||
|
def g1() -> c_int64:
|
||||||
|
return 42
|
||||||
|
|
||||||
|
# Constructor with one constant argument
|
||||||
|
@bpf
|
||||||
|
@bpfglobal
|
||||||
|
def g2() -> c_int64:
|
||||||
|
return c_int64(0)
|
||||||
|
|
||||||
|
|
||||||
|
# --- Failing examples ---
|
||||||
|
|
||||||
|
# No return annotation
|
||||||
|
# @bpf
|
||||||
|
# @bpfglobal
|
||||||
|
# def g3():
|
||||||
|
# return 42
|
||||||
|
|
||||||
|
# Return annotation is complex
|
||||||
|
# @bpf
|
||||||
|
# @bpfglobal
|
||||||
|
# def g4() -> List[int]:
|
||||||
|
# return []
|
||||||
|
|
||||||
|
# # Return is missing
|
||||||
|
# @bpf
|
||||||
|
# @bpfglobal
|
||||||
|
# def g5() -> c_int64:
|
||||||
|
# pass
|
||||||
|
|
||||||
|
# # 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)
|
||||||
|
|
||||||
|
# Constructor with multiple args
|
||||||
|
#TODO: this is not working. should it work ?
|
||||||
|
@bpf
|
||||||
|
@bpfglobal
|
||||||
|
def g7() -> c_int64:
|
||||||
|
return c_int64(1, 2)
|
||||||
|
|
||||||
|
# Dataclass call
|
||||||
|
#TODO: fails with dataclass
|
||||||
|
# @dataclass
|
||||||
|
# class Point:
|
||||||
|
# x: c_int64
|
||||||
|
# y: c_int64
|
||||||
|
|
||||||
|
# @bpf
|
||||||
|
# @bpfglobal
|
||||||
|
# def g8() -> Point:
|
||||||
|
# return Point(1, 2)
|
||||||
|
|
||||||
|
|
||||||
@bpf
|
@bpf
|
||||||
@section("tracepoint/syscalls/sys_enter_execve")
|
@section("tracepoint/syscalls/sys_enter_execve")
|
||||||
def sometag(ctx: c_void_p) -> c_int64:
|
def sometag(ctx: c_void_p) -> c_int64:
|
||||||
|
|||||||
Reference in New Issue
Block a user