В своем коде LLVM я создаю для этого extern "C"
функции-оболочки и вставляю объявления функций LLVM в модуль для их вызова. Тогда, хороший способ сообщить LLVM о функциях - это не позволить ему использовать dlopen
и искать имя функции в исполняемом двоичном файле (это задница в заднице, поскольку имена функций должны быть в .dynsym
, и это тоже медленно), но сделать сопоставление вручную, используя ExecutionEngine :: addGlobalMapping .
Просто получите llvm::Function*
этого объявления и адрес функции, заданный в C ++ как &functionname
, преобразованный в void*
, и передайте эти две вещи 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();
}
И создать правильные объявления и сопоставление. Затем вы можете call
эти функции, передавая область памяти, соответствующим образом выровненную и измеренную для QString
(возможно, alloca
'ed) и i8*
, указывающих на данные строки C для инициализации.