25

現在、llvm を使用してコンパイラ プロジェクトに取り組んでいます。さまざまなチュートリアルに従って、パーサーで構文ツリーを作成し、提供された IRBuilder を使用してツリーを llvm モジュールに変換しました。

私の目標は実行可能ファイルを作成することですが、次に何をすべきか混乱しています。私が見つけたすべてのチュートリアルは、llvm モジュールを作成し、Module.dump() を使用してアセンブリを出力するだけです。さらに、私が見つけることができる唯一のドキュメントは、llvm 開発者向けであり、プロジェクトのエンド ユーザー向けではありません。

マシンコードを生成したい場合、次のステップは何ですか? llvm-mc プロジェクトは、私がやりたいことができるように見えますが、ドキュメントが見つかりません。

おそらく、llvm が実行しないことを期待しているのでしょう。私の期待は、モジュールを構築できることです。その後、モジュールで呼び出すことができる API があり、ターゲット トリプルとオブジェクト ファイルが生成されます。JIT の作成に関するドキュメントと例を見つけましたが、それには興味がありません。コンパイルされたバイナリを生成する方法を探しています。

影響がある場合は、OS Xに取り組んでいます。

4

4 に答える 4

19

llc -filetype=objIRからリンク可能なオブジェクトファイルを発行するために使用します。のコードをllc見ると、そのようなコードを発行するためにLLVMAPI呼び出しが行われていることがわかります。少なくともMacOSXとLinuxの場合、そのような方法で放出されたオブジェクトはかなり良いはずです(つまり、これは今のところ「アルファ品質」オプションではありません)。

ただし、LLVMにはリンカーが含まれていません(まだ!)。したがって、このオブジェクトファイルを実行可能ライブラリまたは共有ライブラリに実際にリンクするには、システムリンカーを使用する必要があります。単一のオブジェクトファイルで構成される実行可能ファイルがある場合でも、後者はとにかくリンクする必要があることに注意してください。LLVMコミュニティの開発者は、と呼ばれるLLVMの実際のリンカーに取り組んでいlldます。そのページにアクセスするか、メーリングリストのアーカイブを検索して、進捗状況を確認できます。

于 2012-11-22T13:41:54.117 に答える
16

llc ガイドで読むことができるように、実際にはアセンブリを生成するだけであり、「アセンブリ言語の出力をネイティブ アセンブラとリンカーに渡して、ネイティブ実行可能ファイルを生成できます」-たとえば、gnu アセンブラ ( as) とリンカー ( ld)。

したがって、ここでの主な答えは、アセンブルとリンクにネイティブ ツールを使用することです

ただし、ネイティブ オブジェクトを IR ファイルから直接生成するための実験的なサポートがありますllc

-filetype      - Choose a file type (not all types are supported by all targets):
    =asm         -   Emit an assembly ('.s') file
    =obj         -   Emit a native object ('.o') file [experimental]

または、ファイルllvm-mcからアセンブルするために使用できます。.s

-filetype      - Choose an output file type:
    =asm         -   Emit an assembly ('.s') file
    =null        -   Don't emit anything (for timing purposes)
    =obj         -   Emit a native object ('.o') file

ただし、リンカーについてはわかりません。

さらに、マシン コードを生成するためのプラットフォームのネイティブ C ツールチェーンとtools/bugpoint/ToolRunner.h組み合わせたラッパーを公開するファイルをチェックアウトすることをお勧めします。llcヘッダーコメントから:

このファイルは、C およびアセンブリ コードのコンパイルに使用される、プラットフォーム C コンパイラに関する抽象化を公開します。

于 2012-11-21T11:28:55.747 に答える