当前位置:网站首页>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
边栏推荐
- 解决ssh配置文件优化以及连接慢的问题
- 贷款市场报价利率(LPR)与贷款基准利率介绍
- KVM学习资源
- Recyclerview advanced use (I) - simple implementation of sideslip deletion
- Operation instructions of star boundary automatic text translator (advanced version)
- grep无法重定向到文件的问题
- Thread group ThreadGroup uses introduction + custom thread factory class to implement threadfactory interface
- XX project structure notes
- MySQL数据库讲解(十)
- 使用Executors类快速创建线程池
猜你喜欢
Pass in external parameters to the main function in clion
困扰多年的系统调研问题有自动化采集工具了,还是开源免费的
OpenStack命令操作
Use the executors class to quickly create a thread pool
差分隐私(背景介绍)
Some experience of using dialogfragment and anti stepping pit experience (getactivity and getdialog are empty, cancelable is invalid, etc.)
krpano全景之vtour文件夹和tour
Processing MKDIR: unable to create directory 'AAA': read only file system
回顾2021:如何帮助客户扫清上云最后一公里的障碍?
XX project structure notes
随机推荐
基础正则表达式
线程组ThreadGroup使用介绍+自定义线程工厂类实现ThreadFactory接口
mysql 5.1升级到5.68
Debug on TV screen
Visio画拓扑图随记
Redis cluster 原理
ssh限制登录的四种手段
金融行业云迁移实践 平安金融云整合HyperMotion云迁移解决方案,为金融行业客户提供迁移服务
微信小程序轮播图swiper
Use the executors class to quickly create a thread pool
dp-能量项链
HyperBDR云容灾V3.3.0版本发布|容灾功能升级,资源组管理功能优化
IE8 browser prompts whether to block access to JS script
处理 mkdir:无法创建目录“aaa“:只读文件系统
How does void * exist?
KVM学习资源
js 键值判断
常见存储类型和FTP主被动模式解析
Gif to still image processing
Introduction to loan market quotation interest rate (LPR) and loan benchmark interest rate