Also ich baue einen Compiler, der Code zur Kompilierzeit aufrufen kann. Nachdem alles erfolgreich kompiliert wurde, erstelle ich ein llvm::ExecutionEngine
und füge jedes llvm::Module
hinzu, das das Programm benötigt.LLVM - Wie verwendet man Globals mit MCJIT?
Schließlich rufe ich llvm::ExecutionEngine::finalizeObject
auf und führe eine Funktion innerhalb der Module aus.
llvm::ExecutionEngine* execution_engine = llvm::EngineBuilder(std::move(module)).setErrorStr(&error_str).create();
// Ensure execution engine was created successfully
if(!execution_engine){
std::cerr << "Failed to construct ExecutionEngine: " << error_str << std::endl;
return 1;
}
// Add all of the dependencies to the execution engine
for(size_t i = 0; i != dependencies.size(); i++){
ModuleDependency* dependency = &dependencies[i];
if(!dependency->is_nothing){
llvm::SMDiagnostic sm_diagnostic;
std::unique_ptr<llvm::Module> required_module = llvm::parseIRFile(dependency->bytecode_filename, sm_diagnostic, llvm_context);
if (!required_module) {
sm_diagnostic.print("Failed to parse IR File: ", llvm::errs());
return false;
}
required_module->setModuleIdentifier(dependency->bytecode_filename.c_str());
execution_engine->addModule(std::move(required_module));
}
}
execution_engine->finalizeObject();
llvm::GenericValue returned_value = execution_engine->runFunction(entry_point, args);
Alles funktioniert bis auf eine Sache in Ordnung:
llvm::ExecutionEngine::finalizeObject
stürzt mit Integer division by zero
Fehler, wenn ein Modul globale Variablen enthält.
Also meine Frage: Wie richtig verwenden globale Variablen mit MCJIT?
Hinweise:
- Globale Variablen funktionieren, wenn sie in nativen ausführbaren Dateien
- Die Ausführungs-Engine funktioniert gut, wenn nicht globale Variablen
mit - ich denke, das Problem etwas haben könnte, mit dem zu tun, Verknüpfung der globalen Variablen oder des Datenlayouts der Ausführungsmaschine
Vielen Dank für eine Rückmeldung!