Hello, One way to fix this could be to add this to the beginning of tree_nocb.h /* Make clangd understand tree_nocb.h */ +#ifdef CLANGD_PARSER_ACTIVE +#define TREE_NOCB_H_CLANGD +#include "tree.c" +#endif And then at the end of tree.c, do this to prevent recursion: +#ifndef TREE_NOCB_H_CLANGD #include "tree_nocb.h" -#include "tree_plugin.h" +#endif +#include "tree_plugin.h" Then in scripts/clang-tools/gen_compile_commands.py, we can just make it add "-DCLANGD_PARSER_ACTIVE" to all compile command entries in the JSON file. Would that be an acceptable solution? Let me know your opinion (both Paul and clangd people :)) so I can work on a patch to do this. - Joel On Thu, Apr 13, 2023 at 8:53 PM Joel Fernandes <joel@xxxxxxxxxxxxxxxxx> wrote: > > Hello! > > I have been trying to get clangd working properly with tree_nocb.h. clangd > trips quite badly when trying to build tree_nocb.h to generate ASTs. > > I get something like this in the clangd logs showing it 'infers' how to build > tree_nocb.h because it could not find a command in compile_commands.json: > > ASTWorker building file [..]/tree_nocb.h version 9 with command inferred from > [..]/kernel/rcu/tree.c > > This leads to all hell breaking lose with complaints about missing rcu_data > struct definition and so forth. > > So far I came up with a workaround as follows, but is there a better way? > > 1. Open compile_commands.json and add a new entry as follows, with a > definition "-DNOCB_H_CLANGD_PARSE". Otherwise the entry is indentical to how > tree.c is built. > > { > "arguments": [ > "/usr/bin/clang", > "-Wp,-MMD,kernel/rcu/.treenocb.o.d", > "-nostdinc", > "-I./arch/x86/include", > "-I./arch/x86/include/generated", > "-I./include", > "-I./arch/x86/include/uapi", > [...] > "-Wformat-zero-length", > "-Wnonnull", > "-Wformat-insufficient-args", > "-Wno-sign-compare", > "-Wno-pointer-to-enum-cast", > "-Wno-tautological-constant-out-of-range-compare", > "-Wno-unaligned-access", > "-DKBUILD_MODFILE=\"kernel/rcu/tree\"", > "-DKBUILD_BASENAME=\"tree\"", > "-DKBUILD_MODNAME=\"tree\"", > "-D__KBUILD_MODNAME=kmod_tree", > "-DNOCB_H_CLANGD_PARSE", > "-c", > "-I", > "/s/", > "-I", > "/s/", > "-o", > "kernel/rcu/tree_nocb.h.o", > "kernel/rcu/tree_nocb.h" > ], > "directory": "/usr/local/google/home/joelaf/repo/linux-master", > "file": "/usr/local/google/home/joelaf/repo/linux-master/kernel/rcu/tree_nocb.h", > "output": "/usr/local/google/home/joelaf/repo/linux-master/kernel/rcu/tree_nocb.h.o" > }, > > 2. > Then in kernel/tree/tree_nocb.h, I do the following right in the beginning. > (Thanks to paulmck@ for this idea). > > #ifdef NOCB_H_CLANGD_PARSE > #include "tree.c" > #endif > > 3. To prevent the above inclusion of tree.c from recursively including > tree_nocb.h, I do the following at the end of tree.c > > +#ifndef NOCB_H_CLANGD_PARSE > #include "tree_nocb.h" > -#include "tree_plugin.h" > +#endif > +#include "tree_plugin.h" > > With that it works, but if I ever generate compile_commands.json again, then > I'll have to again modify compile_commands.json manually to make my editor > work again with clangd. > > So I guess my questions are: > > 1. Is there a 'standard' procedure to solve something like this? > > 2. How do we fix this the right way? > One way would be for scripts/clang-tools/gen_compile_commands.py to parse > header files and generate suitable compile_commands.json based on > meta-data in the header file. > > 3. How do we fix this for other header files in general? Do we have to make hacks like > above (sad face) or can we come up with a standard way to make it work for kernel > sources? > > Thank you! > > - Joel > > > > > >