想要什么:
| int add1(int p1) { return 1 + p1; } |
IR:
| define i32 @add1(i32 %p1) { |
| entry: |
| %retVal = add i32 1, %p1 |
| ret i32 %retVal |
| } |
| #include "llvm/ExecutionEngine/Orc/LLJIT.h" |
| #include "llvm/IR/Function.h" |
| #include "llvm/IR/IRBuilder.h" |
| #include "llvm/IR/Module.h" |
| #include "llvm/Support/CommandLine.h" |
| #include "llvm/Support/InitLLVM.h" |
| #include "llvm/Support/TargetSelect.h" |
| #include "llvm/Support/raw_ostream.h" |
| |
| using namespace llvm; |
| using namespace llvm::orc; |
| |
| ExitOnError ExitOnErr; |
| |
| ThreadSafeModule createTSM() { |
| |
| auto Context = std::make_unique<LLVMContext>(); |
| |
| |
| auto M = std::make_unique<Module>("test", *Context); |
| |
| |
| IRBuilder<> builder(*Context); |
| |
| |
| auto funcType = FunctionType::get(Type::getInt32Ty(*Context), { Type::getInt32Ty(*Context) }, false); |
| Function* Add1F = Function::Create(funcType, Function::ExternalLinkage, "add1", M.get()); |
| |
| |
| BasicBlock* BB = BasicBlock::Create(*Context, "entry", Add1F); |
| |
| |
| builder.SetInsertPoint(BB); |
| |
| |
| Value* One = builder.getInt32(1); |
| |
| |
| assert(Add1F->arg_size() == 1); |
| Argument* p1 = Add1F->getArg(0); |
| p1->setName("p1"); |
| |
| |
| |
| builder.CreateRet(builder.CreateAdd(One, p1, "retVal")); |
| |
| |
| M->print(errs(), nullptr); |
| |
| |
| return ThreadSafeModule(std::move(M), std::move(Context)); |
| } |
| |
| int main() { |
| InitializeNativeTarget(); |
| InitializeNativeTargetAsmPrinter(); |
| |
| |
| auto _jit = ExitOnErr(LLJITBuilder().create()); |
| auto M = createTSM(); |
| |
| ExitOnErr(_jit->addIRModule(std::move(M))); |
| |
| |
| auto Add1Sym = ExitOnErr(_jit->lookup("add1")); |
| int (*Add1)(int) = (int (*)(int))Add1Sym.getAddress(); |
| int Result = Add1(42); |
| outs() << "add1(42) = " << Result << "\n"; |
| |
| return 0; |
| } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束
2018-06-01 js函数 eql,equal,equalp
2018-06-01 nodejs XML和json互相转换