用C++基于LLVM OrcV2实现JIT编译器的核心是构建IR模块、配置ExecutionSession与IRCompileLayer、注册模块并获取函数指针调用;需启用RTTI/EH、链接llvm-orc等库、注意上下文生命周期和符号解析。
用 C++ 基于 LLVM 实现一个简单 JIT 编译器,核心不是“从零写编译器”,而是利用 LLVM 提供的 orc JIT 架构快速把内存中的 IR(中间表示)编译成可执行机器码并即时调用。关键在于理解 LLVM 的模块构建、优化、JIT 执行流程,而不是手写词法/语法分析。
确保安装 LLVM(≥14.0,推荐 16+),CMake 中正确 find_package:
LLVM_ENABLE_RTTI=ON 和 LLVM_ENABLE_EH=ON(OrcV2 需要 RTTI)跳过前端解析,直接在内存中构造 LLVM IR:
llvm::LLVMContext、llvm::Module、llvm::IRBuilder 创建函数int add(int a, int b) { return a + b; }
CallingConv::C)、返回类型、参数名,并将函数加入 Modulemodule->dump() 可查看生成的 IR(调试必备)LLVM 14+ 推荐使用 orc::ExecutionSession + orc::EPCExecutorProcessControl + or:
c::TidyIRCompileLayer
ExecutionSession 和共享资源(如符号查找器)orc::RTDyldObjectLinkingLayer 管理对象文件链接orc::IRCompileLayer 将 Module 编译为 object code(自动选择 TargetMachine)addIRModule 注册模块,返回 orc::MaterializationUnit 句柄JIT 编译后,需从符号表提取函数地址并转为可调用指针:
jit_lookup("add")(封装了 ES.lookup(...))获取 JITEvaluatedSymbol
reinterpret_cast 强转SymbolResolver)基本上就这些。不复杂但容易忽略细节:上下文生命周期管理、模块所有权转移、符号名是否以 @ 开头、JIT 内存权限(Linux 上可能需 mprotect 设置可执行)。跑通一个 add 函数后,再逐步支持常量、控制流、多函数调用,就自然进入 JIT 深水区了。