2017-03-11 9 views
1

Je compile donc un compilateur qui peut appeler du code lors de la compilation. Après que tout a été compilé avec succès, je crée un llvm::ExecutionEngine et ajoute chaque llvm::Module le programme exige.LLVM - Comment utiliser correctement les variables globales avec MCJIT

Enfin, j'appelle llvm::ExecutionEngine::finalizeObject et j'exécute une fonction dans les modules.

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); 

Tout fonctionne bien, sauf une chose:

llvm::ExecutionEngine::finalizeObject accidents avec Integer division by zero erreur chaque fois qu'un module contient des variables globales.

Donc ma question: Comment utiliser correctement les variables globales avec MCJIT?

Notes:
- Les variables globales fonctionnent bien quand dans executables indigènes
- Le moteur d'exécution fonctionne très bien quand ne pas utiliser les variables globales
- Je pense que le problème pourrait avoir quelque chose à voir avec le lien des variables globales ou la disposition des données du moteur d'exécution

Merci pour vos commentaires!

Répondre

0

J'ai trouvé mon problème.

Mes globals avaient CommonLinkage ce qui n'a aucun sens pour le code JIT. Changer le lien des variables globales à InernalLinkage a fait fonctionner mon code.