c++ - LLVM - 如何通过 MCJIT 正确使用全局变量

标签 c++ llvm jit global mcjit

所以我正在构建一个可以在编译时调用代码的编译器。一切都成功编译后,我创建一个 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 中正确使用全局变量?

注意事项:
- 全局变量在 native 可执行文件中工作正常
- 执行引擎在不使用全局变量时工作正常
- 我认为问题可能与全局变量的链接或执行引擎的数据布局有关

感谢任何反馈!

最佳答案

我发现了我的问题。

我的全局变量有 CommonLinkage,这对 JIT 代码没有意义。将全局变量的链接更改为 InernalLinkage 使我的代码运行良好。

关于c++ - LLVM - 如何通过 MCJIT 正确使用全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42741545/

相关文章:

c++ - C++ 中的正则表达式 : Requires compiler support error

c++ - 新的数组分配

c++ - 以下 if 语句中的条件是做什么的?

LLVM 将 if/else 插入现有的基本 block

c++ - 使用 clang 从 C/C++ 头文件中提取函数声明

java - java不适合被多次调用的短进程吗?

C++ 优化向量化嵌套循环

Clang Static Analyzer 没有发现最基本的问题

lua - LuaJIT 真的比其他所有 JIT 动态语言更快吗?

Monotouch 中的 Linq(在设备上调试)