所以我正在构建一个可以在编译时调用代码的编译器。在成功编译完所有内容后,我创建了一个llvm::ExecutionEngine
并添加了程序所需的每个llvm::Module
。
最后,我调用llvm::ExecutionEngine::finalizeObject
并在模块中执行一个函数。
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);
除了一件事以外,一切正常:
只要模块包含全局变量, llvm::ExecutionEngine::finalizeObject
就会发生Integer division by zero
错误。
所以我的问题: 如何在MCJIT中正确使用全局变量?
注意:
- 在本机可执行文件中全局变量正常工作
- 不使用全局变量时执行引擎正常工作
- 我认为问题可能与全局变量的链接或执行引擎的数据布局有关
感谢您的反馈!
答案 0 :(得分:0)
我发现了我的问题。
我的全局变量有CommonLinkage,这对JIT代码毫无意义。将全局变量的链接更改为InernalLinkage使我的代码工作正常。