objtool warning in cfg80211_edmg_chandef_valid() with ThinLTO

From: Nathan Chancellor
Date: Tue Aug 24 2021 - 16:09:03 EST


Hi Josh and Peter,

An in-review LLVM patch [1] introduces an optimization around switch cases, marking the default case unreachable when all known values are covered. This ended up introducing a boot regression when building a kernel with ThinLTO, which Sami reported initially [2] and I reported it upstream, generating some discussion starting from [3].

There is an objtool warning about the function that the author of the patch tracked down to be problematic:

vmlinux.o: warning: objtool: cfg80211_edmg_chandef_valid()+0x169: can't find jump dest instruction at .text.cfg80211_edmg_chandef_valid+0x17b

The LLVM developers are under the impression that this is an issue with objtool; specifically quoting Eli Friedman:

"The backend can, in general, create basic blocks that don't contain any instructions, and don't fall through to another block. A jump table entry can refer to such a block. I guess certain tools could be confused by this.

If that's the issue, it should be possible to work around it using '-mllvm -trap-unreachable'."

I can confirm that adding '-mllvm -trap-unreachable' to KBUILD_{C,LD}FLAGS does resolve the issue but I am curious if that is an adequate solution (as Nick has frowned upon the presence of '-mllvm' flags) or if there is something that could be done on the objtool side. I do have a small reproducer on Phabricator [4] and I can provide any binary files that would be helpful for seeing what is going on here.

[1] https://reviews.llvm.org/D106056
[2] https://github.com/ClangBuiltLinux/linux/issues/1440
[3] https://reviews.llvm.org/D106056#2953104
[4] https://reviews.llvm.org/D106056#2961136

Cheers,
Nathan