mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2026-02-12 16:10:59 +00:00
Compare commits
7 Commits
v0.1.4
...
253944afd2
| Author | SHA1 | Date | |
|---|---|---|---|
| 253944afd2 | |||
| 54993ce5c2 | |||
| 05083bd513 | |||
| 6e4c340780 | |||
| 9dbca410c2 | |||
| 62ca3b5ffe | |||
| f263c35156 |
@ -21,17 +21,17 @@ def last() -> HashMap:
|
|||||||
@section("tracepoint/syscalls/sys_enter_sync")
|
@section("tracepoint/syscalls/sys_enter_sync")
|
||||||
def do_trace(ctx: c_void_p) -> c_int64:
|
def do_trace(ctx: c_void_p) -> c_int64:
|
||||||
key = 0
|
key = 0
|
||||||
tsp = last().lookup(key)
|
tsp = last.lookup(key)
|
||||||
if tsp:
|
if tsp:
|
||||||
kt = ktime()
|
kt = ktime()
|
||||||
delta = kt - tsp
|
delta = kt - tsp
|
||||||
if delta < 1000000000:
|
if delta < 1000000000:
|
||||||
time_ms = delta // 1000000
|
time_ms = delta // 1000000
|
||||||
print(f"sync called within last second, last {time_ms} ms ago")
|
print(f"sync called within last second, last {time_ms} ms ago")
|
||||||
last().delete(key)
|
last.delete(key)
|
||||||
else:
|
else:
|
||||||
kt = ktime()
|
kt = ktime()
|
||||||
last().update(key, kt)
|
last.update(key, kt)
|
||||||
return c_int64(0)
|
return c_int64(0)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@ from .functions_pass import func_proc
|
|||||||
from .maps import maps_proc
|
from .maps import maps_proc
|
||||||
from .structs import structs_proc
|
from .structs import structs_proc
|
||||||
from .globals_pass import globals_processing
|
from .globals_pass import globals_processing
|
||||||
from .debuginfo import DW_LANG_C11, DwarfBehaviorEnum
|
from .debuginfo import DW_LANG_C11, DwarfBehaviorEnum, DebugInfoGenerator
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import inspect
|
import inspect
|
||||||
@ -60,33 +60,17 @@ def compile_to_ir(filename: str, output: str, loglevel=logging.WARNING):
|
|||||||
module.triple = "bpf"
|
module.triple = "bpf"
|
||||||
|
|
||||||
if not hasattr(module, "_debug_compile_unit"):
|
if not hasattr(module, "_debug_compile_unit"):
|
||||||
module._file_metadata = module.add_debug_info(
|
debug_generator = DebugInfoGenerator(module)
|
||||||
"DIFile",
|
debug_generator.generate_file_metadata(filename, os.path.dirname(filename))
|
||||||
{ # type: ignore
|
debug_generator.generate_debug_cu(
|
||||||
"filename": filename,
|
DW_LANG_C11,
|
||||||
"directory": os.path.dirname(filename),
|
f"PythonBPF {VERSION}",
|
||||||
},
|
True, # TODO: This is probably not true
|
||||||
)
|
|
||||||
|
|
||||||
module._debug_compile_unit = module.add_debug_info(
|
|
||||||
"DICompileUnit",
|
|
||||||
{ # type: ignore
|
|
||||||
"language": DW_LANG_C11,
|
|
||||||
"file": module._file_metadata, # type: ignore
|
|
||||||
"producer": f"PythonBPF {VERSION}",
|
|
||||||
"isOptimized": True, # TODO: This is probably not true
|
|
||||||
# TODO: add a global field here that keeps track of all the globals. Works without it, but I think it might
|
# TODO: add a global field here that keeps track of all the globals. Works without it, but I think it might
|
||||||
# be required for kprobes.
|
# be required for kprobes.
|
||||||
"runtimeVersion": 0,
|
True,
|
||||||
"emissionKind": 1,
|
|
||||||
"splitDebugInlining": False,
|
|
||||||
"nameTableKind": 0,
|
|
||||||
},
|
|
||||||
is_distinct=True,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
module.add_named_metadata("llvm.dbg.cu", module._debug_compile_unit) # type: ignore
|
|
||||||
|
|
||||||
processor(source, filename, module)
|
processor(source, filename, module)
|
||||||
|
|
||||||
wchar_size = module.add_metadata(
|
wchar_size = module.add_metadata(
|
||||||
|
|||||||
@ -12,6 +12,34 @@ class DebugInfoGenerator:
|
|||||||
self.module = module
|
self.module = module
|
||||||
self._type_cache = {} # Cache for common debug types
|
self._type_cache = {} # Cache for common debug types
|
||||||
|
|
||||||
|
def generate_file_metadata(self, filename, dirname):
|
||||||
|
self.module._file_metadata = self.module.add_debug_info(
|
||||||
|
"DIFile",
|
||||||
|
{ # type: ignore
|
||||||
|
"filename": filename,
|
||||||
|
"directory": dirname,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
def generate_debug_cu(
|
||||||
|
self, language, producer: str, is_optimized: bool, is_distinct: bool
|
||||||
|
):
|
||||||
|
self.module._debug_compile_unit = self.module.add_debug_info(
|
||||||
|
"DICompileUnit",
|
||||||
|
{ # type: ignore
|
||||||
|
"language": language,
|
||||||
|
"file": self.module._file_metadata, # type: ignore
|
||||||
|
"producer": producer,
|
||||||
|
"isOptimized": is_optimized,
|
||||||
|
"runtimeVersion": 0,
|
||||||
|
"emissionKind": 1,
|
||||||
|
"splitDebugInlining": False,
|
||||||
|
"nameTableKind": 0,
|
||||||
|
},
|
||||||
|
is_distinct=is_distinct,
|
||||||
|
)
|
||||||
|
self.module.add_named_metadata("llvm.dbg.cu", self.module._debug_compile_unit) # type: ignore
|
||||||
|
|
||||||
def get_basic_type(self, name: str, size: int, encoding: int) -> Any:
|
def get_basic_type(self, name: str, size: int, encoding: int) -> Any:
|
||||||
"""Get or create a basic type with caching"""
|
"""Get or create a basic type with caching"""
|
||||||
key = (name, size, encoding)
|
key = (name, size, encoding)
|
||||||
|
|||||||
@ -192,6 +192,21 @@ def handle_assign(
|
|||||||
elif isinstance(rval.func, ast.Attribute):
|
elif isinstance(rval.func, ast.Attribute):
|
||||||
logger.info(f"Assignment call attribute: {ast.dump(rval.func)}")
|
logger.info(f"Assignment call attribute: {ast.dump(rval.func)}")
|
||||||
if isinstance(rval.func.value, ast.Name):
|
if isinstance(rval.func.value, ast.Name):
|
||||||
|
if rval.func.value.id in map_sym_tab:
|
||||||
|
map_name = rval.func.value.id
|
||||||
|
method_name = rval.func.attr
|
||||||
|
if HelperHandlerRegistry.has_handler(method_name):
|
||||||
|
val = handle_helper_call(
|
||||||
|
rval,
|
||||||
|
module,
|
||||||
|
builder,
|
||||||
|
func,
|
||||||
|
local_sym_tab,
|
||||||
|
map_sym_tab,
|
||||||
|
structs_sym_tab,
|
||||||
|
)
|
||||||
|
builder.store(val[0], local_sym_tab[var_name].var)
|
||||||
|
else:
|
||||||
# TODO: probably a struct access
|
# TODO: probably a struct access
|
||||||
logger.info(f"TODO STRUCT ACCESS {ast.dump(rval)}")
|
logger.info(f"TODO STRUCT ACCESS {ast.dump(rval)}")
|
||||||
elif isinstance(rval.func.value, ast.Call) and isinstance(
|
elif isinstance(rval.func.value, ast.Call) and isinstance(
|
||||||
|
|||||||
Reference in New Issue
Block a user