llvm function expr

想要什么:

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() {
// context 拥有许多核心的 LLVM 数据结构,例如类型和常量值表
auto Context = std::make_unique<LLVMContext>();
// module 包含函数和全局变量的LLVM构造,它是 LLVM IR 用来包含代码的顶级结构。它将拥有我们生成的所有 IR 的内存
auto M = std::make_unique<Module>("test", *Context);
// 创建一个构建器,可以轻松生成 LLVM 指令
IRBuilder<> builder(*Context);
// 声明一个函数 int add1(int) 添加到module中
auto funcType = FunctionType::get(Type::getInt32Ty(*Context), { Type::getInt32Ty(*Context) }, false);
Function* Add1F = Function::Create(funcType, Function::ExternalLinkage, "add1", M.get());
// 创建一个block添加到Add1F
BasicBlock* BB = BasicBlock::Create(*Context, "entry", Add1F);
// 构建器接下来的指令将插入到BB
builder.SetInsertPoint(BB);
// 获取指向常量“1”的指针
Value* One = builder.getInt32(1);
// 获取指向 add1 函数的整数参数的指针
assert(Add1F->arg_size() == 1); // 确保有一个 arg
Argument* p1 = Add1F->getArg(0); // 获取参数
p1->setName("p1"); // 设置arg name, int add1(int p1);
// 创建 add 指令,将其插入到 BB
// 创建返回指令并将其添加到基本块
builder.CreateRet(builder.CreateAdd(One, p1, "retVal")); // ret 1 + p1
// 打印出所有生成的代码
M->print(errs(), nullptr);
// 返回线程模块
return ThreadSafeModule(std::move(M), std::move(Context));
}
int main() {
InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
// Create an LLJIT instance.
auto _jit = ExitOnErr(LLJITBuilder().create());
auto M = createTSM();
ExitOnErr(_jit->addIRModule(std::move(M)));
// 查找 JIT 函数,将其转换为函数指针,然后调用它.
auto Add1Sym = ExitOnErr(_jit->lookup("add1"));
int (*Add1)(int) = (int (*)(int))Add1Sym.getAddress();
int Result = Add1(42);
outs() << "add1(42) = " << Result << "\n";
return 0;
}
posted @   Ajanuw  阅读(202)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解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互相转换
点击右上角即可分享
微信分享提示