Re: Enum relocations against zero values

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 2/26/21 7:31 PM, Yonghong Song wrote:


On 2/26/21 12:43 PM, Andrii Nakryiko wrote:
On Fri, Feb 26, 2021 at 10:08 AM Yonghong Song <yhs@xxxxxx> wrote:



On 2/26/21 9:47 AM, Lorenz Bauer wrote:
Hi Andrii and Yonghong,

I'm playing around with enum CO-RE relocations, and hit the following snag:

      enum e { TWO };
      bpf_core_enum_value_exists(enum e, TWO);

Compiling this with clang-12
(12.0.0-++20210225092616+e0e6b1e39e7e-1~exp1~20210225083321.50) gives
me the following:

internal/btf/testdata/relocs.c:66:2: error:
__builtin_preserve_enum_value argument 1 invalid
          enum_value_exists(enum e, TWO);
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
internal/btf/testdata/relocs.c:53:8: note: expanded from macro
'enum_value_exists'
                  if (!bpf_core_enum_value_exists(t, v)) { \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
internal/btf/testdata/bpf_core_read.h:168:32: note: expanded from
macro 'bpf_core_enum_value_exists'
          __builtin_preserve_enum_value(*(typeof(enum_type)
*)enum_value, BPF_ENUMVAL_EXISTS)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Andrii can comment on MACRO failures.

Yeah, I ran into this a long time ago as well...

I don't actually know why this doesn't work for zeroes. I've tried to
write that macro in a bit different way, but Clang rejects it:

__builtin_preserve_enum_value(({typeof(enum_type) ___xxx =
(enum_value); *(typeof(enum_type)*)&___xxx;}), BPF_ENUMVAL_EXISTS)

And something as straightforward as

__builtin_preserve_enum_value((typeof(enum_type))(enum_value),
BPF_ENUMVAL_EXISTS)

doesn't work as well.

Yonghong, any idea how to write such a macro to work in all cases? Or
why those alternatives don't work? I only get " error:
__builtin_preserve_enum_value argument 1 invalid" with no more
details, so hard to do anything about this.

This is a clang BPF bug. In certain number classification system,
clang considers 0 as NULL and non-0 as INTEGER. I only checked
INTEGER and hence only non-0 works. All my tests has non-zero
enum values :-(

Will fix the issue soon. Thanks for reporting!

Just pushed the fix (https://reviews.llvm.org/D97659) to llvm trunk
this morning. Also filed a request (https://bugs.llvm.org/show_bug.cgi?id=49391) to backport the fix to 12.0.1 release.
it is too late to be included in 12.0.0 release.
Thanks!






Changing the definition of the enum to

      enum e { TWO = 1 }

compiles successfully. I get the same result for any enum value that
is zero. Is this expected?

IIRC, libbpf will try to do relocation against vmlinux BTF.
So here, "enum e" probably does not exist in vmlinux BTF, so
the builtin will return 0. You can try some enum type
existing in vmlinux BTF to see what happens.


Best
Lorenz




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux