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