mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
Merge pull request #21 from pythonbpf/globals
Adds support for globals SO...... *I'm not merging this because it's complete, but because I don't want it to diverge from master too much. *Stuff I still need to complete: -> Structs and eval expressions in these globals. -> handling the global keyword. -> assigning back to the global and reading from inside a function. -> Basically, `global` keyword in Python is used to write only and reading can be done directly without declaring as global as a direct assign without global declaration is going to diverge from Python. -> The above logic is going to be supported by `global_sym_tab` generated using the new order of passes that we are doing. -> This needs to be fixed and done ASAP to avoid conflicts. so yes, im gonna do it soon.
This commit is contained in:
101
tests/failing_tests/globals.py
Normal file
101
tests/failing_tests/globals.py
Normal file
@ -0,0 +1,101 @@
|
||||
import logging
|
||||
|
||||
from pythonbpf import compile, bpf, section, bpfglobal, compile_to_ir
|
||||
from ctypes import c_void_p, c_int64, c_int32
|
||||
|
||||
@bpf
|
||||
@bpfglobal
|
||||
def somevalue() -> c_int32:
|
||||
return c_int32(42)
|
||||
|
||||
@bpf
|
||||
@bpfglobal
|
||||
def somevalue2() -> c_int64:
|
||||
return c_int64(69)
|
||||
|
||||
@bpf
|
||||
@bpfglobal
|
||||
def somevalue1() -> c_int32:
|
||||
return c_int32(42)
|
||||
|
||||
|
||||
# --- Passing examples ---
|
||||
|
||||
# Simple constant return
|
||||
@bpf
|
||||
@bpfglobal
|
||||
def g1() -> c_int64:
|
||||
return c_int64(42)
|
||||
|
||||
# Constructor with one constant argument
|
||||
@bpf
|
||||
@bpfglobal
|
||||
def g2() -> c_int64:
|
||||
return c_int64(69)
|
||||
|
||||
|
||||
# --- 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)
|
||||
|
||||
# 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
|
||||
@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
|
||||
@bpfglobal
|
||||
def LICENSE() -> str:
|
||||
return "GPL"
|
||||
|
||||
|
||||
compile_to_ir("globals.py", "globals.ll", loglevel=logging.INFO)
|
||||
compile()
|
||||
21
tests/failing_tests/undeclared_values.py
Normal file
21
tests/failing_tests/undeclared_values.py
Normal file
@ -0,0 +1,21 @@
|
||||
import logging
|
||||
|
||||
from pythonbpf import compile, bpf, section, bpfglobal, compile_to_ir
|
||||
from ctypes import c_void_p, c_int64
|
||||
|
||||
# This should not pass as somevalue is not declared at all.
|
||||
@bpf
|
||||
@section("tracepoint/syscalls/sys_enter_execve")
|
||||
def sometag(ctx: c_void_p) -> c_int64:
|
||||
print("test")
|
||||
print(f"{somevalue}") # noqa: F821
|
||||
return c_int64(1)
|
||||
|
||||
@bpf
|
||||
@bpfglobal
|
||||
def LICENSE() -> str:
|
||||
return "GPL"
|
||||
|
||||
|
||||
compile_to_ir("globals.py", "globals.ll", loglevel=logging.INFO)
|
||||
compile()
|
||||
Reference in New Issue
Block a user