OK, I’ve already added an usdt_o2 test and passed it.
At 2025-08-06 03:42:22, "Yonghong Song" <[email protected]> wrote: > > >On 8/2/25 1:48 AM, Jiawei Zhao wrote: >> When using GCC on x86-64 to compile an usdt prog with -O1 or higher >> optimization, the compiler will generate SIB addressing mode for global >> array and PC-relative addressing mode for global variable, >> e.g. "1@-96(%rbp,%rax,8)" and "-1@4+t1(%rip)". >> >> In this patch: >> - force -O2 optimization for usdt.test.o to generate SIB addressing usdt >> argument spec. >> - change the global variable t1 to a local variable, to avoid compiler >> generating PC-relative addressing mode for it. >> >> Signed-off-by: Jiawei Zhao <[email protected]> >> --- >> tools/testing/selftests/bpf/Makefile | 8 ++++++++ >> tools/testing/selftests/bpf/prog_tests/usdt.c | 18 ++++++++++++------ >> 2 files changed, 20 insertions(+), 6 deletions(-) >> >> diff --git a/tools/testing/selftests/bpf/Makefile >> b/tools/testing/selftests/bpf/Makefile >> index 910d8d6402ef..4b77d06d5c42 100644 >> --- a/tools/testing/selftests/bpf/Makefile >> +++ b/tools/testing/selftests/bpf/Makefile >> @@ -759,6 +759,14 @@ TRUNNER_BPF_BUILD_RULE := $$(error no BPF objects >> should be built) >> TRUNNER_BPF_CFLAGS := >> $(eval $(call DEFINE_TEST_RUNNER,test_maps)) >> >> +# Force usdt.c to use -O2 optimization to generate SIB addressing >> +# Only apply on x86 architecture where SIB addressing is relevant >> +ifeq ($(ARCH), x86) >> +$(OUTPUT)/usdt.test.o: CFLAGS:=$(subst O0,O2,$(CFLAGS)) >> +$(OUTPUT)/cpuv4/usdt.test.o: CFLAGS:=$(subst O0,O2,$(CFLAGS)) >> +$(OUTPUT)/no_alu32/usdt.test.o: CFLAGS:=$(subst O0,O2,$(CFLAGS)) >> +endif > >This is no good. You should not change from -O0 to -O2. The existing usdt.c >test should be kept. I assume at -O0 level, the compiler probably >won't generate SIB pattern. > >You could add another usdt test e.g. usdt_o2.c and force >usdt_o2 is compiled with -O2 optimizations and in usdt_o2 focusing on >SIB probe. > >> + >> # Define test_verifier test runner. >> # It is much simpler than test_maps/test_progs and sufficiently different >> from >> # them (e.g., test.h is using completely pattern), that it's worth just >> diff --git a/tools/testing/selftests/bpf/prog_tests/usdt.c >> b/tools/testing/selftests/bpf/prog_tests/usdt.c >> index 495d66414b57..86f354d25aef 100644 >> --- a/tools/testing/selftests/bpf/prog_tests/usdt.c >> +++ b/tools/testing/selftests/bpf/prog_tests/usdt.c >> @@ -14,10 +14,15 @@ static volatile int idx = 2; >> static volatile __u64 bla = 0xFEDCBA9876543210ULL; >> static volatile short nums[] = {-1, -2, -3, -4}; >> >> -static volatile struct { >> - int x; >> - signed char y; >> -} t1 = { 1, -127 }; >> +/* >> + * TODO: At O2 optimization level, t1's USDT argument spec becomes >> -1@4+t1(%rip). >> + * Since libbpf doesn't support RIP addressing mode yet, this causes >> "unrecognized register" errors. >> + * This test will be re-enabled once libbpf supports RIP addressing mode. >> + */ >> +// static volatile struct { >> +// int x; >> +// signed char y; >> +// } t1 = { 1, -127 }; >> > >[...]

