22

LLVMは非常にモジュール化されており、新しいバックエンドをかなり簡単に定義できます。ただし、LLVMバックエンドの作成に関するドキュメント/チュートリアルのほとんどは、新しいプロセッサ命令セットとレジスタの追加に重点を置いています。LLVM用のVHDLバックエンドを作成するには何が必要か疑問に思っていますか?LLVMを使用して1つの高級言語から別の言語に移行する例はありますか?

明確にするために:LLVM IRをアセンブリ言語ではなく高級言語に翻訳する例はありますか?例:CでClangを読み取り、LLVMを使用して最適化を行い、JavaやFortranなどの別の言語でコードを書き出すことができます。

4

7 に答える 7

19

はい !

VHDL/Verilog をターゲットとする LLVM バックエンドが数多くあります。

そして、他にもたくさんいることを知っています...

LLVM や GIMPLE (ちなみに RTL とも呼ばれます) などの低レベル表現の興味深い点は、静的単一割り当て (SSA) フォームを公開することです。これは、SSA がマルチプレクサのツリー...

于 2011-02-01T14:02:18.650 に答える
3

LLVM IR について特別なことは何もありません。これは、可変アリティを持つ標準の DAG です。LLVM IR の逆コンパイルは、機械語の逆コンパイルによく似ています。

定数フォールディングなどのフロントエンドの最適化を活用できるかもしれませんが、タスク全体と比較すると、それはかなりマイナーに思えます。

LLVM に関する私の唯一の経験は、おもちゃの CISC からカスタム RISC まで、クラス プロジェクト用のバイナリ トランスレータを作成することでした。

これは標準の IR に最も近いものなので ( GCC GIMPLEは 2 番目に近い)、アルゴリズムとスタイルに適合するかどうかを確認し、1 つの代替案として評価してください。

GCC も移植性を何よりも優先することから始め、多くのことを達成したことに注意してください。

于 2010-09-09T00:27:03.790 に答える
1

あなたの質問の一部が互いにどのように関連しているかはわかりません。

LLVM を C のような高級言語にターゲット化することは非常に可能であり、1 つの基準点を見つけたようです。

ただし、VHDL はまったく別のビジネスです。VHDL は高級言語だと思いますか? そうかもしれませんが、ハードウェア/ロジックを説明しています。確かに、VHDL には実際にプログラムするために使用できる構造がいくつかありますが、実り多い試みとは言えません。VHDL はハードウェアを記述するため、LLVM IR を VHDL のカスタム命令セットで CPU を設計し、LLVM IR を自分の命令に変換しない限り、VHDL に変換するのは非常に難しい問題です。

于 2010-09-17T17:00:47.217 に答える
1

質問は部分的に回答されたようですので、試してみたいと思います:

  • LLVM 用の VHDL バックエンドを作成するには何が必要ですか?

  • LLVM IR を高水準言語に翻訳するには何が必要でしょうか (おそらく高水準言語間の変換を意図して)?

2 については背景を説明します。1 については後日詳しく説明します。

LLVM IR を C や Java などの高級言語に変換する場合:

LLVM 命令を取り出し、それを同等の C コードに抽象化する必要があります。次に、LLVM に相当するものがない残りの機能 (C++ のクラスや抽象化など) を取得し、LLVM でそれらのパターンを見つけるルーチン (再利用されたブロックなど) を作成し、C を記述する必要があります。基本的なものについては、それはかなり簡単です。しかし、思考の流れを追うだけで、問題の真の難しさにすぐに気が付くでしょう。結局のところ、誰もが簡単な C を書くわけではないのです。さらに困難を増すために、生成された C をコンパイルするときに同じ LLVM IR が得られない可能性があります! (結果として生じるフィードバック ループを考慮してください)

Javaに関しては、LLVM IRから直接行くことはさらに困難な戦いに直面しています.どちらの場合でも、同じコードをLLVM IRにコンパイルすることさえできないという問題があります。むしろ、LLVM IR を JVM バイトコードに変換します。次に、リバース コンパイラを使用して Java を取得できます。

中国人学生のグループは明らかにこれを行うことができた. 彼らは LLVM の人たちが何をしたか、そしてそれが JVM よりも優れていることを完全には理解していません。(実際、LLVM は間違いなく JVM を時代遅れにします;)

これは、LLVM を C と Java の間の仲介として使用して双方向に変換できるという点で便利に思えますが、間違った質問をしているため、実際にはほとんど役に立ちません。ほら、実用的な目的でそれが必要な理由は、共通のコードベースを持ち、パフォーマンスを向上させるためです。

しかし、本当の問題は、現代の言語の共通機能を抽象化し、そこから構築できる中心的な言語を提供する言語が必要だということです。 http://julialang.org/が質問に答えました

于 2016-01-08T08:55:31.057 に答える
1

このスレッドは、同じものを探しているときに最初に見つけたものの 1 つです。

私は、llvm 3.5 の下で、または llvm 3.5 を使用してきれいにビルドする、かなり先のプロジェクトを見つけました。それはかなりクールです。HDL を吐き出し、その他のさまざまなクールな FPGA 関連のことを行います。TTA で動作し、FPGA 用のイメージを生成する (またはそれらをシミュレートする) ように設計されていますが、c 関数から簡単な HDL 生成を実行するように作成することもできます。

アルテラ FPGA にアップロードしたかったので、私の目的には完璧でした。fpga_stdout の例は、Quartus ビルド スクリプトとプロジェクト ファイルを出力します。

TTA ベースの共同設計環境

また、受け入れられた回答と他のいくつかにリストされていることを試してみたところ、それらがうまくいかないか、あまり高品質ではないことがわかりました(通常は両方)。TCE はプロフェッショナルな感覚ですが、純粋にアカデミックだと思います。とても素敵です。

于 2014-11-27T16:55:54.190 に答える
-1

開始するのに最適な場所は、LLVMソースのCBackendを使用することです。

llvm / lib / Target / CBackend / CBackend.cpp

于 2010-09-09T16:54:23.793 に答える
-1

tl,dr : LLVM は適切なツールではないと思います

あなたが探しているのは、LLVM コードをより高い言語に翻訳する方法です。これはemscriptenが Javascript に対して行うことです。

しかし、その目的のために特定の中間言語ビルドを使用することを達成するために静的コードを生成することを意図しているため、LLVM のポイントを少し見逃しているようです。

ご覧のとおり、emscripten の動作はスタックを実装することによって行われますが、javascript を使用しなければ、人間はそれを行っていたでしょう。

Python を VHDL または Verilog に変換するMyHDLのように、元の質問を達成しようとするプロジェクトがいくつかあります。

于 2011-01-30T00:28:06.787 に答える