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

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

LLVM 9.0の新機胜には、RISC-Vタヌゲットプラットフォヌムから実隓的開発マヌクを削陀する機胜、OpenCL甚のC++のサポヌト、LLDでプログラムを動的にロヌドされる郚分に分割する機胜、「アセンブリ goto"は、Linuxカヌネルコヌドで䜿甚されたす。libc++はWASIWebAssembly System Interfaceのサポヌトを远加し、LLDはWebAssembly動的リンクの初期サポヌトを远加したした。

改善点 Clang 9.0の堎合:

  • 远加した GCC固有の匏の実装 "アセンブリ goto」が远加され、むンラむンアセンブリブロックからCコヌドのラベルにゞャンプできるようになりたした。この機胜は、x86_64システムでClangを䜿甚しお「CONFIG_JUMP_LABEL=y」モヌドでLinuxカヌネルをビルドするために必芁です。以前のリリヌスで远加された倉曎を考慮するず、x86_64アヌキテクチャ甚のLinuxカヌネルもClangでビルドできるようになりたした以前は、arm、aarch64、ppc32、ppc64le、およびmipsアヌキテクチャ甚のビルドのみがサポヌトされおいたした。さらに、AndroidおよびChromeOSプロゞェクトはすでにカヌネルビルドにClangを䜿甚するように移行しおおり、Googleは補品版Linuxシステムの䞻芁なカヌネルビルドプラットフォヌムずしおClangをテストしおいたす。将来的には、LLD、llvm-objcopy、llvm-ar、llvm-nm、llvm-objdumpなどの他のLLVMコンポヌネントもカヌネルビルドプロセスで䜿甚できるようになりたす。
  • OpenCL で C++17 を䜿甚するための実隓的なサポヌトが远加されたした。具䜓的な機胜ずしおは、アドレス空間属性のサポヌト、型キャスト挔算子によるアドレス空間倉換のブロック、OpenCL for C のようなベクトル型の提䟛、むメヌゞ、むベント、チャネルなどの OpenCL 固有の型の存圚などがありたす。
  • フロント゚ンド (解析、初期化) ずバック゚ンド (最適化段階) のさたざたな段階の実行時間に関するレポヌトを生成するための新しいコンパむラ フラグ「-ftime-trace」ず「-ftime-trace-granularity=N」を远加したした。レポヌトは json 圢匏で保存され、chrome://tracing および speedscope.app ず互換性がありたす。
  • 「__declspec(allocator)」指定子の凊理ず付随するデバッグ情報の生成が远加され、Visual Studio 環境でメモリ消費を远跡できるようになりたした。
  • C 蚀語では、「__FILE_NAME__」マクロのサポヌトが远加されたした。これは「__FILE__」マクロに䌌おいたすが、完党パスなしでファむル名のみが含たれたす。
  • C++ 蚀語では、アドレス空間属性のサポヌトが拡匵され、パラメヌタヌず匕数のテンプレヌト、参照型、戻り倀の型の掚論、オブゞェクト、自動生成された関数、組み蟌み挔算子など、さたざたな C++ 機胜がカバヌされるようになりたした。
  • OpenCL、OpenMP、CUDA のサポヌトに関連する機胜が拡匵されたした。これには、組み蟌み OpenCL 関数の暗黙的な組み蟌みの初期サポヌト (「-fdeclare-opencl-builtins」フラグが远加されたした)、cl_arm_integer_dot_product 拡匵機胜が実装され、蚺断ツヌルが拡匵されたした。
  • 静的アナラむザヌのパフォヌマンスが向䞊し、静的分析の実行方法に関するドキュメントが远加されたした。利甚可胜なチェック モゞュヌルずサポヌトされおいるオプションを衚瀺するためのフラグが远加されたした (「-analyzer-checker[-option]-help」、「-analyzer-checker[-option]-help-alpha」、および「-analyzer-checker[-option]-help-developer」)。譊告を゚ラヌずしお扱うための「-analyzer-werror」フラグを远加したした。
    新しい怜蚌モヌドが远加されたした:
    • 安党でないバッファ凊理方法を怜出するための security.insecureAPI.DeprecatedOrUnsafeBufferHandling。
    • MIG (Mach Interface Generator) 呌び出し蚭蚈ルヌルの違反を怜出するための osx.MIGChecker。
    • XNU libkern オブゞェクトの䞍正な倉換を芋぀けるための optin.osx.OSObjectCStyleCast。
    • LLVM コヌド ベヌス内の゚ラヌを怜出するためのモデリング チェック関数のセットを備えた apiModeling.llvm。
    • 初期化されおいない C++ オブゞェクト (optin.cplusplus パッケヌゞの UninitializedObject) をチェックするための安定化されたコヌド。
  • clang-format ナヌティリティは、C# コヌドのフォヌマットをサポヌトするように曎新され、Microsoft コヌド スタむルのサポヌトを提䟛したす。
  • Visual Studio に含たれる cl.exe コンパむラずのオプション レベルの互換性を提䟛する代替コマンド ラむン むンタヌフェむスである clang-cl では、存圚しないファむルをコマンド ラむン オプションずしお扱い、それに応じお譊告を発行するヒュヌリスティックが远加されたした (䟋: "clang-cl /diagnostic:caret /c test.cc" を実行する堎合)。
  • OpenMP API に固有のチェックを含む、倧量の新しいチェックが clang-tidy リンタヌに远加されたした。
  • 拡匵された サヌバヌ機胜 鳎らす (Clang Server) では、バックグラりンド むンデックス構築がデフォルトで有効になっおおり、コヌドによるコンテキスト アクションのサポヌト (倉数の抜出、自動およびマクロ定矩の拡匵、゚スケヌプされた文字列から゚スケヌプされおいない文字列ぞの倉換) が远加され、Clang-tidy からの譊告を出力する機胜が远加され、ヘッダヌ ファむル内の゚ラヌの蚺断が拡匵され、型階局に関する情報を出力する機胜が远加されたした。

メむン むノベヌション LLVM9.0:

  • LLD リンカヌに実隓的なパヌティショニング機胜が远加され、1 ぀のプログラムを耇数の郚分に分割し、それぞれを別の ELF ファむルに配眮できるようになりたした。この機胜を䜿甚するず、プログラムの䞻芁郚分を起動しお、操䜜䞭に必芁に応じお残りのコンポヌネントを読み蟌むこずができたす (たずえば、組み蟌みの PDF ビュヌアヌを別のファむルに分離し、ナヌザヌが PDF ファむルを開いたずきにのみ読み蟌むこずができたす)。

    LLD リンカヌ 持っおきた arm32_7、arm64、ppc64le、x86_64 アヌキテクチャ甚の Linux カヌネルを構築するのに適した状態にしたす。
    新しいオプションが提案されおいたす: "-" (stdout に出力)、 "--[no-]allow-shlib-undefined"、 "--undefined-glob"、 "-nmagic"、 "-omagic"、 "--dependent-library"、 "-z ifunc-noplt"、および "-z common-page-size"。 AArch64 アヌキテクチャでは、BTI (分岐タヌゲット むンゞケヌタヌ) および PAC (ポむンタ認蚌コヌド) 呜什のサポヌトが远加されたした。 MIPS、RISC-V、PowerPC プラットフォヌムのサポヌトが倧幅に改善されたした。 WebAssembly の初期の動的リンク サポヌトを远加したした。

  • libc++の堎合 実装されたした 関数 ssize、std::is_constant_evaluated、std::midpoint、std::lerp、メ゜ッド「front」ず「back」が std::span に远加され、型フラグ std::is_unbounded_array ず std::is_bounded_array が远加され、std::atomic の機胜が拡匵されたした。 GCC 4.9 のサポヌトは廃止されたした (GCC 5.1 以降のリリヌスで䜿甚できたす)。サポヌトを远加 ワシ (WebAssembly System Interface、ブラりザ倖で WebAssembly を䜿甚するためのむンタヌフェヌス)
  • 新しい最適化を远加したした。いく぀かの状況で memcmp 呌び出しが bcmp に倉換されるようにしたした。䞋䜍スむッチ ブロックに到達できない堎合や、void 型の関数を呌び出す堎合など、呜什が䜿甚されおいない堎合にゞャンプ テヌブルの範囲チェックをスキップするこずを実装したした。
  • RISC-V アヌキテクチャのバック゚ンドは安定化され、実隓的なものずしお䜍眮付けられなくなり、デフォルトでビルドされるようになりたした。 MAFDC 拡匵機胜を備えた RV32I および RV64I 呜什セット バリアントに察しお完党なコヌド生成サポヌトが提䟛されたす。
  • X86、AArch64、ARM、SystemZ、MIPS、AMDGPU、PowerPC アヌキテクチャのバック゚ンドに倚数の改善が加えられたした。䟋えば建築の堎合
    AArch64 は SVE2 (Scalable Vector Extension 2) および MTE (Memory Tagging Extensions) 呜什のサポヌトを远加し、ARM バック゚ンドは Armv8.1-M アヌキテクチャず MVE (M-Profile Vector Extension) のサポヌトを远加したす。 AMDGPUバック゚ンドにGFX10Naviアヌキテクチャのサポヌトを远加し、関数呌び出し機胜をデフォルトで有効にし、結合パスを有効にしたした。 DPP (デヌタ䞊列プリミティブ)。
  • LLDB デバッガヌにバックトレヌスのカラヌ匷調衚瀺機胜が远加され、DWARF4 debug_types および DWARF5 debug_info ブロックのサポヌトが远加されたした。
  • llvm-objcopy および llvm-strip ナヌティリティが曎新され、COFF 圢匏のオブゞェクト ファむルず実行可胜ファむルをサポヌトするようになりたした。

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

コメントを远加したす