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

6ヶ月の開発期間を経て、LLVM 22.1.0がリリースされました。このバージョンでは、プログラムをRISCライクな仮想命令(多層最適化システムを備えた低レベル仮想マシン)の中間ビットコードにコンパイルするツール(コンパイラ、オプティマイザ、コードジェネレータ)を開発しています。生成された擬似コードは、特定のターゲットプラットフォームのマシンコードに変換したり、ジャストインタイム(JIT)コンパイラで使用してプログラム実行中に直接マシン命令を生成したりできます。このプロジェクトは、LLVMテクノロジーを基盤として、C、C++、Objective-Cの各プログラミング言語をサポートするClangコンパイラを開発しています。18.xブランチ以降、プロジェクトは新しいバージョン番号体系に移行しました。開発中はリリース0(「N.0」)が使用され、最初の安定バージョンには「N.1」が付けられます。

Clang 22 の改良点は次のとおりです。

  • malloc などの関数を用いて実行されたメモリ割り当て操作に一意の識別子を付与するためのメモリ割り当てトークン(Allocation Token)のサポートを追加しました。Allocation Token を使用すると、ヒープ情報を構造化し、メモリリーク検出を簡素化できるほか、オブジェクトの目的や変更パターンに基づいてグループ化することが可能になります(例: 「ホット」データと「コールド」データを分離する)。有効にするには、「-fsanitize=alloc-token」フラグを使用します。
  • C言語に関連する機能:
    • 「defer」遅延実行メカニズムを定義するドラフト仕様が実装されました。これにより、現在のスコープの終了時にアクションを実行できるようになります。「defer」サポートを有効にするために、「-fdefer-ts」フラグが追加されました。
    • GCCの類似関数をミラーリングした組み込み関数 __builtin_stack_address() が追加されました。この関数は、 __builtin_stack_address() を呼び出した現在の関数と、その後に呼び出される関数のスタック領域を区切るスタックアドレスを返します。
  • 将来の C2y 標準に向けて開発されている機能:
    • 名前付きループのサポートが追加されました。これにより、ループと switch ステートメントに名前を割り当てることができ、break ステートメントと continue ステートメントで指定して、終了するループを明示的に定義できます。 outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // CONT1 へ進む continue outer; // CONT2 へ進む // CONT1 } // CONT2 }
    • 一意の識別子名を生成するために設計された組み込みマクロ「__COUNTER__」の実装が拡張され、標準に含まれました。このマクロの呼び出し回数は2147483647回に制限されており、この制限を超えるとエラーが発生します。
    • 「extern inline」として宣言された関数内で静的関数または変数を使用する際の警告 (-Wstatic-in-inline) を削除しました。
  • C23 C 標準で定義されている機能:
    • float.h ヘッダー ファイルは、float、double、long double 型に対してシグナル化された (算術演算で使用すると例外が発生する) NaN 値を実装する FLT_SNAN、DBL_SNAN、および LDBL_SNAN マクロをサポートするようになりました。
    • 同じフィールドを持つ異なる名前のない型が同じ翻訳単位内で互換性があるものとして扱われるバグを修正しました。
    • 依存関係のスキャン中に不足しているヘッダー ファイルを無視するために使用される "-MG" フラグが "#embed" ディレクティブに拡張され、"#embed" ディレクティブで指定されたファイルが不足している場合に "ファイルが見つかりません" エラーを抑制するようになりました。
  • C++ 関連の機能:
    • C++2c (C++26) 仕様で開発された「constexpr」コンテキストで構造化バインディングを使用する機能が追加されました。これにより、定数式への参照自体が定数式になるようになりました。配列と単純な構造体のサポートが実装されています(タプルはまだサポートされていません)。constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
    • C++20 標準の要件に従い、制約はチェックされる前に標準形式に変換されるようになりました。これにより、より正確な診断メッセージが生成され、コンセプト ID のみで使用されるテンプレート引数の置換エラーが適切に処理されるようになりました。
    • 比較演算子「<」、「>」、「<="」、および「>="」が「<=>」演算子から合成されたかどうかを確認するための組み込み関数ファミリー「__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship」を追加しました。
    • 「-Wincompatible-pointer-types」パラメータは、警告ではなくエラーを出力するように変更されました。以前の動作に戻すには、「-Wno-error=incompatible-pointer-types」オプションを使用してください。
  • 組み込み関数 __builtin_bswapg、__builtin_elementwise_ldexp、__builtin_elementwise_fshl、__builtin_elementwise_fshr、__builtin_elementwise_minnumnum、__builtin_elementwise_maxnumnum、__builtin_masked_load、__builtin_masked_expand_load、__builtin_masked_store、__builtin_masked_compress_store、__builtin_masked_gather、__builtin_masked_scatter、および __builtin_dedup_pack を追加しました。例えば、builtin_dedup_pack を使用すると、型のリストから重複を削除できます。例:MyTypeList = TypeList<__builtin_dedup_pack …>; // 結果の型はTypeListになります
  • UBSan(-fsanitize=undefined -fsanitize-trap=undefined)で未定義の動作をデバッグする際、生成されるデバッグ情報にエラー原因情報が含まれるようになりました。エラー情報の詳細レベルを指定するための「-fsanitize-debug-trap-reasons」フラグが追加されました。「basic」に設定すると一般的な説明(例:「整数加算オーバーフロー」)が、「detailed」に設定すると詳細な情報(例:「'a + b' で符号付き整数加算オーバーフロー」)が表示されます。
  • 新しいコンパイラ フラグを追加しました。
    • 「-f[no-]sanitize-debug-trap-reasons」は、「-fsanitize-trap」モードでコンパイルするときに、例外トラップの理由をデバッグ情報に埋め込むかどうかを制御します。
    • メモリ割り当てトークンを管理するための「-fsanitize=alloc-token」、「-falloc-token-max」、「-fsanitize-alloc-token-fast-abi」、および「-fsanitize-alloc-token-extended」。
    • "-fmatrix-memory-layout" は、行列タイプのメモリレイアウトを制御します (例: 列優先の場合は column-major、行優先の場合は row-major)。
  • 関数には、malloc 属性に似ていますが、ポインタとサイズを持つフィールド、またはブロックの末尾へのポインタを含む span のような構造体を返す関数に適用できる「malloc_span」属性が追加されました。
  • リンク時に printf 関数の必要な静的にリンクされた実装を動的に選択するための "modular_format" 属性が追加されました。
  • 診断および静的分析ツールが拡張され、新しいチェックが追加されました (数十の診断関連の改善)。
  • SSE、AVX、AVX512拡張機能用の組み込み関数がX86バックエンドに追加されました。Wildcat Lake(-march=wildcatlake)およびNova Lake(-march=novalake)マイクロアーキテクチャに基づくIntel CPU用のビルドモードが追加されました。
  • AArch64バックエンドは、Ampere Computing Ampere1C (ampere1c)、Arm C1-Nano (c1-nano)、Arm C1-Pro (c1-pro)、Arm C1-Premium (c1-premium)、およびArm C1-Ultra (c1-ultra)プロセッサをサポートするようになりました。FCVTZ[US]、FCVTN[US]、FCVTM[US]、FCVTP[US]、およびFCVTA[US]命令用の組み込み関数が追加されました。関数マルチバージョン (FMV) サポートが安定化しました。ユーザーは、異なる関数バージョンの優先度をオーバーライドできるようになりました。
  • LoongArch32 (LA32R、LA32S) アーキテクチャのサポートが追加されました。
  • ARM、AMDGPU、RISC-V、LoongArch64、MIPS、WebAssembly、PowerPC アーキテクチャのバックエンドが改善されました。

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

DDoS 保護機能を備えた信頼性の高いサイト用ホスティング、VPS VDS サーバーを購入する 🔥 DDoS攻撃対策付きの信頼性の高いウェブサイトホスティング、VPS/VDSサーバーを購入しましょう | ProHoster