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

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

Clang 13.0 の改善点:

  • 保証された末尾呼び出しのサポートが実装されました (関数の最後でサブルーチンを呼び出し、サブルーチンがそれ自体を呼び出す場合は末尾再帰を形成します)。 保証された末尾呼び出しのサポートは、「return」ステートメントで使用される、C++ の "[[clang::musttail]]" 属性および C の "__attribute__((musttail))" 属性によって提供されます。 この機能を使用すると、コードをフラットな反復にデプロイしてスタックの消費を節約することで最適化を実装できます。
  • 「using」宣言と Clang 拡張機能は、「[[]]」形式を使用した C++11 スタイルの属性の定義をサポートします。
  • ユーザーコードで予約済みの識別子を指定したときに警告を表示する「-Wreserved-identifier」フラグを追加しました。
  • パラメータまたは変数が設定されているが使用されていない場合に警告を表示する「-Wunused-but-set-parameter」フラグと「-Wunused-but-set-variable」フラグを追加しました。
  • 減算演算での null ポインターの使用によりコードで未定義の動作が発生する可能性がある場合に警告を発行する「-Wnull-pointer-subtraction」フラグを追加しました。
  • 「-fstack-usage」フラグを追加して、コード ファイルごとに、処理中のファイルで定義されている各関数のスタック フレームのサイズに関する情報を含む追加の「.su」ファイルを生成します。
  • 新しい出力タイプ「sarif-html」が静的アナライザーに追加されました。これにより、HTML 形式と Sarif 形式でレポートを同時に生成できます。 新しい allocClassWithName チェックが追加されました。 「-analyzer-display-progress」オプションを指定すると、各関数の解析時間が表示されます。 スマート ポインター アナライザー (alpha.cplusplus.SmartPtr) の準備がほぼ整いました。
  • OpenCL サポートに関連する機能が拡張されました。 新しい拡張機能 cl_khr_integer_dot_product、cl_khr_extended_bit_ops、__cl_clang_bitfields、および __cl_clang_non_portable_kernel_param_types のサポートが追加されました。 OpenCL 3.0 仕様の実装は継続されています。 C の場合、別のバージョンが明示的に選択されない限り、デフォルトで OpenCL 1.2 仕様が使用されます。 C++ の場合、拡張子「.clcpp」を持つファイルのサポートが追加されました。
  • OpenMP 5.1仕様で定義されているループ変換ディレクティブ(「#pragma omp unrol」および「#pragma omp tile」)のサポートが実装されました。
  • Clang-format ユーティリティにオプションを追加しました。コメントの前のスペースの数を定義する SpacesInLineCommentPrefix、エントリ、ラムダ式、およびプリプロセッサ ディレクティブの配置を制御する IndentAccessModifiers、LambdaBodyIndentation、および PPIndentWidth。 ヘッダー ファイルの列挙を並べ替える可能性 (Sortincludes) が拡張されました。 JSON ファイルのフォーマットのサポートが追加されました。
  • linter clang-tidy のために、新しいチェックの大部分が追加されました。

LLVM 13.0 の主な革新:

  • CET (Windows Control-flow Enforcement Technology) テクノロジーを使用して、例外処理段階でリターン指向プログラミング (ROP) テクニックを使用して構築されたエクスプロイトの実行を保護するための「-ehcontguard」オプションが追加されました。
  • debuginfo-test プロジェクトは、cross-project-tests という名前に変更され、デバッグ情報に限定されず、さまざまなプロジェクトのコンポーネントをテストするように設計されています。
  • アセンブリ システムは、複数のディストリビューションを構築するためのサポートを提供します。たとえば、XNUMX つはユーティリティを備え、もう XNUMX つは開発者用のライブラリを備えています。
  • AArch64 アーキテクチャのバックエンドでは、Armv9-A RME (Realm Management Extension) および SME (Scalable Matrix Extension) 拡張機能のサポートがアセンブラに実装されています。
  • ISA V68/HVX のサポートが Hexagon アーキテクチャのバックエンドに追加されました。
  • x86 バックエンドでは、AMD Zen 3 プロセッサのサポートが強化されました。
  • GFX1013 RDNA2 APU のサポートが AMDGPU バックエンドに追加されました。
  • Libc++ は、「コンセプト」ライブラリの完成を含め、C++20 および C++2b 標準の新機能を実装し続けています。 MinGW ベースの Windows プラットフォームの std::filesystem のサポートが追加されました。 ヘッダーファイルが分離されている、 そして。 完全に実装されていない機能を持つヘッダー ファイルを無効にするビルド オプション LIBCXX_ENABLE_INCOMPLETE_FEATURES を追加しました。
  • LLD リンカーの機能が拡張され、ビッグエンディアン Aarch64 プロセッサのサポートが実装され、Mach-O バックエンドが通常のプログラムをリンクできる状態になりました。 LLD を使用して Glibc をリンクするために必要な改善が含まれています。
  • llvm-mca (マシン コード アナライザー) ユーティリティには、ARM Cortex-A55 など、命令を順番に実行するプロセッサ (インオーダー スーパースカラー パイプライン) のサポートが追加されました。
  • AArch64 プラットフォーム用の LLDB デバッガーは、ポインター認証、MTE (MemTag、メモリ タグ付け拡張機能)、および SVE レジスタを完全にサポートします。 各メモリ割り当て操作にタグをバインドし、メモリにアクセスするときにポインタのチェックを組織できるようにするコマンドが追加されました。ポインタは正しいタグに関連付けられている必要があります。
  • LLDB デバッガーと Fortran 言語のフロントエンドである Flang が、プロジェクトによって生成されたバイナリ アセンブリに追加されました。

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

コメントを追加します