Nel mio codice LLVM, creo le funzioni di wrapper extern "C"
per questo e inserisco dichiarazioni di funzione LLVM nel modulo per chiamarle. Quindi, un buon modo per far conoscere a LLVM le funzioni non è di lasciarlo usare dlopen
e cercare il nome della funzione nel file eseguibile (questo è un rompicapo, dato che i nomi delle funzioni devono essere nella sezione .dynsym
, ed è anche lento), ma per fare la mappatura manualmente, usando ExecutionEngine::addGlobalMapping.
solo ottenere il llvm::Function*
di tale dichiarazione e l'indirizzo della funzione come indicato in C++ da &functionname
convertito in void*
e passare queste due cose insieme a LLVM. Il JIT che esegue le tue cose saprà quindi dove trovare la funzione.
Ad esempio, se si vuole avvolgere QString
è possibile creare diverse funzioni che creano, distruggono e le funzioni di un tale oggetto
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();
}
creare e richiamare le dichiarazioni adeguati e una mappatura. Quindi è possibile call
queste funzioni, passando lungo un'area di memoria adeguatamente allineata e dimensionata per QString
(possibilmente alloca
'ed) e un i8*
che punta ai dati di stringa C per l'inizializzazione.
fonte
2010-08-23 21:31:03
Ottiene la risposta per fornire esempi concisi di codice. Grazie! esattamente quello che stavo cercando. –