問題タブ [llvm-c++-api]
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.
llvm - LLVM で符号付き整数と符号なし整数を区別する方法
ここで説明されているように、LLVM プロジェクトは符号付き整数と符号なし整数を区別しません。ただし、サイズが拡張されている場合や除算で使用されている場合など、特定の変数を符号付きまたは符号なしとして解釈する必要があるかどうかを知る必要がある状況があります。これに対する私の解決策は、変数が整数型かカーディナル型かを説明する変数ごとに個別の型情報を保持することです。
しかし、LLVMで型をそのように「属性」する方法はありませんか? タイプに追加できるある種の「ユーザーデータ」を探していましたが、何もないようです。LLVM では等しい型は 1 回しか生成されないため、これは型の作成時に何らかの形で発生する必要があります。
したがって、私の質問は次のとおりです。
整数変数を LLVM インフラストラクチャ内で符号付きまたは符号なしとして解釈する必要があるかどうかを追跡する方法はありますか、それとも私のように個別の情報を保持する唯一の方法ですか?
ありがとう
llvm-clang - LLVM IR 用に SIMD マシンが生成されているかどうかを確認する
LLVM ライブラリを使用して LLVM IR モジュールを生成し、それをコンパイルして実行する C++ プログラムがあります。
コードはベクター型を使用しており、私のアーキテクチャーで正しく SIMD 命令に変換されるかどうかを確認したいと考えています。
どうすればこれを見つけることができますか? この IR から生成されたアセンブリ コードを確認する方法はありますか?
c++ - clang::HeaderSearch 検索パスは無視されました
clang::CompilerInstance
インクルードを含むソース ファイルを解析しようとしていますが、インクルードされたヘッダーを実際に見つける方法がわかりません。これが私のセットアップです:
パスは間違いなく 100% 正しく、何度も何度もチェックしました。私がスローしたソースコードに のようなものが含まれるまで、すべてが機能し#include <foobar.h>
ますerror 'foobar.h' file not found
。ここで本当に明白な何かが欠けているように感じます。正しい方向への指針はありますか?
llvm - LLVM メタデータに任意のデータを保存するにはどうすればよいですか?
LLVM C++ API を使用して生成しているモジュール内に一連のキー値を格納したいと考えています。可能であれば、メタデータとして保存したいと考えています。LLVM の変更されていないバージョンでそれは可能ですか、それとも変更する必要がありますか?
llvm - C++ API を使用した LLVM の最適化
LLVM モジュールですべての最適化を実行する方法を見つけようとしています (たとえば、すべての -O3 最適化)。次のことを試しましたが、可能なすべての最適化が適用されているかどうかはわかりません (インライン化など)。
出力 LLVM IR のパフォーマンスを向上させるために他にできることはありますか?
EDIT :以下に示すようAddOptimizationPasses()
に、関数のすべての最適化を追加しようとしました:opt.cpp
また、 を作成するFunctionPassManager
前に を作成し、次のPassManager
ようにいくつかのパスを追加します。
ただし、パフォーマンスは -O1 を使用してコマンド ラインで実行した場合と同じですが、-O3 を使用するとコマンド ラインではるかに優れたパフォーマンスを得ることができます。助言がありますか?
llvm - 基本ブロックの名前/ラベルを変更します (llvm パスで)
llvm で特定の基本ブロックの名前/ラベルを変更する方法はありますか?
c++ - C++ ポインタを LLVM JIT コードと共有する
プログラムの大部分を通常のコンパイル済み C++ プログラムにしたいと考えています。このプログラムは、スタックに連続したメモリのチャンクを使用します。スタックの最上位は、通常のポインターによって維持されます。
そのポインターを、LLVM JIT で生成されたコードと共有したいと考えています。たとえば、次のようになります。
whereは、現在のインクリメントpointerInc()
に JIT されたコードを挿入します。コードは次のとおりです。BasicBlock
top
pointerInc()
残念ながら、これは機能しません。pointerInc()
間違っているのは(大きい方の)本体です。llc
コードは実際には、ポインターをインクリメントする通常の C++ プログラムで生成された LLVM C++ API コードから派生しています。
実行すると、プログラムは次のように出力します。
2 つの質問があります。
- これは正しいです?生の C++ ポインターを JIT されたコードと共有するなど、自分のやりたいことを実行できますか?
- なぜコアをダンプするのですか?
JIT された関数を空にしても、関数を呼び出す行でコードがコア ダンプします。LLVM JIT セットアップ コードは、私が見たすべての例のように見えるので、何が問題なのかわかりません。
少しの援助?
アップデート
非推奨の行を変更すると:
新しい行に:
その後func_ptr
はヌルです。
llvm - 外部関数への callinst の作成
インストルメンテーション パスを作成しています。パスは、指定された IR を特定の方法で変更することになっています。必要な変更の 1 つは、特定の場所に関数への呼び出しを挿入することです。これは、呼び出された関数のシグネチャです。
この関数のプロトタイプはinclude/llvmfoofile.h
内のファイルに
あり、関数定義はMCJITフォルダー内のファイルにあります。このフォルダーで実行すると正常に動作し、同じファイル内の別の関数でコンパイルされ、期待どおりに正常に動作します。インストルメンテーション パスには戻りません。特定の IR で foo 関数に callinst を挿入するにはどうすればよいですか? 呼び出しを挿入するスニペットは次のとおりです。foofile.cpp
make
foofile.cpp
MCJIT.cpp
注: Args2
は、関数への 2 つの値ポインターと基本ブロックを含む配列リストでbb
あり、呼び出しを挿入する基本ブロックです。
特定の IR で op を使用してパスを実行すると、次のように宣言と呼び出しが正しく生成されます。
宣言:
電話:
しかし、lli を使用して結果の .ll ファイルを実行しようとすると、すべてが爆発します。これは、スタックトレースの前の最初の 2 行です。
問題は foo 関数が見つからないことだと結論付けました。これが問題である場合、callinst を正しく作成するにはどうすればよいですか?