Re: Enum relocations against zero values

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

 



On Mon, Mar 1, 2021 at 8:19 PM Yonghong Song <yhs@xxxxxx> wrote:
>
>
>
> 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!
>

Thanks, Yonghong!

> >
> >>
> >>
> >>>
> >>>>
> >>>> 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