Verknüpfung von LLVM JIT-code externe C++ - Funktionen
Ich Schreibe ein LLVM-scripting-engine JIT-kompiliert-scripting-code in einer benutzerdefinierten Sprache. Mein problem ist, dass ich nicht in der Lage bin für den Aufruf von externen Funktionen (auch der C99-erf () - Funktion ist fehlerhaft).
Zum Beispiel, wenn ich extern "C" die erf-Funktion,
extern "C" double erft(double x){
return erf(x);
}
und erstellen Sie eine Funktion mit externer Verknüpfung
std::vector<const Type*> Double1(1,Type::getDoubleTy(getGlobalContext()));
FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),Double1,false);
Function *erft = Function::Create(FT,Function::ExternalLinkage,"erft",TheModule);
bekomme folgende Fehlermeldung beim ausführen meines scripts mit erft(0.0) :
LLVM FEHLER: Programm externe Funktion "erft", die nicht aufgelöst werden konnte!
Tun das mapping manuell,
void ExecutionEngine::addGlobalMapping( const GlobalValue * erfF, void * erft);
wird, bekomme ich die folgende Fehlermeldung:
Deklaration von `void llvm::ExecutionEngine::addGlobalMapping(const llvm::GlobalValue*, void*)' außerhalb der Klasse ist nicht definition
Offensichtlich mache ich etwas sehr falsch. Jede Hilfe wäre sehr geschätzt werden
- Eine Warnung für zukünftige Besucher: Die Antworten sind referering zu veralteten Methoden..
- Die Antwort auf dieser Frage zeigt, wie dies mit den nicht-veralteten Methoden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, Sie haben nicht deaktiviert (durch Aufruf
EE->DisableSymbolSearching()
) dann LLVM verwendendlsym()
zu finden, die Symbole, die im JIT-Programm selbst. Abhängig von Ihrer Plattform, dass könnte bedeuten, dass Sie brauchen, um zu bauen Ihre JIT-mit-fPIC
oder, dass es vielleicht nicht auf allen (wie unter Windows).Abgesehen vom automatischen symbol suchen, können Sie sich stets registrieren, die einzelnen Funktionen selbst mit
EE->addGlobalMapping(GV, &function)
wo GV = der llvm::Funktionen* Funktionsdeklaration entspricht die native Funktion, die Sie aufrufen. In deinem Fall mit ertf (), dass ist:Beachten Sie, dass Sie mit dem Namen der globalen Funktion
erft()
und die lokale variableerft
, daher der "::". Bitte wählen Sie verschiedene Namen das nächste mal!Dies geschieht, weil Sie vergessen haben, fügen Sie die "libm" depedency, versuchen Sie es mit:
Sehen hier für weitere Informationen über die
Module::addLibrary()
.Ich weiß nicht, llvm, aber diese machen keinen Sinn:
Definiert eine neue Funktion in C++. Was Sie tun müssen, ist irgendwie registrieren Sie Ihre Funktion mit LLVM. Die Definition, die Funktion ist wie der Versuch, das hinzufügen neuer Methoden, um die LLVM-Klassen nicht, was Sie tun möchten.