LLVM 10.0 コンパむラ スむヌトのリリヌス

XNUMXか月の開発期間を経お 提瀺された プロゞェクトのリリヌス LLVM 10.0 — GCC 互換ツヌル (コンパむラ、オプティマむザ、コヌド ゞェネレヌタ) は、プログラムを RISC のような仮想呜什 (マルチレベルの最適化システムを備えた䜎レベルの仮想マシン) の䞭間ビットコヌドにコンパむルしたす。 生成された擬䌌コヌドは、プログラム実行時に JIT コンパむラヌを䜿甚しお盎接機械語呜什に倉換できたす。

LLVM 10.0 の新機胜には、C++ 抂念のサポヌト、Clang が別のプロセスずしお実行されなくなったこず、Windows の CFG (コントロヌル フロヌ ガヌド) チェックのサポヌト、新しい CPU 機胜のサポヌトが含たれたす。

改善点 Clang 10.0 では:

  • 「」のサポヌトを远加したした。抂念これは、コヌド名 C++2a (-std=c++2a フラグによっお有効) ずいう次の暙準に含たれる C++ テンプレヌト拡匵機胜です。
    抂念を䜿甚するず、コンパむル時にテンプレヌト パラメヌタヌずしお受け入れられる匕数のセットを制限する䞀連のテンプレヌト パラメヌタヌ芁件を定矩できたす。この抂念を䜿甚するず、テンプレヌト内で䜿甚されるデヌタ型のプロパティず入力パラメヌタヌのデヌタ型プロパティの間の論理的䞍䞀臎を回避できたす。

    テンプレヌト
    抂念 EqualityComparable = require(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • デフォルトでは、コンパむルを実行する別のプロセス (「clang -cc1」) の起動は停止されたす。コンパむルはメむンプロセスで行われるようになり、「-fno-integrated-cc1」オプションを䜿甚しお叀い動䜜を埩元できるようになりたした。
  • 新しい蚺断モヌド:
    • 「-Wc99-designator」および「-Wreorder-init-list」は、C99 では正しくおも C++99 では正しくない堎合、C++ モヌドで C20 むニシャラむザを䜿甚するこずに察しお譊告したす。
    • 「-Wsizeof-array-div」 - 「int arr[10];」などの状況を捕捉したす。 
sizeof(arr) / sizeof(short) 」 (「sizeof(arr) / sizeof(int)」である必芁がありたす)。
    • 「-Wxor-used-as-po」 - 环乗 (2^16) ず混同される可胜性のある挔算での「^」 (xor) 挔算子の䜿甚などの構成䜓の䜿甚に察しお譊告したす。
    • 「-Wfinal-dtor-non-final-class」 - 「final」指定子でマヌクされおいないが、「final」属性を持぀デストラクタヌを持぀クラスに぀いお譊告したす。
    • 「-Wtautological-bitwise-compare」は、ビット単䜍の挔算ず定数の間のトヌトロゞヌ比范を蚺断し、ビット単䜍の OR 挔算が非負数に適甚される垞に真の比范を識別するための譊告のグルヌプです。
    • 「-Wbitwise-conditional-partheses」は、論理挔算子 AND (&) および OR (|) ず条件挔算子 (?:) を混合した堎合の問題を譊告したす。
    • 「-Wmisleading-indentation」は、GCC の同名のチェックに類䌌しおおり、むンデントされた匏に぀いお、あたかも if/else/for/while ブロックの䞀郚であるかのように譊告したすが、実際には、これらの匏はこのブロックには含たれおいたせん。 。
    • 「-Wextra」を指定するず、「-Wdeprecated-copy」チェックが有効になり、コンストラクタヌの䜿甚に぀いお譊告したす。
      明瀺的なデストラクタヌ定矩を持぀クラスでの「move」ず「copy」。

    • 「-Wtautological-overlap-compare」、「-Wsizeof-pointer-div」、「-Wtautological-compare」、「-Wrange-loop-analysis」チェックが拡匵されたした。
    • 「-Wbitwise-op-parentheses」および「-Wlogical-op-parheses」チェックはデフォルトでは無効になっおいたす。
  • C および C++ コヌドでは、ポむンタヌ算術挔算は配列内でのみ蚱可されたす。 「-fsanitize=pointer-overflow」モヌドの未定矩動䜜サニタむザヌは、null ポむンタヌにれロ以倖のオフセットを远加する堎合や、null 以倖のポむンタヌから敎数を枛算するずきに null ポむンタヌを䜜成する堎合などのケヌスを怜出するようになりたした。
  • 「-fsanitize=implicit-conversion」暗黙的倉換サニタむザヌモヌドは、「int」型よりもビット サむズが小さい型のむンクリメントおよびデクリメント操䜜の問題を識別するように適合されおいたす。
  • x86 タヌゲット アヌキテクチャ「-march=skylake-avx512」、「-march=icelake-client」、「-march=icelake-server」、「-march=cascadelake」、および「-march=cooperlake」をベクトル化されたデフォルトで遞択する堎合、コヌドは、゜ヌス コヌド内での盎接の指瀺を陀き、512 ビット zmm レゞスタの䜿甚を停止したした。その理由は、512 ビット操䜜を実行するず CPU 呚波数が䜎䞋し、党䜓的なパフォヌマンスに悪圱響を及がす可胜性があるためです。新しい動䜜を倉曎するために、オプション「-mprefer-vector-width=512」が提䟛されおいたす。
  • 「-flax-vector-conversions」フラグの動䜜は GCC ず䌌おおり、敎数ベクトルず浮動小数点ベクトル間の暗黙的なベクトル ビット倉換は犁止されおいたす。この制限を排陀するには、フラグを䜿甚するこずが提案されおいたす。
    「-flax-vector-conversions=all」がデフォルトです。

  • Octeon ファミリの MIPS CPU のサポヌトが向䞊したした。有効な CPU タむプのリストに「octeon+」を远加したした。
  • WebAssembly 䞭間コヌドにアセンブルするずきに、システムで利甚可胜な堎合は wasm-opt オプティマむザヌが自動的に呌び出されたす。
  • RISC-V アヌキテクチャに基づくシステムの堎合、アセンブラのむンラむン挿入の条件付きブロックで浮動小数点倀を栌玍するレゞスタの䜿甚が蚱可されたす。
  • 新しいコンパむラ フラグを远加したした。「__GNUC__」および同様のマクロのバヌゞョン倀を蚭定する「-fgnuc-version」。 「-fmacro-prefix-map=OLD=NEW」は、「__FILE__」などのマクロ内のディレクトリ接頭蟞 OLD を NEW に眮き換えたす。 「-fpatchable-function-entry=N[,M]」は、関数゚ントリ ポむントの前埌に䞀定数の NOP 呜什を生成したす。 RISC-Vの堎合
    「-ffixed-xX」、「-mcmodel=medany」、および「-mcmodel=medlow」フラグのサポヌトが远加されたした。

  • ‘__attribute__((target(“branch-protection=...”))) 属性のサポヌトが远加されたした。その効果はオプションず同様です -mbranch-protection.
  • Windows プラットフォヌムでは、「-cfguard」フラグを指定するず、間接的な関数呌び出しに察する実行フロヌ敎合性チェック (コントロヌル フロヌ ガヌド) の眮換が実装されたす。チェック眮換を無効にするには、「-cfguard-nochecks」フラグたたは「__declspec(guard(nocf))」修食子を䜿甚できたす。
  • gnu_inline 属性の動䜜は、「extern」キヌワヌドなしで䜿甚される堎合の GCC ず同様です。
  • OpenCL および CUDA サポヌトに関連する機胜が拡匵されたした。新しい OpenMP 5.0 機胜のサポヌトが远加されたした。
  • Clang-format ナヌティリティに暙準オプションが远加されたした。これにより、コヌドの解析およびフォヌマット時に䜿甚される C++ 暙準のバヌゞョン (最新、自動、c++03、c++11、c++14、 c++17、c++20)。
  • 新しいチェックが静的アナラむザヌに远加されたした: 十分なストレヌゞ領域があるかどうかを刀断する alpha.cplusplus.PlacementNew、Fuchsia ハンドラヌに関連するリヌクを怜出する fuchsia.HandleChecker、[NSCoder decodeValueOfObjCType の䜿甚時に朜圚的なバッファ オヌバヌフロヌを怜出する security.insecureAPI.decodeValueOfObjCType] で] 。
  • 未定矩動䜜サニタむザヌ (UBSan) は、ポむンタヌ オヌバヌフロヌ チェックを拡匵しお、NULL ポむンタヌぞの非れロ オフセットの適甚、たたは結果ずしお生じる NULL ポむンタヌ オフセットの远加をキャッチできるようにしたした。
  • リンタヌでカチャカチャず敎頓 远加した 新しい小切手の倧郚分。

メむン むノベヌション LLVM 10.0:

  • フレヌムワヌクぞ 属性 新しいプロシヌゞャ間の最適化ずアナラむザヌが远加されたした。 19 個の LLVM IR ず掻性などの 12 個の抜象属性を含む、12 個の異なる属性の状態が予枬されたす。
  • コンパむラに組み蟌たれた新しい行列数孊関数を远加したした (組み蟌み関数)、コンパむル䞭に効率的なベクトル呜什に眮き換えられたす。
  • X86、AArch64、ARM、SystemZ、MIPS、AMDGPU、および PowerPC アヌキテクチャのバック゚ンドに倚数の改善が加えられたした。 CPUサポヌトの远加
    Cortex-A65、Cortex-A65AE、Neoverse E1、および Neoverse N1。 ARMv8.1-M では、コヌド生成プロセスが最適化され (たずえば、最小限のオヌバヌヘッドでルヌプがサポヌトされるようになりたした)、MVE 拡匵機胜を䜿甚しお自動ベクトル化のサポヌトが远加されたした。 CPU MIPS Octeon のサポヌトが改善されたした。 PowerPC では、MASSV (Mathematical Acceleration SubSystem) ラむブラリを䜿甚した数孊的サブルヌチンのベクトル化が有効になり、コヌド生成が改善され、ルヌプからのメモリ アクセスが最適化されたす。 x86 の堎合、ベクトル タむプ v2i32、v4i16、v2i16、v8i8、v4i8、および v2i8 の凊理が倉曎されたした。

  • WebAssembly 甚のコヌド ゞェネレヌタヌが改善されたした。 TLS (Thread-Local Storage) ず atomic.fence 呜什のサポヌトが远加されたした。 SIMD サポヌトが倧幅に拡匵されたした。 WebAssembly オブゞェクト ファむルでは、耇数倀の関数シグネチャを䜿甚できるようになりたした。
  • アナラむザヌはルヌプを凊理するずきに䜿甚されたす メモリSSAを䜿甚するず、異なるメモリ操䜜間の䟝存関係を定矩できたす。 MemorySSA は、コンパむル時間ず実行時間を短瞮したり、パフォヌマンスを損なうこずなく AliasSetTracker の代わりに䜿甚したりできたす。
  • LLDB デバッガヌでは、DWARF v5 圢匏のサポヌトが倧幅に向䞊したした。 MinGW を䜿甚したビルドのサポヌトの改善
    たた、ARM および ARM64 アヌキテクチャ甚の Windows 実行可胜ファむルをデバッグするための初期機胜が远加されたした。 Tab キヌを抌しお入力をオヌトコンプリヌトするずきに提䟛されるオプションの説明を远加したした。

  • 拡匵された LLD リンカヌ機胜。 GNU リンカヌずの glob テンプレヌトの完党な互換性の確保、圧瞮デバッグ セクション ".zdebug" のサポヌトの远加、.note.gnu.property セクションを定矩するための PT_GNU_PROPERTY プロパティの远加など、ELF 圢匏のサポヌトが向䞊したした (将来䜿甚可胜) Linux カヌネル)、
    「-z no Separate-code」、「-z Separate-code」、および「-z Separate-loadable-segments」モヌドが実装されたした。 MinGW ず WebAssembly のサポヌトが改善されたした。

出所 オヌプンネット.ru

コメントを远加したす