当前位置:网站首页>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
边栏推荐
- JUC learning record (2022.4.22)
- 1-初识Go语言
- MySQL error packet out of order
- like和regexp差别
- Epolloneshot event of epoll -- instance program
- What is the main purpose of PCIe X1 slot?
- 2-GO variable operation
- we引用My97DatePicker 实现时间插件使用
- Leetcode151 - invert words in string - String - simulation
- UML project example -- UML diagram description of tiktok
猜你喜欢
Detailed explanation of C language knowledge points -- first understanding of C language [1] - vs2022 debugging skills and code practice [1]
Provided by Chengdu control panel design_ It's detailed_ Introduction to the definition, compilation and quotation of single chip microcomputer program header file
8.5 concise implementation of cyclic neural network
8.2 text preprocessing
Leetcode149 - maximum number of points on a line - Math - hash table
Comment eolink facilite le télétravail
Vous ne connaissez pas encore les scénarios d'utilisation du modèle de chaîne de responsabilité?
On the day of entry, I cried (mushroom street was laid off and fought for seven months to win the offer)
Model location setting in GIS data processing -cesium
Do (local scope), initializer, memory conflict, swift pointer, inout, unsafepointer, unsafebitcast, success
随机推荐
[jz46 translate numbers into strings]
OPPO数据湖统一存储技术实践
When splicing HQL, the new field does not appear in the construction method
你還不知道責任鏈模式的使用場景嗎?
冰冰学习笔记:一步一步带你实现顺序表
LeetCode165-比较版本号-双指针-字符串
[thymeleaf] handle null values and use safe operators
Achievements in science and Technology (21)
Nuxt project: Global get process Env information
编程哲学——自动加载、依赖注入与控制反转
Ffmpeg installation error: NASM / yasm not found or too old Use --disable-x86asm for a clipped build
Share 20 tips for ES6 that should not be missed
8.4 realization of recurrent neural network from zero
Brute force of DVWA low -- > High
Swift - literal, literal protocol, conversion between basic data types and dictionary / array
Svn detailed use tutorial
C语言超全学习路线(收藏让你少走弯路)
Frame synchronization implementation
async void 导致程序崩溃
Share 3 tools, edit 5 works at home and earn more than 400