On Mon, Aug 18, 2025 at 12:46 AM Jiawei Zhao <phoenix500...@163.com> 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: > - add usdt_o1 test case to cover SIB addressing usdt argument spec > handling logic > > Signed-off-by: Jiawei Zhao <phoenix500...@163.com> > --- > .../selftests/bpf/prog_tests/usdt_o1.c | 70 +++++++++++++++++++ > .../selftests/bpf/progs/test_usdt_o1.c | 37 ++++++++++ > 2 files changed, 107 insertions(+) > create mode 100644 tools/testing/selftests/bpf/prog_tests/usdt_o1.c > create mode 100644 tools/testing/selftests/bpf/progs/test_usdt_o1.c > > diff --git a/tools/testing/selftests/bpf/prog_tests/usdt_o1.c > b/tools/testing/selftests/bpf/prog_tests/usdt_o1.c > new file mode 100644 > index 000000000000..706168e804cb > --- /dev/null > +++ b/tools/testing/selftests/bpf/prog_tests/usdt_o1.c > @@ -0,0 +1,70 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* Copyright (c) 2025 Jiawei Zhao <phoenix500...@163.com>. */ > +#include <test_progs.h> > + > +#include "../sdt.h" > +#include "test_usdt_o1.skel.h" > + > +#if (defined(__GNUC__) && !defined(__clang__)) > +#pragma GCC optimize("O1")
that optimize attribute is a function attribute, while your earlier version just randomly put it here. Have you tried using that optimize attribute on a function properly? One of the points of that attribute suggestion was to avoid the need to add another file in prog_tests and keeping various USDT test cases in one test, so can you give that attribute another try and see if it works? > +#else > +#pragma message("non-gcc compiler: the correct probes might not be > installed") hm... non-gcc is expected, so I don't think we should pollute compiler output with extra messages > +#endif > + > + > +#define test_value 0xFEDCBA9876543210ULL > +#define SEC(name) __attribute__((section(name), used)) > + > +int lets_test_this(int); > +static volatile __u64 array[1] = {test_value}; > + > +static __always_inline void trigger_func(void) > +{ > + /* Base address + offset + (index * scale) */ > + for (volatile int i = 0; i <= 0; i++) > + STAP_PROBE1(test, usdt1, array[i]); I think I saw a bunch of mentions that getting desired SIB form for USDT arg was a challenge, right? Have you checked STAP_PROBE_ASM from sdt.h? That will allow to define USDT from inside assembly block, which should give you a lot of control over the shape of the argument. [...]