After six months of development the launch of the new version of the LLVM 9.0 project was presented, which is a GCC compatible toolkit (compilers, optimizers and code generators), which compiles programs into an intermediate bit code of RISC-like virtual instructions (a low-level virtual machine with a multi-level optimization system).
It is designed to optimize compilation time, the binding time, the execution time in whatever programming language the user wants to define. Originally implemented to compile C and C ++, LLVM's language agnostic design, and project success have spawned a wide variety of languages, including Objective-C, Fortran, Ada, Haskell, Java bytecode, Python, Ruby, ActionScript, GLSL, Clang, Rust, Gambas and others.
The generated pseudocode can be converted using the JIT compiler into machine instructions directly at the time of program execution.
Main new features of LLVM 9.0
Among the new features of LLVM 9.0 found support to remove experimental development tag from RISC-V platform, C ++ support for OpenCL.
Another novelty that stands out is the ability to divide the program into dynamically loaded parts in LLD and the implementation of the »asm goto» construct used in the Linux kernel code.
In addition, it is also highlighted that Libc ++ arrived with support for WASI (WebAssembly System Interface), and LLD introduced initial support for dynamic WebAssembly binding. Added the implementation of the GCC-specific expression »asm goto», which allows you to switch from an assembled inline block to a tag in C code.
This feature is necessary to build the Linux kernel in »CONFIG_JUMP_LABEL = y« mode using Clang on x86_64 systems. Considering the changes added in previous versions, the Linux kernel can now be built in Clang for the x86_64 architecture (previously, it was only supported for arm, aarch64, ppc32, ppc64le and mips architectures.
Support for BTI instructions has been added (Branch Target Indicator) and PAC (Pointer Authentication Code) for AArch64 architecture. Significantly improved support for MIPS, RISC-V, and PowerPC platforms.
In addition, Android and ChromeOS projects have already switched to using Clang to build the kernel and Google is testing Clang as the primary build platform for kernels for its running Linux systems.
In the future, during the kernel compilation process, it will be possible to use other components LLVM, including LLD, llvm-objcopy, llvm-ar, llvm-nm, and llvm-objdump.
An experimental partition function has been added to the LLD linker, which allows a program to be divided into multiple parts, each of which is placed in a separate ELF file. This feature allows you to run the main part of the program, which, as needed, will load the remaining components in the process (for example, you can select the built-in PDF viewer as a separate file, which will be downloaded only when the user opens the file PDF).
On the other hand, the numerous improvements in the backends also stand out for X86, AArch64, ARM, SystemZ, MIPS, AMDGPU, and PowerPC architectures.
For example, support for the SVE2 and MTE (Memory Tagging Extensions) instructions has been added for the AArch64 architecture, support for the Armv8.1-M architecture and the MVE architecture have been added to the ARM backend.
In the case of AMDGPU, support for the GFX10 architecture was added (Navi), the default is enabled to invoke a function and pass the activated combined DPP (Data Primitives-Parallel).
The LLDB debugger introduced color highlighting of traces backwards; added support for DWARF4 debug_types and DWARF5 debug_info blocks;
The llvm-objcopy and llvm-strip utilities have added support for COFF format executable files and objects.
Backend for RISC-V architecture is stabilized, which is no longer positioned as experimental and is built by default. Full support for code generation for the RV32I and RV64I instruction set variants with MAFDC extensions.