Messages in this thread | | | Date | Mon, 11 Jul 2022 16:35:55 -0700 | Subject | Re: [PATCH v2] bpf/scripts: Generate GCC compatible helpers | From | Yonghong Song <> |
| |
On 7/6/22 10:28 AM, James Hilliard wrote: > The current bpf_helper_defs.h helpers are llvm specific and don't work > correctly with gcc. > > GCC appears to required kernel helper funcs to have the following > attribute set: __attribute__((kernel_helper(NUM))) > > Generate gcc compatible headers based on the format in bpf-helpers.h. > > This adds conditional blocks for GCC while leaving clang codepaths > unchanged, for example: > #if __GNUC__ && !__clang__ > void *bpf_map_lookup_elem(void *map, const void *key) __attribute__((kernel_helper(1))); > #else > static void *(*bpf_map_lookup_elem)(void *map, const void *key) = (void *) 1; > #endif
It does look like that gcc kernel_helper attribute is better than '(void *) 1' style. The original clang uses '(void *) 1' style is just for simplicity.
Do you mind to help implement similar attribute in clang so we don't need "#if" here?
> > #if __GNUC__ && !__clang__ > long bpf_map_update_elem(void *map, const void *key, const void *value, __u64 flags) __attribute__((kernel_helper(2))); > #else > static long (*bpf_map_update_elem)(void *map, const void *key, const void *value, __u64 flags) = (void *) 2; > #endif > > See: > https://github.com/gcc-mirror/gcc/blob/releases/gcc-12.1.0/gcc/config/bpf/bpf-helpers.h#L24-L27 > > This fixes the following build error: > error: indirect call in function, which are not supported by eBPF > > Signed-off-by: James Hilliard <james.hilliard1@gmail.com> > --- > Changes v1 -> v2: > - more details in commit log > --- > scripts/bpf_doc.py | 43 ++++++++++++++++++++++++++----------------- > 1 file changed, 26 insertions(+), 17 deletions(-) > [...]
| |