En mi código LLVM, creo extern "C"
funciones de envoltura para esto, e inserte declaraciones de funciones LLVM en el módulo para llamarlas. Entonces, una buena manera de hacer que LLVM conozca las funciones es no dejarlo usar dlopen
y buscar el nombre de la función en el binario de ejecución (esto es un dolor en el culo, ya que los nombres de las funciones deben estar en la sección .dynsym
, y también es lento), pero para hacer la asignación manualmente, usando ExecutionEngine::addGlobalMapping.
acaba de obtener el llvm::Function*
de esa declaración y la dirección de la función como se indica en C++ por &functionname
convertido a void*
y pasan a lo largo de estas dos cosas a LLVM. El JIT que ejecuta tus cosas sabrá dónde encontrar la función.
Por ejemplo, si desea envolver QString
puede crear varias funciones que crean, destruyen y se llaman a las funciones de un objeto tal
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();
}
y crear declaraciones apropiadas y un mapeo. Luego puede call
estas funciones, pasando a lo largo de una región de memoria convenientemente alineada y dimensionada para QString
(posiblemente alloca
'ed) y una i8*
apuntando a los datos de cadena C para la inicialización.
Obtiene la respuesta para proporcionar ejemplos de código conciso. ¡Gracias! Exactamente lo que estaba buscando. –