On Mon, Aug 18, 2025 at 12:46 AM Jiawei Zhao phoenix500526@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 phoenix500526@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 phoenix500526@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.
[...]