Hi Piyush, On 7/17/25 05:13, Piyush Raj wrote: > This patch adds new DejaGnu target board for BPF that enables execution > testing > of BPF programs using the `bpf-vmtest-tool` script in the contrib directory.
Sorry for the delay. I am hoping Thomas or Jose can chime in who know a bit more about dejagnu integration than I do. FWIW I think the approach is quite sensible. A couple of little notes below. > > Signed-off-by: Piyush Raj <piyushraj92...@gmail.com> > --- > gcc/Makefile.in | 1 + > gcc/testsuite/boards/bpf.exp | 63 +++++++++++++++++++ > .../gcc.target/bpf/bpf-testool-demo.c | 25 ++++++++ > 3 files changed, 89 insertions(+) > create mode 100644 gcc/testsuite/boards/bpf.exp > create mode 100644 gcc/testsuite/gcc.target/bpf/bpf-testool-demo.c > > diff --git a/gcc/Makefile.in b/gcc/Makefile.in > index 56fa5ac25ff..e3c4e6e14a3 100644 > --- a/gcc/Makefile.in > +++ b/gcc/Makefile.in > @@ -4562,6 +4562,7 @@ site.exp: ./config.status Makefile > fi > echo "set tmpdir $(objdir)/testsuite" >> ./site.tmp > @echo "set srcdir \"\$${srcdir}/testsuite\"" >> ./site.tmp > + @echo "lappend boards_dir \"\$${srcdir}/boards\"" >> ./site.tmp > @if [ "X$(ALT_CC_UNDER_TEST)" != "X" ] ; then \ > echo "set ALT_CC_UNDER_TEST \"$(ALT_CC_UNDER_TEST)\"" >> ./site.tmp; \ > else true; \ > diff --git a/gcc/testsuite/boards/bpf.exp b/gcc/testsuite/boards/bpf.exp > new file mode 100644 > index 00000000000..ed99d4a0b83 > --- /dev/null > +++ b/gcc/testsuite/boards/bpf.exp > @@ -0,0 +1,63 @@ > +load_lib "standard.exp" > +set_board_info target_install {bpf-unknown-none} > +set_board_info generic_name bpf > +set_board_info mathlib "" > +unset_board_info isremote > +set_board_info isremote "0" > + > +set BPF_GCC_FLAGS "-D__TARGET_ARCH_x86_64 -gbtf -std=gnu17 > -I/usr/local/include -I/usr/include" > +proc bpf_compile {source destfile type options} { > + global BPF_GCC_FLAGS > + > + if { $type == "executable" } { > + # We don't actually link now; we just need the object file > + set type "object" > + lappend options "additional_flags=$BPF_GCC_FLAGS" > + puts $options > + return [default_target_compile $source $destfile $type $options] > + } > + return [default_target_compile $source $destfile $type $options] > +} > + > +proc bpf_load {dest prog args} { > + global srcdir > + # Construct command > + set python3 [find_python3] > + if {$python3 == ""} { > + error "Cannot find python3 in $PATH" > + } > + set script_path "$srcdir/../../contrib/bpf-vmtest-tool/main.py" > + set bpf_object $prog > + > + set args [list $script_path -k 6.15 --bpf-obj $prog] Probably we will want to be able to pass the kernel version as an arg, even if just from RUNTESTFLAGS to override the default. (I think having a default of e.g. 6.15 is perfectly sensible though) > + set status [remote_exec $dest $python3 $args] > + set exit_code [lindex $status 0] > + set output [lindex $status 1] > + > + if { $exit_code < 0 } { > + verbose -log "Couldn't execute $prog: $output" > + return "unresolved" > + } > + > + verbose -log "Executed $prog, exit_code $exit_code" > + if {$output ne ""} { > + verbose -log -- $output 2 > + } > + > + if { $exit_code == 0 } { > + return [list "pass" $output] > + } else { > + return [list "fail" $output] > + } > +} > + > + > +proc find_python3 {} { > + foreach candidate {python3 python} { > + set path [which $candidate] > + if {$path != ""} { > + return $path > + } > + } > + return "" > +} > \ No newline at end of file > diff --git a/gcc/testsuite/gcc.target/bpf/bpf-testool-demo.c > b/gcc/testsuite/gcc.target/bpf/bpf-testool-demo.c > new file mode 100644 > index 00000000000..8d3d0c56909 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/bpf-testool-demo.c > @@ -0,0 +1,25 @@ > +// { dg-do run } > +// how to do tourture testing ? I *think* you may just need to set ADDITIONAL_TORTURE_OPTIONS before loading gcc-dg.exp in bpf.exp. Looking in testsuite/lib/gcc-dg.exp, looks like gcc-dg-runtest may handle the rest? I have also seen some other targets running tests with multiple sets of options with a simple loop in e.g. riscv.exp like foreach opt { {-O2} {-O3} {-Ofast} ... } { dg-runtest ... } > +/* { dg-options "-O2" }*/ > +> +#include "vmlinux.h" > +#include <bpf/bpf_helpers.h> > +#include <bpf/bpf_tracing.h> > +#include <bpf/bpf_core_read.h> > + > +char LICENSE[] SEC("license") = "GPL"; > + > +int example_pid = 0; > + > +SEC("tracepoint/syscalls/sys_enter_openat") > +int handle_openat(struct trace_event_raw_sys_enter *ctx) > +{ > + int pid = bpf_get_current_pid_tgid() >> 32; > + char filename[256]; // filename buffer > + bpf_probe_read_user(&filename, sizeof(filename), (void *)ctx->args[1]); > + bpf_printk("sys_enter_openat() called from PID %d for file: %s\n", pid, > filename); > + > + return 0; > +} > + > +/* { dg-output "BPF programs succesfully loaded" } */