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