当前位置:网站首页>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
边栏推荐
- 牛客网数据库SQL实战详细剖析(26-30)
- 8.5 concise implementation of cyclic neural network
- UML learning_ Day2
- Explanation and example application of the principle of logistic regression in machine learning
- Advanced application of I / O multiplexing: Processing TCP and UDP services at the same time
- JS - implémenter la fonction de copie par clic
- Pnpm installation and use
- win10 任务栏通知区图标不见了
- 小红书 timestamp2 (2022/04/22)
- Share 20 tips for ES6 that should not be missed
猜你喜欢

Redis主从同步

PCIe X1 插槽的主要用途是什么?

Role of asemi rectifier module mdq100-16 in intelligent switching power supply

Share 20 tips for ES6 that should not be missed

Thread synchronization, life cycle

LeetCode153-寻找旋转排序数组中的最小值-数组-二分查找

win10 任务栏通知区图标不见了

How does eolink help telecommuting

LeetCode167-两数之和II-双指针-二分-数组-查找

For 22 years, you didn't know the file contained vulnerabilities?
随机推荐
Leetcode162 - find peak - dichotomy - array
On the day of entry, I cried (mushroom street was laid off and fought for seven months to win the offer)
When splicing HQL, the new field does not appear in the construction method
Async void caused the program to crash
Thread synchronization, life cycle
Raised exception class eaccexviolation with 'access violation at address 45efd5 in module error
2-Go变量操作
thinkphp5+数据大屏展示效果
What is the effect of Zhongfu Jinshi wealth class 29800? Walk with professional investors to make investment easier
1n5408-asemi rectifier diode
如何设计一个良好的API接口?
[NLP] HMM hidden Markov + Viterbi word segmentation
牛客网数据库SQL实战详细剖析(26-30)
8.2 text preprocessing
Advanced application of I / O multiplexing: Processing TCP and UDP services at the same time
Don't you know the usage scenario of the responsibility chain model?
Redis主从同步
A series of problems about the best time to buy and sell stocks
ffmpeg安装遇错:nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
Fill in the next right node pointer II of each node [classical hierarchy traversal | regarded as linked list]