インストルメンテーション パスを作成しています。パスは、指定された IR を特定の方法で変更することになっています。必要な変更の 1 つは、特定の場所に関数への呼び出しを挿入することです。これは、呼び出された関数のシグネチャです。
void myclass::foo(Function *f, BasicBlock* b)
この関数のプロトタイプはinclude/llvmfoofile.h
内のファイルに
あり、関数定義はMCJITフォルダー内のファイルにあります。このフォルダーで実行すると正常に動作し、同じファイル内の別の関数でコンパイルされ、期待どおりに正常に動作します。インストルメンテーション パスには戻りません。特定の IR で foo 関数に callinst を挿入するにはどうすればよいですか? 呼び出しを挿入するスニペットは次のとおりです。foofile.cpp
make
foofile.cpp
MCJIT.cpp
Type* retTy = Type::getInt32Ty(C);
FunctionType* FuncTy = FunctionType::get(retTy, false);
PointerType* PtrToFuncTy = PointerType::get(FuncTy, 0);
Constant *fun = M->getOrInsertFunction("foo", Type::getVoidTy(C), PtrToFuncTy, Type::getLabelTy(C), nullptr);
Function *dofoo = cast<Function>(fun);
Instruction* dofooCall = CallInst::Create(fun, Args2, "", bb);
注: Args2
は、関数への 2 つの値ポインターと基本ブロックを含む配列リストでbb
あり、呼び出しを挿入する基本ブロックです。
特定の IR で op を使用してパスを実行すると、次のように宣言と呼び出しが正しく生成されます。
宣言:
declare void @foo(i32 ()*, label)
電話:
call void @foo(i32 ()* @main, label %for.cond)
しかし、lli を使用して結果の .ll ファイルを実行しようとすると、すべてが爆発します。これは、スタックトレースの前の最初の 2 行です。
Can't get register for value!
UNREACHABLE executed at /home/marwayusuf/llvm-env/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:1158!
問題は foo 関数が見つからないことだと結論付けました。これが問題である場合、callinst を正しく作成するにはどうすればよいですか?