当前位置:网站首页>Llvm - generate addition
Llvm - generate addition
2022-04-23 15:04:00 【Mrpre】
In this case KaleidoscopeJIT stay ./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.
in
1、LLVM Generating function
2、LVVM Generating addition
3、LLVM jit function
#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://yzsam.com/2022/04/202204231409588187.html
边栏推荐
- Redis master-slave synchronization
- LeetCode162-寻找峰值-二分-数组
- 三、梯度下降求解最小θ
- 你還不知道責任鏈模式的使用場景嗎?
- LeetCode165-比较版本号-双指针-字符串
- 1990年1月1日是星期一,定义函数date_to_week(year,month,day),实现功能输入年月日后返回星期几,例如date_to_week(2020,11,1),返回:星期日。 提示:
- LeetCode167-两数之和II-双指针-二分-数组-查找
- On the day of entry, I cried (mushroom street was laid off and fought for seven months to win the offer)
- Alexnet model
- 解决computed属性与input的blur事件冲突问题
猜你喜欢
大文件如何快速上传?
Provided by Chengdu control panel design_ It's detailed_ Introduction to the definition, compilation and quotation of single chip microcomputer program header file
Thinkphp5 + data large screen display effect
win10 任务栏通知区图标不见了
Leetcode153 - find the minimum value in the rotation sort array - array - binary search
Lotus DB design and Implementation - 1 Basic Concepts
Redis master-slave synchronization
Detailed explanation of C language knowledge points -- data types and variables [1] - carry counting system
Daily question - leetcode396 - rotation function - recursion
Detailed explanation of C language knowledge points -- first understanding of C language [1] - vs2022 debugging skills and code practice [1]
随机推荐
如何打开Win10启动文件夹?
OC to swift conditional compilation, marking, macro, log, version detection, expiration prompt
牛客网数据库SQL实战详细剖析(26-30)
如何设计一个良好的API接口?
Introduction to dirty reading, unrepeatable reading and phantom reading
大文件如何快速上传?
Interviewer: let's talk about the process of class loading and the mechanism of class loading (parental delegation mechanism)
ffmpeg安装遇错:nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
你还不知道责任链模式的使用场景吗?
Nuxt project: Global get process Env information
One of the advanced applications of I / O reuse: non blocking connect -- implemented using select (or poll)
Unity_ Code mode add binding button click event
分享 20 个不容错过的 ES6 的技巧
多语言通信基础 06 go实现grpc的四种数据流模式实现
Async keyword
How to upload large files quickly?
Introduction to Arduino for esp8266 serial port function
Redis主从同步
Comment eolink facilite le télétravail
Detailed analysis of SQL combat of Niuke database (26-30)