Commit 2220ecf5 authored by Yonghong Song's avatar Yonghong Song Committed by Alexei Starovoitov

selftests/bpf: Skip btf_tag test if btf_tag attribute not supported

Commit c240ba28 ("selftests/bpf: Add a test with a bpf
program with btf_tag attributes") added btf_tag selftest
to test BTF_KIND_TAG generation from C source code, and to
test kernel validation of generated BTF types.
But if an old clang (clang 13 or earlier) is used, the
following compiler warning may be seen:
  progs/tag.c:23:20: warning: unknown attribute 'btf_tag' ignored
and the test itself is marked OK. The compiler warning is bad
and the test itself shouldn't be marked OK.

This patch added the check for btf_tag attribute support.
If btf_tag is not supported by the clang, the attribute will
not be used in the code and the test will be marked as skipped.
For example, with clang 13:
  ./test_progs -t btf_tag
  #21 btf_tag:SKIP
  Summary: 1/0 PASSED, 1 SKIPPED, 0 FAILED

The selftests/README.rst is updated to clarify when the btf_tag
test may be skipped.
Signed-off-by: default avatarYonghong Song <yhs@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20210915061036.2577971-1-yhs@fb.com
parent 4c24483e
...@@ -201,6 +201,20 @@ Without it, the error from compiling bpf selftests looks like: ...@@ -201,6 +201,20 @@ Without it, the error from compiling bpf selftests looks like:
__ https://reviews.llvm.org/D93563 __ https://reviews.llvm.org/D93563
btf_tag test and Clang version
==============================
The btf_tag selftest require LLVM support to recognize the btf_tag attribute.
It was introduced in `Clang 14`__.
Without it, the btf_tag selftest will be skipped and you will observe:
.. code-block:: console
#<test_num> btf_tag:SKIP
__ https://reviews.llvm.org/D106614
Clang dependencies for static linking tests Clang dependencies for static linking tests
=========================================== ===========================================
......
...@@ -10,5 +10,11 @@ void test_btf_tag(void) ...@@ -10,5 +10,11 @@ void test_btf_tag(void)
skel = tag__open_and_load(); skel = tag__open_and_load();
if (!ASSERT_OK_PTR(skel, "btf_tag")) if (!ASSERT_OK_PTR(skel, "btf_tag"))
return; return;
if (skel->rodata->skip_tests) {
printf("%s:SKIP: btf_tag attribute not supported", __func__);
test__skip();
}
tag__destroy(skel); tag__destroy(skel);
} }
...@@ -4,8 +4,19 @@ ...@@ -4,8 +4,19 @@
#include <bpf/bpf_helpers.h> #include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h> #include <bpf/bpf_tracing.h>
#ifndef __has_attribute
#define __has_attribute(x) 0
#endif
#if __has_attribute(btf_tag)
#define __tag1 __attribute__((btf_tag("tag1"))) #define __tag1 __attribute__((btf_tag("tag1")))
#define __tag2 __attribute__((btf_tag("tag2"))) #define __tag2 __attribute__((btf_tag("tag2")))
volatile const bool skip_tests __tag1 __tag2 = false;
#else
#define __tag1
#define __tag2
volatile const bool skip_tests = true;
#endif
struct key_t { struct key_t {
int a; int a;
...@@ -20,7 +31,6 @@ struct { ...@@ -20,7 +31,6 @@ struct {
__type(value, __u64); __type(value, __u64);
} hashmap1 SEC(".maps"); } hashmap1 SEC(".maps");
__u32 total __tag1 __tag2 = 0;
static __noinline int foo(int x __tag1 __tag2) __tag1 __tag2 static __noinline int foo(int x __tag1 __tag2) __tag1 __tag2
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment