Skip to contentSkip to conversation

libbpf: Fix compile error in libbpf_attach_type_by_name

PATCH In review Andrey Ignatov 3 participants 3 messages Nov 1, 2018

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 libbpf: Fix compile error in libbpf_attach_type_by_name

Arnaldo Carvalho de Melo reported build error in libbpf when clang version 3.8.1-24 (tags/RELEASE_381/final) is used:

libbpf.c:2201:36: error: comparison of constant -22 with expression of type 'const enum bpf_attach_type' is always false [-Werror,-Wtautological-constant-out-of-range-compare]

                if (section_names[i].attach_type == -EINVAL)
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~

1 error generated.

Fix the error by keeping "is_attachable" property of a program in a separate struct field instead of trying to use attach_type itself.

Fixes commit 956b620fcf0b ("libbpf: Introduce libbpf_attach_type_by_name")
---
 tools/lib/bpf/libbpf.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
tools/lib/bpf/libbpf.c +7 -6
index b607be7236d3..d6e62e90e8d4 100644
@@ -2084,19 +2084,19 @@ void bpf_program__set_expected_attach_type(struct bpf_program *prog,
 	prog->expected_attach_type = type;
 }
 
-#define BPF_PROG_SEC_IMPL(string, ptype, eatype, atype) \
-	{ string, sizeof(string) - 1, ptype, eatype, atype }
+#define BPF_PROG_SEC_IMPL(string, ptype, eatype, is_attachable, atype) \
+	{ string, sizeof(string) - 1, ptype, eatype, is_attachable, atype }
 
 /* Programs that can NOT be attached. */
-#define BPF_PROG_SEC(string, ptype) BPF_PROG_SEC_IMPL(string, ptype, 0, -EINVAL)
+#define BPF_PROG_SEC(string, ptype) BPF_PROG_SEC_IMPL(string, ptype, 0, 0, 0)
 
 /* Programs that can be attached. */
 #define BPF_APROG_SEC(string, ptype, atype) \
-	BPF_PROG_SEC_IMPL(string, ptype, 0, atype)
+	BPF_PROG_SEC_IMPL(string, ptype, 0, 1, atype)
 
 /* Programs that must specify expected attach type at load time. */
 #define BPF_EAPROG_SEC(string, ptype, eatype) \
-	BPF_PROG_SEC_IMPL(string, ptype, eatype, eatype)
+	BPF_PROG_SEC_IMPL(string, ptype, eatype, 1, eatype)
 
 /* Programs that can be attached but attach type can't be identified by section
  * name. Kept for backward compatibility.
@@ -2108,6 +2108,7 @@ static const struct {
 	size_t len;
 	enum bpf_prog_type prog_type;
 	enum bpf_attach_type expected_attach_type;
+	int is_attachable;
 	enum bpf_attach_type attach_type;
 } section_names[] = {
 	BPF_PROG_SEC("socket",			BPF_PROG_TYPE_SOCKET_FILTER),
@@ -2198,7 +2199,7 @@ int libbpf_attach_type_by_name(const char *name,
 	for (i = 0; i < ARRAY_SIZE(section_names); i++) {
 		if (strncmp(name, section_names[i].sec, section_names[i].len))
 			continue;
-		if (section_names[i].attach_type == -EINVAL)
+		if (!section_names[i].is_attachable)
 			return -EINVAL;
 		*attach_type = section_names[i].attach_type;
 		return 0;
Signature · 1 line
2.17.1
Tested-by on v1 1/1
#1 lore raw

Em Wed, Oct 31, 2018 at 12:57:18PM -0700, Andrey Ignatov escreveu:

Quoted 6 lines

Arnaldo Carvalho de Melo reported build error in libbpf when clang version 3.8.1-24 (tags/RELEASE_381/final) is used:

libbpf.c:2201:36: error: comparison of constant -22 with expression of type 'const enum bpf_attach_type' is always false [-Werror,-Wtautological-constant-out-of-range-compare]

Quoted 6 lines
                if (section_names[i].attach_type == -EINVAL)
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~

1 error generated.

Fix the error by keeping "is_attachable" property of a program in a separate struct field instead of trying to use attach_type itself.

Thanks, now it builds in all the previously failing systems:

# export PERF_TARBALL=http://192.168.86.4/perf/perf-4.19.0.tar.xz
# dm debian:9 fedora:25 fedora:26 fedora:27 ubuntu:16.04 ubuntu:17.10
   1 debian:9        : Ok   gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516          clang version 3.8.1-24 (tags/RELEASE_381/final)
   2 fedora:25       : Ok   gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1)           clang version 3.9.1 (tags/RELEASE_391/final)
   3 fedora:26       : Ok   gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2)           clang version 4.0.1 (tags/RELEASE_401/final)
   4 fedora:27       : Ok   gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-6)           clang version 5.0.2 (tags/RELEASE_502/final)
   5 ubuntu:16.04    : Ok   gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609  clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
   6 ubuntu:17.10    : Ok   gcc (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0                  clang version 4.0.1-6 (tags/RELEASE_401/final)
#

I also have it tentatively applied to my perf/urgent branch, that I'll push upstream soon.

- Arnaldo

Quoted 55 lines
Fixes commit 956b620fcf0b ("libbpf: Introduce libbpf_attach_type_by_name")
---
 tools/lib/bpf/libbpf.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
tools/lib/bpf/libbpf.c +7 -6
index b607be7236d3..d6e62e90e8d4 100644
@@ -2084,19 +2084,19 @@ void bpf_program__set_expected_attach_type(struct bpf_program *prog,
 	prog->expected_attach_type = type;
 }
 
-#define BPF_PROG_SEC_IMPL(string, ptype, eatype, atype) \
-	{ string, sizeof(string) - 1, ptype, eatype, atype }
+#define BPF_PROG_SEC_IMPL(string, ptype, eatype, is_attachable, atype) \
+	{ string, sizeof(string) - 1, ptype, eatype, is_attachable, atype }
 
 /* Programs that can NOT be attached. */
-#define BPF_PROG_SEC(string, ptype) BPF_PROG_SEC_IMPL(string, ptype, 0, -EINVAL)
+#define BPF_PROG_SEC(string, ptype) BPF_PROG_SEC_IMPL(string, ptype, 0, 0, 0)
 
 /* Programs that can be attached. */
 #define BPF_APROG_SEC(string, ptype, atype) \
-	BPF_PROG_SEC_IMPL(string, ptype, 0, atype)
+	BPF_PROG_SEC_IMPL(string, ptype, 0, 1, atype)
 
 /* Programs that must specify expected attach type at load time. */
 #define BPF_EAPROG_SEC(string, ptype, eatype) \
-	BPF_PROG_SEC_IMPL(string, ptype, eatype, eatype)
+	BPF_PROG_SEC_IMPL(string, ptype, eatype, 1, eatype)
 
 /* Programs that can be attached but attach type can't be identified by section
  * name. Kept for backward compatibility.
@@ -2108,6 +2108,7 @@ static const struct {
 	size_t len;
 	enum bpf_prog_type prog_type;
 	enum bpf_attach_type expected_attach_type;
+	int is_attachable;
 	enum bpf_attach_type attach_type;
 } section_names[] = {
 	BPF_PROG_SEC("socket",			BPF_PROG_TYPE_SOCKET_FILTER),
@@ -2198,7 +2199,7 @@ int libbpf_attach_type_by_name(const char *name,
 	for (i = 0; i < ARRAY_SIZE(section_names); i++) {
 		if (strncmp(name, section_names[i].sec, section_names[i].len))
 			continue;
-		if (section_names[i].attach_type == -EINVAL)
+		if (!section_names[i].is_attachable)
 			return -EINVAL;
 		*attach_type = section_names[i].attach_type;
 		return 0;
Signature · 1 line
2.17.1
maintainer
#2 lore raw
Quoted 26 lines · Arnaldo Carvalho de Melo

Em Wed, Oct 31, 2018 at 12:57:18PM -0700, Andrey Ignatov escreveu:

Quoted 6 lines

Arnaldo Carvalho de Melo reported build error in libbpf when clang version 3.8.1-24 (tags/RELEASE_381/final) is used:

libbpf.c:2201:36: error: comparison of constant -22 with expression of type 'const enum bpf_attach_type' is always false [-Werror,-Wtautological-constant-out-of-range-compare]

Quoted 6 lines
                if (section_names[i].attach_type == -EINVAL)
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~

1 error generated.

Fix the error by keeping "is_attachable" property of a program in a separate struct field instead of trying to use attach_type itself.

Thanks, now it builds in all the previously failing systems:

# export PERF_TARBALL=http://192.168.86.4/perf/perf-4.19.0.tar.xz
# dm debian:9 fedora:25 fedora:26 fedora:27 ubuntu:16.04 ubuntu:17.10
   1 debian:9        : Ok   gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516          clang version 3.8.1-24 (tags/RELEASE_381/final)
   2 fedora:25       : Ok   gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1)           clang version 3.9.1 (tags/RELEASE_391/final)
   3 fedora:26       : Ok   gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2)           clang version 4.0.1 (tags/RELEASE_401/final)
   4 fedora:27       : Ok   gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-6)           clang version 5.0.2 (tags/RELEASE_502/final)
   5 ubuntu:16.04    : Ok   gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609  clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
   6 ubuntu:17.10    : Ok   gcc (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0                  clang version 4.0.1-6 (tags/RELEASE_401/final)
#
Quoted 1 line

Thanks everyone, applied to bpf tree.