mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
fix context debug info repetition circular reference error
This commit is contained in:
@ -49,16 +49,27 @@ def generate_function_debug_info(
|
|||||||
"The first argument should always be a pointer to a struct or a void pointer"
|
"The first argument should always be a pointer to a struct or a void pointer"
|
||||||
)
|
)
|
||||||
context_debug_info = VmlinuxHandlerRegistry.get_struct_debug_info(annotation.id)
|
context_debug_info = VmlinuxHandlerRegistry.get_struct_debug_info(annotation.id)
|
||||||
|
|
||||||
|
# Create pointer to context this must be created fresh for each function
|
||||||
|
# to avoid circular reference issues when the same struct is used in multiple functions
|
||||||
pointer_to_context_debug_info = generator.create_pointer_type(
|
pointer_to_context_debug_info = generator.create_pointer_type(
|
||||||
context_debug_info, 64
|
context_debug_info, 64
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Create subroutine type - also fresh for each function
|
||||||
subroutine_type = generator.create_subroutine_type(
|
subroutine_type = generator.create_subroutine_type(
|
||||||
return_type, pointer_to_context_debug_info
|
return_type, pointer_to_context_debug_info
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Create local variable - fresh for each function with unique name
|
||||||
context_local_variable = generator.create_local_variable_debug_info(
|
context_local_variable = generator.create_local_variable_debug_info(
|
||||||
leading_argument_name, 1, pointer_to_context_debug_info
|
leading_argument_name, 1, pointer_to_context_debug_info
|
||||||
)
|
)
|
||||||
|
|
||||||
retained_nodes = [context_local_variable]
|
retained_nodes = [context_local_variable]
|
||||||
|
logger.info(f"Generating debug info for function {func_node.name}")
|
||||||
|
|
||||||
|
# Create subprogram with is_distinct=True to ensure each function gets unique debug info
|
||||||
subprogram_debug_info = generator.create_subprogram(
|
subprogram_debug_info = generator.create_subprogram(
|
||||||
func_node.name, subroutine_type, retained_nodes
|
func_node.name, subroutine_type, retained_nodes
|
||||||
)
|
)
|
||||||
|
|||||||
@ -3,6 +3,12 @@ from pythonbpf import bpf, section, bpfglobal, compile_to_ir, compile
|
|||||||
from vmlinux import struct_xdp_md
|
from vmlinux import struct_xdp_md
|
||||||
from vmlinux import XDP_PASS
|
from vmlinux import XDP_PASS
|
||||||
|
|
||||||
|
@bpf
|
||||||
|
@section("xdp")
|
||||||
|
def print_xdp_dat2a(ct2x: struct_xdp_md) -> c_int64:
|
||||||
|
data = ct2x.data # 32-bit field: packet start pointer
|
||||||
|
print(f"ct2x->data = {data}")
|
||||||
|
return c_int64(XDP_PASS)
|
||||||
|
|
||||||
@bpf
|
@bpf
|
||||||
@section("xdp")
|
@section("xdp")
|
||||||
@ -12,13 +18,6 @@ def print_xdp_data(ctx: struct_xdp_md) -> c_int64:
|
|||||||
print(f"ctx->data = {something}")
|
print(f"ctx->data = {something}")
|
||||||
return c_int64(XDP_PASS)
|
return c_int64(XDP_PASS)
|
||||||
|
|
||||||
@bpf
|
|
||||||
@section("xdp")
|
|
||||||
def print_xdp_dat2a(ct2x: struct_xdp_md) -> c_int64:
|
|
||||||
data = ct2x.data # 32-bit field: packet start pointer
|
|
||||||
print(f"ct2x->data = {data}")
|
|
||||||
return c_int64(XDP_PASS)
|
|
||||||
|
|
||||||
@bpf
|
@bpf
|
||||||
@bpfglobal
|
@bpfglobal
|
||||||
def LICENSE() -> str:
|
def LICENSE() -> str:
|
||||||
|
|||||||
Reference in New Issue
Block a user