]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
libbpf: Fix clang compilation error in btf_relocate.c
authorAlan Maguire <alan.maguire@oracle.com>
Mon, 24 Jun 2024 19:29:03 +0000 (20:29 +0100)
committerAndrii Nakryiko <andrii@kernel.org>
Wed, 26 Jun 2024 23:38:59 +0000 (16:38 -0700)
When building with clang for ARCH=i386, the following errors are
observed:

  CC      kernel/bpf/btf_relocate.o
./tools/lib/bpf/btf_relocate.c:206:23: error: implicit truncation from 'int' to a one-bit wide bit-field changes value from 1 to -1 [-Werror,-Wsingle-bit-bitfield-constant-conversion]
  206 |                 info[id].needs_size = true;
      |                                     ^ ~
./tools/lib/bpf/btf_relocate.c:256:25: error: implicit truncation from 'int' to a one-bit wide bit-field changes value from 1 to -1 [-Werror,-Wsingle-bit-bitfield-constant-conversion]
  256 |                         base_info.needs_size = true;
      |                                              ^ ~
2 errors generated.

The problem is we use 1-bit, 31-bit bitfields in a signed int.
Changing to

bool needs_size: 1;
unsigned int size:31;

...resolves the error and pahole reports that 4 bytes are used
for the underlying representation:

$ pahole btf_name_info tools/lib/bpf/btf_relocate.o
struct btf_name_info {
const char  *              name;                 /*     0     8 */
unsigned int               needs_size:1;         /*     8: 0  4 */
unsigned int               size:31;              /*     8: 1  4 */
__u32                      id;                   /*    12     4 */

/* size: 16, cachelines: 1, members: 4 */
/* last cacheline: 16 bytes */
};

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20240624192903.854261-1-alan.maguire@oracle.com
tools/lib/bpf/btf_relocate.c

index 2281dbbafa11ad22a00f374c0ff33264062183cb..17f8b32f94a08776005e470d2257455ed921be3a 100644 (file)
@@ -58,8 +58,8 @@ struct btf_relocate {
 struct btf_name_info {
        const char *name;
        /* set when search requires a size match */
-       int needs_size:1,
-           size:31;
+       bool needs_size: 1;
+       unsigned int size: 31;
        __u32 id;
 };