On Tue, Apr 25, 2023 at 11:29 AM Yonghong Song <yhs@xxxxxxxx> wrote: > > > > On 4/25/23 11:22 AM, Stanislav Fomichev wrote: > > On Tue, Apr 25, 2023 at 11:10 AM Yonghong Song <yhs@xxxxxxxx> wrote: > >> > >> > >> > >> On 4/25/23 10:04 AM, Stanislav Fomichev wrote: > >>> On Mon, Apr 24, 2023 at 6:56 PM Yonghong Song <yhs@xxxxxxxx> wrote: > >>>> > >>>> > >>>> > >>>> On 4/24/23 5:01 PM, Stanislav Fomichev wrote: > >>>>> From: Peng Wei <pengweiprc@xxxxxxxxxx> > >>>>> > >>>>> Compiling C++ BPF programs with existing bpf_helper_defs.h is not > >> > >> Just curious, why you want to compile BPF programs with C++? > >> The patch looks good to me. But it would be great to know > >> some reasoning since a lot of stuff, e.g., some CORE related > >> intrinsics, not available for C++. > > > > Can you share more? What's not available? Any pointers to the docs maybe? > > Sorry, it is an attribute, instead of instrinsics. > > The attribute preserve_access_index/btf_type_tag/btf_decl_tag are all C > only. Interesting, thanks! I don't think we use btf_type_tag/btf_decl_tag in the program we want to try c++, but losing preserve_access_index might be unfortunate :-( But we'll see.. Btw, any reason these are explicitly opted out from c++? Doesn't seem like there is anything c-specific in them? The c++ we are talking about here is mostly "c with classes + templates"; no polymorphism / inheritance. > In llvm-project/clang/include/clang/Basic/Attr.td: > > def BPFPreserveAccessIndex : InheritableAttr, > TargetSpecificAttr<TargetBPF> { > let Spellings = [Clang<"preserve_access_index">]; > let Subjects = SubjectList<[Record], ErrorDiag>; > let Documentation = [BPFPreserveAccessIndexDocs]; > let LangOpts = [COnly]; > } > > def BTFDeclTag : InheritableAttr { > let Spellings = [Clang<"btf_decl_tag">]; > let Args = [StringArgument<"BTFDeclTag">]; > let Subjects = SubjectList<[Var, Function, Record, Field, TypedefName], > ErrorDiag>; > let Documentation = [BTFDeclTagDocs]; > let LangOpts = [COnly]; > } > > def BTFTypeTag : TypeAttr { > let Spellings = [Clang<"btf_type_tag">]; > let Args = [StringArgument<"BTFTypeTag">]; > let Documentation = [BTFTypeTagDocs]; > let LangOpts = [COnly]; > } > > > > > > > People here want to try to use c++ to see if templating helps with v4 > > vs v6 handling. > > We have a bunch of copy-paste around this place and would like to see > > whether c++ could make it a bit more readable. > > > >>>>> possible due to stricter C++ type conversions. C++ complains > >>>>> about (void *) type conversions: > >>>>> > >>>>> bpf_helper_defs.h:57:67: error: invalid conversion from ‘void*’ to ‘void* (*)(void*, const void*)’ [-fpermissive] > >>>>> 57 | static void *(*bpf_map_lookup_elem)(void *map, const void *key) = (void *) 1; > >>>>> | ^~~~~~~~~~ > >>>>> | | > >>>>> | void* > >>>>> > >>>>> Extend bpf_doc.py to use proper function type instead of void. > >>>> > >>>> Could you specify what exactly the compilation command triggering the > >>>> above error? > >>> > >>> The following does it for me: > >>> clang++ --include linux/types.h ./tools/lib/bpf/bpf_helper_defs.h > >> > >> Thanks. It would be good if you add the above compilation command > >> in the commit message. > > > > Sure, will add. > > > >>> > >>> > >>>>> > >>>>> Before: > >>>>> static void *(*bpf_map_lookup_elem)(void *map, const void *key) = (void *) 1; > >>>>> > >>>>> After: > >>>>> static void *(*bpf_map_lookup_elem)(void *map, const void *key) = (void *(*)(void *map, const void *key)) 1; > >>>>> > >>>>> Signed-off-by: Peng Wei <pengweiprc@xxxxxxxxxx> > >>>>> Signed-off-by: Stanislav Fomichev <sdf@xxxxxxxxxx> > >>>>> --- > >>>>> scripts/bpf_doc.py | 7 ++++++- > >>>>> 1 file changed, 6 insertions(+), 1 deletion(-) > >>>>> > >>>>> diff --git a/scripts/bpf_doc.py b/scripts/bpf_doc.py > >>>>> index eaae2ce78381..fa21137a90e7 100755 > >>>>> --- a/scripts/bpf_doc.py > >>>>> +++ b/scripts/bpf_doc.py > >>>>> @@ -827,6 +827,9 @@ COMMANDS > >>>>> print(' *{}{}'.format(' \t' if line else '', line)) > >>>>> > >>>>> print(' */') > >>>>> + fptr_type = '%s%s(*)(' % ( > >>>>> + self.map_type(proto['ret_type']), > >>>>> + ((' ' + proto['ret_star']) if proto['ret_star'] else '')) > >>>>> print('static %s %s(*%s)(' % (self.map_type(proto['ret_type']), > >>>>> proto['ret_star'], proto['name']), end='') > >>>>> comma = '' > >>>>> @@ -845,8 +848,10 @@ COMMANDS > >>>>> one_arg += '{}'.format(n) > >>>>> comma = ', ' > >>>>> print(one_arg, end='') > >>>>> + fptr_type += one_arg > >>>>> > >>>>> - print(') = (void *) %d;' % helper.enum_val) > >>>>> + fptr_type += ')' > >>>>> + print(') = (%s) %d;' % (fptr_type, helper.enum_val)) > >>>>> print('') > >>>>> > >>>>> ###############################################################################