開発のXNUMXか月後 LLVM9.0プロジェクトの新しいバージョンの立ち上げが発表されました。 これはGCC互換のツールキット(コンパイラ、オプティマイザ、コードジェネレータ)であり、 プログラムをRISCのような仮想命令の中間ビットコードにコンパイルします (マルチレベル最適化システムを備えた低レベル仮想マシン)。
コンパイル時間を最適化するように設計されています、バインディング時間、ユーザーが定義したいプログラミング言語での実行時間。 もともとCとC ++をコンパイルするために実装されました、LLVMの言語にとらわれない設計、およびプロジェクトの成功 多種多様な言語を生み出しました、Objective-C、Fortran、Ada、Haskell、Javaバイトコード、Python、Ruby、ActionScript、GLSL、Clang、Rust、Gambasなどを含みます。
生成された擬似コードは、JITコンパイラを使用して、プログラムの実行時に直接マシン命令に変換できます。
LLVM9.0の主な新機能
LLVM9.0の新機能のXNUMXつ RISC-Vプラットフォームから実験的な開発タグを削除するためのサポートを見つける、OpenCLのC ++サポート。
もう一つの目新しさ 際立っているのは、プログラムを動的にロードされる部分に分割する機能です LLDで、Linuxカーネルコードで使用される»asmgoto»構造の実装。
さらに、Libc ++がWASIのサポートとともに到着したことも強調されています (WebAssemblyシステムインターフェイス)、およびLLDはWebAssembly動的バインディングの初期サポートを導入しました。 GCC固有の式»asmgoto»の実装が追加されました。これにより、アセンブルされたインラインブロックからCコードのタグに切り替えることができます。
この機能は、x86_64システムでClangを使用して»CONFIG_JUMP_LABEL = y«モードでLinuxカーネルを構築するために必要です。 以前のバージョンで追加された変更を考慮して、Linuxカーネルをx86_64アーキテクチャ用のClangに組み込むことができるようになりました(以前は、arm、aarch64、ppc32、ppc64le、およびmipsアーキテクチャでのみサポートされていました。
BTI命令のサポートが追加されました (ブランチターゲットインジケーター)およびAArch64アーキテクチャ用のPAC(ポインター認証コード)。 MIPS、RISC-V、およびPowerPCプラットフォームのサポートが大幅に改善されました。
さらに、 AndroidおよびChromeOSプロジェクトは、カーネルの構築にClangを使用するようにすでに切り替えられています Googleは、実行中のLinuxシステムのプライマリビルドプラットフォームカーネルとしてClangをテストしています。
将来は、 カーネルのコンパイルプロセス中に、他のコンポーネントを使用できるようになります LLD、llvm-objcopy、llvm-ar、llvm-nm、およびllvm-objdumpを含むLLVM。
実験的なパーティション関数がLLDリンカーに追加されました。これにより、プログラムを複数の部分に分割し、それぞれを個別のELFファイルに配置できます。 この機能を使用すると、プログラムの主要部分を実行できます。必要に応じて、プロセスの残りのコンポーネントが読み込まれます(たとえば、組み込みのPDFビューアを個別のファイルとして選択できます。このファイルは、次の場合にのみダウンロードされます。ユーザーがファイルPDFを開きます)。
一方で、バックエンドの多くの改善も際立っています。 X86、AArch64、ARM、SystemZ、MIPS、AMDGPU、およびPowerPCアーキテクチャー用。
たとえば、AArch2アーキテクチャにSVE64およびMTE(Memory Tagging Extensions)命令のサポートが追加され、ARMバックエンドにArmv8.1-MアーキテクチャおよびMVEアーキテクチャのサポートが追加されました。
AMDGPUの場合、GFX10アーキテクチャのサポートが追加されました (Navi)、デフォルトでは、関数を呼び出して、アクティブ化された結合DPP(Data Primitives-Parallel)を渡すことができます。
LLDBデバッガーは、トレースのカラーハイライトを逆方向に導入しました。 DWARF4debug_typesおよびDWARF5debug_infoブロックのサポートが追加されました。
llvm-objcopyおよびllvm-stripユーティリティは、COFF形式の実行可能ファイルおよびオブジェクトのサポートを追加しました。
RISC-Vアーキテクチャのバックエンドが安定化されている、これは実験的なものとして位置付けられなくなり、デフォルトで構築されます。 MAFDC拡張機能を備えたRV32IおよびRV64I命令セットバリアントのコード生成を完全にサポートします。