Skip to content

Commit f8e8c05

Browse files
committed
Refactor struct definition generation to filter kernel-defined structs based on the IR kernel_defined flag. Update include generation to handle tracepoint context and register tracepoint code generator in multiple locations.
1 parent 7f1ac4f commit f8e8c05

2 files changed

Lines changed: 21 additions & 6 deletions

File tree

src/context/tracepoint_codegen.ml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ let generate_tracepoint_includes () = [
5252
"#include <linux/types.h>";
5353
"#include <bpf/bpf_helpers.h>";
5454
"#include <bpf/bpf_tracing.h>";
55-
"#include <linux/trace_events.h>";
5655
]
5756

5857
(** Generate field access for tracepoint context *)

src/ebpf_c_codegen.ml

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -852,18 +852,19 @@ let collect_struct_definitions_from_multi_program ir_multi_prog =
852852

853853
(** Generate struct definitions *)
854854
let 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

Comments
 (0)