問題タブ [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.
c++ - LLVM IR でグローバル変数の場所を制御するには?
特定の定数と関数がメモリ内で連続するように LLVM を変更しようとしています。
言い換えれば、特定の関数のマシン コードの前に、メモリ内で常に ~4 バイトの定数があることを確認する必要があります。関数本体自体は変更しないでください。
LLVM IR を何らかの方法で変更するだけでこれを達成できますか?
はいの場合: 変数と関数をメモリ内で連続した状態に保つために、LLVM IR でどのように記述しますか?
「いいえ」の場合: これを実現するには、コード生成プロセスのどの部分 (つまり、どのパス) を変更する必要がありますか? どこから始めればよいかわからないので、私が見るべきプロジェクト/ファイルへのリンクは役に立ちます。
c++ - std::istreamからLLVMIRを読み取る
以前、私はIRをファイルに書き込んだり、ファイルから読み戻したりする方法を尋ねていました。読み取ったコードは次のようになりました。
ただし、LLVM IRを後付けしようとしているコードは、私に合格しますstd::istream&
。どうすればIRを読み取ることができstd::istream
ますか?
モジュールを書くためにaをraw_os_ostream
に適応させる方法を理解しましたが、コードを読み取りに適応させる明確な方法はありません。たとえば、(見逃した場合を除いて)適応する方法はありません。std::ostream
raw_ostream
MemoryBuffer
std::istream
c++ - 配列インデックスを決定する
Cコードに次のループがあります。
上記のコードで、配列bのストライドが3で、fの増分係数が2であることを確認したいと思います。
生成されたLLVMアセンブリは(ループを含むブロックの場合):
今私のLoopPassでは、次のコードを使用しています。
しかし、出力として何も得られません。私はここで何が間違っているのですか?
c++ - LLVM命令を挿入するには?
私は何時間も探していましたが、私を助けることができるものは何も見つかりません. FunctionPass を含むプロジェクトに取り組んでいます。runOnFunction(Function &f) メソッドを実装しましたが、正常に動作しています。基本的に、次のことが必要です。
1) ストア命令の検出
2) ストア命令のメモリ アドレスを整数に変換します。
3) ビットごとの AND 演算 (0000FFFF) を使用して整数を変更します。
4) 整数をポインタに戻す
これまでのところ、次のものがあります。
私は一生、実際に命令を挿入する方法を理解することはできません。また、AND 命令を作成する方法を見つけることさえできません。誰かが私を正しい方向に向けることができれば、それは素晴らしいことです.
前もって感謝します。
llvm - LLVM IR の命令にメタデータを追加する
まず、私は LLVM パスの初心者です。
変換パス (C++ API を使用) の後、LLVM の命令にメタデータを追加しようとしています。ツール チェーン内の別のツールで使用するために、この情報を保存するつもりです。これに関して2つの質問があります。
メタデータとして保存した情報が、LLVM IR で動作する別のツールにフィードされることを期待しています。では、メタデータは良い考えですか? 文字列をいくつかの指示とともにメタデータとして保存するつもりです。
ここでメタデータが正しい方法である場合は、メタデータ ノードを作成するための助けが必要です。setMedata() 関数を使用して命令にアタッチする予定です。setMetadata() のどのバリアントを使用するのが適切か。私のデータがどの MDKind であるべきかわかりません。MDString を作成し、それを MDNode にアタッチしてから、命令で setMetadata() を呼び出します。関数内の命令にメタデータを添付する場合、setMedata() でどのコンテキストを使用する必要がありますか。コンテキストとメタデータとの関連性は?
フォーラムや llvm doxygen のドキュメントで多くの議論を読み上げようとしましたが、すべての質問に対する明確で完全な回答が得られませんでした。私はこれを理解するのに役立つあなたの助け、またはいくつかの資料に感謝します.
c++ - llvm でユーザー定義パスの引数を追加することは可能ですか?
現在、このチュートリアルに従って、 llvmの分析パスを実装しています。以下のような追加の引数をプラグインに渡す必要があります。
しかし、その方法を教えてくれるマニュアルは見つかりませんでした。だから、実際にそれが可能かどうか疑問に思っています。
前もって感謝します。
llvm-3.0 - 関数引数リストでの配列検出 LLVM オプトパス
次のLLVM IRがあるとします
define void @foo(i32* %a, i32* %m) nounwind { ...
最初の引数に配列を渡し、m に変数のアドレスを渡すことで、foo を呼び出します。ここで、foo の arg リストを分析し、どの arg が配列に渡され、どれが単なるポインター アドレスであるかを判断する必要があります。どちらも実際にはアドレスであることはわかっていますが、渡されたタイプを静的に判別できるように、LLVM は何らかのメタデータを提供します。
注:私はオプトパスを書いています
llvm - dbg メタデータを使用して変数定義行番号などを取得する方法は?
私の知る限り、ローカル変数の行番号を取得する必要がある場合、llvm.dbg.declare
組み込み関数の呼び出しを探して dbg メタデータを取得する必要がありました (それAllocaInst
自体には dbg 情報が含まれていないため)。CallInst
ただし、これが の次の命令であるという保証はないAllocaInst
ようで、指定された関数で命令をトラバースする必要があり、非効率的です。そこで、指示を直接AllocaInst
取得する方法があるかどうか疑問に思っています。llvm.dbg.declare
たとえば、次のような src でfoo.c
:
および対応する llvm ir:
int a;
で定義されている の行番号を知る必要がある場合はfoo.c
、ir をトラバースして!dbg !9
から取得する必要がありますcall void @llvm.dbg.declare(metadata !{i32* %a}, metadata !7), !dbg !9
。
llvm.dbg.gv
ところで、非常に情報が含まれているため、グローバル変数を扱うときに問題はないようです。
build - IR をファイルに保存し、それを実行可能ファイルにビルドする方法は?
今、clang を使用して .c ファイルを .s ファイルにビルドします。また、llvm API を使用して IR を変更しました。ただし、変更した IR をファイルに保存できません。「LLVMWriteBitcodeToFile」を使用したいのですが、「LLVMOpaqueModule」の構造体が見つかりません。「WriteBitcodeToFile」を使用したいのですが、常に「型の不一致」が表示されます。また、IR ファイルを実行可能ファイルにビルドする方法も知りたいです。
次に、モジュールを保存するために使用する 2 つの方法を示します。
1、まず WriteBitcodeToFile を使用する
2、LLVMWriteBitcodeToFile の 2 回目の使用
注: m は Module インスタンスのポイントです
insert - basicblockにいくつかの命令を挿入したいのに、なぜそんなに面倒なのですか?
basicblockに命令を挿入しようとすると、非常に問題が発生しました。
上記は私が使用したいくつかのコードです。今でも、basicblockにすべての種類の命令を挿入する原理がわかりません(allocaInstを挿入できます)。誰かがbasicblockにすべての種類の命令を挿入するいくつかの例を教えてくれたらいいのにと思います。