当前位置:网站首页>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
边栏推荐
- 如何打开Win10启动文件夹?
- LeetCode 练习——396. 旋转函数
- Contraction mapping theorem
- How to upload large files quickly?
- Leetcode165 compare version number double pointer string
- Role of asemi rectifier module mdq100-16 in intelligent switching power supply
- My raspberry PI zero 2W tossing notes record some problems encountered and solutions
- Detailed analysis of SQL combat of Niuke database (26-30)
- 免费在upic中设置OneDrive或Google Drive作为图床
- How does eolink help telecommuting
猜你喜欢

UML project example -- UML diagram description of tiktok

Daily question - leetcode396 - rotation function - recursion

Detailed comparison between asemi three-phase rectifier bridge and single-phase rectifier bridge

On the day of entry, I cried (mushroom street was laid off and fought for seven months to win the offer)

My raspberry PI zero 2W tossing notes record some problems encountered and solutions

Swift - literal, literal protocol, conversion between basic data types and dictionary / array

Is asemi ultrafast recovery diode interchangeable with Schottky diode

For 22 years, you didn't know the file contained vulnerabilities?
![Detailed explanation of C language knowledge points -- data types and variables [1] - carry counting system](/img/95/3b38a550e78b3467c4a756af073d0a.png)
Detailed explanation of C language knowledge points -- data types and variables [1] - carry counting system

Explain TCP's three handshakes in detail
随机推荐
Realization of four data flow modes of grpc based on Multilingual Communication
JUC学习记录(2022.4.22)
Swift - literal, literal protocol, conversion between basic data types and dictionary / array
Design of digital temperature monitoring and alarm system based on DS18B20 single chip microcomputer [LCD1602 display + Proteus simulation + C program + paper + key setting, etc.]
What is the main purpose of PCIe X1 slot?
2-GO variable operation
LeetCode165-比较版本号-双指针-字符串
nuxt项目:全局获取process.env信息
编程哲学——自动加载、依赖注入与控制反转
【thymeleaf】处理空值和使用安全操作符
eolink 如何助力遠程辦公
大文件如何快速上传?
One of the advanced applications of I / O reuse: non blocking connect -- implemented using select (or poll)
Introduction to distributed transaction Seata
LeetCode149-直线上最多的点数-数学-哈希表
capacitance
8.4 realization of recurrent neural network from zero
博睿数据携手F5共同构建金融科技从代码到用户的全数据链DNA
Ffmpeg installation error: NASM / yasm not found or too old Use --disable-x86asm for a clipped build
eolink 如何助力远程办公