当前位置:网站首页>LLVM - 生成加法
LLVM - 生成加法
2022-04-23 14:11:00 【Mrpre】
本例中KaleidoscopeJIT在 ./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.
中
1、LLVM生成函数
2、LVVM生成加法
3、LLVM jit运行
#include <sys/time.h>
#include "./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Transforms/InstCombine/InstCombine.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Scalar/GVN.h"
#include <string>
#include <vector>
#include <iostream>
using namespace std;
using namespace llvm;
using namespace llvm::orc;
//LLVM items
static LLVMContext TheContext;
static IRBuilder<> Builder(TheContext);
static std::unique_ptr<Module> TheModule;
//JIT
static std::unique_ptr<KaleidoscopeJIT> TheJIT;
/* *double fuckadd(double a, double b) *{ * return a + b; *} * */
int main()
{
InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
//init module
TheModule = llvm::make_unique<Module>("myjit", TheContext);
//used to be runned by jit later
TheJIT = llvm::make_unique<KaleidoscopeJIT>();
TheModule->setDataLayout(TheJIT->getTargetMachine().createDataLayout());
//define the args
vector<std::string> ArgNames;
//fuckadd has 2 args
ArgNames.push_back(string("a"));
ArgNames.push_back(string("b"));
//make the 2 args attach to LLVM Type::double
std::vector<Type *> Doubles(ArgNames.size(), Type::getDoubleTy(TheContext));
//generate llvm function type
FunctionType *FT = FunctionType::get(Type::getDoubleTy(TheContext), Doubles, false);
//Create function whose FunctionType is FT
Function *F = Function::Create(FT, Function::ExternalLinkage, "fuckadd", TheModule.get());
//give the name of Function args and save the args as innerargs
unsigned Idx = 0;
std::vector<Value *>innerargs;
for (auto &Arg : F->args()) {
Arg.setName(ArgNames[Idx++]);
innerargs.push_back(&Arg);
}
//generate the function body
BasicBlock *BB = BasicBlock::Create(TheContext, "entry", F);
Builder.SetInsertPoint(BB);
//generate llvm function body:a+b
Value *ret = Builder.CreateFAdd(innerargs[0], innerargs[1], "addtmp");
Builder.CreateRet(ret);
//print LLVM IR
F->print(errs());
//using jit to run this code
auto H = TheJIT->addModule(std::move(TheModule));
auto ExprSymbol = TheJIT->findSymbol("fuckadd");
double (*fuckadd)(double, double) = (double (*)(double, double))(intptr_t)cantFail(ExprSymbol.getAddress());
std::cout<< fuckadd(1, 3) <<std::endl;
}
版权声明
本文为[Mrpre]所创,转载请带上原文链接,感谢
https://wonderful.blog.csdn.net/article/details/106900546
边栏推荐
猜你喜欢
A table splitting implementation scheme of MySQL and InnoDB, MyISAM and MRG_ Introduction to MyISAM and other engine application scenarios
微信小程序客服接入,实现发送和接收消息
Installation and use of postman pit
OpenStack如何跨版本升级
Use the executors class to quickly create a thread pool
flannel 原理 之 TUN模式
Win10 comes with groove music, which can't play cue and ape files. It's a curvilinear way to save the country. It creates its own aimpack plug-in package, and aimp installs DSP plug-in
Gartner预测云迁移规模大幅增长;云迁移的优势是什么?
uni-app消息推送
政务云迁移实践 北明数科使用HyperMotion云迁移产品为某政府单位实施上云迁移项目,15天内完成近百套主机迁移
随机推荐
mysql 5.1升级到5.68
返回数组排序后下标
容灾有疑问?点这里
云迁移的六大场景
Mysql的安装过程(已经安装成功的步骤说明)
Tongxin UOS uninstall php7 2.24, install php7 4.27 ; Uninstall and then install PHP 7.2.34
DP energy Necklace
JDBC details
Flop effect
MySQL数据库讲解(九)
ssh限制登录的四种手段
差分隐私(背景介绍)
正则表达式
微信小程序客服接入,实现发送和接收消息
Algorithem_ReverseLinkedList
Redis数据库讲解(一)
mysql锁数据库锁
source insight via samba
std::map 和 std::vector 内存释放
xx项目架构随记