2017-03-11 2 views
1

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!

Antwort

0

Ich habe mein Problem gefunden.

Meine Globals hatte CommonLinkage, die keinen Sinn für JIT-Code macht. Durch die Änderung der Verknüpfung globaler Variablen zu InernalLinkage funktionierte mein Code einwandfrei.