diff --git a/pythonbpf/codegen.py b/pythonbpf/codegen.py index 5db9f88..16e4bf2 100644 --- a/pythonbpf/codegen.py +++ b/pythonbpf/codegen.py @@ -55,6 +55,7 @@ def processor(source_code, filename, module): func_proc(tree, module, bpf_chunks, map_sym_tab, structs_sym_tab) globals_list_creation(tree, module) + return structs_sym_tab, map_sym_tab def compile_to_ir(filename: str, output: str, loglevel=logging.INFO): @@ -80,7 +81,7 @@ def compile_to_ir(filename: str, output: str, loglevel=logging.INFO): True, ) - processor(source, filename, module) + structs_sym_tab, maps_sym_tab = processor(source, filename, module) wchar_size = module.add_metadata( [ @@ -127,7 +128,7 @@ def compile_to_ir(filename: str, output: str, loglevel=logging.INFO): f.write(str(module)) f.write("\n") - return output + return output, structs_sym_tab, maps_sym_tab def _run_llc(ll_file, obj_file): @@ -165,15 +166,14 @@ def compile(loglevel=logging.INFO) -> bool: ll_file = Path("/tmp") / caller_file.with_suffix(".ll").name o_file = caller_file.with_suffix(".o") - success = True - success = ( - compile_to_ir(str(caller_file), str(ll_file), loglevel=loglevel) and success - ) + compile_to_ir(str(caller_file), str(ll_file), loglevel=loglevel) - success = _run_llc(ll_file, o_file) and success + if not _run_llc(ll_file, o_file): + logger.error("Compilation to object file failed.") + return False logger.info(f"Object written to {o_file}") - return success + return True def BPF(loglevel=logging.INFO) -> BpfProgram: @@ -189,7 +189,11 @@ def BPF(loglevel=logging.INFO) -> BpfProgram: f.write(src) f.flush() source = f.name - compile_to_ir(source, str(inter.name), loglevel=loglevel) + _, structs_sym_tab, maps_sym_tab = compile_to_ir( + source, str(inter.name), loglevel=loglevel + ) _run_llc(str(inter.name), str(obj_file.name)) - return BpfProgram(str(obj_file.name)) + return BpfProgram( + str(obj_file.name), structs=structs_sym_tab, maps=maps_sym_tab + )