私のLLVMコードでは、extern "C"
このためのラッパー関数を作成し、それらを呼び出すためにLLVM関数宣言をモジュールに挿入します。次に、LLVMに関数について知らせる良い方法は、実行中のバイナリで関数名を使用および検索しないことです(関数名はセクションにdlopen
含める必要があるため、これはお尻の痛みです。.dynsym
も遅いです)が、ExecutionEngine::addGlobalMappingを使用して手動でマッピングを行うには。
llvm::Function*
その宣言とC++で指定された関数のアドレスを&functionname
変換して取得し、void*
これら2つをLLVMに渡します。自分のものを実行するJITは、関数の場所を認識します。
たとえば、ラップしたい場合は、QString
そのようなオブジェクトの関数を作成、破棄、および呼び出すいくつかの関数を作成できます
extern "C" void createQString(void *p, char const*v) {
new (p) QString(v); // placement-new
}
extern "C" int32_t countQString(void *p) {
QString *q = static_cast<QString*>(p);
return q->count();
}
extern "C" void destroyQString(void *p) {
QString *q = static_cast<QString*>(p);
q->~QString();
}
そして、適切な宣言とマッピングを作成します。次に、これらの関数を実行して、適切に配置およびサイズ設定された(場合によっては'ed)call
メモリ領域を渡し、初期化のためにC文字列データをポイントします。QString
alloca
i8*