@@ -852,18 +852,19 @@ let collect_struct_definitions_from_multi_program ir_multi_prog =
852852
853853(* * Generate struct definitions *)
854854let generate_struct_definitions ctx struct_defs =
855- (* Filter out kernel-defined structs that are provided by kernel headers *)
856- let user_defined_structs = List. filter (fun (struct_name , fields ) ->
857- (* Check if any field indicates this is a kernel-defined struct *)
855+ (* Filter out kernel-defined structs based on IR kernel_defined flag *)
856+ let user_defined_structs = List. filter (fun (_struct_name , fields ) ->
857+ (* Check if this struct itself is kernel-defined or has kernel-defined fields *)
858858 let has_kernel_field = List. exists (fun (_field_name , field_type ) ->
859859 match field_type with
860860 | IRStruct (_ , _ , kernel_defined ) -> kernel_defined
861861 | IREnum (_ , _ , kernel_defined ) -> kernel_defined
862862 | _ -> false
863863 ) fields in
864864
865- (* Include all user-defined structs (no special treatment for struct_ops) *)
866- not has_kernel_field && not (Kernel_types. is_well_known_ebpf_type struct_name)
865+ (* Only filter based on kernel_defined flag from IR, not struct name *)
866+ (* User-defined structs should be generated regardless of their name *)
867+ not has_kernel_field
867868 ) struct_defs in
868869
869870 if user_defined_structs <> [] then (
@@ -1129,6 +1130,7 @@ let generate_includes ctx ?(program_types=[]) ?(include_builtin_headers=false) (
11291130 | Ast. Xdp -> Some " xdp"
11301131 | Ast. Tc -> Some " tc"
11311132 | Ast. Kprobe -> Some " kprobe"
1133+ | Ast. Tracepoint -> Some " tracepoint"
11321134 | _ -> None
11331135 in
11341136 match context_type with
@@ -1176,7 +1178,13 @@ let generate_includes ctx ?(program_types=[]) ?(include_builtin_headers=false) (
11761178 ] in
11771179 let additional_includes = List. filter (fun inc ->
11781180 not (List. mem inc kprobe_includes)) all_additional_includes in
1181+
1182+ (* Add context-specific includes for non-kprobe programs *)
1183+ let filtered_context_includes = List. filter (fun inc ->
1184+ not (List. mem inc kprobe_includes) && not (List. mem inc additional_includes)) unique_context_includes in
1185+
11791186 List. iter (emit_line ctx) additional_includes;
1187+ List. iter (emit_line ctx) filtered_context_includes;
11801188 emit_blank_line ctx
11811189 ) else (
11821190 (* For non-kprobe programs, use standard processing *)
@@ -3551,6 +3559,8 @@ let generate_c_multi_program ?_config_declarations ?(type_aliases=[]) ?(variable
35513559 (* Initialize modular context code generators *)
35523560 Kernelscript_context.Xdp_codegen. register () ;
35533561 Kernelscript_context.Tc_codegen. register () ;
3562+ Kernelscript_context.Kprobe_codegen. register () ;
3563+ Kernelscript_context.Tracepoint_codegen. register () ;
35543564
35553565 (* Store variable type aliases for later lookup *)
35563566 ctx.variable_type_aliases < - variable_type_aliases;
@@ -3668,6 +3678,12 @@ let compile_multi_to_c_with_tail_calls
36683678
36693679 let ctx = create_c_context () in
36703680
3681+ (* Initialize modular context code generators *)
3682+ Kernelscript_context.Xdp_codegen. register () ;
3683+ Kernelscript_context.Tc_codegen. register () ;
3684+ Kernelscript_context.Kprobe_codegen. register () ;
3685+ Kernelscript_context.Tracepoint_codegen. register () ;
3686+
36713687 (* Generate headers and includes *)
36723688 let program_types = List. map (fun ir_prog -> ir_prog.program_type) ir_multi_prog.programs in
36733689 generate_includes ctx ~program_types () ;
0 commit comments