lkml.org 
[lkml]   [2020]   [Jun]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 00/22] add support for Clang LTO
    Hi Masahiro,

    On Mon, Jun 29, 2020 at 01:56:19AM +0900, Masahiro Yamada wrote:
    > On Thu, Jun 25, 2020 at 5:32 AM 'Sami Tolvanen' via Clang Built Linux
    > <clang-built-linux@googlegroups.com> wrote:
    > >
    > > This patch series adds support for building x86_64 and arm64 kernels
    > > 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's
    > > Pixel devices have shipped with LTO+CFI kernels 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 first objtool patch in the series is already in linux-next,
    > > but as it's needed with LTO, I'm including it also here to make testing
    > > easier.
    >
    >
    > I put this series on a testing branch,
    > and 0-day bot started reporting some issues.

    Yes, I'll fix those issues in v2.

    > (but 0-day bot is quieter than I expected.
    > Perhaps, 0-day bot does not turn on LLVM=1 ?)

    In order for it to test an LTO build, it would need to enable LTO_CLANG
    explicitly though, in addition to LLVM=1.

    > I also got an error for
    > ARCH=arm64 allyesconfig + CONFIG_LTO_CLANG=y
    >
    >
    >
    > $ make ARCH=arm64 LLVM=1 LLVM_IAS=1
    > CROSS_COMPILE=~/tools/aarch64-linaro-7.5/bin/aarch64-linux-gnu-
    > -j24
    >
    > ...
    >
    > GEN .version
    > CHK include/generated/compile.h
    > UPD include/generated/compile.h
    > CC init/version.o
    > AR init/built-in.a
    > GEN .tmp_initcalls.lds
    > GEN .tmp_symversions.lds
    > LTO vmlinux.o
    > MODPOST vmlinux.symvers
    > MODINFO modules.builtin.modinfo
    > GEN modules.builtin
    > LD .tmp_vmlinux.kallsyms1
    > ld.lld: error: undefined symbol: __compiletime_assert_905
    > >>> referenced by irqbypass.c
    > >>> vmlinux.o:(jeq_imm)
    > make: *** [Makefile:1161: vmlinux] Error 1

    I can reproduce this with ToT LLVM and it's BUILD_BUG_ON_MSG(..., "value
    too large for the field") in drivers/net/ethernet/netronome/nfp/bpf/jit.c.
    Specifically, the FIELD_FIT / __BF_FIELD_CHECK macro in ur_load_imm_any.

    This compiles just fine with an earlier LLVM revision, so it could be a
    relatively recent regression. I'll take a look. Thanks for catching this!

    Sami

    \
     
     \ /
      Last update: 2020-06-30 01:22    [W:4.072 / U:0.380 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site