3

基本的に LLVM IR コードの一部を取得し、C でインラインで実行する方法を見つけようとしています。仮想関数呼び出しが不要になるように、IR コードをインライン化できるようにしたいと考えています (同じを使用してアセンブリ コードをインライン化する方法_asm{})。次の例を参照してください。

実行するLLVM IRコード:

define i64 @square(i64 %x){
    %y = mul i64 %x, %x
    ret i64 %y
}

C プログラム:

for(i = 0; i < length; i++){
   //run LLVM IR Code here
}

IRコードを使用して読み取り、parseIRFile()関数へのポインターを作成できることはわかっていますが、仮想関数呼び出しが必要なため、それは私が探しているものではありません。

4

1 に答える 1

2

まず第一に、関連する仮想関数はありません。C にはそのような概念がありません。つまり、関数ポインターを取得し、それが指している関数を呼び出すという間接的な関数呼び出しだと思います。

簡単に言うと、いいえ、C に LLVM IR を埋め込んでコードでコンパイルする簡単な方法はありません。この関連する質問と私の回答を参照してください。そこで述べたように、プログラマーが LLVM IR を記述できるようにし、直接関数呼び出しを引き続き使用できるようにしたい場合は、IR を関数にカプセル化し、別のファイルに配置する必要があります。

IR の埋め込みがパフォーマンスよりも重要な場合は、ParseIR()ルートを使用する必要があります (その必要はありませんParseIRFile()- メモリから直接解析できます)。

ビルド プロセスに、ハイブリッド C/IR 入力ファイルを取り、それを 2 つのファイルに分割してからコンパイルし、IR のデバッグ情報を適切に変更して、実際に埋め込まれているかのように動作させるスクリプトを導入できると思います。 Cファイルで。しかし、これは非常にハックなアプローチであり、いずれにしても入力ファイルは正当な C ファイルではありません。

于 2013-04-25T05:02:17.590 に答える