Is it possible to generate a whole kernel bitcode for Linux using clang?

Hello,

With clang/llvm 9.0 adding support for ASM GOTOs, it is now possible to compile the latest Linux kernel with clang without any modification. However, is it possible to generate a single bitcode for the whole Linux kernel? Earlier approaches would involve hacks, like compiling separate bitcode files and then linking with llvm-link, or using wllvm, or using some other wrapper. Frequently, the resulting bitcode was not functional due to different parts being missing. Did that situation change at all? Can we generate a function, monolithic, self-contained bitcode using something like libLTO? Any help would be appreciated.

Hi Jason,

Frequently, the resulting bitcode was not functional due to different parts being missing. Did that situation change at all? Can we generate a function, monolithic, self-contained bitcode using something like libLTO? Any help would be appreciated.

You can get the linker to emit the last bitcode that exists (e.g. via
--plugin-opt save-temps or emit-llvm I think), but it still won't be
self contained for something like a kernel. There's no representation
in IR for objects that come from .s files or the linker script for a
start.

Cheers.

Tim.

Hi Tim,

Now I understand why it can’t be a self-contained IR. However, just to emit the bitcode of individual files, I tried compiling with

make CC=clang HOSTCC=clang CFLAGS=" -g -flto -std=gnu99 " LDFLAGS=" -flto -fuse-ld=gold -Wl,-plugin-opt=save-temps" menuconfig
make CC=clang HOSTCC=clang CFLAGS=" -g -flto -std=gnu99 " LDFLAGS=" -flto -fuse-ld=gold -Wl,-plugin-opt=save-temps" -j8

The compilation with clang is still going on. But, it doesn’t look like it generates the IR at all. Whatever *.o files the build is producing are native ELF files.