ORC JIT是LLVM面向编译器作者的可组合底层JIT构建块,用于将已生成的IR模块动态编译为机器码并执行;核心流程为:创建ExecutionSession→配置IRTransformLayer和ObjectLinkingLayer→添加模块→解析符号获取函数指针。

ORC(On-Resident Compilation)是 LLVM 提供的现代 JIT 框架,取代了旧版 MCJIT。它不是“一键运行字符串代码”的工具,而是面向编译器作者设计的、可组合、可扩展的底层 JIT 构建块。你用它来把 已生成的 IR 模块(Module) 动态编译成机器码并执行,不是直接喂 C++ 源码。
典型路径分四步:构造 ExecutionSession → 设置 ORC Layer(IRTransformLayer + ObjectLinkingLayer)→ 添加模块 → 解析符号获取函数指针。
ExecutionSession 管理 JIT 内存、符号表和资源生命周期IRTransformLayer 注入优化(如 createFunctionPassManagerForModule),再接 ObjectLinkingLayer 完成链接addIRModule 注入 std::unique_ptr<module></module>,ORC 自动编译、重定位、注册符号lookup("func_name") 得到 JITSymbol,再调用 getAddress() 转为函数指针(注意类型强转)ORC 默认使用 jitdylib 隔离符号空间。主 JIT dylib(如 es.createBareJITDylib("main"))需显式添加依赖才能看到外部符号(比如 printf)。
absoluteSymbols 注册地址,再通过 auto &mainJD = es.createBareJITDylib("main"); mainJD.addGenerator(...) 让 JIT 能解析它们addIRModule 引发重复定义错误:每个 Module 的全局符号名必须唯一,或启用 setAutoClaimResponsibilityForObjectSymbols(true)
removeModule 或直接销毁 JITDylib —— ORC 会自动回收对应内存页(通过 SectionMemoryManager)假设你已有 LLVM IR 描述的 int add(int a, int b) { return a + b; }(可用 parseIRFile 或手动生成):
立即学习“C++免费学习笔记(深入)”;
ExecutionSession ES; 和 MangleAndInterner Mangle(ES, DL);
ObjectLinkingLayer OL(ES, []() { return std::make_unique<sectionmemorymanager>(); });</sectionmemorymanager>
IRTransformLayer IRT(ES, OL, [](Module &M, const MaterializationResponsibility &) { return optimizeModule(M); });
auto &MainJD = ES.createBareJITDylib("main"); MainJD.addGenerator(orc::DynamicLibrarySearchGenerator::GetForCurrentProcess(DL.getGlobalPrefix())); IRT.addModule(std::move(M), MainJD);
auto Sym = ES.lookup({&MainJD}, Mangle("add")); auto AddPtr = (int(*)(int,int))Sym->getAddress(); int r = AddPtr(3, 5); // 得到 8
基本上就这些。不复杂但容易忽略符号注册和内存管理边界。
以上就是c++++如何使用LLVM的ORC JIT API_c++动态编译与执行【高级】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号