LLVM 2.8 で LLVM ビットコードから解析された関数を読み込んで呼び出そうとしています。プログラムをクラッシュさせる実際の呼び出しとは別に、すべてが機能しています。
まず、私はこのCコードを持っています:
void hello() {}
私はこれをコンパイルしました:
llvm-gcc -c -emit-llvm hello.c -o hello.bc
これを読み取るはずのコードの縮小版を次に示します。
using namespace std;
using namespace llvm;
void callFunction(string file, string function) {
InitializeNativeTarget();
LLVMContext context;
string error;
MemoryBuffer* buff = MemoryBuffer::getFile(file);
Module* m = getLazyBitcodeModule(buff, context, &error);
// Check the module parsed here.
// ...
ExecutionEngine* engine = ExecutionEngine::create(m);
// Check the engine started up correctly here.
// ...
Function* func = m->getFunction(function);
// Check the function was found here.
// ..
vector<GenericValue> args(0);
// This is what crashes.
engine->runFunction(func, args);
}
ExecutionEngine/JIT.h を含む多数の LLVM ヘッダーを含め、コードは各ステップで値が NULL でないことを確認します。ビットコードを解析し、見つかった関数を調べて、期待どおりであることを確認しました。
また、モジュールと関数を自分で構築しようとしましたが、これは期待どおりに機能するため、関数がビットコードによって生成されるという事実から問題が発生することは間違いありません。