問題タブ [llvm-ir]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
10128 参照

llvm - C プログラムから LLVM Jit を呼び出す

llvm.org のオンライン コンパイラを使用して bc ファイルを生成しました。この bc ファイルを ac または C++ プログラムからロードし、llvm jit を使用して bc ファイルで IR を実行できるかどうかを知りたいです (プログラムでc プログラム)、結果を取得します。

どうすればこれを達成できますか?

0 投票する
1 に答える
2154 参照

linker - LLVMをライブラリの関数にインライン化する

LLVMライブラリからインライン関数を作成しようとしています。

とリンクしたLLVMビットコードファイル(手動で生成)があります。llvm-linkまた、によってビットコードにコンパイルされclang、アーカイブされたライブラリ(Cで記述)もありllvm-arます。LLVMすべてをリンクして実行することはできますが、ライブラリから関数をインライン化することはできません。これをどのように行うべきかについての手がかりはありますか?

0 投票する
4 に答える
14425 参照

assembly - LLVM アセンブリを直接使用することは可能ですか?

llvm に関する Web ページや記事をいくつか読みましたが、このプロジェクトに非常に興味があります。(おそらく、x86 の複雑な点に苦労することなく、コンパイラーの作成について何かを学ぶためです)。

llvm アセンブリの書き方やアセンブル方法が書かれているページもありますが、実際にこれらを実行するにはどのような環境が必要なのかはわかりませんでした。ファイルに対して llvm-gcc を実行して、C コンテキストで実行可能なオブジェクト ファイルを取得できることはわかっています。しかし、C ランタイム環境 (およびその友人) を使用したくない場合、libc.sollvm コードを実行するには何が必要ですか? それに関するドキュメントはありますか?

0 投票する
2 に答える
4573 参照

compiler-construction - LLVM IRでクロージャを効率的に実装するには?

バックエンドとして LLVM を使用する言語にクロージャー (ラムダ) を追加し始めました。常にインライン化できる単純なケースのために実装しました。つまり、クロージャー定義自体のコードは、使用されている場所でインライン化されるため、生成する必要はありません。

ただし、クロージャーが常にインライン化されていない場合 (たとえば、インライン化されていない別の関数に渡される場合) にクロージャーのコードを生成する方法。好ましくは、呼び出しサイトは、通常の関数またはクロージャーが渡されるかどうかを気にせず、通常の関数として呼び出す必要があります。

合成名で関数を生成できましたが、参照環境を追加の引数として使用する必要があり、その関数を、必要な追加の引数を知らない別の関数に渡すことはできませんでした。

私は、LLVM のトランポリン組み込み関数を使用して 1 つの可能な解決策を考えました。これは、関数から単一のパラメーターを「削除」し、1 つ少ないパラメーターを受け取るトランポリン関数へのポインターを返します。この場合、クロージャー用に生成された関数が参照環境を最初のパラメーターとして受け取った場合、それを切り取って、クロージャーが実際に宣言するのとまったく同じ数のパラメーターを受け取る関数を取り戻すことができます。これは実行可能ですか?効率的?より良い解決策はありますか?

コード例:

ここで、これが にインライン化されず、個別にコンパイルされる可能性があり、そこで呼び出しサイトを変更できないと想像してみましょdef main() = 3 + 4 + 5applyFunctionTo。トランポリンを使用すると、生成されるコードは次のようになると思います (疑似コードで表現、* はポインターを意味します)。

これは正しいと思いますか?

0 投票する
2 に答える
1479 参照

llvm - llvm の Dead Code Elimination パスを介して命令を削除する

LLVM での私のパスは、次のIRようなものを生成します。

or命令は実際には必要ない (デッド コード) ため、出現するすべての を に置き換えまし%7%5。これで、or命令が削除されます。自分のパスから LLVM のDead Code Eliminationパスを呼び出すことはできますか、またはそのor命令を削除する方法はありますか?

0 投票する
3 に答える
3692 参照

compiler-construction - llvmIRコードでのラベルの表現

llvm IRのラベル識別子がコンマ';'で始まって ; <label> 6 いることに気付くことがありますが、私が知っているように、コンマはコメントに使用されます。では、llvmはコメント内のラベル情報をどのように取得できますか?私は何かが足りないのですか?
1つの簡単なテストが続きます。
Cソースファイル:

http://llvm.org/demo/index.cgi(clang -c -emit-llvm main.cと同じ)によって生成されたllvmIRコードは次のとおりです。

0 投票する
2 に答える
4064 参照

llvm - LLVM-IR から llvm c++ API コードを自動生成できますか?

clang 3.0 オンライン デモ ページhttp://llvm.org/demo/index.cgiは、入力プログラムの LLVM-IR を表す LLVM C++ API コードを出力するオプションを提供します。

「LLVM C++ APIコードを生成する」出力はclangオプションですか(もしそうなら、それは何ですか)?

それともllvmツールオプションですか(どちらですか)?

同じことをLLVM-IR入力から行うことは可能ですか? 基本的に、特定の llvm-ir シーケンスを生成するために必要な適切な llvm c++ api 呼び出しを確認したいと思います。ドキュメントから順方向に学習するのではなく、例から逆方向に学習したいと思います。

マニュアルページと、clang、llvm-as、および llvm-dis の --help と --help-hidden には、明白な情報は何も表示されません。

編集:OK今、そのWebページの出力に「llvm2cppによって生成された」と表示されます。しかし、最近のllvmリリースではそのツールを見つけることができません。古いリリースのみで、2.9と3.0の新しいツールがllvm2cppに引き継がれていますか?

0 投票する
5 に答える
3385 参照

compiler-construction - コンパイラ出力言語 - LLVM IR と C

コンパイラを作成する場合、ターゲット言語に LLVM IR と C を使用する利点と欠点は何ですか? 私は両方が使用されていることを知っており、clang を使用して C をコンパイルした場合、最終的なマシン コードは似ていると思います。

0 投票する
3 に答える
38472 参照

llvm - PHI命令の正確な機能とLLVMでの使用方法

LLVM にはphi命令があり、非常に奇妙な説明があります。

「phi」命令は、関数を表す SSA グラフに φ ノードを実装するために使用されます。

通常、分岐を実装するために使用されます。私の理解が正しければ、依存関係の分析を可能にする必要があり、場合によっては不要な読み込みを回避するのに役立つ可能性があります。しかし、それが正確に何をするのかを理解することはまだ難しいです。

万華鏡のは、ケースについてかなりうまく説明していますif。ただし、&&や などの論理演算を実装する方法はそれほど明確ではありません||オンラインllvmコンパイラに次のように入力すると:

最後の数行は私を完全に混乱させます:

phiノードが使用できる結果を生成するように見えます。そして、ファイノードはどのパスから値が来るかを定義するだけだという印象を受けました。

誰かがファイノードとは何か、そしてそれを実装||する方法を説明できますか?

0 投票する
1 に答える
4028 参照

c++ - LLVM IRで文字列リテラルの値を取得するにはどうすればよいですか?

LLVMは初めてです。printf中間表現が与えられたときに、呼び出しの引数を検査する基本的なパスを作成しようとしています。
フォーマット文字列が文字列リテラルでない場合は、もちろん検査できません。しかし、かなり頻繁にそうです。

私が調べようとしているサンプルIRは次のとおりです。

と呼ばれる既存のパスを見つけましたExternalFunctionsPassedConstants。これは関連性があるようです。

だから私はコードを追加しました:

これまでのところ、とても良いです-タイプIDが14であることがわかります。これは、それがであることを意味しPointerTyIDます。

しかし、今、引数として渡されている文字列リテラルの内容を取得するにはどうすればよいので、実際に与えられた数に対して期待される引数の数を検証できますか?