From 3eb3d78cf8d7b2f1aa57d70d7610a451a561f096 Mon Sep 17 00:00:00 2001 From: ssy <879650736@qq.com> Date: Sat, 7 Mar 2026 18:08:02 +0800 Subject: [PATCH] fix bugs in examples/ringbuf_demo --- src/ebpf_c_codegen.ml | 5 ++++- src/userspace_codegen.ml | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/ebpf_c_codegen.ml b/src/ebpf_c_codegen.ml index 3f85ff0..975d715 100644 --- a/src/ebpf_c_codegen.ml +++ b/src/ebpf_c_codegen.ml @@ -2559,7 +2559,10 @@ and generate_assignment ctx dest_val expr is_const = | IRValue src_val -> (* Simple value assignment *) let dest_str = generate_c_value ctx dest_val in - let src_str = generate_c_value ctx src_val in + (* Auto-dereference map access to get the value, not the pointer *) + let src_str = (match src_val.value_desc with + | IRMapAccess (_, _, _) -> generate_c_value ~auto_deref_map_access:true ctx src_val + | _ -> generate_c_value ctx src_val) in emit_line ctx (sprintf "%s%s = %s;" assignment_prefix dest_str src_str) | _ -> (* Other expressions *) diff --git a/src/userspace_codegen.ml b/src/userspace_codegen.ml index db58538..16f865e 100644 --- a/src/userspace_codegen.ml +++ b/src/userspace_codegen.ml @@ -2811,6 +2811,19 @@ let generate_pinned_globals_support _project_name global_variables = (** Generate ring buffer event handler functions *) let generate_ringbuf_handlers_from_registry (registry : Ir.ir_ring_buffer_registry) ~dispatch_used = + (* Generate forward declarations for callback functions *) + let forward_declarations = List.map (fun rb_decl -> + let ringbuf_name = rb_decl.rb_name in + let value_type = c_type_from_ir_type rb_decl.rb_value_type in + let handler_name = match List.assoc_opt ringbuf_name registry.event_handler_registrations with + | Some handler -> handler + | None -> + (* Try callback function naming convention: {ringbuf_name}_callback *) + ringbuf_name ^ "_callback" + in + sprintf "int %s(%s *event);" handler_name value_type + ) registry.ring_buffer_declarations |> String.concat "\n" in + let event_handlers = List.map (fun rb_decl -> let ringbuf_name = rb_decl.rb_name in let value_type = c_type_from_ir_type rb_decl.rb_value_type in @@ -2836,7 +2849,11 @@ static int %s_event_handler(void *ctx, void *data, size_t data_sz) { else "" in (* Only generate event handlers if dispatch is actually used *) - let final_event_handlers = if dispatch_used then event_handlers else "" in + let final_event_handlers = if dispatch_used then + if List.length registry.ring_buffer_declarations > 0 then + sprintf "\n// Forward declarations for ring buffer callbacks\n%s\n%s" forward_declarations event_handlers + else "" + else "" in final_event_handlers ^ combined_rb_declaration