問題タブ [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.
assembly - LLVMとコンパイラの命名法
LLVMシステムを調べており、GettingStartedのドキュメントを読みました。ただし、いくつかの命名法(およびclangの例の表現)はまだ少し混乱しています。次の用語とコマンドはすべてコンパイルプロセスの一部であり、誰かが私のためにそれらをもう少しよく説明できるのではないかと思っていました。
clang -S
vs.clang -c
(私は何をするのか知って-c
いますが、結果はどのように異なりますか?)* (編集)- LLVMビットコードとLLVMIR(違いは何ですか?)
- .llファイルと.bcファイル(それらは何ですか、どのように異なりますか?)
- LLVMアセンブリコードとネイティブアセンブリコード(違いはありますか?)
より高いレベルでは、コンパイルプロセス全体を理解しており、かなりうまく追跡できます。たとえば、「IR」が表示されることを期待しているが、代わりに「ビットコード」または「 LLVMアセンブリ」ということで、私はそれらをほとんど理解していないと思います。
function - C++ で IR 関数を呼び出す方法
次のような関数を含む C++ ファイルがあり、int myMax(int a,int b)
それを llvm IR にコンパイルします。別の C++ ファイルで IR を操作したいのですが、C++ ファイルで関数 (myMax など) を呼び出す方法がわかりません。
llvm - LLVM IR: ベクトルを効率的に合計する
LLVM IR 命令を生成するコンパイラを作成しています。私はベクターを幅広く扱っています。
ベクトル内のすべての要素を合計できるようにしたいと考えています。現在、各要素を個別に抽出して手動で追加しているだけですが、これはまさにハードウェアが支援できるはずの種類のものだと思います (かなり一般的な操作のように思えます)。しかし、それを行うための本質的なものはないようです。
これを行う最善の方法は何ですか?LLVM 3.2 を使用しています。
javascript - Javascript LLVM IR ビットコード インタープリターはありますか?
アドオン/プラグインなどに依存せずに、ブラウザーで既存の C プロジェクトを実行しようとしています。ソースは 3MB で、結果のコンパイル済みビットコード (llvm-link) は 3.5M です。
ビットコードを lli で実行すると、ネイティブ ELF バイナリをコンパイルして実行する場合と同じように、メモリ使用量は約 150MB です。
Emscripten (-O2 --closure 0) はビットコードを 24MB の .js ファイルにコンパイルします。それを Node.js で実行すると、メモリが不足します (上は約 2GB のメモリ使用量を示しています)。
jslinux のデモが示しているように、ネイティブ コードを解釈できるはずです。許容できるパフォーマンスでコンパイルされたビットコードを解釈する方がおそらく簡単です。私の質問は、JavaScript で LLVM IR を解釈しようとするプロジェクトがあるかどうかです (Emscripten、mandreel などのように IR を JavaScript に変換するのではなく)。
llvm - llvm::命令がフロー制御内にあるかどうかを確認する方法は?
LLVM を使用して、命令がフロー制御 (if/switch/for) 内に存在するかどうかを調べようとしていますが、IR レベルでこれを行う必要があります。疑似コードは以下のようなものです。
関数の SCC を見ていますが、命令がフロー制御内に存在するかどうかを確実に推測する方法がわかりません。
この IR の万華鏡の例から例をとります。
上記の IR で、関数 foo へのすべての呼び出しを調べたいとしましょう。したがって、エントリ ブロックには %0 の呼び出しが 1 つあり、then: ブロックに 1 つあり、別の foo の呼び出しと ifcont: ブロックの最後の呼び出しがあります。
問題は、then: ブロック内の呼び出しが if ブロックから生成されたコードに含まれているが、どうすればそれを推測できるかということです。つまり、entry ブロックと ifcont ブロックは実行されますが、then: ブロックは条件によっては実行されない場合があります。
誰かが私にいくつかの指針を教えてもらえますか? ありがとう
編集: もう少し考えてみると、ドミネーター ツリーがこれを判断するのに役立つかもしれませんが、これに対するアルゴリズムはまだありません。
perl - Perl用のLLVMバックエンドはありますか?
Perlに変換したいCで書かれたプロジェクトがあります。私の友人はLLVMの使用を提案しました。Clangを使用してCコードをLLVMアセンブリにコンパイルしました。現在、この中間表現をPerlに変換しようとしていますが、そのバックエンドが見つからないようです。誰かが私を正しい方向に向けてくれませんか?
c++ - llvm でのメモリ結合分析
LLVM 分析パスを使用して、プログラムで合体分析を実行しようとしています。
基本的には、配列アクセスを見て、メモリ アクセスが合体できるかどうか、つまりアクセス式が帰納変数に対して単調かどうかを調べる必要があります。
次の問題に直面しています。LLVM IR では、配列アクセスは getelementptr 命令で表現されます。そこからどのように表現を再構築できるでしょうか。
静的分析を使用してそれが不可能な場合は、動的分析も実行します。
それが役立つ場合は、次のアルゴリズムを実装しようとしています:
llvm - llvm で基本ブロック ターミネータが生成されない
私は llvm を初めて使用し、ここでオンライン チュートリアルのみを行いまし た。これを解析したい:
次の 2 つのことを行う必要があります。
- 1 を返す新しい関数を定義する
- 式として使用できるように値を返す
関数は正しく作成されますが、式として使用する際に問題があります。AST は次のようになります。
関数のコード作成のコードは次のようになります。
そして、DefExprAST は次のようになります。
verifyFunction
次のエラーが表示されます。
実際、生成された関数には ret エントリがありません。空っぽです:
しかしRetVal
、double で正しく埋められBuilder.CreateRet( RetVal )
、ret ステートメントを返しますが、エントリに挿入されません。