Re: clangd cannot handle tree_nocb.h

From: Nick Desaulniers
Date: Wed Apr 19 2023 - 18:55:35 EST


On Tue, Apr 18, 2023 at 2:03 PM Joel Fernandes <joel@xxxxxxxxxxxxxxxxx> wrote:
>
> Hi Nick,
>
> On Tue, Apr 18, 2023 at 01:46:40PM -0700, Nick Desaulniers wrote:
> > On Tue, Apr 18, 2023 at 1:36 PM Joel Fernandes <joel@xxxxxxxxxxxxxxxxx> wrote:
> > >
> > > On Fri, Apr 14, 2023 at 03:47:51PM -0700, Nick Desaulniers wrote:
> > > > On Thu, Apr 13, 2023 at 5: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.
> > > >
> > > > Hi Joel,
> > > > Thanks for the report. What are you using clangd for? I'll bet
> > > > something interesting.
> > >
> > > Thanks for the response and sorry for the late reply. I am at the OSPM
> > > conference. I use vim and vscode with clangd. In vim, YCM uses it to
> > > highlight compiler errors live while editing, I am pretty happy with it so
> > > far and has been a huge time saver. Enough that now I want to use it for
> > > everything...
> >
> > Cool! I use vim, can you share more info about your set up for this?
> > I'll have to try it.
>
> This is how I installed YCM:
>
> # Install YouCompleteMe for vim
> # cd ~/.vim/bundle
> # git clone https://github.com/Valloric/YouCompleteMe.git
> # cd YouCompleteMe/
> # git submodule update --init --recursive
> # python3 install.py --clang-completer

Thanks, I needed to add this
set runtimepath+=~/.vim/bundle/YouCompleteMe/
to my ~/.vimrc as well. Via
https://stackoverflow.com/q/60797142
so not sure I fully installed YCM since I didn't see `runtimepath` in
https://github.com/ycm-core/YouCompleteMe, but it's working now for me! Cool!

>
> Then install and run bear in the kernel sources to generate
> compile_compands.json:
> bear -- make -j99 CC=clang
>
> However, there's also the script:
> scripts/clang-tools/gen_compile_commands.py
>
> This generates the .json from an existing build. Thank God because we can
> probably make this generate better .json files which may make clangd better.

So we have a compile_commands.json make target. All I did was:

$ make LLVM=1 -j128 compile_commands.json

it invokes that python script you found which parses the *.o.cmd files
produced from a build. Unfortunately, that requires a completed
build, and IIRC I think `make clean` deletes compile_commands.json. I
think we might only want to do that for mrproper...

>
> You don't need YCM to reproduce the issue though if you just use vscode with
> the clangd plugin.
>
> > > I first came across clangd when developing Chrome userspace code which is C++
> > > :). In Chrome, ninja builds can be made to output compile_commands.json.
> > > However, now I noticed the support in the kernel and was like, wow I need to
> > > try it. Further, YCM seems to work much better with it than without :)
> > >
> > > > I've never used it myself, so I don't know where to even begin with
> > > > how to reproduce the issue.
> > >
> > > Ah ok. :). When I ran get_maintainer on the script, your name popped up and
> > > someone also suggested that you're the goto person for clang on the kernel
> > > (which I kind of already knew ;)
> >
> > You've cc'ed the right set of folks. We might not have the expertise
> > related to clangd specifically, but we can point you in the right
> > direction.
>
> Sure, thanks! And thanks for CC'ing the right folks.
>
> > > > It might be worth filing a bug upstream at
> > > > https://github.com/llvm/llvm-project/issues
> > > > or internally under the component
> > > > Language Platforms > C++ > Clang > Tools > Clangd
> > > > with detailed steps to reproduce (and what the observed error actually
> > > > is). Feel free to cc me, though I don't know the first thing about
> > > > clangd.
> > >
> > > Ok I will consider doing this if needed. One thing I do observe is lack of
> > > good support for header files and it is a known clangd issue [1].
> > >
> > > However, the fixes I was proposing can purely be done in the kernel itself
> > > since all it'd require is generating compile_compands.json with the -D<macro>
> > > and editing files to keep clangd happy. I guess one question is, how welcome
> > > would such changes to header files be since they're for tooling and isn't
> > > code that will be compiled outside of clangd.
> >
> > Specifically your patch sites some log print that doesn't look
> > indicative of a failure:
> > https://github.com/llvm/llvm-project/blob/53430bfd5c9d0074dd6de06dccea366e1d40bce4/clang-tools-extra/clangd/TUScheduler.cpp#L903-L906
> > so something else is going on here. Just trying to make sure we root cause this.
> >
>
> Right, so clangd's log does not show failure, the failure is when it displays
> in the code editor that your code has compiler errors when in fact it does
> not.
>
> So if you open up tree_nocb.h in vscode, for example, you'll see squiggles
> saying 'undefined reference to rcu_data', etc. That makes clangd stop working
> at the error. Sorry to not make the failure mode clear earlier.

In vim, the very first line is highlighted with:
Too many errors emitted, stopping now [fatal_too_many_errors]
I guess that disables nice checking that's done in .c files?
--
Thanks,
~Nick Desaulniers