LLVM 15.0 コンパイラ スイートのリリース

15.0 か月の開発後、LLVM XNUMX プロジェクトのリリースが発表されました。これは、プログラムを RISC のような仮想命令の中間ビットコードにコンパイルする GCC 互換ツールキット (コンパイラ、オプティマイザ、およびコード ジェネレータ) です (マルチレベル最適化システム)。 生成された擬似コードは、プログラム実行時に JIT コンパイラーを使用して直接機械語命令に変換できます。

Clang 15.0 の主な改善点:

  • x86 アーキテクチャに基づくシステムの場合、「-fzero-call-used-regs」フラグが追加されました。これにより、関数から制御を返す前に、関数で使用されるすべての CPU レジスタがゼロにリセットされます。 このオプションを使用すると、関数からの情報漏洩を防止し、エクスプロイトで ROP (Return-Oriented Programming) ガジェットの構築に適したブロックの数を約 20% 削減できます。
  • C コードの構造体のメモリ配置のランダム化が実装されており、脆弱性が悪用された場合に構造体からのデータの抽出が複雑になります。 ランダム化は、randomize_layout 属性と no_randomize_layout 属性を使用してオンまたはオフに切り替えられ、「-frandomize-layout-seed」または「-frandomize-layout-seed-file」フラグを使用してシードを設定する必要があります。
  • 「-fstrict-flex-arrays=」フラグを追加しましたこれを使用すると、構造体の柔軟な配列要素 (柔軟な配列メンバー、構造体の最後にある無限サイズの配列) の境界を制御できます。 0 (デフォルト) に設定すると、配列を含む構造体の最後の要素が常にフレキシブル配列として処理されます。1 - サイズ []、[0]、および [1] のみがフレキシブル配列として処理され、2 - サイズのみがフレキシブル配列として処理されます。 [] と [0] は柔軟な配列のように処理されます。
  • DirectX でシェーダーを作成するために使用される、C に似た言語 HLSL (高レベル シェーダー言語) の実験的なサポートが追加されました。
  • 固定長配列および可変長配列に関連付けられた互換性のない引数宣言による関数のオーバーライドについて警告する「-Warray-parameter」を追加しました。
  • MSVC との互換性が向上しました。 MSVCで提供されている「#pragma function」(インライン展開ではなく関数呼び出しを生成するようにコンパイラに指示する)と「#pragma alloc_text」(関数コードでセクション名を定義する)のサポートを追加しました。 MSVC 互換の /JMC および /JMC フラグのサポートが追加されました。
  • 将来の C2X および C++23 標準のサポートは引き続き行われます。 C 言語の場合、noreturn 属性、キーワード false および true、特定のビット深度の整数の _BitInt(N) 型、*_WIDTH マクロ、UTF-8 エンコード文字の u8 プレフィックスが実装されています。

    C++ の場合、以下が実装されます: モジュールのマージ、関数メンバーの ABI 分離、モジュール内の非ローカル変数の順序付けされた動的初期化、多次元インデックス演算子、auto(x)、非リテラル変数、constexpr として宣言された関数内の goto およびラベル、区切られたエスケープ シーケンス、名前付きエスケープ文字。

  • OpenCL および OpenMP のサポートに関連する機能が拡張されました。 OpenCL 拡張機能 cl_khr_subgroup_rotate のサポートが追加されました。
  • x86 アーキテクチャの場合、無条件前方ジャンプ操作後の命令の投機的実行によって引き起こされるプロセッサの脆弱性に対する保護が追加されました。 この問題は、メモリ内の分岐命令の直後の命令のプリエンプティブ処理 (SLS、直線投機) が原因で発生します。 保護を有効にするために、オプション「-mharden-sls=[none|all|return|indirect-jmp]」が提案されています。
  • SSE2 拡張機能をサポートするプラットフォームの場合、_Float16 タイプが追加されました。これは、AVX512-FP16 命令がサポートされていない場合に float タイプを使用してエミュレートされます。
  • RDPRU 命令の使用を制御する「-m[no-]rdpru」フラグが追加されました。これは、AMD Zen2 プロセッサ以降でサポートされています。
  • RETBLEED 脆弱性から保護するために「-mfunction-return=thunk-extern」フラグを追加しました。これは、間接分岐の投機的実行メカニズムの関与を排除する一連の命令を追加することによって機能します。

LLVM 15.0 の主な革新:

  • Cortex-M85 CPU、Armv9-A、Armv9.1-A、および Armv9.2-A アーキテクチャ、Armv8.1-M PACBTI-M 拡張機能のサポートが追加されました。
  • DirectX シェーダに使用される DXIL (DirectX Intermediate Language) 形式をサポートする、DirectX の実験的なバックエンドが追加されました。 バックエンドは、アセンブリ中に「-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX」パラメータを指定することで有効になります。
  • Libc++ は、「format」ライブラリの実装の完了や提案されている「ranges」ライブラリの実験版など、C++20 および C++2b 標準の新機能を実装し続けています。
  • x86、PowerPC、RISC-V アーキテクチャ向けのバックエンドが改善されました。
  • LLD リンカーと LLDB デバッガーの機能が強化されました。

出所: オープンネット.ru

コメントを追加します