Skip to content

Commit 3a6b98a

Browse files
committed
Enhance eBPF C code generation by adding optional BTF path parameter to struct definition functions, allowing for better filtering of kernel-defined structs.
1 parent 975ef02 commit 3a6b98a

File tree

3 files changed

+12
-12
lines changed

3 files changed

+12
-12
lines changed

src/ebpf_c_codegen.ml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -848,17 +848,17 @@ let collect_struct_definitions_from_multi_program ir_multi_prog =
848848
List.rev !struct_defs
849849

850850
(** Generate struct definitions *)
851-
let generate_struct_definitions ctx struct_defs =
851+
let generate_struct_definitions ?(btf_path=None) ctx struct_defs =
852852
(* Filter out kernel-defined structs using centralized kernel type knowledge *)
853853
let user_defined_structs = List.filter (fun (struct_name, fields) ->
854854
(* Check if this struct name is a well-known kernel type *)
855-
let is_kernel_type = Kernel_types.is_well_known_ebpf_type struct_name in
855+
let is_kernel_type = Kernel_types.is_well_known_ebpf_type ?btf_path struct_name in
856856

857857
(* Check if this struct has kernel-defined field types *)
858858
let has_kernel_field = List.exists (fun (_field_name, field_type) ->
859859
match field_type with
860-
| IRStruct (name, _) -> Kernel_types.is_well_known_ebpf_type name
861-
| IREnum (name, _) -> Kernel_types.is_well_known_ebpf_type name
860+
| IRStruct (name, _) -> Kernel_types.is_well_known_ebpf_type ?btf_path name
861+
| IREnum (name, _) -> Kernel_types.is_well_known_ebpf_type ?btf_path name
862862
| _ -> false
863863
) fields in
864864

@@ -3539,7 +3539,7 @@ let generate_c_program ?_config_declarations ir_prog =
35393539

35403540
(** Generate complete C program from multiple IR programs *)
35413541

3542-
let generate_c_multi_program ?_config_declarations ?(type_aliases=[]) ?(variable_type_aliases=[]) ir_multi_prog =
3542+
let generate_c_multi_program ?_config_declarations ?(type_aliases=[]) ?(variable_type_aliases=[]) ?(btf_path=None) ir_multi_prog =
35433543
let ctx = create_c_context () in
35443544

35453545
(* Initialize modular context code generators *)
@@ -3566,7 +3566,7 @@ let generate_c_multi_program ?_config_declarations ?(type_aliases=[]) ?(variable
35663566

35673567
(* Generate struct definitions *)
35683568
let struct_defs = collect_struct_definitions_from_multi_program ir_multi_prog in
3569-
generate_struct_definitions ctx struct_defs;
3569+
generate_struct_definitions ~btf_path ctx struct_defs;
35703570

35713571
(* Generate config maps from IR multi-program *)
35723572
if ir_multi_prog.global_configs <> [] then
@@ -3659,7 +3659,7 @@ let generate_prog_array_map ctx prog_array_size =
36593659

36603660
(** Compile multi-program IR to eBPF C code with automatic tail call detection *)
36613661
let compile_multi_to_c_with_tail_calls
3662-
?(_config_declarations=[]) ?(type_aliases=[]) ?(variable_type_aliases=[]) ?(kfunc_declarations=[]) ?symbol_table ?(tail_call_analysis=None)
3662+
?(_config_declarations=[]) ?(type_aliases=[]) ?(variable_type_aliases=[]) ?(kfunc_declarations=[]) ?symbol_table ?(tail_call_analysis=None) ?(btf_path=None)
36633663
(ir_multi_prog : Ir.ir_multi_program) =
36643664

36653665
let ctx = create_c_context () in
@@ -3759,7 +3759,7 @@ let compile_multi_to_c_with_tail_calls
37593759

37603760
(* Generate struct definitions *)
37613761
let struct_defs = collect_struct_definitions_from_multi_program ir_multi_prog in
3762-
generate_struct_definitions ctx struct_defs;
3762+
generate_struct_definitions ~btf_path ctx struct_defs;
37633763

37643764
(* Generate global map definitions BEFORE functions that use them *)
37653765
List.iter (generate_map_definition ctx) ir_multi_prog.global_maps;
@@ -3834,10 +3834,10 @@ let compile_multi_to_c ?(_config_declarations=[]) ?(type_aliases=[]) ?(variable_
38343834

38353835
(** Multi-program compilation entry point that returns both code and tail call analysis *)
38363836

3837-
let compile_multi_to_c_with_analysis ?(_config_declarations=[]) ?(type_aliases=[]) ?(variable_type_aliases=[]) ?(kfunc_declarations=[]) ?symbol_table ?(tail_call_analysis=None) ir_multi_program =
3837+
let compile_multi_to_c_with_analysis ?(_config_declarations=[]) ?(type_aliases=[]) ?(variable_type_aliases=[]) ?(kfunc_declarations=[]) ?symbol_table ?(tail_call_analysis=None) ?(btf_path=None) ir_multi_program =
38383838
(* Always use the intelligent tail call compilation that auto-detects and handles tail calls *)
38393839
let (c_code, final_tail_call_analysis) = compile_multi_to_c_with_tail_calls
3840-
~type_aliases ~variable_type_aliases ~kfunc_declarations ?symbol_table ~tail_call_analysis ir_multi_program in
3840+
~type_aliases ~variable_type_aliases ~kfunc_declarations ?symbol_table ~tail_call_analysis ~btf_path ir_multi_program in
38413841

38423842
(* Tail call analysis results calculated and stored *)
38433843
(c_code, final_tail_call_analysis)

src/main.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,7 @@ let compile_source input_file output_dir _verbose generate_makefile btf_vmlinux_
964964

965965
(* Generate eBPF C code (with updated IR and kfunc declarations) *)
966966
let (ebpf_c_code, _final_tail_call_analysis) = Ebpf_c_codegen.compile_multi_to_c_with_analysis
967-
~type_aliases ~variable_type_aliases ~kfunc_declarations ~symbol_table ~tail_call_analysis:(Some tail_call_analysis) updated_optimized_ir in
967+
~type_aliases ~variable_type_aliases ~kfunc_declarations ~symbol_table ~tail_call_analysis:(Some tail_call_analysis) ~btf_path:btf_vmlinux_path updated_optimized_ir in
968968

969969
(* Analyze kfunc dependencies for automatic kernel module loading *)
970970
let ir_functions = List.map (fun prog -> prog.Ir.entry_function) ir_with_ring_buffer_analysis.programs in

tests/test_ebpf_c_codegen.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ let test_kernel_struct_filtering () =
641641

642642
(* Generate struct definitions using the filtering logic *)
643643
let ctx = create_c_context () in
644-
generate_struct_definitions ctx struct_defs;
644+
generate_struct_definitions ~btf_path:None ctx struct_defs;
645645

646646
let output = String.concat "\n" ctx.output_lines in
647647

0 commit comments

Comments
 (0)