Re: [PATCH v8 00/16] Add support for Clang LTO
From: Will Deacon <will@kernel.org>
Date: 2020-12-03 18:23:57
Also in:
linux-arch, linux-kbuild, linux-pci, lkml
On Thu, Dec 03, 2020 at 09:07:30AM -0800, Sami Tolvanen wrote:
On Thu, Dec 3, 2020 at 3:26 AM Will Deacon [off-list ref] wrote:quoted
On Tue, Dec 01, 2020 at 01:36:51PM -0800, Sami Tolvanen wrote:quoted
This patch series adds support for building the kernel with Clang's Link Time Optimization (LTO). In addition to performance, the primary motivation for LTO is to allow Clang's Control-Flow Integrity (CFI) to be used in the kernel. Google has shipped millions of Pixel devices running three major kernel versions with LTO+CFI since 2018. Most of the patches are build system changes for handling LLVM bitcode, which Clang produces with LTO instead of ELF object files, postponing ELF processing until a later stage, and ensuring initcall ordering. Note that arm64 support depends on Will's memory ordering patches [1]. I will post x86_64 patches separately after we have fixed the remaining objtool warnings [2][3].I took this series for a spin, with my for-next/lto branch merged in but I see a failure during the LTO stage with clang 11.0.5 because it doesn't understand the '.arch_extension rcpc' directive we throw out in READ_ONCE().I just tested this with Clang 11.0.0, which I believe is the latest 11.x version, and the current Clang 12 development branch, and both work for me. Godbolt confirms that '.arch_extension rcpc' is supported by the integrated assembler starting with Clang 11 (the example fails with 10.0.1): https://godbolt.org/z/1csGcT What does running clang --version and ld.lld --version tell you?
I'm using some Android prebuilts I had kicking around: Android (6875598, based on r399163b) clang version 11.0.5 (https://android.googlesource.com/toolchain/llvm-project 87f1315dfbea7c137aa2e6d362dbb457e388158d) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /usr/local/google/home/willdeacon/work/android/repo/android-kernel/prebuilts-master/clang/host/linux-x86/clang-r399163b/bin and: LLD 11.0.5 (/buildbot/tmp/tmpx1DlI_ 87f1315dfbea7c137aa2e6d362dbb457e388158d) (compatible with GNU linkers)
quoted
We actually check that this extension is available before using it in the arm64 Kconfig: config AS_HAS_LDAPR def_bool $(as-instr,.arch_extension rcpc) so this shouldn't happen. I then realised, I wasn't passing LLVM_IAS=1 on my Make command line; with that, then the detection works correctly and the LTO step succeeds. Why is it necessary to pass LLVM_IAS=1 if LTO is enabled? I think it would be _much_ better if this was implicit (or if LTO depended on it).Without LLVM_IAS=1, Clang uses two different assemblers when LTO is enabled: the external GNU assembler for stand-alone assembly, and LLVM's integrated assembler for inline assembly. as-instr tests the external assembler and makes an admittedly reasonable assumption that the test is also valid for inline assembly. I agree that it would reduce confusion in future if we just always enabled IAS with LTO. Nick, Nathan, any thoughts about this?
That works for me, although I'm happy with anything which means that the assembler checks via as-instr apply to the assembler which will ultimately be used. Will _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel