LLVM を使用して JIT コンパイラのフロントエンドを実装しています。まず、LLVM チュートリアルの万華鏡の例に従ってみました。LLVM C++ API を使用して LLVM IR を生成および JIT する方法を知っています。また、llvm::ExecutionEngine の「getPointerToFunction」メソッドを使用して、JITed 関数を呼び出す方法も知っています。
getPointerToFunction は void* を返し、これを正しい関数型にキャストする必要があります。たとえば、私のコンパイラには、次のような単体テストがあります。
void* compiled_func = compiler.get_function("f");
auto f = reinterpret_cast<int32_t(*)(int32_t)>(compiled_func);
int32_t result = f(10);
問題は、関数のシグネチャを事前に知っておく必要があることです。上記の例では、32 ビット整数を取り、32 ビット整数を返す関数 "f" があります。私は自分で「f」を作成したので、関数の型が何であるかを知っているので、JIT された関数を呼び出すことができます。ただし、一般に、ユーザーが入力した関数のシグネチャ (または構造体の型) が何であるかはわかりません。ユーザーは、任意の引数と戻り値の型を使用して任意の関数を作成できるため、LLVM の getPointerToFunction から void* をキャストする関数ポインターの型がわかりません。私のランタイムは、これらの関数を呼び出すことができる必要があります (たとえば、Read-Evaluate-Print ループの場合)。JIT ランタイムからこのような任意の関数を処理するにはどうすればよいですか?
ありがとう