LLVM 3.2 リリースノートの訳
ようやくLLVM 3.2がでました。今回はスケジュールよりもそれほど遅れませんでした。
前回に引き続き、リリースノートを訳しました。
SROA周りとか訳がぶっこわれているところがありますが、気になる人は原文を読みましょう。
branchを見ながら訳したので抜けているところがあったらすみません。
変更の注目点としてはLLVM本体としては、ループベクトル化,SROAの新実装, NVPTX(旧PTX)バックエンド追加などがあります。
MIPSとPowerPCの変更点の多さは注目です。(個人的にMIPSをずっと見てたので変更量は本当にすごいです)
Clangを含めスレッドローカルストレージ周りの追加や
サブプロジェクトとしてClang Static Analyzerという項目が追加されていたり、
外部のオープンソースプロジェクトとしてEmbToolkitが追加されていたりします。
LLVM狐本もよろしくおねがいします!
追記
思ったより参照頂いているようでありがたい限りです。
訳についてコメントを頂いたので反映させて頂きました。ありがとうございます。
専門用語の対訳がわからなかったり、直訳かつ単語をスキップして訳していたりもするので、どうしても気になる場合はコメント頂けるとうれしいです。
翻訳は読むだけと違ったスキルが必要で自分にはまだまだ力が及ばないところもありますが、日本語なら読むという方に参考になれば幸いです。
イントロダクション(Instroduction)
このドキュメントはLLVMコンパイラ・インフラストラクチャのリリース3.2に関するリリースノートです。
前回のリリースからの大きな改善点, サブプロジェクトの改善点, コードの利用者などを含むLLVMの状況を記しています。
LLVMリリースの全てはLLVMリリースサイト からダウンロードできます。
LLVMについての最新情報などの詳細はLLVMメインサイト を参照して下さい。
疑問や感想などがありましたらLLVM開発者メーリングリスト に投稿して下さい。
サブプロジェクトの更新状況(Sub-project Status Update)
LLVM3.2ディストリビューションはLLVMのコアリポジトリ(オプティマイザ, コード生成器, サポートツールなど)と
Clang, DragonEgg, compiler-rtサブプロジェクトリポジトリから成る高品質のコードで構成されています。
更に、LLVMプロジェクトには開発中のサブプロジェクトを含んでいます。
これらのコードに加えて、LLVMプロジェクトは開発中のサブプロジェクトを含みます。
ここでは3つのサブプロジェクトの更新を記します。
Clang: C/C++/Objective-C Frontend Toolkit
Clang はC,C++,Objective-CのためのLLVMフロントエンドです。
Clangはわかりやすい診断メッセージ(コンパイルエラー・警告を明快にするためのわかりやすい情報), 言語標準規格に忠実, 高速かつメモリ使用量の少ないコンパイルという特徴を持ち、
より良いユーザ体験を提供することを目指しています。
ClangはLLVMのようにモジュール化されたライブラリを元として作られており、開発ツールを作成したり(開発ツールに)統合したりするのに適しています。
LLVM3.2のリリースにあわせて、Clangチームは大きな改善を果たしています。以下が主な変更点です。
Clangのリリース3.1からの変更点についての詳細はClangリリースノート を参照して下さい。
もしClangで通らないコードが他のコンパイラで通る場合、
それが意図していないものか既知のものであるかを確認するために、言語互換性ガイド を参照して下さい。
DragonEgg: GCC front-ends, LLVM back-end
DragonEgg はGCCのオプティマイザとコード生成器をLLVMのものに置き換えるGCCプラグイン です。
GCC4.5, GCC4.6(部分的にGCC4.7)で動作し、Darwin, FreeBSD, KFreeBSD, LinuxそしてOpenBSD上で利用実績があります。
x86-32/x86-64とARMプロセッサファミリーをターゲットとして利用できます。
Ada, C, C++そしてFortranを完全にサポートし、Go, Java, Obj-CそしてObj-C++は部分的なサポートをしています。
リリース3.2では主に次のような変更点があります。
compiler-rt: Compiler Runtime Library
compiler-rt プロジェクトは、コード生成器や他の実行時コンポーネントで必要とされる低レベルでターゲット特有のフックの実装を提供する単純なライブラリです。
例えば、32ビットターゲット向けにコンパイル時に、double型から64ビット符号無し整数への変換は"__fixunsdfdi"関数の実行時呼び出しへコンパイルされる。
compiler-rtライブラリは高度に最適化されたこれらの実装および他の低レベルルーチン(libgccより3倍速いものもある)を提供する。
3.2のリリースでは次のような主な変更点がある。
- ThreadSanitizer(TSan) : C/C++用データ競合検知ランタイムライブラリの追加
- AddressSanitizer の改善 : より良いポータビリティ(OSX, Android NDK), cmakeベースのビルドのサポート, エラー報告の強化, 多くのバグfix
- A6 'Swift' CPUのサポートの追加
- ハードウェアで符号無し除算が可能な場合にdivsi3関数でそれを活用するように改善
LLDB: Low Level Debugger
LLDB はコマンドラインデバッガの基礎からの実装であり、他のアプリケーションから利用されるデバッガAPIです。
LLDBは(特にC++向けの)忠実な式解析(expression parsing)を提供するためにClangのパーサを利用しており、ターゲットサポートのためにLLVM JITを利用している。
3.2のリリースでは次のような主な変更点がある。
- Clang向けのLinuxビルドfix(Building LLDB を参照)
- いくつかのLinuxの安定性, 利便性の改善
- Linux上で式評価で(古いJITから)MCJitを使うように変更
libc++: C++ Standard Library
compiler-rtと同様、libc++は更に寛容的に利用できるようにMITとUIUCのデュアルライセンスを採用している。
LLVM3.2では次の主な変更点がある。
VMKit
VMKitプロジェクト は静的もしくはjust-in-timeコンパイラとしてLLVM利用する、Java Virtual Machine(Java VM or JVM)の実装です。
LLVM3.2では次の主な変更点がある。
- バグfixのみ。 機能の変更無し。
Polly: Polyhedral Optimizer
Polly はデータ局所性と並列性のための実験的なオプティマイザです。
現在、高レベルなループ最適化と(OpenMPランタイムを利用した)自動並列化を提供している。
自動SIMD化とアクセラレータコード生成のあたりはまだ始まったばかりです。
LLVM3.2では次の主な変更点がある。
- Pollyに利用されているisl(integer set library)がMITライセンスとして再度ライセンス化された
- islベースコード生成
- LGPLV2だったCLooGをMITライセンスのものに入れ替え
- 細粒度オプション(Fine grained option)の取り扱い(コアと計算の分離, コントロールオーバーヘッドvsコードサイズ)
- FORTRANとDragonEGGのサポート
- OpenMPコード生成のfix
Clang Static Analyzer
Clang Static Analyzer は潜在的なバグを発見するための高度な解析を実行する、Clangと統合された高度なソースコード解析ツールです。
LLVM3.2のリリースでは、static analyzerは多くの部分で重要な改善をしており、次のような変更点があります。
- Translation Unit(詳細は以下)内で手続き間解析の改善。これはパーサがバグを発見する能力を大きく拡大させる。
- "well-known" APIをモデル化するための新しいインフラ。これは、それらの関数呼び出しをモデル化するときにパーサがより良い仕事を実行できるようにする。
- checker APIで関数/メソッド呼び出しを表現するより統一された方法を用いたことによるstatic analyzer checkersを書くためのAPIの重要な改善。詳細はBuilding a Checker in 24 hoursを見てください。
リリースでは特にObjective-C解析向けの次のような変更点を含む。
- Objective-Cメソッド向けの手続き間解析
- "blocks"の呼び出しの手続き間解析
- dispatch_onceやfriendsのようなGCD APIの正確なモデリング
- arrayやdictionaryリテラルのような最近追加されたObjective-C constructs(訳注:コンテナ?)向けのサポートの改善
リリースでは特にC++解析向けの次のような改善を含む。
- C++メソッド(Translation Unit内)向けの手続き間解析
- C++イニシャライザとデストラクタのより正確なモデリング
最後に、このリリースはscan-build(コマンドラインもしくは統合システムから分析を起動するために使われる)のための多くの小さな改善を含む。
これはディレクトリ横断的な問題を含む。これはいくつかのケースで潜在的なセキュリティ問題を引き起こす可能性がある。
この問題を報告するために、我々はTim Brown氏(Portcullis Computer Security Ltd)に承認を求めている。
LLVM3.2を利用している外部のオープンソースプロジェクト
LLVMの興味深い点として、多くの言語やツールのプロジェクトで何かを実現する(実現技術)ために使われていることです。
この節ではLLVM3.2とともに動作するように既に更新されているプロジェクトの一部を挙げる。
Crack
Crack はコンパイル言語のパフォーマンスをもつ、スクリプト言語のように開発が容易なものを提供することを目的とする。
この言語はC++, Java, Pythonからコンセプトを得て、オブジェクト指向や演算子オーバーロード,強い型付けを取り入れたものです。
EmbToolkit
EmbToolkit はLinuxのクロスコンパイラ toolchain/SDK (GCC/binutils/Cライブラリ(uclibc,glibc,musl))、パッケージのクロスコンパイルのためのビルドシステムそしてオプションとして様々なルートファイルシステムを提供する。
ARMとMIPSをサポートする。
現在3.2リリースに向けたclang+llvm環境を提供するために準備中。
FAUST
FAUST はリアルタイム音声信号処理のためのコンパイル言語です。
FAUSTはFunctional AUdio STreamを表す。
プログラミングモデルは関数型プログラミングとブロック図構成(block diagram composition)の2つのアプローチを結合させたものです。
FaustコンパイラはC, C++, Java, JavaScriptの出力形式に加えて、LLVMビットコードを生成可能で、LLVM2.7から3.2で動作する。
Glasgow Haskell Compiler (GHC)
GHC は遅延評価関数型プログラミング言語であるHaskellのオープンソースのコンパイラおよびプログラミングスイートです。
様々なプラットフォーム向けに最適化されたコードを生成する静的コンパイラや開発時用のインタラクティブなシステムを含んでいる。
GHC7.0以降はLLVM2.8以降をサポートしたLLVMコード生成器を含んでいる。
Julia
Julia は技術計算向け高レベル高性能の動的言語です。
洗練されたコンパイラ、分散並列処理、数値精度、豊富な数値演算ライブラリを提供する。
コンパイラでは型推論を用いて型宣言無しで高速なコードを生成しており、LLVMの最適化パスやJITコンパイラも利用している。
Julia言語 は複数ディスパッチやプログラムに大幅な柔軟性を与えるように設計されている。
Juliaは既に多くの問題に利用可能です。
LLVM D Compiler
LLVM D Compiler(LDC)はD言語用のコンパイラです。
DMDフロントエンドに基づいてLLVMをバックエンドとして利用している。
Open Shading Language
Open Shading Language(OSL)はプログラマブルなシェーディング向けの小さいが高機能な言語です。
先進的な大域照明レンダラや他のアプリケーションで利用され、マテリアル, 光源, 転移, パターン生成の表現に適している。
実行時に複雑なシェーダネットワークをx86コードにJITするためにLLVMを利用している。
OSLはSony Pictures Imageworksによって開発され、フィルムアニメーションとビジュアル効果に特化して使われる社内のレンダラーと使われる。
New BSDライセンスのオープンソースソフトウェアとして配布される。
これはアメイジングスパイダーマン, メン・イン・ブラック3, モンスター・ホテルや現在作成中の他の映画、CM、そしてBlender, VRay, Autodesk Beastのようないくつかのオープンソースレンダリング製品において全てのシェーディングで使われている。
Portable OpenCL (pocl)
簡単で移植性のあるオープンソースのOpenCL実装の実現に加えて、pocl のもう1つの主な目的は、
コンパイラの最適化を利用しターゲットに依存した手動最適化の必要性を減らすことで、
OpenCLプログラムの性能の移植性を改善することです。
poclの重要な部分は、カーネルコンパイラを用いて静的に複数の仕事に並列化させるために使われるLLVMパスの集合です。
これによって複数の方法(SIMD, VLIW, superscalarなど)でワークグループの静的な細流度並列化が可能になる。
Pure
Pure はterm rewritingを基にした代数/関数型プログラミング言語です。
プログラムはsymbolic fashionで式を評価するのに利用される方程式の集合です。
インタプリタはPureプログラムを高速なネイティブコードにJITコンパイルするためにLLVMをバックエンドとして利用している。
Pureは動的型付け, 先行評価と遅延評価, レキシカルクロージャ, 衛生的なマクロシステム(term rewritingを基にしたもの), 組み込みのリストと行列のサポート
そしてCや他のプログラミング言語への使いやすいインタフェース
(LLVMビットコードモジュールのロードや対応するLLVMコンパイラが利用可能であればPureプログラム内にC, C++, Fortran, Faustコードのインライン記述が可能)
Pureバージョン0.56はテストされてLLVM3.2で動作するようになった。また、LLVMリリース2.5以降の古いバージョンでも動作するように開発している。
TTA-based Co-design Environment (TCE)
TCE はTransport triggered architecture(TTA)を基にしたアプリケーション特有のプロセッサ(ASP)をデザインするためのツールセットです。
このツールセットでは上はC/C++プログラムから下は合成可能なVHDL/Verilogや並列プログラムのバイナリまでの完全な共創(co-design)フローを提供する。
プロセッサの設定可能な項目としてはレジスタファイルや機能ユニット, サポート操作, 相互接続ネットワークが含まれる。
TCEはCC/C++言語サポート,ターゲット非依存の最適化そして一部のコード生成のためにlangとLLVMを利用する。
これはコンパイラチェインの大部分をターゲット毎に再コンパイルするのを避けるために、
デザインされたTTAプロセッサのために"オンザフライ"で新しいLLVMベースのコード生成器を生成し、
ランタイムライブラリとしてコンパイラバックエンドへそれらをロードする。
LLVM 3.2の変更点
このリリースには大量のバグフィックス、性能修正そして細かい改善点を含んでいます。
この節ではいくつかの主な改善点と新機能を挙げています。
主な新機能(Majro New Features)
LLVM3.2はいくつかの主な変更点と大きな新機能があります。
- ループベクトル化(Loop Vectorizer)
- SROA(Scalar Replacement Of Aggregates)の新実装
- NVIDIAのソースをベースとしたNVPTXバックエンド(既存のPTXバックエンドの置き換え)
LLVM IRとコアの改善点(LLVM IR and Core Improvements)
LLVM IRは新しいターゲットのより良いサポートのためにいくつかの新機能があり、それによって新たな最適化が可能になります。
- スレッドローカル変数は特定のTLSモデルを持つことができる。 Language Reference Manualを参照。
- 古い関数属性向けの'TYPE_CODE_FUNCTION_OLD' タイプコードとautoupgradeコードが削除された
- Attributeクラスの内部表現は、LLVMContextオブジェクトに格納される一意化されたopaqueオブジェクトへのポインタへと変換される。 よって、Attributesクラスはこのopaqueオブジェクトのただのラッパーとなった。
オプティマイザの改善点(Optimizer Improvements)
多くの細かい性能修正とバグフィックスに加えて、このリリースではオプティマイザに対する細かい強化と追加が少し含まれている。
Loop Vectorizer。我々はループベクトル化を追加し現在では小さなループをベクトル化することができるようになった。
ループ最適化はデフォルトで無効化されており、-mllvm-vectorize-loopsフラグにより有効化できる。
SIMD vector widthは-mllvm-force-vector-width=4フラグで明示される。
そのデフォルト値は0であり、自動選択を意味する。
我々は次のような関数をベクトル化可能である。
unsigned sum_arrays(int *A, int *B, int start, int end) { unsigned sum = 0; for (int i = start; i < end; ++i) sum += A[i] + B[i] + i; return sum; }
我々は次のようなループ下でベクトル化可能である。
- 最も内側のループは必ず1つのBasic Blockを持つ必要がある
- イテレーション回数がループの実行開始以前に既知である
- ループカウンタは1つずつインクリメントされる
- ループトリップカウントは変数になれる
- ループはゼロから始まる必要はない
- 帰納変数(インデックス変数, 誘導変数)をループ内で使うことが可能
- Loop reductionがサポートされている
- アフィンアクセスパターンを伴う配列は'noalias'としてマークされる必要はなく、実行時にチェックされる
SROA。 我々はよりパワフルに、そして残りの最適化パイプラインにより親切なコードを生成するためにSROAを書き直した。
以前はこのパスは比較的な小さな集合のみを操作する必要があるというスケール問題があり、間違えてスカラSSA値にするために大きな集合を1つの大きな整数に置き換えるという問題があった。
小さなスタックバッファを表すi1024やi2048型の大きな数字が結果となった。
これらは今度は次の多くの最適化パスを遅くする。
新しいSROAパスは現在使用中の集合の一部のみをスカラに昇格させる異なるアルゴリズムを使っている。
このため閾値を必要としない。スカラ値を集合の特定のLLVM型ではなく集合の使用から推定する。
これらの特徴はパスとコードの最適化を結合するだけでなく多くの関数のコンパイル時間を劇的に改善する。
- Branch weightメタデータは多くのオプティマイザを通して保護される
MCレベルの改善点(MC Level Improvements)
LLVMマシンコード(MC)サブシステムはアセンブリ, ディスアセンブリ, オブジェクトファイルフォーマットの扱いなどや
CPUの命令セットレベルのツールに関連する数多くの問題を解決するため作られた。
詳細な情報はIntro to the LLVM MC Project Blog Postを参照してください。
- 次のようなアセンブラディレクティブのサポートの追加: .ifb, .ifnb, .ifc, .ifnc, .purgem, .rept そして .version (ELF) Darwin用の .pushsection, .popsection, .previous .
- .lcommディレクティブのハンドリング強化
- MSスタイルインラインアセンブラ: offsetとTYPEオペレータの実装の追加
- ターゲットはNOPパディングのための最小限のサポートされたNOPサイズを明示することができる
- ELF改善: Windows上でELFオブジェクトの生成をサポート
- MachO改善: symbol-difference 変数はN_ABSとしてマークされ、data-in-codeマーカーのためのdirect-to-object属性が追加された
- x86とarmターゲット向けの注釈付きディスアセンブリ出力のサポート
- ARM TARGET2 relocationのサポート追加とARMスタイルの "$d.*"ラベルのハンドリング修正 によりARMサポートが改善された
- PowerPCにおけるlocal-exec TLSの実装
ターゲット独自のコード生成器の改善点(Target Independent COde Genereator Improvements)
Stack Coloring。コードの離れた領域で別個に使われているスタックオブジェクトを共有させるために新しい最適化パスを実装した。
この最適化は、オプティマイザにとってスタックスロットが共有されていないことが明白なケースでは、必要とされるスタックスペースを大幅に減らす。
各alloca について、それがひとつのリージョン内で使われていることをコードジェネレータに伝えるためにlifetimeマーカーを使用している。
連続したload/storeはマージされる。
コード生成基盤に非常に多くの仕事を取り入れた。
これらは積極的なアルゴリズムを実装可能にし、コード生成を早くすることができる。
Very Long Instruction Word(VLIW)アーキテクチャのためのバンドリングをサポートするために新しいTableGen基盤を追加した。
TalbeGenはVLIWターゲットのスケジュール記述からDFA(決定性有限オートマトン)を自動的に生成することができる。
この記述ではバンドル内で命令の正当なグルーピングを決定するために問い合わされる(queried)ことができる。
機械命令バンドルにグルーピングするためにをDFA基盤をベースとした新しいターゲット非依存のVLIW packetizerを追加した。
我々は命令間の関係づけのために新しいTableGen基盤を追加した。
この機能によりTableGenは自動的に関連テーブルのセットと様々な形式の命令間を切り替えるために使われるクエリ関数を構築できる。
詳細な情報はHow To Use Instruction Mappings を参照して下さい。
基本ブロック配置(Basic Block Placement)
確率を基にしたブロック配置とコードレイアウトアルゴリズムがLLVMのコード生成器に追加された。
レイアウトパスは__builtin_expectのようなソースコードアノテーションと同様の静的ヒューリスティックスから算出される確率をサポートする。
X86-32とX86-64ターゲットの改善点(X86-32 and X86-64 Target Improvements)
X86ターゲットにおける新しい特徴と主な変更点は以下の通りです。
- 特にAVX2向けの小さなコード生成最適化
ARMターゲットの改善点(ARM Target Improvements)
ARMターゲットの新機能は以下の通りです。
- A6 'Swift' CPU向けのサポートと性能改善
ARM統合アセンブラ(ARM Integrated Assembler)
Clang向けの直接オブジェクト化モジュールを含む、ARMターゲットのフル機能のマクロアセンブラが対応された。
アセンブラはDarwinでのみデフォルトで有効化されており、Linuxではテストやプラットフォーム特有の追加サポートが未解決です(訳自信無し)。
Thumb1, Thumb2とARMモードが完全サポートされており、サブターゲットと特定CPU拡張としてはVFP2, VFP3とNEONがサポートされている。
アセンブラはUnified Syntax(詳細はARM Architecural Reference Manualを参照)のみが使える。
いくつか発展途上のサポートされているpre-unfied(divided) syntaxあるが、未だサポートと大きな差がある。
MIPSターゲットの改善点(MIPS Target Improvements)
MIPSターゲットにおける新機能と主な変更点は以下の通りです。
- 統合アセンブラサポート: MIPS32がPICとstaticで動作する、既知の制限としてPR14456においてR_MIPS_GPREL16リロケーションが間違った加数(addend)で生成される。 MIPS64サポートは不完全である。例えば例外ハンドリングが動作しない。
- fast calling convetionがサポート
- Android MIPSツールチェインがClangドライバに追加された
- "-mabi=n32"オプションを通したMIPS N32 ABI向けのClangドライバサポートの追加
- MIPS32とMIPS64のディスアセンブラが実装された
- llcの"-mxgot"オプションを通した大きなGOT(64KBを超える)を含んだプログラムのコンパイルをサポート
- MIPS32 DSP intrinsicsの実験的なサポート
- MIPS16の実験的なサポート。次のような制限を持つ: soft floatのみをサポート, C++例外はサポートされない, 大きなスタックフレーム(> 32000 Bytes)はサポートされない, .sでは直接オブジェクトコード出力がサポートされない。
- スタンドアロンアセンブラ(llvm-mc): 実装は進行中であり実験的である
- リトルエンディアンとビッグエンディアンのMIPS32プラットフォームにおける古典的なJITとMCJITの全てのテストがパス
- インラインアセンブラサポート: 全ての共通の制約(constraints)とオペランド修正(modifiers)が実装された
- 末尾最適化(tail call optimization)のサポート。llcの"-enable-mips-tail-calls"オプションを使うかもしくはClangの"-mllvm-enable-mips-tail-calls"オプションを使うことで有効化できる
- $fp, $gp, $ra, $atレジスタを予約レジスタから削除することによるレジスタ割り当ての改善
- 長い分岐展開(Long branch expansion)パスが実装された。これは16-bitフィールドに入らないoffsetを持つ分岐命令を展開する。
- Cavium Octeon IIボードがテストビルドに使われる(llvm-mips-linux builder)
PowerPCターゲットの改善点(PowerPC Target Improvements)
64-bit PowerPC ELF ABI準拠のため、GCCとの相互運用性のため、そして全般的な64-bit PowerPCサポートのため、多くの修正と変更がLLVMに(そしてClangにも)なされている。
いくつかの主な変更は以下の通りです。
- MCJITサポートの追加
- PPC64リロケーションサポートと(Small code model) TOCハンドリングの追加
- パラメータ渡しと戻り値のfix(アライメント問題, パディング, varargsサポート, 適切なレジスタ使用, 奇数サイズの構造体サポート, 浮動小数点数サポート, i32戻り値のための戻り値拡張)
- ベクタレジスタのためのspill/reloadコードの修正
- C++例外ハンドリングの有効化
- GCCの挙動に関連するdouble-rounding互換性問題を修正するための変更
- Darwin ppc64 ABIサポートからppc64-elf-linux ABIを独立させる(disentangle)ためのリファクタリング
- 新しいテストケースの分類、およびテストケースの修正(エンディアンやwordサイズ問題)を分類した
- ビッグエンディアンコード生成バグ, 命令エンコーディングや命令制約のfix,
- Clang統合アセンブラ(-integrated-as)の実装
- Altivec compare命令の追加サポート
- IBM long doubleサポート
更に32bit,64bitコード向けのコード生成の改善を含む。
Freescale e500mcとe5500コア向けの命令スケジューリングサポートの追加
PTX/NVPTXターゲットの改善点(PTX/NVPTX Target Improvements)
PTXバックエンドはNVPTXバックエンドにより置き換えられた。
NVPTXバックエンドはNVIDIAによるCUDA(nvcc)とOpenCLコンパイラで使われているLLVMバックエンドをベースとしている。
いくつかの主な変更点は以下の通りです。
- PTX3.1とSM3.4の互換性
- NVIDIA Compiler SDKで定義されているでNVVM intrinsics向けのサポート
- より多くのLLVm IRをカバーした古いPTXバックエンドとの完全な互換性
バックエンドのいかなるバグもLLVM Bugzillaに投稿するようにお願いします。
他のターゲット特有の改善点(Other Target Specific Improvements)
- TargetLibraryInfoにおけるライブラリ関数のためのカスタム名のサポート追加
主な変更点と削除された機能(Major Changes and Removed Features)
ここでは以前のリリースからアップグレードしようとして陥るかもしれない"落とし穴"を挙げていきます
- llvm-ldとllvm-stubは削除された。llvm-ldの機能は一部についてはllvm-link, opt, llc, ldに置き換えられ、Clangにより完全に置き換えられた。
- MCJIT: インラインアセンブリのサポート(asm parserが必要), lliの'-remote-mcjit'のための疑似リモートターゲット実行の追加
内部APIの変更点(Internal API Changes)
多くのAPIがこのリリースで変更されている。
いくつかの主なLLVM APIの変更点は以下の通りである。
(CodeGenパスからだけではなく)IRレベルパスでターゲット特有の情報にアクセスを可能にするための新しいインターフェイスを追加した。
"TargetTransformInfo" と呼ばれる新しいIRレベルパスでは、いくつかの低レベルインタフェースを提供する。
LSRとLowerInvokeは既にこのインターフェイスを使っている。
構造体TargetDataはDataLayoutという名前に変更され、さらに(Targetに依存しないようにするために、Targetから)VMCoreに移動しました。
ツールの変更点(Tools Changes)
いくつかのツールがこのリリースで変更されました。変更点の一部は以下の通りです。
- opt: '-mtriple'オプションのサポート追加
- llvm-mc: '-show-inst'と-show-encoding'オプションのための'-disassemble'オプションのサポート, X86とARMターゲット向け注釈付きディスアセンブリ出力生成のための'-edis'オプションの追加
- libprofile: プロファイルデータファイル名がLLVMPROF_OUTPUT環境変数により明示できるようにした
- llvm-objdump: 利用可能なターゲットを表示するように変更した, '-arch'オプションでx86とx86-64が有効なarch名として認識されるようになった
- llcとopt: '-enable-excess-fp-precision'オプションもしくは'-enable-unsafe-fp-math'オプションにより有効化される FADD + FMUL もしくは FSUB + FMULのペアーからFMA構成の追加
- llc: llcからのオブジェクトファイル出力はもはや実験的とは思われていない。
- gold プラグイン: Position Independent Executables (PIE)のサポート
既知の問題点
LLVMはプロダクション品質のコンパイラであり、幅広いアプリケーションで使われて多くの製品を輩出しています。
とは言え、全てのサブシステムが総体として成熟しているとは言えません(特にマイナーなターゲットにおいては)。
もし問題に遭遇した場合は、LLVMバグデータベース をチェックし、既知でない場合はバグを提出するかLLVM開発者ML で質問してください。
既知の問題点としては以下の通りです。
- CellSPU, MSP430そしてXCoreバックエンドは実験的な段階です。 CellSPUバックエンドはLLVM 3.3で削除される予定です。
- 統合アセンブラ, ディスアセンブラそしてJITはいくつかのターゲットではサポートされていません。統合アセンブラがサポートされていない場合、システムアセンブラが必要とされています。詳細はTarget Features Matrixを参照して下さい。
追加情報
LLVMウェブページ 、特にドキュメント では様々な追加情報が利用できます。
ウェブページにはSubversionにあるソースコードにあわせて更新されているAPIドキュメントもあります。
LLVMツリーの"llvm/branches/releases"のdocsディレクトリに行くと特定のリリースに対するドキュメントが取得可能です。
LLVMに関する質問やコメント等がありましたらメーリングリスト を通してお気軽にご連絡下さい。