Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Documentation/llvm: refresh docs

Recent fixes for an embargoed hardware security vulnerability failed to
link with ld.lld (LLVM's linker). [0] To be fair, our documentation
mentions ``CC=clang`` foremost with ``LLVM=1`` being buried "below the
fold."

We want to encourage the use of ``LLVM=1`` rather than just
``CC=clang``. Make that suggestion "above the fold" and "front and
center" in our docs.

While here, the following additional changes were made:
- remove the bit about CROSS_COMPILE setting --target=, that's no longer
true.
- Add ARCH=loongarch to the list of maintained targets (though we're
still working on getting defconfig building cleanly at the moment;
we're pretty close).
- Bump ARCH=powerpc from CC=clang to LLVM=1 status.
- Promote ARCH=riscv from being Maintained to being Supported. Android
is working towards supporting RISC-V, and we have excellent support
from multiple companies in this regard.
- Note that the toolchain distribution on kernel.org has been built with
profile data from kernel builds.
- Note how to use ccache with clang.

Link: https://github.com/ClangBuiltLinux/linux/issues/1907 [0]
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

authored by

Nick Desaulniers and committed by
Masahiro Yamada
a3c6bfba 1ef061a4

+80 -44
+80 -44
Documentation/kbuild/llvm.rst
··· 25 25 that supports C and the GNU C extensions required by the kernel, and is 26 26 pronounced "klang," not "see-lang." 27 27 28 - Clang 29 - ----- 28 + Building with LLVM 29 + ------------------ 30 30 31 - The compiler used can be swapped out via ``CC=`` command line argument to ``make``. 32 - ``CC=`` should be set when selecting a config and during a build. :: 31 + Invoke ``make`` via:: 33 32 34 - make CC=clang defconfig 33 + make LLVM=1 35 34 36 - make CC=clang 35 + to compile for the host target. For cross compiling:: 37 36 38 - Cross Compiling 39 - --------------- 37 + make LLVM=1 ARCH=arm64 40 38 41 - A single Clang compiler binary will typically contain all supported backends, 42 - which can help simplify cross compiling. :: 39 + The LLVM= argument 40 + ------------------ 43 41 44 - make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-gnu- 45 - 46 - ``CROSS_COMPILE`` is not used to prefix the Clang compiler binary, instead 47 - ``CROSS_COMPILE`` is used to set a command line flag: ``--target=<triple>``. For 48 - example: :: 49 - 50 - clang --target=aarch64-linux-gnu foo.c 51 - 52 - LLVM Utilities 53 - -------------- 54 - 55 - LLVM has substitutes for GNU binutils utilities. They can be enabled individually. 56 - The full list of supported make variables:: 42 + LLVM has substitutes for GNU binutils utilities. They can be enabled 43 + individually. The full list of supported make variables:: 57 44 58 45 make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \ 59 46 OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \ 60 47 HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld 61 48 62 - To simplify the above command, Kbuild supports the ``LLVM`` variable:: 63 - 64 - make LLVM=1 49 + ``LLVM=1`` expands to the above. 65 50 66 51 If your LLVM tools are not available in your PATH, you can supply their 67 52 location using the LLVM variable with a trailing slash:: 68 53 69 54 make LLVM=/path/to/llvm/ 70 55 71 - which will use ``/path/to/llvm/clang``, ``/path/to/llvm/ld.lld``, etc. 56 + which will use ``/path/to/llvm/clang``, ``/path/to/llvm/ld.lld``, etc. The 57 + following may also be used:: 58 + 59 + PATH=/path/to/llvm:$PATH make LLVM=1 72 60 73 61 If your LLVM tools have a version suffix and you want to test with that 74 62 explicit version rather than the unsuffixed executables like ``LLVM=1``, you ··· 66 78 67 79 which will use ``clang-14``, ``ld.lld-14``, etc. 68 80 81 + To support combinations of out of tree paths with version suffixes, we 82 + recommend:: 83 + 84 + PATH=/path/to/llvm/:$PATH make LLVM=-14 85 + 69 86 ``LLVM=0`` is not the same as omitting ``LLVM`` altogether, it will behave like 70 - ``LLVM=1``. If you only wish to use certain LLVM utilities, use their respective 71 - make variables. 87 + ``LLVM=1``. If you only wish to use certain LLVM utilities, use their 88 + respective make variables. 72 89 73 - The integrated assembler is enabled by default. You can pass ``LLVM_IAS=0`` to 74 - disable it. 90 + The same value used for ``LLVM=`` should be set for each invocation of ``make`` 91 + if configuring and building via distinct commands. ``LLVM=`` should also be set 92 + as an environment variable when running scripts that will eventually run 93 + ``make``. 75 94 76 - Omitting CROSS_COMPILE 95 + Cross Compiling 96 + --------------- 97 + 98 + A single Clang compiler binary (and corresponding LLVM utilities) will 99 + typically contain all supported back ends, which can help simplify cross 100 + compiling especially when ``LLVM=1`` is used. If you use only LLVM tools, 101 + ``CROSS_COMPILE`` or target-triple-prefixes become unnecessary. Example:: 102 + 103 + make LLVM=1 ARCH=arm64 104 + 105 + As an example of mixing LLVM and GNU utilities, for a target like ``ARCH=s390`` 106 + which does not yet have ``ld.lld`` or ``llvm-objcopy`` support, you could 107 + invoke ``make`` via:: 108 + 109 + make LLVM=1 ARCH=s390 LD=s390x-linux-gnu-ld.bfd \ 110 + OBJCOPY=s390x-linux-gnu-objcopy 111 + 112 + This example will invoke ``s390x-linux-gnu-ld.bfd`` as the linker and 113 + ``s390x-linux-gnu-objcopy``, so ensure those are reachable in your ``$PATH``. 114 + 115 + ``CROSS_COMPILE`` is not used to prefix the Clang compiler binary (or 116 + corresponding LLVM utilities) as is the case for GNU utilities when ``LLVM=1`` 117 + is not set. 118 + 119 + The LLVM_IAS= argument 77 120 ---------------------- 78 121 79 - As explained above, ``CROSS_COMPILE`` is used to set ``--target=<triple>``. 122 + Clang can assemble assembler code. You can pass ``LLVM_IAS=0`` to disable this 123 + behavior and have Clang invoke the corresponding non-integrated assembler 124 + instead. Example:: 80 125 81 - If ``CROSS_COMPILE`` is not specified, the ``--target=<triple>`` is inferred 82 - from ``ARCH``. 126 + make LLVM=1 LLVM_IAS=0 83 127 84 - That means if you use only LLVM tools, ``CROSS_COMPILE`` becomes unnecessary. 128 + ``CROSS_COMPILE`` is necessary when cross compiling and ``LLVM_IAS=0`` 129 + is used in order to set ``--prefix=`` for the compiler to find the 130 + corresponding non-integrated assembler (typically, you don't want to use the 131 + system assembler when targeting another architecture). Example:: 85 132 86 - For example, to cross-compile the arm64 kernel:: 133 + make LLVM=1 ARCH=arm LLVM_IAS=0 CROSS_COMPILE=arm-linux-gnueabi- 87 134 88 - make ARCH=arm64 LLVM=1 89 135 90 - If ``LLVM_IAS=0`` is specified, ``CROSS_COMPILE`` is also used to derive 91 - ``--prefix=<path>`` to search for the GNU assembler and linker. :: 136 + Ccache 137 + ------ 92 138 93 - make ARCH=arm64 LLVM=1 LLVM_IAS=0 CROSS_COMPILE=aarch64-linux-gnu- 139 + ``ccache`` can be used with ``clang`` to improve subsequent builds, (though 140 + KBUILD_BUILD_TIMESTAMP_ should be set to a deterministic value between builds 141 + in order to avoid 100% cache misses, see Reproducible_builds_ for more info): 142 + 143 + KBUILD_BUILD_TIMESTAMP='' make LLVM=1 CC="ccache clang" 144 + 145 + .. _KBUILD_BUILD_TIMESTAMP: kbuild.html#kbuild-build-timestamp 146 + .. _Reproducible_builds: reproducible-builds.html#timestamps 94 147 95 148 Supported Architectures 96 149 ----------------------- ··· 164 135 * - hexagon 165 136 - Maintained 166 137 - ``LLVM=1`` 138 + * - loongarch 139 + - Maintained 140 + - ``LLVM=1`` 167 141 * - mips 168 142 - Maintained 169 143 - ``LLVM=1`` 170 144 * - powerpc 171 145 - Maintained 172 - - ``CC=clang`` 146 + - ``LLVM=1`` 173 147 * - riscv 174 - - Maintained 148 + - Supported 175 149 - ``LLVM=1`` 176 150 * - s390 177 151 - Maintained ··· 203 171 Getting LLVM 204 172 ------------- 205 173 206 - We provide prebuilt stable versions of LLVM on `kernel.org <https://kernel.org/pub/tools/llvm/>`_. 174 + We provide prebuilt stable versions of LLVM on `kernel.org 175 + <https://kernel.org/pub/tools/llvm/>`_. These have been optimized with profile 176 + data for building Linux kernels, which should improve kernel build times 177 + relative to other distributions of LLVM. 178 + 207 179 Below are links that may be useful for building LLVM from source or procuring 208 180 it through a distribution's package manager. 209 181